服务器:

Master: 192.168.1.200   192.168.1.202   192.168.1.203

Slave:  192.168.1.206   192.168.1.207   192.168.1.208

所有服务器已编译安装redis

 

 

一、准备redis-cluster集群环境:

yum install -y ruby

yum install  -y rubygems

gem install redis             //速度很慢

 

 

 

二、创建集群:

1.集群配置参数

cluster-enabled                //是否启用集群

 

cluster-config-file         

//指定一个文件,由集群自动维护,用于保存集群相关的信息

 

cluster-node-timeout        //节点超时时间,单位为毫秒

 

cluster-slave-validity-factor

//举例:如果设置超时时间为5秒,factor10.master宕机后,如果slave节点与该master节点断开时间超过50秒(即5*10)的时候,该slave不会被选举为master

 

cluster-migration-barrier

//举例,如果设置为2,表示master后面至少要维持2slave,多余的slave可以被迁移到其他孤立的master

 

cluster-require-full-coverage

//槽位是否全覆盖,即当有master宕机且没有slave可以顶替的情况下是否还允许集群继续工作

 

 

实验中配置:

bind 192.168.1.200

cluster-config-file nodes.conf

cluster-node-timeout 15000

cluster-enabled yes

appendonly yes

 

 

2.  创建集群

  各个节点启动redis

redis-server /etc/redis/redis.conf

redis-cluster_第1张图片

 

 

  创建集群

redis-trib.rbcreate --replicas 1 192.168.1.200:6379 192.168.1.202:6379 192.168.1.203:6379192.168.1.206:6379 192.168.1.207:6379 192.168.1.208:6379

redis-cluster_第2张图片

 

redis-cluster_第3张图片

 redis-cluster_第4张图片

 


 

 

3.  简单测试

redis-cli -c -h192.168.1.200 -p 6379   

//使用-c选项,可以自动切换到其他节点上

 

redis-cluster_第5张图片

 

 

redis-cli -h192.168.1.200 -p 6379   //指定访问200节点,不自动切换

redis-cluster_第6张图片

 

 

 

redis-cli -h192.168.1.206 -p 6379        //指定访问slave节点

 

redis-cluster_第7张图片

 

 

redis-cluster_第8张图片

 

 

三、测试故障转移:

1.关闭203节点

wKioL1hyTn-CArbaAAC7aIqv5iQ426.png

 

redis-cluster_第9张图片

 

 

2. 重启203节点

wKioL1hyTq_zxZCfAADBbBuFpSA454.png

 

 

3. 关闭并重置203节点

wKiom1hyTt2xILd6AAC1dP4--4E459.png

 

 

4. 移除203节点

redis-cluster_第10张图片

停止所有节点上的redis服务

 

修改各节点的nodes.conf

vim nodes.conf

wKiom1hyTzGyfuW0AACsnxQ8IE0293.png

 

重启所有redis服务

wKioL1hyT0vAbXqHAACPdfWEphA532.png

 

 

5. 重建203节点

启动redis服务

 

添加203节点

redis-trib.rbadd-node 192.168.1.203:6379192.168.1.200:6379

//可以通过集群内任一节点添加新节点

 

redis-cluster_第11张图片

redis-trib.rbdel-node 192.168.1.203:6379 4246aef39ae381bca47835132902293d4bac6b00

//删除203节点重新以slave身份添加,还需要删除203节点上的nodes.conf文件

 

redis-trib.rbadd-node --slave 192.168.1.203:6379 192.168.1.200:6379

//使用--master-id可以指定作为哪一个masterslave

redis-cluster_第12张图片

 

关闭208节点

wKiom1hyT9HBb_L9AACy76caXdg942.png

 

redis-cluster_第13张图片

 

 

四、集群扩容:

1.准备两个redis节点

Master:  192.168.1.204   

Slave:   192.168.1.205

 

 

2. 加入两个节点

redis-trib.rbadd-node 192.168.1.204:6379 192.168.1.200:6379

redis-cluster_第14张图片

 

redis-trib.rbadd-node --slave --master-id 0996e2a2cf52fab07f85cfdd729573915ce55359  192.168.1.205:6379 192.168.1.200:6379

//指定为204节点的slave

 

 

3.  重新分配槽位

redis-cluster_第15张图片

 

redis-trib.rbrebalance --use-empty-masters 192.168.1.200:6379

//让空节点参与rebalance

 

redis-cluster_第16张图片

 

redis-trib.rbreshard 192.168.1.200:6379        //可以手动选择迁移多少槽位

 

 

五、手动降级Master:

redis-cluster_第17张图片

1.使用cli登录207(即202节点的slave节点)

redis-cli -h192.168.1.207 -p 6379

 

redis-cluster_第18张图片

 

redis-cluster_第19张图片

 

 

六、测试slave节点的自动迁移:

1.重新准备redis集群

Master: 192.168.1.200   192.168.1.202   192.168.1.203

Slave:  192.168.1.206   192.168.1.207   192.168.1.208

 

 

bind 192.168.1.200

cluster-config-filenodes.conf

cluster-node-timeout15000

cluster-enabled yes

appendonly yes

cluster-migration-barrier1

//指定每个master后面应该有一个slave

 

wKiom1hyUPnRSD8UAADJ0Lsb3Fo103.png

 

2. 新添加204,205节点,都作为200节点的slave

redis-cluster_第20张图片

 

 

3.移除 202节点的slave

redis-cluster_第21张图片

 

 

 

 

 

 

附:

计算key的插槽值:

key的有效部分使用CRC16算法计算出哈希值,再将哈希值对16384取余,得到插槽值。

 

什么是有效部分?

1、如果key中包含了{符号,且在{符号后存在}符号,并且{和}之间至少有一个字符,则有效部分是指{和}之间的部分;

  1. key={hello}_tatao的有效部分是hello

2、如果不满足上一条情况,整个key都是有效部分;

  1. key=hello_taotao的有效部分是全部