主题
Redis数据分片
Redis cluster 介绍
在哨兵模式下, 无非就是master宕机, slave再顶上去。这种主从切换不能解决master单点高并发的压力, 因此在写压力有一定压力的时候就需要考虑Redis的水平扩展。 Redis集群支持多个Master, 每个Master又可以挂载多个Slave, 而且自带了SentineI(哨兵)的故障转移机制, 支持高可用。 客户端与Redis的节点连接, 不再需要连接集群中所有的节点, 只需要任意连接集群中的一个可用节点即可。而且, redis集群引入了哈希槽的概念, 将数据划分了16384个哈希槽, 每个key通过CRC16校验后对16384取模来决定放置哪个槽集群的每个节负责一部分hash槽, 使得单master的压力减小从而实现高负载。
Redis cluster 的 hash slot 算法
Redis cluster 有固定的 16384
个 hash slot,对每个 key
计算 CRC16
值,然后对 16384
取模,可以获取 key 对应的 hash slot。
Redis cluster 中每个 master 都会持有部分 slot,比如有 3 个 master,那么可能每个 master 持有 5000 多个 hash slot。hash slot 让 node 的增加和移除很简单,增加一个 master,就将其他 master 的 hash slot 移动部分过去,减少一个 master,就将它的 hash slot 移动到其他 master 上去。移动 hash slot 的成本是非常低的。客户端的 api,可以对指定的数据,让他们走同一个 hash slot,通过 hash tag
来实现。
任何一台机器宕机,另外两个节点,不影响的。因为 key 找的是 hash slot,不是机器。
Redis cluster 搭建
使用的是FinalShell快速执行指令, 对应参数为替换成实际值就可以运行
reids-master创建
shell
docker run --name [p#1 参数名] -d --restart=always --network=host redis --requirepass [p#4 参数名] \
--appendonly yes --protected-mode no --cluster-enabled yes --cluster-config-file nodes.conf --cluster-node-timeout 5000 \
--port [p#2 参数名] --daemonize no --pidfile /var/run/redis.pid --cluster-announce-ip [p#3 参数名] --cluster-announce-port [p#2 参数名] --cluster-announce-bus-port 1[p#2 参数名]
参数说明
[p#1 参数名]
docker容器名, 可以随便填, 建议reids-master[p#2 参数名]
端口, 建议6379[p#3 参数名]
IP地址, 建议运行此容器本机的内网ip地址[p#4 参数名]
redis密码, 随便填, 建议所有redis设置成一致
redis-slave创建
建议最少是3主3从, 6个起步, 即redis-slave需要执行5遍。所以这里使用的是快捷命令执行。
shell
docker run --name [p#1 参数名] -d --restart=always --network=host redis --requirepass [p#4 参数名] \
--appendonly yes --port [p#2 参数名] --slaveof [p#3 参数名] --masterauth [p#4 参数名]
参数说明
[p#1 参数名]
docker容器名, 可以随便填[p#2 参数名]
端口, 建议6379[p#3 参数名]
IP地址, 建议运行此容器本机的内网ip地址[p#4 参数名]
redis密码, 和reids-master一致
添加进集群
shell
redis-cli -a [p#1 参数名] --cluster create 内网ip1:6379 内网ip2:6379 内网ip3:6379 内网ip4:6379 内网ip5:6379 内网ip6:6379 --cluster-replicas 1
参数说明
[p#1 参数名]
redis密码
Redis 集群会根据指定的节点数量和从节点数量自动将这些实例分配为主节点和从节点, 其中每个主节点有 1 个从节点。这是一个3主3从的分片集群, 数据均匀分配到集群中的主节点, 每个主节点负责约 5461 个哈希槽(16384/3)。
在java中的应用
yml
# Spring boot
spring.data:
redis:
# Redis集群节点信息
cluster:
nodes: 内网ip1:6379 内网ip2:6379 内网ip3:6379 内网ip4:6379 内网ip5:6379 内网ip6:6379
# Redis密码
password: 设置的redis密码
# 连接超时时间
timeout: 10s
# 是否开启ssl
ssl: false
注意事项
连接redis最好使用内网IP, 因为redis集群内置同步的服务, 并且默认和cluster设置的IP地址一致只是端口不同, 无法单独设置(2024/7), 使用外网IP会极大增加网络压力
redis管理工具可以使用远程同内网的跳板机连接。