前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >redis实际操作部署篇(二)

redis实际操作部署篇(二)

作者头像
灰子学技术
发布2021-01-06 17:52:41
5950
发布2021-01-06 17:52:41
举报
文章被收录于专栏:灰子学技术

写在前面的话:

对于redis来说,它有四种部署模式,分别是单机模式、主从模式、哨兵模式和集群模式,他们的使用场景有些区别,当然也是越来越复杂,可靠性越来越高。

本文从实际操作的角度,来介绍和讲解下,这几种模式的特点,鉴于篇幅的问题,文章分成两篇,一篇用来介绍:单机模式、主从模式和哨兵模式;本篇文章是,另外一个模式的介绍:集群模式。

一、集群模式解决什么问题呢?

集群模式用来解决Redis的在线扩容的问题,原因是:Redis容量受限于单机配置的问题,并且前面的几种模式并不能很好的做到这一点。

集群模式有三种方式:客户端实现、Proxy代理层、服务端实现。

本文章主要讲解服务端实现方式,服务端的实现方式就是标准的集群(分区分片)模式,RedisCluster是Redis在3.0版本后推出的分布式解决方案。

Cluster模式实现了Redis的分布式存储,即每台节点存储不同的内容,来解决在线扩容的问题。

二、Cluster模式的工作机制是什么?

在Redis的每个节点上,都有一个插槽(slot),总共16384个哈希槽,取值范围为0-16383。采用Slot的设计(一个集群有多个主从节点,一个主从节点上会分配多个Slot槽,每个槽点上存的是Key-Value数据):

当我们存取key的时候,Redis会根据CRC16的算法得出一个结果,然后把结果对16384求余数,这样每个key都会对应一个编号在0-16383之间的哈希槽,通过这个值,去找到对应的插槽所对应的节点,然后直接自动跳转到这个对应的节点上进行存取操作。如图所示:

代码语言:javascript
复制
1.为了保证高可用,Cluster模式也引入主从复制模式,一个主节点对应一个或者多个从节点,当主节点宕机的时候,就会启用从节点。(备注:这里的从节点只是做备份来用,不作为读写分离来操作。)2.当其它主节点ping一个主节点A时,如果半数以上的主节点与A通信超时,那么认为主节点A宕机了。如果主节点A和它的从节点都宕机了,那么该集群就无法再提供服务了。
备注:Cluster模式集群节点最小配置6个节点(3主3从,因为需要半数以上)

三、集群部署实际操作

1. 配置和启动集群

1)修改配置文件,这里分别启动7001~7006六个redis服务:

代码语言:javascript
复制
#修改成自己对应的端口号port 7001 #指定了记录日志的文件。logfile #数据目录,数据库的写入会在这个目录。rdb、aof文件也会写在这个目录dir #是否开启集群cluster-enabled#集群配置文件的名称,每个节点都有一个集群相关的配置文件,持久化保存集群的信息。#这个文件并不需要手动配置,这个配置文件由Redis生成并更新,每个Redis集群节点需要一个单独的配置文件,请确保与实例运行的系统中配置文件名称不冲突(建议配对应端口号)cluster-config-file nodes-7001.conf#节点互连超时的阀值。集群节点超时毫秒数cluster-node-timeout 15000 #默认redis使用的是rdb方式持久化,这种方式在许多应用中已经足够用了。#但是redis如果中途宕机,会导致可能有几分钟的数据丢失,根据save来策略进行持久化,Append Only File是另一种持久化方式,可以提供更好的持久化特性。#Redis会把每次写入的数据在接收后都写入 appendonly.aof 文件,每次启动时Redis都会先把这个文件的数据读入内存里,先忽略RDB文件。appendonly yesprotected-mode no #保护模式 yes改为nobind 127.0.0.1 #本机试验,使用这个ip,这里也可以指定为集群的IPdaemonize yes   #用来指定redis是否要用守护线程的方式启动,yes表示后台启动

2)启动redis-server:

按照下面的命令来分别启动7001~7006六个服务:

代码语言:javascript
复制
$ redis-server /usr/local/etc/redis7005.conf14903:C 05 Jan 2021 11:50:05.601 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo14903:C 05 Jan 2021 11:50:05.601 # Redis version=5.0.5, bits=64, commit=00000000, modified=0, pid=14903, just started14903:C 05 Jan 2021 11:50:05.601 # Configuration loaded

显示启动的redis-server:

代码语言:javascript
复制
$ ps -ef | grep redis  501 14867     1   0 11:45上午 ??         0:00.66 redis-server 127.0.0.1:7001 [cluster]  501 14884     1   0 11:48上午 ??         0:00.17 redis-server 127.0.0.1:7002 [cluster]  501 14887     1   0 11:49上午 ??         0:00.08 redis-server 127.0.0.1:7003 [cluster]  501 14890     1   0 11:49上午 ??         0:00.06 redis-server 127.0.0.1:7004 [cluster]  501 28799     1   0 171120  ??        45:20.39 redis-server 127.0.0.1:7005 [cluster]  501 28801     1   0 171120  ??        47:39.12 redis-server 127.0.0.1:7006 [cluster]  501 13669   841   0 10:11上午 ttys002    0:00.01 redis-cli -h 127.0.0.1 -p 7001  501 14897 14516   0 11:49上午 ttys007    0:00.00 grep redis

3)设置为cluster集群模式:

命令: redis-cli --cluster create 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 --cluster-replicas 1

代码语言:javascript
复制
# 1表示每个主节点至少一个备份
代码语言:javascript
复制
$ redis-cli --cluster create 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 --cluster-replicas 1>>> Performing hash slots allocation on 6 nodes...Master[0] -> Slots 0 - 5460Master[1] -> Slots 5461 - 10922Master[2] -> Slots 10923 - 16383Adding replica 127.0.0.1:7005 to 127.0.0.1:7001Adding replica 127.0.0.1:7006 to 127.0.0.1:7002Adding replica 127.0.0.1:7004 to 127.0.0.1:7003>>> Trying to optimize slaves allocation for anti-affinity[WARNING] Some slaves are in the same host as their masterM: 4359ede424a92c7f249fb6524c6cc3f6dc46fb60 127.0.0.1:7001   slots:[0-5460] (5461 slots) masterM: 2c779d5cc0b786af908d1c76dd3d4968e15796b3 127.0.0.1:7002   slots:[5461-10922] (5462 slots) masterM: 62c2ac721e402a27f017be49589bc06532548cdd 127.0.0.1:7003   slots:[10923-16383] (5461 slots) masterS: 2b51a786e6f204c292dc349b45aa8b515637382c 127.0.0.1:7004   replicates 62c2ac721e402a27f017be49589bc06532548cddS: 357221f17c5f5bf11d0551506fbff245ed0c047b 127.0.0.1:7005   replicates 4359ede424a92c7f249fb6524c6cc3f6dc46fb60S: 2ecce47670970e13a034a37dd425154d298dc480 127.0.0.1:7006   replicates 2c779d5cc0b786af908d1c76dd3d4968e15796b3Can I set the above configuration? (type 'yes' to accept): yes>>> Nodes configuration updated>>> Assign a different config epoch to each node>>> Sending CLUSTER MEET messages to join the clusterWaiting for the cluster to join.....>>> Performing Cluster Check (using node 127.0.0.1:7001)M: 4359ede424a92c7f249fb6524c6cc3f6dc46fb60 127.0.0.1:7001   slots:[0-5460] (5461 slots) master   1 additional replica(s)S: 2ecce47670970e13a034a37dd425154d298dc480 127.0.0.1:7006   slots: (0 slots) slave   replicates 2c779d5cc0b786af908d1c76dd3d4968e15796b3M: 2c779d5cc0b786af908d1c76dd3d4968e15796b3 127.0.0.1:7002   slots:[5461-10922] (5462 slots) master   1 additional replica(s)S: 2b51a786e6f204c292dc349b45aa8b515637382c 127.0.0.1:7004   slots: (0 slots) slave   replicates 62c2ac721e402a27f017be49589bc06532548cddM: 62c2ac721e402a27f017be49589bc06532548cdd 127.0.0.1:7003   slots:[10923-16383] (5461 slots) master   1 additional replica(s)S: 357221f17c5f5bf11d0551506fbff245ed0c047b 127.0.0.1:7005   slots: (0 slots) slave   replicates 4359ede424a92c7f249fb6524c6cc3f6dc46fb60[OK] All nodes agree about slots configuration.>>> Check for open slots...>>> Check slots coverage...[OK] All 16384 slots covered.

备注:这一步碰到的问题:

代码语言:javascript
复制
$ redis-cli --cluster create 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 --cluster-replicas 1[ERR] Node 127.0.0.1:7003 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.

解决方法:

1)将每个节点下aof、rdb、nodes.conf本地备份文件删除; 2)172.168.63.201:7001> flushdb #清空当前数据库(可省略)

代码语言:javascript
复制
$redis-cli -p 7000
127.0.0.1:7000> flushall
127.0.0.1:7000> cluster reset
127.0.0.1:7000> exit

3)之后再执行脚本,成功执行

详情可以参考:

https://www.jianshu.com/p/338bc2a74300

https://stackoverflow.com/questions/37206993/redis-server-cluster-not-working

2. 集群检查

1) 查看集群信息以及slot分配信息:

代码语言:javascript
复制
$ redis-cli -h 127.0.0.1 -p 7001127.0.0.1:7001> cluster node(error) ERR Unknown subcommand or wrong number of arguments for 'node'. Try CLUSTER HELP.127.0.0.1:7001> cluster nodes2ecce47670970e13a034a37dd425154d298dc480 127.0.0.1:7006@17006 slave 2c779d5cc0b786af908d1c76dd3d4968e15796b3 0 1609823130000 6 connected2c779d5cc0b786af908d1c76dd3d4968e15796b3 127.0.0.1:7002@17002 master - 0 1609823129000 2 connected 5461-109222b51a786e6f204c292dc349b45aa8b515637382c 127.0.0.1:7004@17004 slave 62c2ac721e402a27f017be49589bc06532548cdd 0 1609823128000 4 connected4359ede424a92c7f249fb6524c6cc3f6dc46fb60 127.0.0.1:7001@17001 myself,master - 0 1609823128000 1 connected 0-546062c2ac721e402a27f017be49589bc06532548cdd 127.0.0.1:7003@17003 master - 0 1609823130975 3 connected 10923-16383357221f17c5f5bf11d0551506fbff245ed0c047b 127.0.0.1:7005@17005 slave 4359ede424a92c7f249fb6524c6cc3f6dc46fb60 0 1609823129000 5 connected127.0.0.1:7001>

介绍:可以根据以上得出总共有3个master节点,每个节点有一个slave节点,三个master节点分别分配了0-5460、5461-10922、10923-16383三个slot范围,7001这个master节点的slave节点为7005节点,其id为4359ede424a92c7f249fb6524c6cc3f6dc46fb60

2)添加数据,数据会根hash然后存到对应的slot槽,会存到slot槽对应的节点上

代码语言:javascript
复制
$ redis-cli -c -h 127.0.0.1 -p 7001 // -c 是集群方式启动127.0.0.1:7001> set 122 11 // hash在本机7001OK127.0.0.1:7001> set 1221 222 // hash到了7003-> Redirected to slot [13341] located at 127.0.0.1:7003OK127.0.0.1:7003> set 12233 222 // hash到了7002-> Redirected to slot [6669] located at 127.0.0.1:7002OK127.0.0.1:7002> set 12233 111 // hash到了7003OK127.0.0.1:7002> keys *1) "12233"127.0.0.1:7002>

备注:

代码语言:javascript
复制
127.0.0.1:7002> set 6666 6 (error) MOVED 1491 127.0.0.1:7001 // 提示这个错误是因为没有按照集群启动redis-cli

3.宕机测试

测试步骤:关掉7001,查看集群,发现7001的slave变成master,重启7001,发现7001变成7005的salve。

1)关掉7001

代码语言:javascript
复制
$ kill 14867$ ps -ef | grep redis  501 14884     1   0 11:48上午 ??         0:14.18 redis-server 127.0.0.1:7002 [cluster]  501 14887     1   0 11:49上午 ??         0:13.94 redis-server 127.0.0.1:7003 [cluster]  501 14890     1   0 11:49上午 ??         0:14.02 redis-server 127.0.0.1:7004 [cluster]  501 14904     1   0 11:50上午 ??         0:13.84 redis-server 127.0.0.1:7005 [cluster]  501 14907     1   0 11:50上午 ??         0:13.65 redis-server 127.0.0.1:7006 [cluster]  501 13669   841   0 10:11上午 ttys002    0:00.01 redis-cli -h 127.0.0.1 -p 7001  501 15295  7048   0  1:26下午 ttys004    0:00.02 redis-cli -c -h 127.0.0.1 -p 7001  501 15319 14516   0  1:32下午 ttys007    0:00.00 grep redis

2) 7005变成master

代码语言:javascript
复制
127.0.0.1:7003> cluster nodes2b51a786e6f204c292dc349b45aa8b515637382c 127.0.0.1:7004@17004 slave 62c2ac721e402a27f017be49589bc06532548cdd 0 1609824784402 4 connected357221f17c5f5bf11d0551506fbff245ed0c047b 127.0.0.1:7005@17005 master - 0 1609824786425 7 connected 0-54602c779d5cc0b786af908d1c76dd3d4968e15796b3 127.0.0.1:7002@17002 master - 0 1609824785000 2 connected 5461-1092262c2ac721e402a27f017be49589bc06532548cdd 127.0.0.1:7003@17003 myself,master - 0 1609824780000 3 connected 10923-163834359ede424a92c7f249fb6524c6cc3f6dc46fb60 127.0.0.1:7001@17001 master,fail - 1609824748365 1609824746000 1 disconnected2ecce47670970e13a034a37dd425154d298dc480 127.0.0.1:7006@17006 slave 2c779d5cc0b786af908d1c76dd3d4968e15796b3 0 1609824785413 6 connected127.0.0.1:7003>

3)重启7001,变成7005的salve

代码语言:javascript
复制
$ redis-server /usr/local/etc/redis7001.conf15354:C 05 Jan 2021 13:39:21.856 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo15354:C 05 Jan 2021 13:39:21.856 # Redis version=5.0.5, bits=64, commit=00000000, modified=0, pid=15354, just started15354:C 05 Jan 2021 13:39:21.856 # Configuration loaded$ ps -ef | grep redis  501 14884     1   0 11:48上午 ??         0:16.23 redis-server 127.0.0.1:7002 [cluster]  501 14887     1   0 11:49上午 ??         0:15.99 redis-server 127.0.0.1:7003 [cluster]  501 14890     1   0 11:49上午 ??         0:16.05 redis-server 127.0.0.1:7004 [cluster]  501 14904     1   0 11:50上午 ??         0:15.88 redis-server 127.0.0.1:7005 [cluster]  501 14907     1   0 11:50上午 ??         0:15.70 redis-server 127.0.0.1:7006 [cluster]  501 15355     1   0  1:39下午 ??         0:00.02 redis-server 127.0.0.1:7001 [cluster]  501 13669   841   0 10:11上午 ttys002    0:00.01 redis-cli -h 127.0.0.1 -p 7001  501 15295  7048   0  1:26下午 ttys004    0:00.02 redis-cli -c -h 127.0.0.1 -p 7001  501 15360 14516   0  1:39下午 ttys007    0:00.00 grep red

cluster nodes查看:

代码语言:javascript
复制
127.0.0.1:7003> cluster nodes2b51a786e6f204c292dc349b45aa8b515637382c 127.0.0.1:7004@17004 slave 62c2ac721e402a27f017be49589bc06532548cdd 0 1609825212544 4 connected357221f17c5f5bf11d0551506fbff245ed0c047b 127.0.0.1:7005@17005 master - 0 1609825211000 7 connected 0-54602c779d5cc0b786af908d1c76dd3d4968e15796b3 127.0.0.1:7002@17002 master - 0 1609825209000 2 connected 5461-1092262c2ac721e402a27f017be49589bc06532548cdd 127.0.0.1:7003@17003 myself,master - 0 1609825208000 3 connected 10923-163834359ede424a92c7f249fb6524c6cc3f6dc46fb60 127.0.0.1:7001@17001 slave 357221f17c5f5bf11d0551506fbff245ed0c047b 0 1609825210000 7 connected2ecce47670970e13a034a37dd425154d298dc480 127.0.0.1:7006@17006 slave 2c779d5cc0b786af908d1c76dd3d4968e15796b3 0 1609825211533 6 connected127.0.0.1:7003>

4.水平拓展

场景是集群能力不够的时候,扩容用的,下面新增7007,7008来演示下。

1) 新增集群配置 7007和7008,按照前面方法操作,启动如下:

代码语言:javascript
复制
$ ps -ef | grep redis  501 14884     1   0 11:48上午 ??         0:19.85 redis-server 127.0.0.1:7002 [cluster]  501 14887     1   0 11:49上午 ??         0:19.64 redis-server 127.0.0.1:7003 [cluster]  501 14890     1   0 11:49上午 ??         0:19.64 redis-server 127.0.0.1:7004 [cluster]  501 14904     1   0 11:50上午 ??         0:19.51 redis-server 127.0.0.1:7005 [cluster]  501 14907     1   0 11:50上午 ??         0:19.29 redis-server 127.0.0.1:7006 [cluster]  501 15355     1   0  1:39下午 ??         0:03.61 redis-server 127.0.0.1:7001 [cluster]  501 15426     1   0  1:54下午 ??         0:00.61 redis-server 127.0.0.1:7007 [cluster]  501 15430     1   0  1:54下午 ??         0:00.59 redis-server 127.0.0.1:7008 [cluster]  501 13669   841   0 10:11上午 ttys002    0:00.01 redis-cli -h 127.0.0.1 -p 7001  501 15295  7048   0  1:26下午 ttys004    0:00.02 redis-cli -c -h 127.0.0.1 -p 7001  501 15446 14516   0  1:57下午 ttys007    0:00.00 grep redis

尽管7007,7008启动了,但是集群中并没有这两个服务

代码语言:javascript
复制
127.0.0.1:7003> cluster nodes2b51a786e6f204c292dc349b45aa8b515637382c 127.0.0.1:7004@17004 slave 62c2ac721e402a27f017be49589bc06532548cdd 0 1609827727127 4 connected357221f17c5f5bf11d0551506fbff245ed0c047b 127.0.0.1:7005@17005 master - 0 1609827726116 7 connected 0-54602c779d5cc0b786af908d1c76dd3d4968e15796b3 127.0.0.1:7002@17002 master - 0 1609827724000 2 connected 5461-1092262c2ac721e402a27f017be49589bc06532548cdd 127.0.0.1:7003@17003 myself,master - 0 1609827724000 3 connected 10923-163834359ede424a92c7f249fb6524c6cc3f6dc46fb60 127.0.0.1:7001@17001 slave 357221f17c5f5bf11d0551506fbff245ed0c047b 0 1609827725104 7 connected2ecce47670970e13a034a37dd425154d298dc480 127.0.0.1:7006@17006 slave 2c779d5cc0b786af908d1c76dd3d4968e15796b3 0 1609827724094 6 connected127.0.0.1:7003>

2)7007加入到集群中,并把他变为master

增加主节点7007,其中7002是集群里面随便选择的一个master节点。

代码语言:javascript
复制
$ redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7002>>> Adding node 127.0.0.1:7007 to cluster 127.0.0.1:7002>>> Performing Cluster Check (using node 127.0.0.1:7002)M: 2c779d5cc0b786af908d1c76dd3d4968e15796b3 127.0.0.1:7002   slots:[5461-10922] (5462 slots) master   1 additional replica(s)S: 2b51a786e6f204c292dc349b45aa8b515637382c 127.0.0.1:7004   slots: (0 slots) slave   replicates 62c2ac721e402a27f017be49589bc06532548cddM: 62c2ac721e402a27f017be49589bc06532548cdd 127.0.0.1:7003   slots:[10923-16383] (5461 slots) master   1 additional replica(s)S: 4359ede424a92c7f249fb6524c6cc3f6dc46fb60 127.0.0.1:7001   slots: (0 slots) slave   replicates 357221f17c5f5bf11d0551506fbff245ed0c047bM: 357221f17c5f5bf11d0551506fbff245ed0c047b 127.0.0.1:7005   slots:[0-5460] (5461 slots) master   1 additional replica(s)S: 2ecce47670970e13a034a37dd425154d298dc480 127.0.0.1:7006   slots: (0 slots) slave   replicates 2c779d5cc0b786af908d1c76dd3d4968e15796b3[OK] All nodes agree about slots configuration.>>> Check for open slots...>>> Check slots coverage...[OK] All 16384 slots covered.>>> Send CLUSTER MEET to node 127.0.0.1:7007 to make it join the cluster.[OK] New node added correctly.

检查7007是否成功加入,但是发现7007没有index

代码语言:javascript
复制
$ redis-cli -c -h 127.0.0.1 -p 7001127.0.0.1:7001> cluster nodes357221f17c5f5bf11d0551506fbff245ed0c047b 127.0.0.1:7005@17005 master - 0 1609827919000 7 connected 0-546062c2ac721e402a27f017be49589bc06532548cdd 127.0.0.1:7003@17003 master - 0 1609827920739 3 connected 10923-163832ecce47670970e13a034a37dd425154d298dc480 127.0.0.1:7006@17006 slave 2c779d5cc0b786af908d1c76dd3d4968e15796b3 0 1609827917706 6 connected2c779d5cc0b786af908d1c76dd3d4968e15796b3 127.0.0.1:7002@17002 master - 0 1609827919728 2 connected 5461-109222b51a786e6f204c292dc349b45aa8b515637382c 127.0.0.1:7004@17004 slave 62c2ac721e402a27f017be49589bc06532548cdd 0 1609827918000 4 connected8dd6f8799e364e86e3df2acbbc42885482e5f526 127.0.0.1:7007@17007 master - 0 1609827917000 0 connected4359ede424a92c7f249fb6524c6cc3f6dc46fb60 127.0.0.1:7001@17001 myself,slave 357221f17c5f5bf11d0551506fbff245ed0c047b 0 1609827918000 1 connected127.0.0.1:7001>

分配hash槽位给7007:

命令:$redis-cli --cluster reshard 127.0.0.1:7002 // 7002是随机选的一个master

代码语言:javascript
复制
[OK] All 16384 slots covered.How many slots do you want to move (from 1 to 16384)? 2000 // 这里设置7007所需要的 槽位数量What is the receiving node ID? 8dd6f8799e364e86e3df2acbbc42885482e5f526 // 7007对应的idPlease 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 #1: all // 类型选择的是每一个master平均分配的方式。

检查分结果:

代码语言:javascript
复制
$ redis-cli -c -h 127.0.0.1 -p 7001127.0.0.1:7001> cluster nodes357221f17c5f5bf11d0551506fbff245ed0c047b 127.0.0.1:7005@17005 master - 0 1609828313000 7 connected 666-546062c2ac721e402a27f017be49589bc06532548cdd 127.0.0.1:7003@17003 master - 0 1609828315610 3 connected 11589-163832ecce47670970e13a034a37dd425154d298dc480 127.0.0.1:7006@17006 slave 2c779d5cc0b786af908d1c76dd3d4968e15796b3 0 1609828314000 6 connected2c779d5cc0b786af908d1c76dd3d4968e15796b3 127.0.0.1:7002@17002 master - 0 1609828314596 2 connected 6128-109222b51a786e6f204c292dc349b45aa8b515637382c 127.0.0.1:7004@17004 slave 62c2ac721e402a27f017be49589bc06532548cdd 0 1609828313000 4 connected8dd6f8799e364e86e3df2acbbc42885482e5f526 127.0.0.1:7007@17007 master - 0 1609828314000 8 connected 0-665 5461-6127 10923-115884359ede424a92c7f249fb6524c6cc3f6dc46fb60 127.0.0.1:7001@17001 myself,slave 357221f17c5f5bf11d0551506fbff245ed0c047b 0 1609828312000 1 connected

分析:发现每一个master都分配了一部分槽位给7007,如下:0-665 5461-6127 10923-11588

3) 7008加入到集群中,并把他变为salve

添加7008到集群:$ redis-cli --cluster add-node 127.0.0.1:7008 127.0.0.1:7002

代码语言:javascript
复制
[OK] All nodes agree about slots configuration.>>> Check for open slots...>>> Check slots coverage...[OK] All 16384 slots covered.>>> Send CLUSTER MEET to node 127.0.0.1:7008 to make it join the cluster.[OK] New node added correctly.$ redis-cli -c -h 127.0.0.1 -p 7001127.0.0.1:7001> cluster nodes558579e037a19ecc2fc541c121df379bba9ab853 127.0.0.1:7008@17008 master - 0 1609828830000 0 connected357221f17c5f5bf11d0551506fbff245ed0c047b 127.0.0.1:7005@17005 master - 0 1609828831852 7 connected 666-546062c2ac721e402a27f017be49589bc06532548cdd 127.0.0.1:7003@17003 master - 0 1609828828000 3 connected 11589-163832ecce47670970e13a034a37dd425154d298dc480 127.0.0.1:7006@17006 slave 2c779d5cc0b786af908d1c76dd3d4968e15796b3 0 1609828830000 6 connected2c779d5cc0b786af908d1c76dd3d4968e15796b3 127.0.0.1:7002@17002 master - 0 1609828829000 2 connected 6128-109222b51a786e6f204c292dc349b45aa8b515637382c 127.0.0.1:7004@17004 slave 62c2ac721e402a27f017be49589bc06532548cdd 0 1609828830000 4 connected8dd6f8799e364e86e3df2acbbc42885482e5f526 127.0.0.1:7007@17007 master - 0 1609828830843 8 connected 0-665 5461-6127 10923-115884359ede424a92c7f249fb6524c6cc3f6dc46fb60 127.0.0.1:7001@17001 myself,slave 357221f17c5f5bf11d0551506fbff245ed0c047b 0 1609828828000 1 connected127.0.0.1:7001>

指定7008的master为7007,命令:

cluster replicate 8dd6f8799e364e86e3df2acbbc42885482e5f526

代码语言:javascript
复制
$ redis-cli -c -h 127.0.0.1 -p 7008127.0.0.1:7008> cluster replicate 8dd6f8799e364e86e3df2acbbc42885482e5f526OK127.0.0.1:7008> cluster nodes558579e037a19ecc2fc541c121df379bba9ab853 127.0.0.1:7008@17008 myself,slave 8dd6f8799e364e86e3df2acbbc42885482e5f526 0 1609829022000 0 connected4359ede424a92c7f249fb6524c6cc3f6dc46fb60 127.0.0.1:7001@17001 slave 357221f17c5f5bf11d0551506fbff245ed0c047b 0 1609829024000 7 connected8dd6f8799e364e86e3df2acbbc42885482e5f526 127.0.0.1:7007@17007 master - 0 1609829023000 8 connected 0-665 5461-6127 10923-11588357221f17c5f5bf11d0551506fbff245ed0c047b 127.0.0.1:7005@17005 master - 0 1609829020000 7 connected 666-546062c2ac721e402a27f017be49589bc06532548cdd 127.0.0.1:7003@17003 master - 0 1609829022956 3 connected 11589-163832b51a786e6f204c292dc349b45aa8b515637382c 127.0.0.1:7004@17004 slave 62c2ac721e402a27f017be49589bc06532548cdd 0 1609829023000 3 connected2c779d5cc0b786af908d1c76dd3d4968e15796b3 127.0.0.1:7002@17002 master - 0 1609829024977 2 connected 6128-109222ecce47670970e13a034a37dd425154d298dc480 127.0.0.1:7006@17006 slave 2c779d5cc0b786af908d1c76dd3d4968e15796b3 0 1609829023966 2 connected127.0.0.1:7008>

5. 节点下线

场景:与水平扩展相反的是节点下线,一旦不需要这么多服务或者节点坏掉,我们可以操作节点下线,并从集群中移除。

1)移除salve节点,命令:redis-cli --cluster del-node 127.0.0.1:7008 558579e037a19ecc2fc541c121df379bba9ab853

代码语言:javascript
复制
$ redis-cli --cluster del-node 127.0.0.1:7008 558579e037a19ecc2fc541c121df379bba9ab853>>> Removing node 558579e037a19ecc2fc541c121df379bba9ab853 from cluster 127.0.0.1:7008>>> Sending CLUSTER FORGET messages to the cluster...>>> SHUTDOWN the node.$ redis-cli -c -h 127.0.0.1 -p 7001127.0.0.1:7001> cluster nodes357221f17c5f5bf11d0551506fbff245ed0c047b 127.0.0.1:7005@17005 master - 0 1609829451017 7 connected 666-546062c2ac721e402a27f017be49589bc06532548cdd 127.0.0.1:7003@17003 master - 0 1609829449000 3 connected 11589-163832ecce47670970e13a034a37dd425154d298dc480 127.0.0.1:7006@17006 slave 2c779d5cc0b786af908d1c76dd3d4968e15796b3 0 1609829449000 6 connected2c779d5cc0b786af908d1c76dd3d4968e15796b3 127.0.0.1:7002@17002 master - 0 1609829446000 2 connected 6128-109222b51a786e6f204c292dc349b45aa8b515637382c 127.0.0.1:7004@17004 slave 62c2ac721e402a27f017be49589bc06532548cdd 0 1609829450009 4 connected8dd6f8799e364e86e3df2acbbc42885482e5f526 127.0.0.1:7007@17007 master - 0 1609829448000 8 connected 0-665 5461-6127 10923-115884359ede424a92c7f249fb6524c6cc3f6dc46fb60 127.0.0.1:7001@17001 myself,slave 357221f17c5f5bf11d0551506fbff245ed0c047b 0 1609829447000 1 connected127.0.0.1:7001>

2)移除master节点

回收hash槽位给集群:

代码语言:javascript
复制
$ redis-cli --cluster reshard 127.0.0.1:7002 //将7007的槽位回收给7005>>> Performing Cluster Check (using node 127.0.0.1:7007)M: 8dd6f8799e364e86e3df2acbbc42885482e5f526 127.0.0.1:7007   slots:[0-665],[5461-6127],[10923-11588] (1999 slots) masterS: 2b51a786e6f204c292dc349b45aa8b515637382c 127.0.0.1:7004   slots: (0 slots) slave   replicates 62c2ac721e402a27f017be49589bc06532548cddM: 62c2ac721e402a27f017be49589bc06532548cdd 127.0.0.1:7003   slots:[11589-16383] (4795 slots) master   1 additional replica(s)S: 2ecce47670970e13a034a37dd425154d298dc480 127.0.0.1:7006   slots: (0 slots) slave   replicates 2c779d5cc0b786af908d1c76dd3d4968e15796b3S: 4359ede424a92c7f249fb6524c6cc3f6dc46fb60 127.0.0.1:7001   slots: (0 slots) slave   replicates 357221f17c5f5bf11d0551506fbff245ed0c047bM: 2c779d5cc0b786af908d1c76dd3d4968e15796b3 127.0.0.1:7002   slots:[6128-10922] (4795 slots) master   1 additional replica(s)M: 357221f17c5f5bf11d0551506fbff245ed0c047b 127.0.0.1:7005   slots:[666-5460] (4795 slots) master   1 additional replica(s)[OK] All nodes agree about slots configuration.>>> Check for open slots...>>> Check slots coverage...[OK] All 16384 slots covered.How many slots do you want to move (from 1 to 16384)? 2000What is the receiving node ID? 357221f17c5f5bf11d0551506fbff245ed0c047bPlease 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 #1: 8dd6f8799e364e86e3df2acbbc42885482e5f526Source node #2: done

查看hash槽位结果,7007变为了0:

代码语言:javascript
复制
$ redis-cli -c -h 127.0.0.1 -p 7001127.0.0.1:7001> cluster nodes357221f17c5f5bf11d0551506fbff245ed0c047b 127.0.0.1:7005@17005 master - 0 1609830719272 9 connected 0-8578 10923-1236362c2ac721e402a27f017be49589bc06532548cdd 127.0.0.1:7003@17003 master - 0 1609830720283 3 connected 12364-163832ecce47670970e13a034a37dd425154d298dc480 127.0.0.1:7006@17006 slave 2c779d5cc0b786af908d1c76dd3d4968e15796b3 0 1609830721294 6 connected2c779d5cc0b786af908d1c76dd3d4968e15796b3 127.0.0.1:7002@17002 master - 0 1609830717248 2 connected 8579-109222b51a786e6f204c292dc349b45aa8b515637382c 127.0.0.1:7004@17004 slave 62c2ac721e402a27f017be49589bc06532548cdd 0 1609830719000 4 connected8dd6f8799e364e86e3df2acbbc42885482e5f526 127.0.0.1:7007@17007 master - 0 1609830718000 8 connected4359ede424a92c7f249fb6524c6cc3f6dc46fb60 127.0.0.1:7001@17001 myself,slave 357221f17c5f5bf11d0551506fbff245ed0c047b 0 1609830718000 1 connected127.0.0.1:7001>

下线7008,命令 redis-cli -p 7007 shutdown

代码语言:javascript
复制
$ redis-cli -p 7007 shutdown$ redis-cli -c -h 127.0.0.1 -p 7001127.0.0.1:7001> cluster nodes357221f17c5f5bf11d0551506fbff245ed0c047b 127.0.0.1:7005@17005 master - 0 1609830849507 9 connected 0-8578 10923-1236362c2ac721e402a27f017be49589bc06532548cdd 127.0.0.1:7003@17003 master - 0 1609830850515 3 connected 12364-163832ecce47670970e13a034a37dd425154d298dc480 127.0.0.1:7006@17006 slave 2c779d5cc0b786af908d1c76dd3d4968e15796b3 0 1609830850000 6 connected2c779d5cc0b786af908d1c76dd3d4968e15796b3 127.0.0.1:7002@17002 master - 0 1609830846472 2 connected 8579-109222b51a786e6f204c292dc349b45aa8b515637382c 127.0.0.1:7004@17004 slave 62c2ac721e402a27f017be49589bc06532548cdd 0 1609830848000 4 connected8dd6f8799e364e86e3df2acbbc42885482e5f526 127.0.0.1:7007@17007 master - 1609830839496 1609830838387 8 disconnected4359ede424a92c7f249fb6524c6cc3f6dc46fb60 127.0.0.1:7001@17001 myself,slave 357221f17c5f5bf11d0551506fbff245ed0c047b 0 1609830848000 1 connected

参考文档:

代码语言:javascript
复制
redis的几种模式:https://www.cnblogs.com/jing99/p/12651186.htmlclient的几种连接方式:https://blog.csdn.net/comprel/article/details/96716708哨兵模式:https://www.cnblogs.com/yangming1996/p/12677771.htmlredis官方文档:https://godoc.org/gopkg.in/redis.v5redis安装:https://juejin.im/post/6844904002270789645redis-cli命令:https://segmentfault.com/a/1190000022713251redis命令:http://redisdoc.com/string/mset.html
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 灰子学技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档