资讯专栏INFORMATION COLUMN

redis cluster 扩容

call_me_R / 1557人阅读

摘要:重新分片,把要删除的主节点的数据槽移动到其他主节点上,以免数据丢失。分区完成当前主节点已经没有数据槽了。这样就可以实现横向动态扩容,新增加的主从节点,用于存储新的数据则可,对以前的节点的数据不会有任何影响。

需求:

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...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/77079.html

相关文章

  • Redis集群容器化安装

    摘要:本文将讲解如何基于搭建集群,的集群设计包括两个部分主从复制和哈希。至此,集群基本安装成功。后期运维基本命令集群节点槽常见问题把所有的物理节点映射到个哈希槽上,负责维护。 Redis集群概述 Redis作为当前非常热门的内存型数据结构存储,可用于数据存储,缓存和消息代理等。本文将讲解如何基于docker搭建Redis集群,Redis的集群设计包括两个部分:主从复制和哈希Slot。1.1....

    xiaoqibTn 评论0 收藏0
  • Redis集群容器化安装

    摘要:本文将讲解如何基于搭建集群,的集群设计包括两个部分主从复制和哈希。至此,集群基本安装成功。后期运维基本命令集群节点槽常见问题把所有的物理节点映射到个哈希槽上,负责维护。 Redis集群概述 Redis作为当前非常热门的内存型数据结构存储,可用于数据存储,缓存和消息代理等。本文将讲解如何基于docker搭建Redis集群,Redis的集群设计包括两个部分:主从复制和哈希Slot。1.1....

    sf_wangchong 评论0 收藏0

发表评论

0条评论

call_me_R

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<