Redis 3.2.4集群实战
一、Redis Cluster集群设计
Redis集群搭建的方式有多种,例如使用zookeeper等,但从redis3.0之后版本支持Redis-Cluster集群,Redis-Cluster采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他所有节点连接。其redis-cluster架构图如下:
结构特点:
1、所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽。
2、节点的fail是通过集群中超过半数的节点检测失效时才生效。
3、客户端与redis节点直连,不需要中间proxy层。客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可。
4、redis-cluster把所有的物理节点映射到[0-16383]slot上(不一定是平均分配),cluster负责维护node<->slot<->value。
5、Redis集群预分好16384个桶,当需要在 Redis 集群中放置一个 key-value 时,根据 CRC16(key) mod 16384的值,决定将一个key放到哪个桶中。
1、redis cluster节点分配
假如现在有三个主节点分别是:A, B, C三个节点,它们可以是一台机器上的三个端口,也可以是三台不同的服务器。那么,采用哈希槽 (hash slot)的方式来分配16384个slot的话,它们三个节点分别承担的slot区间是:
节点A覆盖0-5460;
节点B覆盖5461-10922;
节点C覆盖10923-16383.
获取数据:
如果存入一个值,按照redis cluster哈希槽的算法: CRC16('key')%16384 = 6782。 那么就会把这个 key 的存储分配到节点B上了。同样,当我连接(A,B,C)任何一个节点想获取'key'这个key时,也会这样的算法,然后内部跳转到B节点上获取数据。
新增一个主节点:
新增一个节点D,redis cluster的这种做法是从各个节点的前面各拿取一部分slot到D上,我会在接下来的实践中实验。大致就会变成这样:
节点A覆盖1365-5460
节点B覆盖6827-10922
节点C覆盖12288-16383
节点D覆盖0-1364,5461-6826,10923-12287
同样删除一个节点也是类似,移动完成后就可以删除这个节点了。
2、Redis Cluster主从模式
Redis Cluster为了保证数据的高可用性,加入了主从模式,一个主节点对应一个或多个从节点,主节点提供数据存取,从节点则是从主节点拉取数据备份,当这个主节点挂掉后,就会从从节点选取一个来充当主节点,从而保证集群不会挂掉。
上面那个例子里, 集群有ABC三个主节点, 如果这3个节点都没有加入从节点,如果B挂掉了,我们就无法访问整个集群了。A和C的slot也无法访问。
所以我们在集群建立的时候,一定要为每个主节点都添加从节点, 比如像这样, 集群包含主节点A、B、C, 以及从节点A1、B1、C1, 那么即使B挂掉系统也可以继续正确工作。
B1节点替代了B节点,所以Redis集群将会选择B1节点作为新的主节点,集群将会继续正确地提供服务。 当B重新开启后,它就会变成B1的从节点。
不过需要注意,如果节点B和B1同时挂了,Redis集群就无法继续正确地提供服务了。
三、redis集群测试
1、查看集群节点信息
[root@localhost src]# ./redis-cli -c -h 192.168.1.105 -p
192.168.1.105:> cluster nodes
4a5dd44e1b57c99c573d03e556f1ca446a1cd907 192.168.1.105: slave afe7e0ca4c438a3f68636e6fc2622d3f910c8c7c connected
d33b8453a4f6fdecf597e6ef2f3908b065ce1d4c 192.168.1.160: slave c50954482dada38aca9e9e72cb93f90df52e9ab2 connected
afe7e0ca4c438a3f68636e6fc2622d3f910c8c7c 192.168.1.160: master - connected -
e611fea46dc1c7c9a1be2287cf1164a7e9422718 192.168.1.160: slave 2a780de364a6b69e9cb5cb007929f19acf575c93 connected
2a780de364a6b69e9cb5cb007929f19acf575c93 192.168.1.105: myself,master - connected -
c50954482dada38aca9e9e72cb93f90df52e9ab2 192.168.1.105: master - connected -
主节点:7000、7001、7003 ,从节点:7002、7004、7005;7000为7004的主节点,7001为7005的主节点,7003为7002的主节点。
节点7000覆盖0-5460
节点7001覆盖10923-16383
节点7003覆盖5461-10922
2、测试存取值
redis-cli客户端连接集群需要带上-c参数,redis-cli -c -p 端口号 -h ip地址 -a redis密码
[root@localhost src]# ./redis-cli -h 192.168.1.160 -p -c
192.168.1.160:> set aa
-> Redirected to slot [] located at 192.168.1.105:
OK
192.168.1.105:> get aa
""
根据redis-cluster的key值分配原理,aa应该分配到节点7000[0-5460]上,上面显示redis cluster自动从7005跳转到7000节点。
我们可以测试一下7002从节点获取aa值
[root@localhost src]# ./redis-cli -h 192.168.1.105 -p -c
192.168.1.105:> get aa
-> Redirected to slot [] located at 192.168.1.105:
""
从上面也是自动跳转至7000获取值,这也是redis cluster的特点,它是去中心化,每个节点都是对等的,连接哪个节点都可以获取和设置数据。
四、集群节点选举
现在模拟将7000主节点挂掉,按照redis-cluster选举原理会将7000的从节点7004选举为主节点。
[root@localhost shell]# ps -ef |grep redis
root : ? :: ./redis-server 192.168.1.105: [cluster]
root : ? :: ./redis-server 192.168.1.105: [cluster]
root : ? :: ./redis-server 192.168.1.105: [cluster]
root : pts/ :: ./redis-cli -h 192.168.1.105 -p -c
root : pts/ :: grep --color=auto redis
[root@localhost shell]# kill -
查看集群中的7000节点
[root@localhost src]# ./redis-trib.rb check 192.168.1.105:
[ERR] Sorry, can't connect to node 192.168.1.105:7000
无法check 7000节点
[root@localhost src]# ./redis-trib.rb check 192.168.1.105:
>>> Performing Cluster Check (using node 192.168.1.105:)
M: 6befec567ca7090eb3731e48fd5275a9853fb394 192.168.1.105:
slots:- ( slots) master
additional replica(s)
S: 910e14d9655a1e6e7fc007e799006d3f0d1cebe5 192.168.1.105:
slots: ( slots) slave
replicates 94f51658302cb5f1d178f14caaa79f27a9ac3703
S: 54ca4fbc71257fd1be5b58d0f545b95d65f8f6b8 192.168.1.160:
slots: ( slots) slave
replicates 6befec567ca7090eb3731e48fd5275a9853fb394
M: cf02aa3d58d48215d9d61121eedd194dc5c50eeb 192.168.1.160:
slots:- ( slots) master
additional replica(s)
M: 94f51658302cb5f1d178f14caaa79f27a9ac3703 192.168.1.160:
slots:- ( slots) master
additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All slots covered.
可以看到集群连接不了7000节点,而7004由原来的S节点转换为M节点,代替了原来的7000主节点。
[root@localhost src]# ./redis-cli -p -c -h 192.168.1.160
192.168.1.160:> cluster nodes
28a51a8e34920e2d48fc1650a9c9753ff73dad5d 192.168.1.105: master,fail - disconnected
54ca4fbc71257fd1be5b58d0f545b95d65f8f6b8 192.168.1.160: myself,slave 6befec567ca7090eb3731e48fd5275a9853fb394 connected
cf02aa3d58d48215d9d61121eedd194dc5c50eeb 192.168.1.160: master - connected -
94f51658302cb5f1d178f14caaa79f27a9ac3703 192.168.1.160: master - connected -
6befec567ca7090eb3731e48fd5275a9853fb394 192.168.1.105: master - connected -
910e14d9655a1e6e7fc007e799006d3f0d1cebe5 192.168.1.105: slave 94f51658302cb5f1d178f14caaa79f27a9ac3703 connected
7004由原来的S节点转换为M节点,代替了原来的7000节点,7000节点提示master,fail。
现在我们将7000节点恢复,看是否会自动加入集群中以及充当的M节点还是S节点。
[root@localhost src]# ./redis-server ../../redis_cluster//redis.conf &
在check一下7000节点
[root@localhost src]# ./redis-trib.rb check 192.168.1.105:
>>> Performing Cluster Check (using node 192.168.1.105:)
S: 28a51a8e34920e2d48fc1650a9c9753ff73dad5d 192.168.1.105:
slots: ( slots) slave
replicates cf02aa3d58d48215d9d61121eedd194dc5c50eeb
S: 910e14d9655a1e6e7fc007e799006d3f0d1cebe5 192.168.1.105:
slots: ( slots) slave
replicates 94f51658302cb5f1d178f14caaa79f27a9ac3703
M: 94f51658302cb5f1d178f14caaa79f27a9ac3703 192.168.1.160:
slots:- ( slots) master
additional replica(s)
S: 54ca4fbc71257fd1be5b58d0f545b95d65f8f6b8 192.168.1.160:
slots: ( slots) slave
replicates 6befec567ca7090eb3731e48fd5275a9853fb394
M: cf02aa3d58d48215d9d61121eedd194dc5c50eeb 192.168.1.160:
slots:- ( slots) master
additional replica(s)
M: 6befec567ca7090eb3731e48fd5275a9853fb394 192.168.1.105:
slots:- ( slots) master
additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All slots covered.
可以看到7000节点变成了cf02aa3d58d48215d9d61121eedd194dc5c50eeb 7004的从节点。
五、集群节点添加
新增节点包括新增主节点、从节点两种情况。以下分别做一下测试:
a、新增主节点
新增一个节点7006作为主节点修改配置文件。
启动7006 redis服务
[root@localhost src]# ./redis-server ../../redis_cluster//redis.conf &
[]
[root@localhost src]# ps -ef|grep redis
root : ? :: ./redis-server 192.168.1.160: [cluster]
root : ? :: ./redis-server 192.168.1.160: [cluster]
root : ? :: ./redis-server 192.168.1.160: [cluster]
root : pts/ :: ./redis-cli -p -c -h 192.168.1.160
root : ? :: ./redis-server 192.168.1.160: [cluster]
root : pts/ :: grep --color=auto redis
[]+ 完成 ./redis-server ../../redis_cluster//redis.conf
上面可以看到,7006已经启动,现在加入集群中。添加使用redis-trib.rb的add-node命令:
./redis-trib.rb add-node 192.168.1.160: 192.168.1.160:
add-node是加入集群节点,192.168.1.160:7006为要加入的节点,192.168.1.160:7003表示加入的集群的一个节点,用来辨识是哪个集群,理论上哪个集群的节点都可以。
执行以下add-node
[root@localhost src]# ./redis-trib.rb add-node 192.168.1.160: 192.168.1.160:
>>> Adding node 192.168.1.160: to cluster 192.168.1.160:
>>> Performing Cluster Check (using node 192.168.1.160:)
M: 94f51658302cb5f1d178f14caaa79f27a9ac3703 192.168.1.160:
slots:- ( slots) master
additional replica(s)
S: 910e14d9655a1e6e7fc007e799006d3f0d1cebe5 192.168.1.105:
slots: ( slots) slave
replicates 94f51658302cb5f1d178f14caaa79f27a9ac3703
M: 6befec567ca7090eb3731e48fd5275a9853fb394 192.168.1.105:
slots:- ( slots) master
additional replica(s)
S: 28a51a8e34920e2d48fc1650a9c9753ff73dad5d 192.168.1.105:
slots: ( slots) slave
replicates cf02aa3d58d48215d9d61121eedd194dc5c50eeb
S: 54ca4fbc71257fd1be5b58d0f545b95d65f8f6b8 192.168.1.160:
slots: ( slots) slave
replicates 6befec567ca7090eb3731e48fd5275a9853fb394
M: cf02aa3d58d48215d9d61121eedd194dc5c50eeb 192.168.1.160:
slots:- ( slots) master
additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All slots covered.
>>> Send CLUSTER MEET to node 192.168.1.160: to make it join the cluster.
[OK] New node added correctly.
[]+ 完成 ./redis-server ../../redis_cluster//redis.conf
可以看到7006加入这个Cluster,并成为一个新的节点。
check下7006节点状态
[root@localhost src]# ./redis-trib.rb check 192.168.1.160:
>>> Performing Cluster Check (using node 192.168.1.160:)
M: 2335477842e1b02e143fabaf0d77d12e1e8e6f56 192.168.1.160:
slots: ( slots) master
additional replica(s)
M: 6befec567ca7090eb3731e48fd5275a9853fb394 192.168.1.105:
slots:- ( slots) master
additional replica(s)
S: 28a51a8e34920e2d48fc1650a9c9753ff73dad5d 192.168.1.105:
slots: ( slots) slave
replicates cf02aa3d58d48215d9d61121eedd194dc5c50eeb
M: 94f51658302cb5f1d178f14caaa79f27a9ac3703 192.168.1.160:
slots:- ( slots) master
additional replica(s)
S: 54ca4fbc71257fd1be5b58d0f545b95d65f8f6b8 192.168.1.160:
slots: ( slots) slave
replicates 6befec567ca7090eb3731e48fd5275a9853fb394
S: 910e14d9655a1e6e7fc007e799006d3f0d1cebe5 192.168.1.105:
slots: ( slots) slave
replicates 94f51658302cb5f1d178f14caaa79f27a9ac3703
M: cf02aa3d58d48215d9d61121eedd194dc5c50eeb 192.168.1.160:
slots:- ( slots) master
additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All slots covered.
M: 2335477842e1b02e143fabaf0d77d12e1e8e6f56 192.168.1.160:7006
slots: (0 slots) master
0 additional replica(s)
上面信息可以看到有4个M节点,3个S节点,7006成为了M主节点,它没有附属的从节点,而且Cluster并未给7006分配哈希卡槽(0 slots)。
redis-cluster在新增节点时并未分配卡槽,需要我们手动对集群进行重新分片迁移数据,需要重新分片命令reshard。
./redis-trib.rb reshard 192.168.1.160:
这个命令是用来迁移slot节点的,后面的192.168.1.160:7005是表示是哪个集群,端口填[7000-7007]都可以,执行结果如下:
[root@localhost redis-cluster]# ./redis-trib.rb reshard 192.168.1.160:
>>> Performing Cluster Check (using node 192.168.1.160:)
M: a5db243087d8bd423b9285fa8513eddee9bb59a6 192.168.1.160:
slots:- ( slots) master
additional replica(s)
S: 50ce1ea59106b4c2c6bc502593a6a7a7dabf5041 192.168.1.160:
slots: ( slots) slave
replicates dd19221c404fb2fc4da37229de56bab755c76f2b
M: f9886c71e98a53270f7fda961e1c5f730382d48f 192.168.1.160:
slots:- ( slots) master
additional replica(s)
S: 1f07d76585bfab35f91ec711ac53ab4bc00f2d3a 192.168.1.160:
slots: ( slots) slave
replicates a5db243087d8bd423b9285fa8513eddee9bb59a6
M: ee3efb90e5ac0725f15238a64fc60a18a71205d7 192.168.1.160:
slots: ( slots) master
additional replica(s)
M: dd19221c404fb2fc4da37229de56bab755c76f2b 192.168.1.160:
slots:- ( slots) master
additional replica(s)
S: 8bb3ede48319b46d0015440a91ab277da9353c8b 192.168.1.160:
slots: ( slots) slave
replicates f9886c71e98a53270f7fda961e1c5f730382d48f
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All slots covered.
How many slots do you want to move (from to )?
它提示我们需要迁移多少slot到7006上,我们平分16384个哈希槽给4个节点:16384/4 = 4096,我们需要移动4096个槽点到7006上。
[OK] All slots covered.
How many slots do you want to move (from to )?
What is the receiving node ID?
需要输入7006的节点id,2335477842e1b02e143fabaf0d77d12e1e8e6f56
Please enter all the source node IDs.
Type 'all' to use all the nodes as source nodes for the hash slots.
Type 'done' once you entered all the source nodes IDs.
Source node #:
redis-trib 会向你询问重新分片的源节点(source node),即要从特定的哪个节点中取出 4096 个哈希槽,还是从全部节点提取4096个哈希槽, 并将这些槽移动到7006节点上面。
如果我们不打算从特定的节点上取出指定数量的哈希槽,那么可以向redis-trib输入 all,这样的话, 集群中的所有主节点都会成为源节点,redis-trib从各个源节点中各取出一部分哈希槽,凑够4096个,然后移动到7006节点上:
Source node #:all
然后开始从别的主节点迁移哈希槽,并且确认。
Moving slot 1343 from dd19221c404fb2fc4da37229de56bab755c76f2b
Moving slot 1344 from dd19221c404fb2fc4da37229de56bab755c76f2b
Moving slot 1345 from dd19221c404fb2fc4da37229de56bab755c76f2b
Moving slot 1346 from dd19221c404fb2fc4da37229de56bab755c76f2b
Moving slot 1347 from dd19221c404fb2fc4da37229de56bab755c76f2b
Moving slot 1348 from dd19221c404fb2fc4da37229de56bab755c76f2b
Moving slot 1349 from dd19221c404fb2fc4da37229de56bab755c76f2b
Moving slot 1350 from dd19221c404fb2fc4da37229de56bab755c76f2b
Moving slot 1351 from dd19221c404fb2fc4da37229de
确认之后,redis-trib就开始执行分片操作,将哈希槽一个一个从源主节点移动到7006目标主节点。
重新分片结束后我们可以check以下节点的分配情况。
[root@localhost src]# ./redis-trib.rb check 192.168.1.160:
>>> Performing Cluster Check (using node 192.168.1.160:)
M: 2335477842e1b02e143fabaf0d77d12e1e8e6f56 192.168.1.160:
slots:-,- ( slots) master
additional replica(s)
M: 6befec567ca7090eb3731e48fd5275a9853fb394 192.168.1.105:
slots:- ( slots) master
additional replica(s)
S: 28a51a8e34920e2d48fc1650a9c9753ff73dad5d 192.168.1.105:
slots: ( slots) slave
replicates cf02aa3d58d48215d9d61121eedd194dc5c50eeb
M: 94f51658302cb5f1d178f14caaa79f27a9ac3703 192.168.1.160:
slots:- ( slots) master
additional replica(s)
S: 54ca4fbc71257fd1be5b58d0f545b95d65f8f6b8 192.168.1.160:
slots: ( slots) slave
replicates 6befec567ca7090eb3731e48fd5275a9853fb394
S: 910e14d9655a1e6e7fc007e799006d3f0d1cebe5 192.168.1.105:
slots: ( slots) slave
replicates 94f51658302cb5f1d178f14caaa79f27a9ac3703
M: cf02aa3d58d48215d9d61121eedd194dc5c50eeb 192.168.1.160:
slots:- ( slots) master
additional replica(s)
[OK] All nodes agree about slots configuration. slots:-,- ( slots) master
可以看到7007节点分片的哈希槽片不是连续的,间隔的移动。
[root@localhost src]# ./redis-cli -p -c -h 192.168.1.160
192.168.1.160:> get aa
-> Redirected to slot [] located at 192.168.1.160:
"aa"
192.168.1.160:>
可以看到将7006的aa[1180]移动到7004节点上,表明主节点7006添加成功。
2、新增从节点
新增一个节点7007节点,使用add-node --slave命令。
redis-trib增加从节点的命令为:
./redis-trib.rb add-node --slave --master-id $[nodeid] 192.168.1.160: 192.168.1.160:
nodeid为要加到master主节点的node id,192.168.1.160:7007为新增的从节点,192.168.1.160:7005为集群的一个节点(集群的任意节点都行),用来辨识是哪个集群;如果没有给定那个主节点--master-id的话,redis-trib将会新增的从节点随机到从节点较少的主节点上。
现在指定主节点添加从节点,给7006增加7007从节点。。。
./redis-trib.rb add-node --slave --master-id 2335477842e1b02e143fabaf0d77d12e1e8e6f56 192.168.1.160: 192.168.1.160:
[root@localhost src]# ./redis-trib.rb add-node --slave --master-id 2335477842e1b02e143fabaf0d77d12e1e8e6f56 192.168.1.160: 192.168.1.160:
>>> Adding node 192.168.1.160: to cluster 192.168.1.160:
>>> Performing Cluster Check (using node 192.168.1.160:)
S: 54ca4fbc71257fd1be5b58d0f545b95d65f8f6b8 192.168.1.160:
slots: ( slots) slave
replicates 6befec567ca7090eb3731e48fd5275a9853fb394
S: 28a51a8e34920e2d48fc1650a9c9753ff73dad5d 192.168.1.105:
slots: ( slots) slave
replicates cf02aa3d58d48215d9d61121eedd194dc5c50eeb
M: 2335477842e1b02e143fabaf0d77d12e1e8e6f56 192.168.1.160:
slots:-,- ( slots) master
additional replica(s)
M: cf02aa3d58d48215d9d61121eedd194dc5c50eeb 192.168.1.160:
slots:- ( slots) master
additional replica(s)
M: 94f51658302cb5f1d178f14caaa79f27a9ac3703 192.168.1.160:
slots:- ( slots) master
additional replica(s)
M: 6befec567ca7090eb3731e48fd5275a9853fb394 192.168.1.105:
slots:- ( slots) master
additional replica(s)
S: 910e14d9655a1e6e7fc007e799006d3f0d1cebe5 192.168.1.105:
slots: ( slots) slave
replicates 94f51658302cb5f1d178f14caaa79f27a9ac3703
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
[WARNING] Node 192.168.1.160: has slots in importing state ().
[WARNING] Node 192.168.1.160: has slots in migrating state ().
[WARNING] The following slots are open:
>>> Check slots coverage...
[OK] All slots covered.
>>> Send CLUSTER MEET to node 192.168.1.160: to make it join the cluster.
Waiting for the cluster to join...
>>> Configure node as replica of 192.168.1.160:.
[OK] New node added correctly.
自此从节点添加成功。
六、节点的移除
和添加节点一样,移除节点也有移除主节点,从节点。
1、移除主节点
移除节点使用redis-trib的del-node命令,
./redis-trib.rb del-node 192.168.1.160: ${node-id}
192.168.1.160:7005为集群节点,node-id为要删除的主节点。和添加节点不同,移除节点node-id是必需的,测试删除7006主节点:
./redis-trib.rb del-node 192.168.1.160: 2335477842e1b02e143fabaf0d77d12e1e8e6f56 [root@localhost src]# ./redis-trib.rb del-node 192.168.1.160: 2335477842e1b02e143fabaf0d77d12e1e8e6f56
>>> Removing node 2335477842e1b02e143fabaf0d77d12e1e8e6f56 from cluster 192.168.1.160:
[ERR] Node 192.168.1.160: is not empty! Reshard data away and try again.
redis cluster提示7006已经有数据了,不能够被删除,需要将他的数据转移出去,也就是和新增主节点一样需重新分片。
[root@localhost redis-cluster]# ./redis-trib.rb reshard 192.168.1.160:
执行以后会提示我们移除的大小,因为7006占用了2546个槽点
>>> Check for open slots...
>>> Check slots coverage...
[OK] All slots covered.
How many slots do you want to move (from to )?
提示移动的node id,填写7004的node id,用来接收7006的solt。
How many slots do you want to move (from to )?
What is the receiving node ID? 2335477842e1b02e143fabaf0d77d12e1e8e6f56 #接收的node id
需要移动到全部主节点上还是单个主节点
Please enter all the source node IDs.
Type 'all' to use all the nodes as source nodes for the hash slots.
Type 'done' once you entered all the source nodes IDs.
Source node #: c1fafa48cb761eeddcc56e8c821eae5fef6a28bc #删除的node id
Source node #: done
Do you want to proceed with the proposed reshard plan (yes/no)? yes
确认之后7006的卡槽是否移到到7000上:
[root@localhost src]# ./redis-trib.rb check 192.168.1.160:
>>> Performing Cluster Check (using node 192.168.1.160:)
M: c1fafa48cb761eeddcc56e8c821eae5fef6a28bc 192.168.1.160:
slots: ( slots) master
additional replica(s)
S: 94f51658302cb5f1d178f14caaa79f27a9ac3703 192.168.1.160:
slots: ( slots) slave
replicates 910e14d9655a1e6e7fc007e799006d3f0d1cebe5
S: 54ca4fbc71257fd1be5b58d0f545b95d65f8f6b8 192.168.1.160:
slots: ( slots) slave
replicates 6befec567ca7090eb3731e48fd5275a9853fb394
M: 28a51a8e34920e2d48fc1650a9c9753ff73dad5d 192.168.1.105:
slots:-,- ( slots) master
additional replica(s)
S: cf02aa3d58d48215d9d61121eedd194dc5c50eeb 192.168.1.160:
slots: ( slots) slave
replicates 28a51a8e34920e2d48fc1650a9c9753ff73dad5d
M: 910e14d9655a1e6e7fc007e799006d3f0d1cebe5 192.168.1.105:
slots:- ( slots) master
additional replica(s)
M: 6befec567ca7090eb3731e48fd5275a9853fb394 192.168.1.105:
slots:- ( slots) master
additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All slots covered.
可以看到7000有9625个卡槽,而7007有0个卡槽。
./redis-trib.rb del-node 192.168.1.160: 2335477842e1b02e143fabaf0d77d12e1e8e6f56
2、移除从节点
比如删除7007节点:
[root@localhost src]# ./redis-trib.rb del-node 192.168.1.160: 2335477842e1b02e143fabaf0d77d12e1e8e6f56
>>> Removing node 2335477842e1b02e143fabaf0d77d12e1e8e6f56 from cluster 192.168.1.160:
>>> Sending CLUSTER FORGET messages to the cluster...
>>> SHUTDOWN the node.
ok,测试到这儿吧。
Node has slots in importing state异常解决:
[WARNING] Node 192.168.1.160:7006 has slots in importing state (1180).
[WARNING] Node 192.168.1.160:7004 has slots in migrating state (1180).
[WARNING] The following slots are open: 1180
解决方案:redis-cli客户端登录7004、7006端口,分别执行cluster setslot 1180 stable命令,如下所示:
[root@localhost src]# ./redis-cli -c -h 192.168.1.160 -p
192.168.1.160:> cluster setslot stable
OK [root@localhost src]# ./redis-cli -c -h 192.168.1.160 -p
192.168.1.160:> cluster setslot stable
OK
Redis 3.2.4集群实战的更多相关文章
- 项目实战11—企业级nosql数据库应用与实战-redis的主从和集群
企业级nosql数据库应用与实战-redis 环境背景:随着互联网2.0时代的发展,越来越多的公司更加注重用户体验和互动,这些公司的平台上会出现越来越多方便用户操作和选择的新功能,如优惠券发放.抢红包 ...
- 近千节点的Redis Cluster高可用集群案例:优酷蓝鲸优化实战(摘自高可用架构)
(原创)2016-07-26 吴建超 高可用架构导读:Redis Cluster 作者建议的最大集群规模 1,000 节点,目前优酷在蓝鲸项目中管理了超过 700 台节点,积累了 Redis Clus ...
- redis3.0 集群实战1 -- 安装和配置
本文主要是在centos7上安装和配置redis集群实战 参考: http://hot66hot.iteye.com/blog/2050676 集群教程: http://redisdoc.com/to ...
- 基于redis 3.x搭建集群环境
由于我团队开发的在线坐席系统,即将面对线上每周3000W的下行投放客户,产品的咨询量可能会很大,基于前期,200W的投放时,前10分钟,大概800问题量,平均一个客户大概8个问题,也就是说每分钟10个 ...
- Redis 中常见的集群部署方案
Redis 的高可用集群 前言 几种常用的集群方案 主从集群模式 全量同步 增量同步 哨兵机制 什么是哨兵机制 如何保证选主的准确性 如何选主 选举主节点的规则 哨兵进行主节点切换 切片集群 Redi ...
- Redis 3.0 Cluster集群配置
Redis 3.0 Cluster集群配置 安装环境依赖 安装gcc:yum install gcc 安装zlib:yum install zib 安装ruby:yum install ruby 安装 ...
- 分布式缓存技术redis学习系列(四)——redis高级应用(集群搭建、集群分区原理、集群操作)
本文是redis学习系列的第四篇,前面我们学习了redis的数据结构和一些高级特性,点击下面链接可回看 <详细讲解redis数据结构(内存模型)以及常用命令> <redis高级应用( ...
- redis + 主从 + 持久化 + 分片 + 集群 + spring集成
Redis是一个基于内存的数据库,其不仅读写速度快,每秒可以执行大约110000的写操作,81000的读取操作,而且其支持存储字符串,哈希结构,链表,集合丰富的数据类型.所以得到很多开发者的青睐.加之 ...
- 分布式缓存技术redis学习(四)——redis高级应用(集群搭建、集群分区原理、集群操作)
本文是redis学习系列的第四篇,前面我们学习了redis的数据结构和一些高级特性,点击下面链接可回看 <详细讲解redis数据结构(内存模型)以及常用命令> <redis高级应用( ...
随机推荐
- *单链表[递归&不带头结点]
不带头结点的单链表,递归法比较简明!(必背!) 单链表的结构: typedef struct node{ int data; struct node *next; }*List,Node; 创建第一种 ...
- C#版ObjectId
近来在准备弄一个开源的HIS,但一周过去了几乎没有进度.就卡在ID如何生成.HIS的数据库压力大,如何多数据库支持,减轻压力一直想去实现.拿不准纯数字ID段还是GUID一类的文本ID.最终在mongo ...
- Swift: 是用Custom Segue还是用Transition动画
用一个很简单的场景做为例子:在storyboard上,你有用UINavigationController串起来两个UIViewController.这两个controller之间要互相跳转,A-> ...
- JQuery设置和去除disabled属性 与 display显示隐藏
//两种方法设置disabled属性 $('#areaSelect').attr("disabled",true); $('#areaSelect').attr("dis ...
- Set tooltip on customized tab header in WPF
<UserControl> <UserControl.Resources> <ResourceDictionary> <ResourceDictionary. ...
- Hdu2819 Swap
Swap Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- Hdu2068 RPG的错排 2017-06-27 15:27 30人阅读 评论(0) 收藏
RPG的错排 Time Limit : 1000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Submis ...
- Maven提高篇系列之五——处理依赖冲突
个人分类: Maven 不知道你在使用Maven时是否遇到过诸如"NoSuchMethodError"或"ClassNotFoundException"之类的问 ...
- bootstrap4相关文档
本节课我们主要学习一下Bootstrap的两个个组件功能:输入框组件和导航导航条组件. 一.输入框组件 文本输入框就是可以在<input>元素前后加上文字或按钮,可以实现对表单控件的扩 展 ...
- DXP 板层
一)DXP-设置板层(D+K )在PCB编辑 Design->Layer Stack Manager(层管理) 1)快捷命令 D + K 进入么多层置管理器 2.鼠标右键 TopLayer- ...