续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

posgresql扩展redis redis水平扩展_posgresql扩展redis

在集群中打印结点信息,

posgresql扩展redis redis水平扩展_posgresql扩展redis_02

4、分配插槽

当把结点中途加到集群后,系统默认是没有为你分配插槽的,所以我们这里为8007分配插槽。

posgresql扩展redis redis水平扩展_redis_03

./bin/redis-cli -a luanbu  --cluster reshard  127.0.0.1:8007  #这里最后不一定要写8007

我们为8007分配1000个插槽,这1000个插槽从原有的各个集群中抽取凑齐而成。也就是我们最终拿到的1000个插槽是零散的。

posgresql扩展redis redis水平扩展_posgresql扩展redis_04


all是从多个组中抽取出插槽,凑齐指定个插槽。
而done是从某个组中抽取出指定个插槽
。如果选择。

如果是想使用all方式,那么直接敲all,再回车即可。

如果想使用done模式,先输入 被抽取插槽的集群的master的id ,然后回车 再输入done,再回车

posgresql扩展redis redis水平扩展_插槽_05

5、为新结点设置主从关系

我们的8007是8008的master结点。所以进行下面操作

posgresql扩展redis redis水平扩展_redis_06


查看8008的主从信息

posgresql扩展redis redis水平扩展_插槽_07

水平收缩

我们现在准备把8008的1000个插槽全分配给8004,再把8007和8008结点给删掉

posgresql扩展redis redis水平扩展_posgresql扩展redis_08


迁移8007的插槽到8004

./bin/redis-cli -a luanbu --cluster reshard 127.0.0.1:8001 #最后的host:port是为了让系统能够连到我们的集群。

posgresql扩展redis redis水平扩展_redis_09

posgresql扩展redis redis水平扩展_redis_10


回车后系统就会为我们分片

posgresql扩展redis redis水平扩展_linux_11


posgresql扩展redis redis水平扩展_linux_12


删除8007和8008结点

posgresql扩展redis redis水平扩展_结点_13

执行下面命令删除结点

./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

posgresql扩展redis redis水平扩展_结点_14


再次查看结点信息,发现8007和8008已经不见了。

posgresql扩展redis redis水平扩展_posgresql扩展redis_15

需求:又假如我们觉得这3组master的所拥有的插槽数不均衡,因为我们上面将8007的1000个插槽分配给了8004,此时8004就比其他2组master结点多了1000个多插槽,我们想3组master结点均分原有总的16384个结点,此时就可以使用reblance命令

posgresql扩展redis redis水平扩展_redis_16

./bin/redis-cli -a luanbu  --cluster rebalance 127.0.0.1:8002 #这里最后的端口可以是8001-8006中任意一个

posgresql扩展redis redis水平扩展_插槽_17


posgresql扩展redis redis水平扩展_结点_18

大功告成!!!

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各得一票,此时就会进入下一轮重新选举。上面的延迟计算公式 有助于 减少 重新选举概率。