在上篇文章《Redis缓存集群解决方案:Redis cluster 安装》 中进行了redis cluster的安装,本文重点侧重于cluster节点的操作和维护。
cluster管理工具
redis-trib.rb
是ruby脚本的cluster管理工具,使用 ruby redis-trib.rb help
查看使用方法:
Usage: redis-trib <command> <options> <arguments ...>
create host1:port1 ... hostN:portN
--replicas <arg>
check host:port
info host:port
fix host:port
--timeout <arg>
reshard host:port
--from <arg>
--to <arg>
--slots <arg>
--yes
--timeout <arg>
--pipeline <arg>
rebalance host:port
--weight <arg>
--auto-weights
--use-empty-masters
--timeout <arg>
--simulate
--pipeline <arg>
--threshold <arg>
add-node new_host:new_port existing_host:existing_port
--slave
--master-id <arg>
del-node host:port node_id
set-timeout host:port milliseconds
call host:port command arg arg .. arg
import host:port
--from <arg>
--copy
--replace
help (show this help)
For check, fix, reshard, del-node, set-timeout you can specify the host and port of any working node in the cluster.
初始化
初始化节点配置上文已经操作过:
./redis-trib.rb create --replicas 1 127.0.0.1:7000 \
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
查看当前节点信息
# 使用cli登陆任一节点
redis-cli -c -p 7000
# 查看cluster信息
cluster nodes
127.0.0.1:7000> cluster nodes
18c6ed2578cf04e44754ebc02ee04211f2e64cca 127.0.0.1:7002@17002 master - 0 1492052450848 3 connected 10923-16383
081da8052edae9a1b373569caa007733b47b50bd 127.0.0.1:7001@17001 master - 0 1492052448842 2 connected 5461-10922
73236ac83b7f3d1696c072027fd1b24fd4eedbc0 127.0.0.1:7005@17005 slave 18c6ed2578cf04e44754ebc02ee04211f2e64cca 0 1492052449846 6 connected
d0453790e80fbbf41a7296d2a005066b5b72c171 127.0.0.1:7004@17004 slave 081da8052edae9a1b373569caa007733b47b50bd 0 1492052449846 5 connected
84072fd637abd3e29094a653e3f25ac52d3ca798 127.0.0.1:7000@17000 myself,slave 6ea73447f79bedb8dd1fdc20791f8c168dbaa8f3 0 0 1 connected
6ea73447f79bedb8dd1fdc20791f8c168dbaa8f3 127.0.0.1:7003@17003 master - 0 1492052448841 7 connected 0-5460
增加节点
新增节点如果是master,那么需要rehashing,如果是slave那么需要关联master。
新增master
- 新建7006文件夹
- 添加redis.conf文件并修改对应的端口信息
port 7006
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
databases 1
pidfile ./redis_7006.pid
logfile ./redis_7006.log
loglevel debug
启动实例
cd /home/redis/redis-cluster/7006/ && \
../redis-server ./redis.conf &
增加实例为 master
使用 redis-trib.rb
工具,管理节点:
cd /home/redis/redis-cluster && \
./redis-trib.rb add-node 127.0.0.1:7006 127.0.0.1:7000
此时,再次使用 cluster nodes
查看节点信息,就会多出一个master节点,但是 此时节点的slots为空:
b75acaf4a0194d0c1b3cd15f967a802c83a85d8c 127.0.0.1:7006@17006 master - 0 1492052599167 0 connected
新增加的 master 再分区
cd /home/redis/redis-cluster && \
./redis-trib.rb reshard \
--from 18c6ed2578cf04e44754ebc02ee04211f2e64cca \
--to b75acaf4a0194d0c1b3cd15f967a802c83a85d8c \
--slots 200 \
--yes \
--timeout 5000 \
127.0.0.1:7000
需要注意的是,虽然help说明中,host:port放在首位,但实际操作的时候放在首位会报错, 具体愿意不清楚。迁移完毕之后,再查看当前节点信息:
18c6ed2578cf04e44754ebc02ee04211f2e64cca 127.0.0.1:7002@17002 master - 0 1492057855700 3 connected 11123-16383
081da8052edae9a1b373569caa007733b47b50bd 127.0.0.1:7001@17001 master - 0 1492057855199 2 connected 5461-10922
73236ac83b7f3d1696c072027fd1b24fd4eedbc0 127.0.0.1:7005@17005 slave 18c6ed2578cf04e44754ebc02ee04211f2e64cca 0 1492057855199 6 connected
d0453790e80fbbf41a7296d2a005066b5b72c171 127.0.0.1:7004@17004 slave 081da8052edae9a1b373569caa007733b47b50bd 0 1492057856703 5 connected
84072fd637abd3e29094a653e3f25ac52d3ca798 127.0.0.1:7000@17000 myself,slave 6ea73447f79bedb8dd1fdc20791f8c168dbaa8f3 0 0 1 connected
6ea73447f79bedb8dd1fdc20791f8c168dbaa8f3 127.0.0.1:7003@17003 master - 0 1492057856201 7 connected 0-5460
b75acaf4a0194d0c1b3cd15f967a802c83a85d8c 127.0.0.1:7006@17006 master - 0 1492057855700 8 connected 10923-11122
可以发现节点并不是从尾部开始截取,而是从源节点的开始进行截取。
问题:
- rehash期间,数据的更改和查询机制,是怎么处理的?
新增slave
参考新增master,同样需要先新建个redis实例配置,
- 新建7007文件夹
- 添加redis.conf文件并修改对应的端口信息
启动实例
cd /home/redis/redis-cluster/7007/ && \
../redis-server ./redis.conf &
增加实例为 slave 并 挂载在 master
从上面的nodes信息可以看到,端口7006的master的id为 b75acaf4a0194d0c1b3cd15f967a802c83a85d8c
,所以:
cd /home/redis/redis-cluster && \
./redis-trib.rb add-node \
--slave \
--master-id b75acaf4a0194d0c1b3cd15f967a802c83a85d8c \
127.0.0.1:7007 127.0.0.1:7000
删除节点
slave直接删除并没有什么影响,主要考虑删除master的情况。 正常情况下,是rehash之后删除节点。
迁移 slots
先将需要删除节点的slot进行迁移:
From master4 => 7006:b75acaf4a0194d0c1b3cd15f967a802c83a85d8c To master3 => 7002:18c6ed2578cf04e44754ebc02ee04211f2e64cca
cd /home/redis/redis-cluster && \
./redis-trib.rb reshard \
--from b75acaf4a0194d0c1b3cd15f967a802c83a85d8c \
--to 18c6ed2578cf04e44754ebc02ee04211f2e64cca \
--slots 1000 \
--yes \
--timeout 5000 \
127.0.0.1:7000
再次查看节点的时候会发现,master4 清空 slot 之后,其 slave 节点变成了其他 master 的 slave 节点。
删除节点
master4 => 7006:b75acaf4a0194d0c1b3cd15f967a802c83a85d8c slave4 => 7007:8dc7291c74bd7fae0a23388464db7b8c63f211f5
cd /home/redis/redis-cluster && \
./redis-trib.rb del-node 127.0.0.1:7000 b75acaf4a0194d0c1b3cd15f967a802c83a85d8c && \
./redis-trib.rb del-node 127.0.0.1:7000 8dc7291c74bd7fae0a23388464db7b8c63f211f5
删除成功信息:
>>> Removing node b75acaf4a0194d0c1b3cd15f967a802c83a85d8c from cluster 127.0.0.1:7000
>>> Sending CLUSTER FORGET messages to the cluster...
>>> SHUTDOWN the node.
[8] Done cd /home/redis/redis-cluster/7006/ && ../redis-server ./redis.conf
>>> Removing node 8dc7291c74bd7fae0a23388464db7b8c63f211f5 from cluster 127.0.0.1:7000
>>> Sending CLUSTER FORGET messages to the cluster...
>>> SHUTDOWN the node.
[10]- Done cd /home/redis/redis-cluster/7007/ && ../redis-server ./redis.conf
节点失效的处理
cluster关闭之后会,调用的时候会出现如下信息:
(error) CLUSTERDOWN The cluster is down
问题
- 虽然进行了集群,但是连接的时候连接哪个机器哪个端口呢?如果这个机器宕机,集 群中的其他服务器是不是就无法使用了?
- 多少节点失效之后cluster会关闭?
参考资料
- Redis Cluster Specification
- 全面剖析Redis Cluster原理和应用
- 唯品会大规模 Redis Cluster 的生产实践
- Spring Data Redis
- redis cluster管理工具redis-trib.rb详解
文档信息
- 本文作者:Bob.Zhu
- 本文链接:https://adolphor.github.io/2017/03/23/redis-cluster-node-manager/
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)