Redis Cluster集群failover

本文围绕Redis Cluster展开,介绍了其通过cluster - node - timeout设置节点状态检测超时,执行耗时命令易触发master/slave的failover,还给出加负载lua脚本模拟测试场景。同时指出lua脚本会使master和slave的aof文件不同,需关注slave节点aof文件大小。最后介绍了集群维护工具redis - trib.rb的简单使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于master/slave的failover,redis cluster通过cluster-node-timeout设置节点间状态检测超时。 如果在redis中执行命令比较耗时,比如超过cluster-node-timeout时长,集群master和slave很容易触发failover,频繁的failover容易导致集群状态的变化。

 

为了验证集群的变化,可以通过如下加负载lua脚本来模拟一些测试场景:

[root@zhannk create-cluster]# ../../src/redis-cli -h 192.168.100.70 -p 30003
192.168.100.70:30003> eval "local key=KEYS[1] ;local s=tonumber(ARGV[1]); local e=tonumber(ARGV[2]); while s<e do redis.call('zadd',key,tostring(s),tostring(s));s=s+1;end;return redis.call('zrangebyscore',key,'-inf','+inf','withscores','limit',ARGV[3],ARGV[4])" 1 {thekey}.50 10 10000000  0 100

该脚本往{thekey}.50的zset里写入10000000条数据,并返回前100条( 脚本源自对用户现场一个可疑zrangebyscore的操作验证)。在默认cluster-node-timeout为2s的情况下,可以明显观察到master/slave的不断failover;同时数据的操作也容易失败。

 

需要注意的是,类似上面的lua脚本会导致master和slave下的aof文件并不是完全一样。redis在做master/slave同步时,并不是把master的aof文件简单同步……特别是使用lua脚本的时候,在同步发生时,需关注slave节点aof文件大小问题。

master节点aof文件:

slave节点aof文件

 

 

redis cluster集群维护工具redis-trib.rb简单使用:

创建集群:

     redis-trib.rb create 192.168.100.254:30001 192.168.100.254:30002 192.168.100.70:30001

添加slave,trib脚本会自动调整合适master:

      redis-trib.rb add-node --slave 192.168.100.254:30003 192.168.100.70:30001

再平衡数据:

      redis-trib.rb rebalance 192.168.100.254:30001

slot异常修复:

       redis-trib.rb fix 192.168.100.254:30001

cluster状态检查:

     redis-trib.rb check 192.168.100.254:30001

 

### Redis Cluster 模式下的命令 #### 管理命令 在 Redis 集群模式下,`redis-cli` 提供了一系列用于管理和维护集群的命令。这些命令允许管理员执行诸如创建新集群、检查现有配置、重新分配哈希槽等操作。 - **Cluster Meet** `CLUSTER MEET ip port` 这条命令用来向当前节点介绍一个新的节点成员,使其加入到现有的集群当中[^1]。 - **Cluster Nodes** `CLUSTER NODES` 返回集群内所有已知节点的信息列表,包括各个节点的状态、角色以及其他属性详情。 - **Cluster Failover** `CLUSTER FAILOVER [FORCE | TAKEOVER]` 手动触发一次故障转移过程,在指定条件下可以强制让某个从属节点晋升为主节点接管服务;其中 FORCE 参数表示即使没有达到选举所需的票数也强行切换,而 TAKEOVER 则是在不等待其他节点同意的情况下立即夺取主控权。 - **Cluster Reset** `CLUSTER RESET [HARD|SOFT]` 对于不再属于任何有效集群的一部分或者即将被移除的节点来说非常有用,它会清除该节点上的所有集群特定的数据并将其恢复成初始未连接状态;参数 HARD 表示完全重置,连同保存下来的持久化文件也会一并删除,而 SOFT 只是逻辑上断开与其他节点的关系而不做物理层面的变化。 #### 数据迁移相关命令 为了实现在线调整各分片之间的负载均衡或是应对某些特殊情况(比如某台机器要下线),Redis 支持动态地把一部分键空间迁移到另一个地方去: - **Resharding (Rehash)** 使用工具如 `redis-trib.rb reshard host:port --from <source_node_id> --to <target_node_id> --slots <number_of_slots_to_move>` 来完成跨节点间槽位及其对应数据项的实际移动工作。此过程中涉及到了源目标两个位置之间网络传输以及同步机制确保一致性。 ```bash $ redis-trib.rb reshard host:port \ --from source_node_id \ --to target_node_id \ --slots number_of_slots_to_move \ --yes \ --timeout timeout_value_in_seconds \ --pipeline pipeline_size_for_bulk_operations ``` #### 键值读写类指令 除了上述专门针对分布式环境设计的功能外,普通的 CRUD API 同样适用于 Redis Clusters 场景之中,只是需要注意的是每次请求都会先定位负责处理相应 key 的具体实例再发送过去而已。 例如设置一个字符串类型的 value 给定名为 mykey 的记录: ```python SET mykey "Hello" ``` 获取这个存储单元的内容则可通过 GET 方法达成目的: ```python GET mykey ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值