本文主要是承接上一篇文章 Redis 集群的离线安装成功以后, 我们如何进行给集群增加新的主从节点 (集群扩容) 以及如何从集群中删除节点(集群缩容), 也就是集群的伸缩, 集群伸缩的原理是控制虚拟槽和数据在节点之间进行移动, 通过实际操作来整理一下集群的伸缩.
上篇文章中搭建好的集群为三主三从, 端口号为 7000,7001,7002,7003,7004,7005.
查看集群启动情况: ps -ef | grep Redis
查看集群的 slots 分配情况以及节点之间的主从关系:
首先登陆节点 7000:Redis-cli -p 7000 -h 192.168.182.132 -c // 注意不要丢了 - c
cluster nodes 查看集群节点信息
在本例中我们先增加两个节点: 主节点 7006 和从节点 7007, 并给 7006 分配 4096 个 slots, 设置 7007 为 7006 的从节点, 然后再将这两个节点从集群中删除, 一定要先删除主节点, 再删除从节点, 要不然故障转移会生效.
一, 集群的扩容
1. 准备新的节点
在集群目录 redis_cluster 目录下增加 redis7006 和 redis7007 目录
- mkdir redis7006
- mkdir redis7007
增加完成后的目录
复制端口 7000 的 Redis.conf 配置文件到 redis7006 和 redis7007 目录下, 并修改配置文件中的端口为对应目录的端口号.
例如 redis7006 下的 Redis.conf 文件的内容为:
- port 7006
- bind 192.168.182.132 // 本机 IP
- daemonize yes // 设置为后台运行
- pidfile /var/run/Redis-7006.pid
- cluster-enabled yes // 开启集群
- cluster-config-file node-7006.conf
- cluster-node-timeout 15000
- appendonly yes
准备完成后, 启动两个新的 Redis 节点:
- Redis-server redis7006/Redis.conf
- Redis-server redis7007/Redis.conf
- ps -ef | grep Redis // 查看新的 Redis 节点是否启动成功
启动以后登录 7006 查看节点情况:
- Redis-cli -p 7006 -h 192.168.182.132 -c
- cluster nodes
2. 添加主节点
(1)向集群中添加节点 7006, 注意一定要保证节点里面没有添加过任何数据, 不然添加会报错.
- cd /usr/local/Redis/Redis/src
- ./Redis-trib.rb add-node 192.168.182.132:7006 192.168.182.132:7000
- // 第一次节点为新增的节点 第二个节点为集群中的节点
添加成功:
可以看到使用 addnode 命令来添加节点, 第一个参数是新节点的地址, 第二个参数是任意一个已经存在的节点的 IP 和端口. 我们可以看到新的节点已经添加到集群中:
新节点 7006 现在已经连接上了集群, 成为集群的一份子, 并且可以对客户端的命令请求进行转向了, 但是和其他主节点相比, 新节点还有两点区别:
新节点没有包含任何数据, 因为它没有包含任何哈希槽.
尽管新节点没有包含任何哈希槽, 但它仍然是一个主节点, 所以在集群需要将某个从节点升级为新的主节点时, 这个新节点不会被选中.
接下来, 只要使用 Redis-trib 程序, 将集群中的某些哈希桶移动到新节点里面, 新节点就会成为真正的主节点了.
(2)为主节点 7006 分配虚拟槽
- cd /usr/local/Redis/Redis/src
- ./Redis-trib.rb reshard 192.168.182.132:7001 // 可以为任意的节点 在此登录的 7001 只是作为客户端去访问的
执行后:
因为我们增加 7006 为主节点后, 一共存在四个主节点, 为了平均分配我们需要给 7006 分配 16384 除以 4 等于 4096 个节点, 所以我们输入 4096, 按 enter 继续:
输入 7006 的节点 ID, 按 enter 继续:
从哪些主节点抽取槽到新节点中: all 为所有主节点, done: 指定节点, 在这里我们输入 all, 按 enter 继续:
输入 yes 后按 enter 开始给 7006 分配虚拟槽, 分配完成后:
登录集群查看一下集群的状态:
- Redis-cli -p 7000 -h 192.168.182.132 -c
- cluster nodes
至此主节点已经添加完毕了, 我们的集群由三主三从变成了四主三从.
3. 添加从节点 7007
(1)使用 add-node 添加新节点
- cd /usr/local/Redis/Redis/src
- ./Redis-trib.rb add-node 192.168.182.132:7007 192.168.182.132:7000
- // 第一次节点为新增的节点 第二个节点为集群中的节点
加入集群成功, 登录到集群中查看一下集群状态:
7007 还是一个 Master 节点, 而且没有拥有自己的 slot 槽. 那么我们接下来要让它变成从节点.
(2)将 7007 变为 7006 的 从节点
使用 CLUSTER REPLICATE 命令改变一个从节点的主节点.
- Redis-cli -p 7007 -h 192.168.182.132
- cluster replicate 52d169e7011ccdf10f99c1d83f92409dcc37ab55 // 后面的字符串为节点 7006 的节点 ID
设置成功后查看一下:
集群的从节点 7007 添加成功.
二, 集群的缩容
只要使用 del-node 命令即可:
./Redis-trib del-node 127.0.0.1:7000 <node-id>
第一个参数是任意一个节点的地址, 第二个节点是你想要移除的节点地址.
使用同样的方法移除主节点, 不过在移除主节点前, 需要确保这个主节点是空的. 如果不是空的, 需要将这个节点的数据重新分片到其他主节点上.
替代移除主节点的方法是手动执行故障恢复, 被移除的主节点会作为一个从节点存在, 不过这种情况下不会减少集群节点的数量, 也需要重新分片数据.
1. 删除从节点
删除节点用 del-node 命令. 此命令需要制定删除节点的 ip 和端口, 以及节点的 id.
cd /usr/local/Redis/Redis/src
./Redis-trib.rb del-node 192.168.182.132:7007 7007 节点 ID
删除成功后:
删除后我们再次查看集群的节点信息, 如下所示, 7007 从节点已经被移除掉.
2. 删除主节点
(1)将主节点 7006 的 slots 分配到其他主节点上
- cd /usr/local/Redis/Redis/src
- ./Redis-trib.rb reshard 192.168.182.132:7006
选择完这几项以后, 回车继续:
输入 yes, 表示接受这个计划, 然后回车, 完成 7006 节点的槽的移除.
登录集群查看当前集群情况:
节点 7006 上没有任何槽.
(2)使用 del-node 命令来删除 7006 主节点.
- cd /usr/local/Redis/Redis/src
- ./Redis-trib.rb del-node 192.168.182.132:7006 52d169e7011ccdf10f99c1d83f92409dcc37ab55
删除成功:
最后登录查看集群又恢复到了三主三从的结构了, 只是从刚开始的均匀分配变成了 7000 端口的主节点多了 4096 个 slots.
来源: http://www.bubuko.com/infodetail-3203148.html