个人随笔
目录
八、Redis集群水平扩容
2020-12-16 23:00:34

Redis3.0以后的版本虽然有了集群功能,提供了比之前版本的哨兵模式更高的性能与可用性,但是集群的水平扩展却比较麻烦,今天就来带大家看看redis高可用集群如何做水平扩展。

一、启动集群

1、启动

在之前搭建好的环境上执行如下命令启动执行

在 192.168.157.6上执行

  1. cd /usr/local/redis/src
  2. redis-server ../redis_cluster/7000/redis.conf
  3. redis-server ../redis_cluster/7001/redis.conf
  4. redis-server ../redis_cluster/7002/redis.conf

在 192.168.157.7上执行

  1. cd /usr/local/redis/src
  2. redis-server ../redis_cluster/7003/redis.conf
  3. redis-server ../redis_cluster/7004/redis.conf
  4. redis-server ../redis_cluster/7005/redis.conf

2、客户端连接

  1. redis-cli -c -h 192.168.157.6 -p 7000

3、查看集群状态

  1. cluster nodes

从上图可以看出,整个集群运行正常,三个master节点和三个slave节点,7000端口的实例节点存储0-5460这些hash槽,7003端口的实例节点存储5461-10922这些hash槽,7001端口的实例节点存储10923-16383这些hash槽,这三个master节点存储的所有hash槽组成redis集群的存储槽位,slave点是每个主节点的备份从节点,不显示存储槽位,总共16384个槽位。

二、水平扩容

假如我们因为业务量的激增需要扩容redis,那么就需要用—cluster命令来扩容,这里假设新增一个主从也就是两个节点,其中需要指定7006为主节点master,如下。

  1. 192.168.157.6:7006
  2. 192.168.157.7:7008

1、新增7006和7008两个节点

在192.168.157.6和192.168.157.7的redis_cluster目录新建两个文件夹7006,7008,分别拷贝7000和7003里面的配置文件打开编辑修改对应端口,然后分别执行如下命令启动,这里的步骤可以参考集群搭建的步骤。

192.168.157.6

  1. cd /usr/local/redis/src
  2. redis-server ../redis_cluster/7006/redis.conf

192.168.157.8

  1. cd /usr/local/redis/src
  2. redis-server ../redis_cluster/7008/redis.conf

2、查看redis集群的命令帮助

  1. redis-cli --cluster help

  • 1.create:创建一个集群环境host1:port1 … hostN:portN
  • 2.call:可以执行redis命令
  • 3.add-node:将一个节点添加到集群里,第一个参数为新节点的ip:port,第二个参数为集群中任意一个已经存在的节点的ip:port
  • 4.del-node:移除一个节点
  • 5.reshard:重新分片
  • 6.check:检查集群状态

3、配置7006为集群主节点

使用add-node命令新增一个主节点7006(master),前面的ip:port为新增节点,后面的ip:port为已知存在节点,看到日志最后有”[OK]
New node added correctly”提示代表新节点加入成功

  1. redis-cli --cluster add-node 192.168.157.6:7006 192.168.157.6:7000

4、查看集群状态

  1. redis-cli -c -h 192.168.157.6 -p 7000
  2. cluster nodes

当添加节点成功以后,新增的节点不会有任何数据,因为它还没有分配任何的slot(hash槽),我们需要为新节点手工分配hash槽.

5、为新添加的主节点7006分配槽

使用redis-cli命令为7006分配hash槽,找到集群中的任意一个主节点,对其进行重新分片工作。

  1. redis-cli --cluster reshard 192.168.157.6:7001

输出如下:

  1. >>> Performing Cluster Check (using node 192.168.157.6:7001)
  2. M: 5f0358c2327a1e5e2985830f0af2eaa179a4766f 192.168.157.6:7001
  3. slots:[10923-16383] (5461 slots) master
  4. 1 additional replica(s)
  5. S: 546dbf577f9b6a74ecbea31c1ad724c7c287196b 192.168.157.6:7002
  6. slots: (0 slots) slave
  7. replicates fb25dd8252c6afa09d2f01ad108168c9a638f4ae
  8. S: 7afc6c65f6247ff50a5c4e88b31d279ef0a36496 192.168.157.7:7004
  9. slots: (0 slots) slave
  10. replicates 5f0358c2327a1e5e2985830f0af2eaa179a4766f
  11. M: a89bd5971ee31e27fcf31e11209970c0858a3c85 192.168.157.6:7000
  12. slots:[0-5460] (5461 slots) master
  13. 1 additional replica(s)
  14. M: fb25dd8252c6afa09d2f01ad108168c9a638f4ae 192.168.157.7:7003
  15. slots:[5461-10922] (5462 slots) master
  16. 1 additional replica(s)
  17. S: f5a8ef4401f0192ee2733b26ff1515cbd50c7f41 192.168.157.7:7005
  18. slots: (0 slots) slave
  19. replicates a89bd5971ee31e27fcf31e11209970c0858a3c85
  20. M: 07269c5606a840e9234d622d2d594993f906026f 192.168.157.6:7006
  21. slots: (0 slots) master
  22. [OK] All nodes agree about slots configuration.
  23. >>> Check for open slots...
  24. >>> Check slots coverage...
  25. [OK] All 16384 slots covered.
  26. How many slots do you want to move (from 1 to 16384)? 700

问你需要移动多少个槽到新的节点上?这里设置700

  1. What is the receiving node ID? 07269c5606a840e9234d622d2d594993f906026f

把这700个hash槽移动到哪个节点上去,需要指定节点id,这里从上面找到我们的新节点ID。

  1. Please enter all the source node IDs.
  2. Type 'all' to use all the nodes as source nodes for the hash slots.
  3. Type 'done' once you entered all the source nodes IDs.
  4. Source node #1: all

输入all为从所有主节点(7000,7001,7003)中分别抽取相应的槽数指定到新节点中,抽取的总槽数为700个

  1. ...
  2. Moving slot 231 from a89bd5971ee31e27fcf31e11209970c0858a3c85
  3. Moving slot 232 from a89bd5971ee31e27fcf31e11209970c0858a3c85
  4. Do you want to proceed with the proposed reshard plan (yes/no)? yes

上面列出了分配的具体细节,输入yes确认开始分配。

6、查看下最新的集群状态

  1. redis-cli -c -h 192.168.157.6 -p 7000
  2. cluster nodes

如上图所示,现在我们的7006已经有hash槽了,也就是说可以在7006上进行读写数据啦!到此为止我们的7006已经加入到集群中,并且
是主节点(Master)

7、配置7008为7006的从节点

添加从节点7008到集群中去并查看集群状态

  1. redis-cli --cluster add-node 192.168.157.7:7008 192.168.157.6:7000

如图所示,还是一个master节点,没有被分配任何的hash槽。

8、指定7008的主节点

我们需要执行replicate命令来指定当前节点(从节点)的主节点id为哪个,首先需要连接新加的7008节点的客户端,然后使用集群命令进行
操作,把当前的7008(slave)节点指定到一个主节点下(这里使用之前创建的7006主节点)

  1. redis-cli -c -h 192.168.157.7 -p 7008
  1. cluster replicate 07269c5606a840e9234d622d2d594993f906026f

查看集群状态,7008节点已成功添加为7006节点的从节点

9、删除7008从节点

用del-node删除从节点7008,指定删除节点ip和端口,以及节点id(红色为7008节点id)

  1. redis-cli --cluster del-node 192.168.157.7:7008 b26d8a47d17f18f5d5fa0aaef929b200358d2e6e

再次查看集群状态,如下图所示,7008这个slave节点已经移除,并且该节点的redis服务也已被停止

  1. redis-cli -c -h 192.168.157.7 -p 7003

10、删除7006主节点

最后,我们尝试删除之前加入的主节点7006,这个步骤相对比较麻烦一些,因为主节点的里面是有分配了hash槽的,所以我们这里必须
先把7006里的hash槽放入到其他的可用主节点中去,然后再进行移除节点操作,不然会出现数据丢失问题(目前只能把master的数据迁移
到一个节点上,暂时做不了平均分配功能),执行命令如下:

  1. redis-cli --cluster reshard 192.168.157.6:7006

How many slots do you want to move (from 1 to 16384)? 700
这里问你移动多少,这700
What is the receiving node ID?5f0358c2327a1e5e2985830f0af2eaa179a4766f
这里是需要把数据移动到哪?7001的主节点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 1:07269c5606a840e9234d622d2d594993f906026f
这里是需要数据源,也就是我们的7006节点id
Source node 2:done
这里直接输入done 开始生成迁移计划
… …
Do you want to proceed with the proposed reshard plan (yes/no)? Yes

这里输入yes开始迁移

至此,我们已经成功的把7006主节点的数据迁移到7001上去了,我们可以看一下现在的集群状态如下图,你会发现7006下面已经没有任何hash槽了,证明迁移成功!

最后我们直接使用del-node命令删除7006主节点即可

  1. redis-cli --cluster del-node 192.168.157.6:7006 07269c5606a840e9234d622d2d594993f906026f

查看集群状态,除了槽的分配变动,一切还原为最初始状态啦!大功告成!

 440

啊!这个可能是世界上最丑的留言输入框功能~


当然,也是最丑的留言列表

有疑问发邮件到 : suibibk@qq.com 侵权立删
Copyright : 个人随笔   备案号 : 粤ICP备18099399号-2