当前位置: 首页 > news >正文

redis cluster恢复 - 小镇

redis cluster恢复

下面按照你的实际场景整理完整方案:

目标:

  • Redis Cluster 拓扑不变

  • 10.252.176.214 继续作为 master

  • 10.252.176.212 恢复为它的 slave

  • 数据量大(RBD 大)

  • 避免恢复过程中因为同步超时、输出缓冲、RDB传输导致失败


一、当前拓扑

当前:

                 slot 0-546010.252.176.214master||10.252.176.212slave(Failed)10.252.176.211master|10.252.176.215slave10.252.176.213master|10.252.176.210slave

只处理:

10.252.176.214 <----> 10.252.176.212

不执行:

cluster reshard
cluster failover
cluster replicate
cluster reset

二、Redis 主从复制理论

Redis replication 有两种同步:


1. 增量同步(PSYNC)

条件:

slave 保存:

master_replid
slave_repl_offset

master 保留:

repl_backlog

恢复:

slave:我缺少 offset 1000-2000master:我的 backlog 还有1000-2000↓发送增量命令

优点:

  • 不生成 RDB

  • 不大量占用磁盘

  • 秒级恢复

关键参数:

repl-backlog-size

2. 全量同步(FULLRESYNC)

如果:

  • slave replid丢失

  • offset超过 backlog

  • 数据目录丢失

流程:

slave|| SYNC|
master|| fork|
生成RDB|
发送RDB|
slave加载RDB

大数据情况下:

风险:

  1. master fork压力

  2. RBD IO压力

  3. 网络传输时间长

  4. output buffer增长

  5. timeout断开

你的问题属于这个风险模型。


三、恢复前 Master(214)调整

登录:

redis-cli -h 10.252.176.214 -p 16379

1. 调整 replication timeout

查看:

CONFIG GET repl-timeout

默认:

60

大数据恢复不合适。

调整:

CONFIG SET repl-timeout 3600

配置:

repl-timeout 3600

作用:

允许复制连接:

3600秒无异常断开

2. 调整 slave 输出缓冲区

理论

master 内部:

master|| replication client|slave

master 为每个 slave 保存:

output buffer

同步期间:

RDB发送
+
业务写入命令缓存

如果slave慢:

buffer增长。

默认:

256MB

可能不足。


查看:

CONFIG GET client-output-buffer-limit

修改:

Redis 5/6/7:

CONFIG SET client-output-buffer-limit \
"normal 0 0 0 replica 2gb 512mb 300 pubsub 32mb 8mb 60"

旧版本:

CONFIG SET client-output-buffer-limit \
"normal 0 0 0 slave 2gb 512mb 300 pubsub 32mb 8mb 60"

含义:

hard limit:
2GBsoft limit:
512MB持续:
300秒

3. 增大 replication backlog

查看:

CONFIG GET repl-backlog-size

调整:

CONFIG SET repl-backlog-size 2gb

理论:

保证:

写入速度 × 故障时间 < backlog

例如:

业务写:

20MB/s

故障:

10分钟

需要:

20×600=12GB

那么2GB仍不足。

实际值根据业务写入计算。


4. 开启 diskless sync

查看:

CONFIG GET repl-diskless-sync

设置:

CONFIG SET repl-diskless-sync yes

理论:

默认:

master|
fork|
生成RDB文件|
磁盘|
网络

diskless:

master|
fork|
socket|
slave

减少:

  • RBD临时文件

  • Ceph RBD写压力


5. 设置 diskless 延迟

查看:

CONFIG GET repl-diskless-sync-delay

设置:

CONFIG SET repl-diskless-sync-delay 5

作用:

等待多个slave同时同步。

你这里只有一个slave,可选。


四、Slave(212)调整

登录:

redis-cli -h 10.252.176.212 -p 16379

1. replication timeout

设置:

CONFIG SET repl-timeout 3600

2. 确认只读

查看:

CONFIG GET replica-read-only

保持:

yes

3. 确认 cluster 文件

检查:

redis.conf:

cluster-enabled yes
cluster-config-file nodes.conf

必须保留:

nodes.conf

不要:

cluster reset
rm nodes.conf

五、恢复操作

1. 停止反复失败同步

212:

systemctl stop redis

2. 修改配置

修改:

214:

repl-timeout
client-output-buffer-limit
repl-backlog-size
repl-diskless-sync

212:

repl-timeout

3. 启动212

systemctl start redis

六、恢复验证

1. Cluster状态

任意节点:

redis-cli -p 16379 cluster info

必须:

cluster_state:ok
cluster_slots_fail:0

2. Master状态

214:

INFO replication

目标:

role:masterconnected_slaves:1slave0:
ip=10.252.176.212
state=online

3. Slave状态

212:

INFO replication

目标:

role:slavemaster_host:10.252.176.214master_link_status:upmaster_sync_in_progress:0

4. 判断同步类型

查看214日志:

成功增量:

Partial resynchronization accepted

成功全量:

Synchronization with replica succeeded

失败:

Client closed connection
Output buffer limit reached
Timeout

七、最终推荐配置

214 Master

repl-timeout 3600repl-backlog-size 2gbrepl-diskless-sync yesrepl-diskless-sync-delay 5client-output-buffer-limit replica 2gb 512mb 300

212 Slave

repl-timeout 3600replica-read-only yes

八、最关键的判断依据

对于你的“大 RBD”环境,恢复成功的核心指标:

指标正常值
master_link_status up
master_sync_in_progress 0
connected_slaves 1
slave state online
cluster_state ok
复制offset差距 持续接近
日志 无timeout/output buffer错误

这套调整不会改变 Redis Cluster:

  • 不迁移slot

  • 不改变master

  • 不改变node id

  • 不重新组cluster

只是提高 214 → 212 大数据复制成功率。