Redis集群
一、摘要
- 看完本文你将掌握如下知识点:
- redis集群的构建方法【redis-5.0.2】
- redis早期的版本中使用基于ruby的
redis-trib.rb命令进行集群创建,新版本推荐使用redis-cli --cluster,本文就是通过redis-cli --cluster命令实现集群构建。
二、快速创建集群
-
redis为我们提供了快速创建集群的工具,安装好redis后,在其
/redis-5.0.2/utils/create-cluster/目录下存在一个create-cluster命令,通过该命令可以快速创建一个基于本机端口30001~30006的三主三从的redis集群,可以通过修改端口号及服务数量来改变集群的配置。 -
1.启动6个redis服务,
./create-cluster start -
2.创建集群,
./create-cluster create -
3.关闭集群服务,
./create-cluster stop -
4.清除数据及日志文件,
./create-cluster clean
三、源码分析
-
通过看源码可以很清楚其创建过程
-
1.启动6个reids服务,通过参数的方式进行启动,在生产环境中建议通过配置文件启动
1 | if [ "$1" == "start" ] |
-
参数说明:
1 | #端口: |
-
2.构建集群,这里使用的就是
redis-cli --cluster命令,可以看出与redis-trib.rb命令类似
1 | if [ "$1" == "create" ] |
-
create后根的$HOSTS就是redis服务列表
1 | 127.0.0.1:30001 127.0.0.1:30002 127.0.0.1:30003 127.0.0.1:30004 127.0.0.1:30005 127.0.0.1:30006 |
-
--cluster-replicas $REPLICAS,这里$REPLICAS值为1,表示为每一个master节点分配一个slave节点
四、实际应用
-
这里我们使用2台服务器,分别启动3个redis服务,来构建一个三主三从的redis集群。
1.服务器IP
-
10.211.55.15
-
10.211.55.16
2.端口设置
-
分别开启俩台服务器的如下端口,前面是redis服务端口,后面是集群通信端口(默认服务端口+10000)
1 | 6379,16379 |
3.redis-{port}.conf
-
这里需要按照上面的参数说明进行配置,如我们配置号redis-6379.conf后,可以通过如下命令进行复制
1 | more redis-6379.conf | sed 's/6379/6380/g' > redis-6380.conf |
4.启动服务
1 | #10.211.55.15 |
5.构建集群
1 | # create <所有要加入集群的节点IP:端口 空格分隔> |
五、集群相关命令
1.健康检查
1 | # redis-cli --cluster check <任意已存在集群节点IP:端口> |
-
输出如下,可以看到集群中的主从关系,以及每个master中含有key的数量:
1 | 10.211.55.15:6380 (c39c1e8a...) -> 2 keys | 5461 slots | 1 slaves. |
-
说明:此时如果关闭其中一个master节点,那么其对应的从节点就会升级为主节点,当重新启动原master节点后,则该节点会自动加入集群,并作为从节点。
2.集群扩容,即为集群添加新的主机和从机
2.1通过如下命令添加新的node
-
说明:10.211.55.15:6382 是新的服务地址,10.211.55.16:6380 是集群中任意一个的服务地址,添加后的服务类型为master。
1 | # redis-cli --cluster add-node <新服务IP:端口> <任意已存在集群节点IP:端口> |
-
此时我们通过健康检查可以看到新加入的服务没有分配槽点:
1 | # redis-cli --cluster check <任意已存在集群节点IP:端口> |
2.2分配槽
1 | # redis-cli --cluster reshard <任意已存在集群节点IP:端口> |
-
此时再次运行健康检查可以看到槽点已经分配成功
1 | # redis-cli --cluster check <任意已存在集群节点IP:端口> |
2.3平衡槽,就是均匀分配集群中的所有槽到所有的节点,该步非必须,只是看着好看点
-
执行 rebalance 命令
1 | # redis-cli --cluster rebalance --cluster-threshold 1 <任意已存在集群节点IP:端口> |
-
查看集群信息
1 | ./redis-cli --cluster info 10.211.55.15:6380 |
2.4为新加入的master添加slave
-
同样需要先加入集群
1 | # redis-cli --cluster add-node <slave节点IP:端口> <任意已存在集群节点IP:端口> |
-
之后不需要做分配和平衡槽的操作
-
登录这个redis,
./redis-cli -h 10.211.55.16 -p 6382
1 | 127.0.0.1:6382> cluster replicate 316e068fd71ee228299198a271efd839d3493835 #主节点的id |
-
也可以一行命令就完成
1 | redis-cli --cluster add-node <slave节点IP:端口> <任意已存在集群节点IP:端口> --cluster-slave --cluster-master-id <目标Master节点的ID> |
3.删除节点
3.1先删除从节点
-
直接执行节点删除命令
1 | ./redis-cli --cluster del-node 10.211.55.16:6379 从节点ID |
3.2再删除主节点
-
删除master节点前,master节点上的槽需要被清空
1 | ./redis-cli --cluster reshard 10.211.55.15:6382 #集群中任意ip即可 |
-
执行删除节点命令,删除 316e068fd71ee228299198a271efd839d3493835 节点
1 | ./redis-cli --cluster del-node 10.211.55.16:6379 316e068fd71ee228299198a271efd839d3493835 |
-
说明:若先删除主节点,再删除从节点,则删除主节点后,该主节点的从节点会自动转为其它主节点(slot迁移到的主节点)的从节点,而不会升级为主节点