redis cluster恢复
下面按照你的实际场景整理完整方案:
目标:
-
Redis Cluster 拓扑不变
-
10.252.176.214继续作为 master -
10.252.176.212恢复为它的 slave -
数据量大(RBD 大)
-
避免恢复过程中因为同步超时、输出缓冲、RDB传输导致失败
一、当前拓扑
当前:
slot 0-5460
10.252.176.214
master
|
|
10.252.176.212
slave(Failed)
10.252.176.211
master
|
10.252.176.215
slave
10.252.176.213
master
|
10.252.176.210
slave
只处理:
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-2000
master:
我的 backlog 还有
1000-2000
↓
发送增量命令
优点:
-
不生成 RDB
-
不大量占用磁盘
-
秒级恢复
关键参数:
repl-backlog-size
2. 全量同步(FULLRESYNC)
如果:
-
slave replid丢失
-
offset超过 backlog
-
数据目录丢失
流程:
slave
|
| SYNC
|
master
|
| fork
|
生成RDB
|
发送RDB
|
slave加载RDB
大数据情况下:
风险:
-
master fork压力
-
RBD IO压力
-
网络传输时间长
-
output buffer增长
-
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:
2GB
soft 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:master
connected_slaves:1
slave0:
ip=10.252.176.212
state=online
3. Slave状态
212:
INFO replication
目标:
role:slave
master_host:10.252.176.214
master_link_status:up
master_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 3600
repl-backlog-size 2gb
repl-diskless-sync yes
repl-diskless-sync-delay 5
client-output-buffer-limit replica 2gb 512mb 300
212 Slave
repl-timeout 3600
replica-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 大数据复制成功率。
浙公网安备 33010602011771号