一、前言
Redis3.0版本以后,有了集群的功能,提供了比之前版本的哨兵模式更高的性能与可用性,但是集群的水平扩展却比较麻烦,接下来介绍下Redis高可用集群是如何做水平扩展、伸缩的。
二、环境准备
- 三台云服务器(106.14.157.48,49.232.112.117,101.34.253.57)。大家也可以使用一台云服务器,部署多个 Redis 实例也是可以的。 我这里是使用三台云服务器。想购买的小伙伴可以看下,挺便宜的 【腾讯云】云产品限时秒杀,爆款1核2G云服务器,首年74元
- 每台服务器都运行了三个Redis 实例, 由此实现如下图的Redis 集群。
三、Redis集群的水平扩展
现在要将原集群的9个节点基础上新增3个节点,由原来的3主6从变成4主8从,如下图:
1、首选需要一台新的服务器(同一台服务器上运行也是可以的),运行三个节点,配置文件和集群配置一样。
2、查看Redis集群的帮助命令 redis-cli --cluster help
3、使用 add-node
命令新增一个主节点 101.34.253.57:6488 (master),前面的 ip:port
为新增节点,后面的 ip:port
为集群中已存在节点。
# 增加节点
redis-cli --cluster add-node 101.34.253.57:6488 101.34.253.57:6485
4、查看集群信息 redis-cli -c -h 101.34.253.57 -p 6485
,可以看到 101.34.253.57:6488 节点已经被添加进集群, 但是Redis 并没有给该节点分配“哈希槽”。所以需要我们自己手动分配。
5、使用redis-cli命令为 101.34.253.57:6488 节点分配slots槽位,找到集群中的任意一个主节点,对其进行重新分片工作。
# 从新分配 slots
redis-cli --cluster reshard 101.34.253.57:6485
分配 slots 节点, 系统会有几个询问, 需要输入对应内容, 才可下一步。以下是具体内容
How many slots do you want to move (from 1 to 16384)? 2000
解释:需要多少个hash槽移动到新的节点上,自己设置,比如2000个hash槽What is the receiving node ID? b1d00df093710f483525cb4d601123e11611ad21
解释:把这2000个hash槽移动到哪个节点上去,需要指定节点id,这里填写上面新增主节点的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
解释:输入all
为从所有主节点中分别抽取相应的hash槽到指定到新节点中,抽取的总槽数为2000个;或者输入原节点ID然后输入done,意思将输入的节点ID,抽取的总槽数为2000个Do you want to proceed with the proposed reshard plan (yes/no)? yes
解释:输入yes确认开始执行分片任务
6、查询集群节点信息
7、到这里 主节点(master)就添加完成了, 现在开始添加 从节点(slave), 重复第三步的操作,先将节点添加到集群
# 增加节点
redis-cli --cluster add-node 101.34.253.57:6489 101.34.253.57:6485
可以看到,刚刚添加的从节点的角色是 master, 并且没有分配任何的hash 槽, 所以我们只需要执行 replicate
命令将该节点指向一个master 主节点, 让其成为一个从节点即可。
8、将 101.34.253.57:6489 节点设置成 101.34.253.57:6488 的从节点
# 登录从节点
[root@TR ~]# redis-cli -c -h 101.34.253.57 -p 6489
# 将该节点设置成那个节点的从节点
101.34.253.57:6489> cluster replicate b1d00df093710f483525cb4d601123e11611ad21
OK
101.34.253.57:6489>
9、查看集群信息 cluster nodes
四、Redis集群的水平伸缩
现在要将原集群的12个节点基础上减少3个节点,由原来的4主8从变成3主6从,如下图:
1、删除101.34.253.57:6489从节点,用 del-node
删除 101.34.253.57:6489 从节点 ,指定删除节点ip和端口,以及要删除节点的ID
redis-cli --cluster del-node 101.34.253.57:6489 4ddba09063f05aa226d412a71d2e289d6d580574
删除之后, 可以发现集群中已经没有 101.34.253.57:6489
从节点了。
2、下面就需要删除 101.34.253.57:6488 主节点了,这个步骤相对麻烦一些,因为主节点的里面是有分配了slots槽位( 0-665、5461-6127、10923-11588 ),所以必须先把 101.34.253.57:6488 里的slots槽位分配到其他的可用主节点中去,然后再进行移除节点操作,不然会出现数据丢失问题(目前只能把master的数据迁移到一个节点上,暂时做不了平均分配功能)。这一步和水平扩展的第五步是一样的。只不过是反过来了。
# 从新分配 slots
redis-cli --cluster reshard 101.34.253.57:6488
分配 slots 节点, 系统会有几个询问, 需要输入对应内容, 才可下一步。以下是具体内容
- How many slots do you want to move (from 1 to 16384)? 2000
解释:需要多少个hash槽移动到新的节点上,自己设置,比如2000个hash槽 - What is the receiving node ID? 1edef2b7b831bd14347e860b1dc32a576fc5fdc8
解释:把这2000个hash槽移动到哪个节点上去,需要指定节点id,这里填写上面新增主节点的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:b1d00df093710f483525cb4d601123e11611ad21
Source node 2:done
解释:输入all
为从所有主节点中分别抽取相应的hash槽到指定到新节点中,抽取的总槽数为2000个;或者输入原节点ID然后输入done,意思将输入的节点ID,抽取的总槽数为2000个 - Do you want to proceed with the proposed reshard plan (yes/no)? yes
解释:输入yes确认开始执行分片任务
3、下一步删除 101.34.253.57:6488 主节点即可。
[root@TR ~]# redis-cli --cluster del-node 101.34.253.57:6488 b1d00df093710f483525cb4d601123e11611ad21
>>> Removing node b1d00df093710f483525cb4d601123e11611ad21 from cluster 101.34.253.57:6488
>>> Sending CLUSTER FORGET messages to the cluster...
>>> Sending CLUSTER RESET SOFT to the deleted node.
[root@TR ~]#
4、查询集群信息,看是否已经移除
暂无评论