Redis(四)-集群搭建
基本架构
节点
与普通模式下节点的区别是它有一个配置是cluster-enabled:yes,即以集群模式启动
meet
节点之间通过meet实现通信
指派槽
复制
每个主节点都有从节点,主从复制。
搭建步骤(原生安装)
redis-cli -p 7000 cluster nodes/info查看节点信息(不开启客户端)
1.开启节点
redis-server redis-7000.conf
redis-server redis-7001.conf
redis-server redis-7002.conf
redis-server redis-7003.conf
redis-server redis-7004.conf
redis-server redis-7005.conf
2.节点握手(meet)
redis-cli -p 7000 cluster meet 127.0.0.1 7001
redis-cli -p 7000 cluster meet 127.0.0.1 7002
redis-cli -p 7000 cluster meet 127.0.0.1 7003
redis-cli -p 7000 cluster meet 127.0.0.1 7004
redis-cli -p 7000 cluster meet 127.0.0.1 7005
此时通过redis-cli -p 7000 cluster info
查看任意一个节点得到的信息中,cluster_known_nodes
的值都为6,即集群中6个节点都能互通。
3.分配槽
由于分配槽的命令很多且重复,编写脚本如下:
start=$1
end=$2
port=$3
for slot in `seq ${start} ${end}`
do
redis-cli -p ${port} cluster addslots ${slot}
done
运行脚本为7000、7001、7002分配槽:
sh addslots.sh 0 5461 7000
sh addslots.sh 5462 10922 7001
sh addslots.sh 10923 16383 7002
4.主从分配
通过redis-cli -p 7000 cluster nodes
查看节点ID(第一列)。
然后
redis-cli -p 从节点端口
cluster replicate 主节点ID
redis-cli -p 7003 cluster replicate d378ca9057747ed4643e9604de048c72b1e37ebc
redis-cli -p 7004 cluster replicate a41a11969445c1b34b1a7f450339be9dfea6dcd7
redis-cli -p 7005 cluster replicate 6e745ee42dc19ea4259d16aa0837bbba483832a9
Redis Cluster提供了Rubby的安装脚本,可以通过Rubby方便地搭建集群,而不需要通过Redis-cli的原生安装方式。
集群伸缩
集群伸缩:槽和数据在节点之间的移动
扩容集群
-
准备新节点
redis-server redis-7006.conf
即开启一个新的redis-server -
加入集群
新节点和已创建的集群握手(meet)
-
迁移槽和数据
通过redis-cli做会很麻烦,一般使用官方的redis-trib迁移。
收缩集群
-
下线迁移槽
-
让其他节点忘记被除去的节点
-
关闭节点
客户端路由
move重定向
被客户端访问的槽已经迁移到别的节点
ask重定向
被客户端访问的槽正在迁移中
smart客户端
如:JedisCluster
- 从集群中选一个可运行节点,使用cluster slots初始化槽和节点映射
- 将cluster slots的结果映射到本地
- 准备执行命令
这样在客户端就有了槽和节点的对应信息,就能直接访问目标节点
故障
故障发现
- 主观下线:某个节点认为另一个节点不可用
- 客观下线:当半数以上持有槽的主节点都标记某节点主观下线
尝试客观下线
- 通知集群内所有节点标记故障节点为客观下线
- 通知故障节点的从节点触发故障转移流程
故障恢复
- 资格检查:检查哪些从节点有成为主节点的资格
- 准备选举时间
- 选举投票:主节点对参选的从节点投票
- 替换主节点:
- 当前节点取消复制变为主节点
- 撤销故障主节点负责的槽,并将这些槽分配给自己
- 向集群广播自己的pong消息,表明已经替换了故障主节点