Skip to content

Redis 复制中断

常见原因

原因描述
网络问题连接失败、高延迟或网络分区
主节点问题主节点宕机、配置更改或密码更改
从节点问题从节点崩溃、资源耗尽或配置更改
复制缓冲区溢出复制积压缓冲区对于复制延迟来说太小
长时间运行的命令阻塞主节点时间过长的命令
大数据集同步大型数据集的初始同步超时
防火墙更改防火墙规则阻止复制流量
认证问题不正确的 masterauth 配置

Redis 复制中断是指从 Redis 实例失去与主实例的连接,并且无法重新连接或重新同步。这可能导致:

  • 主从节点之间的数据不一致
  • 从节点重新连接时增加主节点负载
  • 故障转移时可能导致数据丢失
  • 高可用性降低

识别和诊断

复制中断的症状

  • 从节点在复制信息中显示为 "disconnected"
  • 复制延迟持续增加
  • 从节点日志包含连接错误消息
  • 主节点显示的已连接从节点数量少于预期
  • Prometheus/Grafana 仪表板显示复制错误

诊断步骤

步骤 1:检查复制状态

bash
# 在从节点上
redis-cli info replication

# 在主节点上
redis-cli info replication

步骤 2:检查 Redis 日志

bash
# 检查从节点日志
tail -f /var/log/redis/redis-server.log | grep -i "replication\|sync\|master"

# 检查主节点日志
tail -f /var/log/redis/redis-server.log | grep -i "replication\|sync\|slave"

步骤 3:测试网络连接

bash
# 测试从节点到主节点的网络连接
ping master-ip
telnet master-ip 6379
nc -zv master-ip 6379

# 检查端口是否开放
redis-cli -h master-ip -p 6379 ping

步骤 4:验证配置

bash
# 检查从节点配置
redis-cli config get replicaof
redis-cli config get masterauth
redis-cli config get port

# 检查主节点配置
redis-cli config get requirepass
redis-cli config get port

步骤 5:检查复制缓冲区

bash
# 检查复制积压缓冲区大小
redis-cli config get repl-backlog-size
redis-cli info replication | grep repl_backlog

恢复流程

场景 1:临时网络问题

步骤 1:检查从节点是否自动重新连接

bash
# 监控复制状态
watch -n 1 redis-cli info replication | grep -E "connected_slaves|master_link_status"

步骤 2:如果未自动重新连接,重启复制

bash
# 在从节点上
redis-cli slaveof no one
redis-cli slaveof master-ip master-port

场景 2:复制缓冲区溢出

步骤 1:增加复制积压缓冲区大小

bash
# 在主节点上
redis-cli config set repl-backlog-size 1gb
redis-cli config rewrite

步骤 2:重启复制

bash
# 在从节点上
redis-cli slaveof no one
redis-cli slaveof master-ip master-port

场景 3:大数据集同步失败

步骤 1:调整超时设置

bash
# 在主节点和从节点上
redis-cli config set repl-timeout 600
redis-cli config rewrite

步骤 2:尽可能使用部分同步

bash
# 检查是否支持部分同步
redis-cli info replication | grep repl_backlog_active

步骤 3:如果需要全量同步,针对大数据集进行优化

bash
# 在主节点上
redis-cli config set rdbcompression yes
redis-cli config set save ""
redis-cli bgsave

# 等待 RDB 完成
redis-cli info persistence | grep rdb_last_save_time

# 在从节点上
redis-cli slaveof no one
redis-cli slaveof master-ip master-port

场景 4:认证问题

步骤 1:验证密码

bash
# 检查主节点密码
redis-cli -h master-ip -a master-password ping

# 检查从节点 masterauth 配置
redis-cli config get masterauth

步骤 2:修复认证配置

bash
# 在从节点上
redis-cli config set masterauth "correct-master-password"
redis-cli config rewrite
redis-cli slaveof no one
redis-cli slaveof master-ip master-port

场景 5:主节点永久故障

步骤 1:将健康的从节点提升为主节点

bash
# 在选定的从节点上
redis-cli slaveof no one

# 在其他从节点上
redis-cli slaveof new-master-ip new-master-port

步骤 2:更新应用程序

  • 将应用程序指向新的主节点
  • 验证应用程序功能

预防措施

网络配置

  • 使用可靠的网络基础设施:确保主从节点之间的连接稳定
  • 实现网络冗余:主从节点之间使用多条网络路径
  • 配置适当的超时时间:根据网络条件调整 repl-timeout
  • 启用 TCP keepalive:设置 tcp-keepalive 60 以检测失效连接

复制配置

  • 设置适当的积压缓冲区大小:对于大型数据集或高写入负载,设置 repl-backlog-size 1gb
  • 配置从节点优先级:设置 slave-priority 以控制故障转移
  • 启用部分同步:确保使用 Redis 2.8+ 以支持 PSYNC
  • 优化复制的 RDB:启用 rdbcompression 以加快传输速度

监控和告警

  • 设置复制延迟告警:当延迟超过阈值(例如 1MB)时告警
  • 监控从节点连接状态:当从节点断开连接时告警
  • 跟踪复制缓冲区使用情况:当缓冲区填满时告警
  • 监控网络连接:主从节点之间的 ping 检查

定期维护

  • 测试故障转移流程:每季度进行故障转移演练
  • 检查复制状态:定期验证所有从节点都已连接
  • 更新 Redis 版本:使用支持的版本,包含错误修复
  • 审查配置更改:在生产环境之前在测试环境中测试更改

最佳实践

复制架构

  • 使用奇数个从节点:3 个或更多从节点以获得更好的冗余
  • 跨可用区分布从节点:避免单点故障
  • 实现 Sentinel 或 Cluster:用于自动故障转移
  • 使用从节点读取:从主节点卸载读取流量

恢复最佳实践

  • 始终先备份数据:在更改复制之前
  • 测试恢复流程:在测试环境中练习
  • 记录恢复步骤:针对不同场景的分步指南
  • 制定回滚计划:准备好在需要时回滚更改
  • 恢复后监控:验证复制保持稳定

主从配置一致性

  • 使用相同的 Redis 版本:避免版本不匹配
  • 匹配配置参数:确保主从节点之间的关键参数匹配
  • 同步配置更改:一致地将更改应用到所有节点
  • 使用配置管理工具:使用 Ansible、Chef 或 Puppet 实现一致的配置

高级场景故障排除

大数据集初始同步

问题:从节点无法完成大型数据集的初始同步

解决方案

  1. 增加 repl-timeout 以处理大型同步
  2. 启动 Redis 时使用 --timeout 选项
  3. 手动将 RDB 文件复制到从节点:
    bash
    # 在主节点上
    redis-cli bgsave
    scp /var/lib/redis/dump.rdb slave:/var/lib/redis/
    
    # 在从节点上
    redis-cli slaveof no one
    redis-cli debug reload
    redis-cli slaveof master-ip master-port

峰值负载期间高复制延迟

问题:峰值流量期间复制延迟显著增加

解决方案

  1. 增加 repl-backlog-size 以处理更高的写入量
  2. 优化主节点性能以减少命令执行时间
  3. 实现分片以分布写入负载
  4. 使用 Redis Cluster 进行水平扩展

主节点重启后从节点未重新连接

问题:主节点重启后从节点未自动重新连接

解决方案

  1. 检查从节点日志中的连接错误
  2. 验证 masterauth 配置是否正确
  3. 手动重启复制:
    bash
    redis-cli slaveof no one
    redis-cli slaveof master-ip master-port
  4. 如果主节点 IP 已更改,检查防火墙规则

监控工具和命令

Redis CLI 命令

bash
# 检查复制状态
redis-cli info replication

# 检查主从连接
redis-cli -h slave-ip -p slave-port ping

# 实时监控复制
redis-cli --stat | grep -E "master|slave|lag"

# 获取复制积压缓冲区信息
redis-cli info replication | grep repl_backlog

Prometheus 指标

指标描述
redis_replication_master_link_status连接时为 1,否则为 0
redis_replication_offset_master_bytes主节点复制偏移量
redis_replication_offset_slave_bytes从节点复制偏移量
redis_connected_slaves已连接从节点数量
redis_repl_backlog_active复制积压缓冲区激活时为 1

Grafana 仪表板

  • 导入 Redis 仪表板(ID: 763)进行可视化
  • 为复制中断创建自定义告警
  • 随时间监控复制延迟趋势

常见问题(FAQ)

Q1:如何知道 Redis 复制是否中断?

A1:复制中断的迹象包括:

  • 从节点上的 master_link_status: down
  • 复制延迟增加
  • 从节点在复制信息中显示为 "disconnected"
  • 从节点日志中有关连接失败的错误消息
  • 主节点显示的已连接从节点数量少于预期

Q2:从复制中断中恢复需要多长时间?

A2:恢复时间取决于:

  • 中断原因(网络问题 vs 配置问题)
  • 数据集大小(大型数据集重新同步需要更长时间)
  • 主从节点之间的网络速度
  • 配置设置(积压缓冲区大小、超时时间)

简单的网络问题可能在几秒钟内恢复,而大型数据集重新同步可能需要几分钟或几小时。

Q3:我可以完全防止复制中断吗?

A3:虽然您无法防止所有复制中断,但可以通过以下方式将其最小化:

  • 使用可靠的网络基础设施
  • 配置适当的复制设置
  • 持续监控复制状态
  • 使用 Sentinel 或 Cluster 实现自动故障转移
  • 定期测试复制和故障转移流程

Q4:复制中断期间数据会发生什么?

A4:在复制中断期间:

  • 从节点停止接收主节点的更新
  • 从节点上的数据变得陈旧
  • 如果主节点发生故障,故障转移可能会提升陈旧的从节点
  • 当从节点重新连接时,它将与主节点同步(部分或全量同步)

Q5:恢复时应使用部分同步还是全量同步?

A5:尽可能使用部分同步,因为:

  • 速度更快(仅发送中断后的更改)
  • 使用更少的网络带宽
  • 对主节点的负载更小

全量同步用于:

  • 部分同步不可行时(例如,积压缓冲区溢出)
  • 从节点首次连接时
  • 需要手动干预时

Q6:如何测试复制中断?

A6:通过以下方式测试复制中断:

  • 模拟主从节点之间的网络故障
  • 使用不同的配置重启主节点
  • 更改主节点密码以测试认证处理
  • 使主节点过载以测试复制积压缓冲区行为
  • 定期进行故障转移演练

Q7:推荐的复制积压缓冲区大小是多少?

A7:推荐的积压缓冲区大小取决于:

  • 主节点上的写入速率
  • 预期的最大复制延迟
  • 网络可靠性

对于大多数环境,1GB 是一个很好的起点。对于高写入环境,增加到 2GB 或更多。

Q8:如何实时监控复制中断?

A8:使用以下工具监控复制中断:

  • Redis CLI info replication 命令
  • Prometheus 与 Redis Exporter 用于指标收集
  • Grafana 仪表板用于可视化
  • Alertmanager 用于实时告警
  • 定期检查复制状态的自定义脚本

结论

Redis 复制中断很常见,但通过适当的配置、监控和恢复流程可以管理。通过了解原因、实施预防措施并制定完善的恢复计划,您可以最大限度地减少复制中断的影响,并确保 Redis 部署的高可用性。