Redis集群节点的变更

Redis集群节点增加

添加的节点以主节点从节点 两种不同的节点类型加入集群。

  • 若为主节点 ,需要创建一个空节点,然后将某些哈希槽移动到这个空节点中
  • 若为从节点 ,需要创建一个空节点,然后将新节点设置为集群中某个master节点的slave节点

注意: 无论是主节点还是从节点,首先第一步都是创建一个空节点,所以创建步骤都是一致的。

添加节点

1.启动新的redis实例

接上一篇文章的描述,首先,新建7117目录;然后,将目录7116的redis服务的配置文件拷贝到7117目录中;最后,将配置文件中的7116全部改为7117并安装一下命令启动服务:

/usr/local/redis4/bin/redis-server /usr/local/redis4/cluster/7117/redis-7116.conf

2.添加节点到集群中
#redis-tirb 的add-node命令解释
#add-node        new_host:new_port existing_host:existing_port
]# redis-trib add-node 127.0.0.1:7117 127.0.0.1:7112
>>> Adding node 127.0.0.1:7117 to cluster 127.0.0.1:7112
>>> Performing Cluster Check (using node 127.0.0.1:7112)
M: 9fd3ed4af7d8ade053112eb30b87ae60710ab823 127.0.0.1:7112
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
S: 3af81b11efae0c0b921218ec4ca1b920f662e985 127.0.0.1:7115
   slots: (0 slots) slave
   replicates 9fd3ed4af7d8ade053112eb30b87ae60710ab823
S: ca15cf3f79f34f6fc40f354d3d8f88e62d9404e5 127.0.0.1:7116
   slots: (0 slots) slave
   replicates bcac95efa02b24ddb07ae186161457f575425bb6
M: f17572645ee8a0e60a62bd9d22a3f8f34e73b6bc 127.0.0.1:7114
   slots:0-5460 (5461 slots) master
   0 additional replica(s)
M: bcac95efa02b24ddb07ae186161457f575425bb6 127.0.0.1:7113
   slots:10923-16383 (5461 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
>>> Send CLUSTER MEET to node 127.0.0.1:7117 to make it join the cluster.
[OK] New node added correctly.
3.查看新增节点信息

使用/user/local/redis4/bin/reids-cli -c -p 7114 连接到redis 集群,然后用如下命令查看集群信息:
这里写图片描述

4.选择新增节点的类型
  • 作为从节点

    由于在新增主节点的时候将端口号为7117的redis实例作为master节点了,此处重新安装上述步骤新增端口为7118的实例作为slave节点

    • 将新增的节点作为127.0.0.1:7114 的从节点,执行的命令如下:

    /usr/local/redis4/bin/redis-cli -c -p 7118 cluster replicate f17572645ee8a0e60a62bd9d22a3f8f34e73b6bc
    注意: 执行上述命令的正确返回结果为返回OK

    • 检查新增的节点是否已经成为从节点
      这里写图片描述

    至此新增节点作为slave节点的全部过程已结束。

  • 作为主节点

    • 使用redis-trib工具,将集群中的某些哈希槽移动到新增节点中,此刻该新增节点才成为主节点 。要将集群中的哈希槽进行移动需要执行如下命令:
      这里写图片描述

    • 指定将哈希槽移动到那个节点,以及从哪几个节点移动哈希槽
      这里写图片描述

    注意all 表示从所有节点中随机转移,凑够3000个哈希槽

  • 再次确实是否开始哈希槽的移动
    这里写图片描述

  • 查看增加主节点后,集群节点的情况
    这里写图片描述
    至此将新增的节点设置为master节点全部操作已经结束。

删除节点

与添加节点类似,删除节点也需要分为两类处理,包括主节点从节点

删除主节点

此处以上文中新增的master节点(127.0.0.1:7117)为例进行说明,该节点有300个哈希槽。

1.移动该节点的哈希槽到集群中的其他节点

执行命令redis-trib reshard 127.0.0.1:7117,控制台输出如下内容:
这里写图片描述

完成上述步骤的输入后,最后输入done表示输入完毕

2.删除该节点
检查负责该节点负责哈希槽是否全部移除

这里写图片描述

使用如下命令删除该节点
//最后一个参数为需要删除的节点ID
bin]# redis-trib del-node 127.0.0.1:7113 a83732804a1bea9f8e5408e7fe06fe6e3fe698ac 
>>> Removing node a83732804a1bea9f8e5408e7fe06fe6e3fe698ac from cluster 127.0.0.1:7113
>>> Sending CLUSTER FORGET messages to the cluster...
>>> SHUTDOWN the node.

删除从节点

删除从节点的操作比较简单,只需要使用redis集群管理工具redis-trib直接删除该节点即可。此处以上文中添加的redis实例(127.0.0.1:7118)为例。

//最后一个参数为需要删除的节点ID
bin]# redis-trib del-node 127.0.0.1:7115 61c19e097b56e91d6a67c9c833172790717bce0d
>>> Removing node 61c19e097b56e91d6a67c9c833172790717bce0d from cluster 127.0.0.1:7115
>>> Sending CLUSTER FORGET messages to the cluster...
>>> SHUTDOWN the node.

遇到的问题

在用redis-tirb 工具进行reshard 的时候,报如下错误:

[ERR] Calling MIGRATE ERR Syntax error, try CLIENT (LIST | KILL | GETNAME | SETNAME | PAUSE | REPLY)

ruby gem安装的redis库,版本不能使用最新的4.x版本的,否则redis-trib reshard 127.0.0.1:7117重新分片会报语法错误

解决方法

  • 卸载安装的redis库,gem uninstall redis

  • 安装3.x版本,gem install redis -v 3.3.5 测试3.2.1到3.3.5都可以,4.x以上的分片报错。

### 清空 Redis 集群中的主从节点数据 在 Redis 集群环境中,清空所有主从节点上的数据可以通过向集群广播 `FLUSHALL` 或者 `FLUSHDB` 命令来实现。这取决于是否要清除所有的数据库还是仅限于默认的单个数据库。 对于 Redis 集群而言,执行此操作前应当确保已经备份了重要的数据以防误删重要信息[^2]。 为了安全起见,在实际生产环境中建议先停止写入操作再进行清理工作,并且通知到可能受影响的应用方知晓维护窗口的存在。 具体命令如下所示: ```bash # 连接到任意一个集群节点并发送 FLUSHALL/FLUSHDB 广播消息给其他成员 redis-cli --cluster call <host>:<port> FLUSHALL ``` 上述命令会遍历整个集群并将指定指令传递至每一个节点上运行,从而达到统一管理的目的。如果只想针对特定范围内的键名实施删除动作,则可以考虑编写脚本来完成更精细的操作逻辑而不是简单粗暴地全部抹除掉。 另外需要注意的是,当使用 `--cluster call` 参数时,它能够帮助用户轻松地将一条命令分发出去影响全局;而直接通过客户端工具单独连接各个实例也是可行的方法之一,不过效率较低而且容易遗漏某些部分。 #### 使用 Python 实现批量清空功能 除了利用官方提供的 CLI 工具外,还可以借助编程语言如Python 来简化流程控制以及错误处理等方面的工作量。下面给出了一段简单的代码片段用于示范如何自动化这一过程: ```python import redis from itertools import chain def flush_redis_cluster(hosts_ports): r = redis.StrictRedis() # 获取全量slot映射关系表 slots_info = list(chain(*r.cluster('SLOTS'))) masters = set([node['host'] for node in slots_info]) for host_port in hosts_ports: try: client = redis.Redis.from_url(f'redis://{host_port}') if host_port.split(":")[0] not in masters: continue info = client.info(section='replication') role = info.get('role') print(f'Flushing {"master" if role == "master" else "slave"} at {host_port}...') client.flushall() except Exception as e: print(e) if __name__ == '__main__': hosts_ports = ['192.168.1.52:8000', 'other_node_ip:port'] flush_redis_cluster(hosts_ports) ``` 这段程序首先收集到了所有槽位对应的主节点地址列表,接着尝试依次访问这些位置并向它们发出刷新请求。由于从属副本通常不会接受来自外部源发起的数据变更类别的事务(比如本例中的清除),所以这里只对领导者角色进行了相应处理[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值