redis cluster 扩容

需求:

A redis cluster 集群 40 台集群扩容到 68 台
也就是 增加 28 台新的机器 : 一主一从 为一组,一共12组

前期准备

   扫描新增扩容服务器ip是否能访问
   DBA扩容脚本模拟验证
   准备系统验证脚本:
       1: netstat -an | grep ':6379'| grep -e add-node1-ip  检查端口连接
                       netstat -an| grep :6379|awk '{print substr($5,8)}'|sort |uniq -c
       2: 比较迁移前后平均没台机器的内存容量         
curl 'http://localhost:8080/systemapp/redis/info.htm?ip=add-node1-ip&port=6379' | grep maxmemory_human --col=always | grep used_memory_human --col=always | grep total_system_memory_human --col   
       3:查看各系统业务是否异常,是否右redis相关报错日志


Redis Cluster集群动态扩容是指在不停掉Cluster集群环境的情况下,动态的往集群环境中增加主、从节点和动态的从集群环境中删除节点。

redis的动态扩容操作都是通过redis-trib.rb脚本文件来完成

 [root@linux redis] # ruby redis-trib.rb
      可以看到redis-trib.rb具有以下功能: 
1、create:创建集群 
2、check:检查集群 
3、info:查看集群信息 
4、fix:修复集群 
5、reshard:在线迁移slot 
6、rebalance:平衡集群节点slot数量 
7、add-node:将新节点加入集群 
8、del-node:从集群中删除节点 
9、set-timeout:设置集群节点间心跳连接的超时时间 
10、call:在集群全部节点上执行命令 
11、import:将外部redis数据导入集群     

因为主、从节点在操作上会有差异,所以分来来说。增加节点的顺序是先增加Master主节点,然后在增加Slave从节点。

-- 查看redis 进程
ps -ef | grep redis

--登陆查看主从信息
redis-cli -h node-ip -p port
cluster nodes

动态增加Master 主服务器节点

#前提:假设 已有6个Cluster 集群节点,三主三从;
   1.1、创建目录7006(Master主节点文件夹)和7007(Slave从节点文件夹),并从以前Cluster集群节点7000-7005任一节点中拷贝配置文件redis.conf到7006和7007目录下。    
    1.2、修改配置文件,将7006和7007目录下面的redis.conf配置文件的端口进行相应修改,与自己的目录名称保持一致,修改项目如下:
    (在linux环境下可以执行如下命令进行全局替换::%s/7000/7006/g,%s/7000/7007/g,保存并退出则可)
    1.3、启动7006和7007目录下Redis实例,并查看效果。
                redis-server ../redis-cluster/7006/redis.conf
                redis-server ../redis-cluster/7007/redis.conf
   ###连个实例虽然存在,但是没有真正的加入到集群中!!!

登陆7006 7007 端口的实例 查看info信息 发现 connected_slaves = 0
redis-cli -C -H 192.168.127.130 -p 7006
info replication

将7006主节点加入到Cluster集群

    ruby redis-trib.rb add-node add-node1:7006 old-node:7000 

ruby redis-trib.rb add-node (增加节点)
add-node1:7006 (新增实例和端口 )
old-node:7000 (集群中已经存在的任意实例地址和其端口 )

注意:当添加新节点成功以后,新的节点不会有任何数据,因为他没有分配任何的数据Slot(哈希slots),这一步需要手动操作。

Send CLUSTER MEET to node add-node1:7006 to make it join the cluster. 
New node added corrently 

表示:节点增加成功

cluster info 验证

cluster nodes 验证: 添加成功但是会没有Slots

为7006Master主节点分配数据Slots,分配方法是从集群中知道任何一个主节点
(因为只有Master主节点才有数据slots),然后对其进行重新分片工作。

ruby redis-trib.rb reshard old-node:7000
我们会从7000这个主节点上抽取一些slots 给7006 
How many slots do you want to move (from 1 to 16384)?  200
我们要使用多少slots    
 选择接收数据槽的节点和数据槽产生的方式:
 what is the receiving node id ? 接受slots的主节点 这里是7006的ID
 Please enter all the source node IDs: all  

执行分配计划后选择yes ,查看cluster nodes,显示7006有数据slots

动态增加Slave从服务器节点
ruby redis-trib.rb add-node 192.168.127.130:7007 192.168.127.130:7000
指定7007节点作为7006的从节点,实现主从的配置。

redis-cli -c -h 192.168.127.130 -p 7007 
   cluster replicate 71ecd970838e9b400a2a6a15cd30a94ab96203bf
                                    (主节点的ID,这里是7006)


Cluster 集群删除操作

删除的顺序是先删除Slave从节点,然后在删除Master主节点

1.动态删除Slave从服务器节点
ruby redis-trib.rb del-node 192.168.127.130:7007 991ed242102aaa08873eb9404a18e0618a4e37bd
 2.动态删除Master主服务器节点   
要想删除Master主节点,可能要繁琐一些。
因为在Master主节点上有数据槽(slots),为了保证数据的不丢失,
必须把这些数据槽迁移到其他Master主节点上,然后在删除主节点。
2.1、重新分片,把要删除的Master主节点的数据槽移动到其他Master主节点上,以免数据丢失。
    ruby redis-trib.rb reshard 192.168.127.130:7006
    2.1.1、移除多少槽如图:创建输入200,这里要输入199,因为计数是从0开始的,切记。
    2.1.2、接受槽的Master主节点ID:这个节点可以是任意一个主节点都可以,
    我选择7002,ID是:3b025b3ecfa65f462de639c7a412be443cf1dd1c
    Source node 选择 需要移除节点7006的ID号 
    2.1.4、执行分区计划,选择yes。分区完成
    2.1.5、当前7006主节点已经没有数据槽了。
    2.2、删除7006主节点,提供要删除节点的IP地址和Port端口,当然还有要删除的节点的ID名称。
     ruby redis-trib.rb del-node 192.168.127.130:7006 71ecd970838e9b400a2a6a15cd30a94ab96203bf
  2.2.1、删除成功 
  2.2.2、查看节点效果 cluster nodes
  

_

总结:

主从复制和哨兵模式这两个集群模式由于不能动态扩容,而且主节点之间(有多个主节点的情况)数据完全一样,导致了主节点的容量成了整个集群的瓶颈,如果想扩展集群容量,必须扩展主节点的容量。由于以上的问题,redis在3.0开始Cluster集群模式,这个模式在主节点之间数据是不一样的,数据也可以根据需求自动转向其他节点。这样就可以实现横向动态扩容,新增加的主从节点,用于存储新的数据则可,对以前的节点的数据不会有任何影响。
参考:https://www.cnblogs.com/Patri…

    原文作者:rockyzhang
    原文地址: https://segmentfault.com/a/1190000016359421
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞