续redis集群搭建完成后,我们想进行水平扩展:
当前的集群信息是 6个reddis结点,一主一从,一共是三组。端口从8001-8006,现在模拟在此基础上进行水平扩展,再加上一主一从,端口分别是8007和8008,其中8007是主结点,而8088是8007的从结点。最终会有8个redis结点。
1、按之前方式创建8007和8008文件夹,以及其redis.conf配置文件
cd /usr/local/mysoftwares/redis/cluster #切换到redis集群目录下
cd /usr/local/mysoftwares/redis/cluster
mkdir 8007
mkdir8008
cp 8001/redis.conf ./8007
cp 8001/redis.conf ./8008
然后把redis.conf中的8001改成自己的8007或8008
2、启动两个新增的两个redis服务
/usr/local/mysoftwares/redis/bin/redis-server /usr/local/mysoftwares/redis/cluster/8007/redis.conf
/usr/local/mysoftwares/redis/bin/redis-server /usr/local/mysoftwares/redis/cluster/8008/redis.conf
然后再一下是否启动成功
ps -ef | grep redis
3、将两个redis结点添加到集群中
./bin/redis-cli -a luanbu --cluster add-node 127.0.0.1:8007 127.0.0.1:8006
./bin/redis-cli -a luanbu --cluster add-node 127.0.0.1:8008 127.0.0.1:8006
在集群中打印结点信息,
4、分配插槽
当把结点中途加到集群后,系统默认是没有为你分配插槽的,所以我们这里为8007分配插槽。
./bin/redis-cli -a luanbu --cluster reshard 127.0.0.1:8007 #这里最后不一定要写8007
我们为8007分配1000个插槽,这1000个插槽从原有的各个集群中抽取凑齐而成。也就是我们最终拿到的1000个插槽是零散的。
注:all是从多个组中抽取出插槽,凑齐指定个插槽。
而done是从某个组中抽取出指定个插槽。如果选择。
如果是想使用all方式,那么直接敲all,再回车即可。
如果想使用done模式,先输入 被抽取插槽的集群的master的id ,然后回车 再输入done,再回车
5、为新结点设置主从关系
我们的8007是8008的master结点。所以进行下面操作
查看8008的主从信息
水平收缩
我们现在准备把8008的1000个插槽全分配给8004,再把8007和8008结点给删掉
迁移8007的插槽到8004
./bin/redis-cli -a luanbu --cluster reshard 127.0.0.1:8001 #最后的host:port是为了让系统能够连到我们的集群。
回车后系统就会为我们分片
删除8007和8008结点
执行下面命令删除结点
./bin/redis-cli -a luanbu --cluster del-node 127.0.0.1:8002 9a669e1f112d42cda12d4284227f562239460aa2
./bin/redis-cli -a luanbu --cluster del-node 127.0.0.1:8002 26fb87f3ca5f9c4550d132bfe9dd452cb6eb0395
再次查看结点信息,发现8007和8008已经不见了。
需求:又假如我们觉得这3组master的所拥有的插槽数不均衡,因为我们上面将8007的1000个插槽分配给了8004,此时8004就比其他2组master结点多了1000个多插槽,我们想3组master结点均分原有总的16384个结点,此时就可以使用reblance命令
./bin/redis-cli -a luanbu --cluster rebalance 127.0.0.1:8002 #这里最后的端口可以是8001-8006中任意一个
大功告成!!!
redis集群投票选举原理
当slave发现自己的master变成FAIL状态时,便尝试进行Failover,以期待成为新的master结点。由于挂掉的master可能有多个slave,从而存在多个slave竞争升级成master。
选举过程如下:
1、slave发现自己的master变成FAIL
2、将自己的记录的集群currentEpoch加1,并广播FAILOVER_AUTH_REQUEST信息。
3、其他结点收到该信息后,只有master作为出响应,并发送FAILOVER_AUTH_ACK,对于每一次epoch只发送一次ack.
4、尝试failover的slave收集FAILOVER_AUTH_ACK
5、收集超过半数后变成Master
6、广播Pong通知其他集群结点
从结点并不是再主结点一进入FAIL状态就马上发起选举,而是有一定的延迟,一定的延迟确保我们等待Fail状态再集群中传播,slave如果立即尝试选举,可能有其它结点尚未意识到FAIL状态,而可能出现拒绝投票的情况。
延迟计算公式
DELAY = 500ms + random(0~500ms) + SLAVE_RANK * 1000ms
SLAVE_RANK代表slave已经从master复制数据的总量的rank.Rank越小代表已复制的数据越新。这种方式下,持有最新数据的slave相对较高概率会首次发起选举。
问题:
为什么集群最少需要3组?
答:因为如果只有两组,那么当其中一组的master挂掉后,只有一组能够进行投票,所以最多只能得到一票,而我们slave升级master选举要求是投票过半,总是2,而得到的票数是1,只有一半,没有超过半数,所以选举不了。所以至少需要3组集群。
当master挂掉后,只选举一次就能选出新的master吗
答: 否,假如是一主二从,一共3组。其中一组的master挂了,只有两个master投票,可能已挂的两个slave各得一票,此时就会进入下一轮重新选举。上面的延迟计算公式 有助于 减少 重新选举概率。