MK
摩柯社区 - 一个极简的技术知识社区
AI 面试

Redis旧版复制功能的故障排查技巧

2022-08-215.4k 阅读

Redis 旧版复制功能概述

Redis 旧版复制功能是主从架构实现的基础,主节点负责处理写操作,从节点复制主节点的数据以实现数据冗余和读负载均衡。在这种模式下,从节点会向主节点发送 SYNC 命令,主节点收到命令后执行 BGSAVE 生成 RDB 文件,并将文件发送给从节点。同时,主节点会缓存新的写命令,等 RDB 文件发送完毕后,再将缓存的写命令发送给从节点,从而使从节点的数据与主节点保持一致。

常见故障类型及排查方法

网络连接故障

  1. 故障现象:从节点无法连接到主节点,日志中出现连接失败相关信息。例如,从节点日志可能显示 “Connecting to MASTER... Could not connect to Redis at [主节点IP]:[主节点端口]: Connection refused”。
  2. 排查步骤
    • 检查网络配置:使用 ping 命令检查从节点与主节点之间的网络连通性。例如,在从节点服务器上执行 ping [主节点IP],如果无法ping通,可能是网络配置问题,需要检查防火墙设置、路由器配置等。可以通过 iptables -L 命令查看防火墙规则,确保 Redis 服务端口(默认为 6379)未被封禁。如果是云服务器,还需检查安全组规则设置。
    • 检查 Redis 配置:确认主节点的 bind 配置项是否限制了可连接的 IP 地址。如果 bind 配置了特定的 IP 地址,而从节点不在此范围内,则无法连接。例如,若主节点配置为 bind 192.168.1.100,从节点 IP 为 192.168.1.101,则需要修改 bind 配置为 bind 0.0.0.0 (此配置会使 Redis 监听所有网络接口,在生产环境中需谨慎使用,应根据实际安全需求配置),或者将从节点 IP 添加到 bind 配置中。同时,检查主节点和从节点的 port 配置,确保端口一致且未被其他进程占用。可以使用 lsof -i :[端口号] 命令查看指定端口是否被占用。
  3. 代码示例
# 检查网络连通性
ping 192.168.1.100 

# 查看防火墙规则
iptables -L 

# 查看端口占用情况
lsof -i :6379 

SYNC 命令相关故障

  1. 故障现象:从节点发送 SYNC 命令后,长时间未完成同步,主节点日志出现异常,如 “MASTER <-> REPLICA sync: received SYNC but replication is not in progress”。
  2. 排查步骤
    • 检查主节点状态:在主节点上执行 INFO replication 命令,查看主节点的复制状态。如果 role 字段不是 master,则说明主节点角色异常。正常情况下,应看到类似如下信息:
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.1.101,port=6379,state=online,offset=12345,lag=0
master_replid:56789abcdef0123456789abcdef0123456789abcdef
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:12345
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:12345
- **检查 RDB 文件生成**:主节点在收到 SYNC 命令后会执行 BGSAVE 生成 RDB 文件。可以通过查看主节点日志确认 BGSAVE 是否成功执行。日志中若出现 “Background saving started by pid [pid 号]” 和 “Background saving terminated with success” 则表示成功。若出现错误,如 “Can't save in background: fork: Cannot allocate memory”,可能是系统内存不足导致无法执行 fork 操作生成 RDB 文件。此时,可以通过 `free -h` 命令查看系统内存使用情况,考虑优化系统内存使用或增加内存。另外,检查 `dir` 和 `dbfilename` 配置项,确保 RDB 文件有正确的存储路径和文件名。例如,若 `dir` 配置为 `/var/lib/redis`,而该目录没有写权限,也会导致 RDB 文件生成失败。
- **检查网络传输**:由于 RDB 文件可能较大,网络传输过程中可能出现问题。可以通过抓包工具(如 `tcpdump`)分析从节点与主节点之间的网络流量,查看是否有丢包现象。在主节点服务器上执行 `tcpdump -i eth0 host [从节点IP] and port 6379 -w sync.pcap`(假设网卡为 eth0),然后在从节点尝试同步,结束后使用 `Wireshark` 等工具分析 `sync.pcap` 文件。如果发现大量丢包,需要联系网络管理员排查网络设备故障或优化网络带宽。

3. 代码示例

# 在主节点查看复制状态
redis-cli INFO replication 

# 查看系统内存使用情况
free -h 

# 抓包命令
tcpdump -i eth0 host 192.168.1.101 and port 6379 -w sync.pcap 

数据不一致故障

  1. 故障现象:从节点数据与主节点数据不一致,在执行读操作时,从节点返回的数据与主节点预期数据不同。例如,在主节点设置 SET key value,在从节点获取 GET key 时返回空值或错误值。
  2. 排查步骤
    • 检查复制偏移量:在主节点和从节点分别执行 INFO replication 命令,对比 master_repl_offsetslave_repl_offset 字段。如果从节点的 slave_repl_offset 小于主节点的 master_repl_offset,说明从节点可能落后于主节点。例如,主节点 master_repl_offset 为 10000,而从节点 slave_repl_offset 为 8000,可能是从节点在同步过程中丢失了部分写命令。可以通过调整 repl_backlog_size 参数来增大复制积压缓冲区,以减少数据丢失的可能性。repl_backlog_size 配置项默认为 1MB,可以根据实际写操作频率适当增大,如设置为 repl_backlog_size 10mb
    • 检查写命令传播:主节点在同步 RDB 文件后会将缓存的写命令发送给从节点。可以通过在主节点和从节点开启慢查询日志(slowlog-log-slower-thanslowlog-max-len 配置项),查看写命令的执行情况。在主节点和从节点的配置文件中设置 slowlog-log-slower-than 10000(表示记录执行时间超过 10 毫秒的命令)和 slowlog-max-len 1000(表示最多记录 1000 条慢查询日志),然后通过 redis-cli SLOWLOG GET 命令查看日志,检查是否有写命令在从节点执行异常。如果发现从节点执行写命令缓慢或失败,可能是从节点的 CPU、内存等资源不足,需要进一步排查系统资源使用情况。
    • 检查过期键处理:Redis 中键可能设置了过期时间,主从节点在过期键处理上可能出现不一致。确保主从节点的 maxmemory-policy 配置一致,若设置为 volatile-lruallkeys-lru 等淘汰策略,可能会因为内存使用情况不同导致过期键提前被淘汰。另外,从节点在同步过程中可能对过期键的处理存在延迟。可以通过 DEBUG OBJECT [key] 命令查看键的详细信息,包括过期时间等,在主从节点上对比同一键的信息,确认过期键处理是否一致。
  3. 代码示例
# 在主从节点查看复制偏移量
redis-cli INFO replication 

# 在主从节点查看慢查询日志
redis-cli SLOWLOG GET 

# 查看键详细信息
redis-cli DEBUG OBJECT key 

从节点角色故障

  1. 故障现象:从节点行为异常,不接受读请求,或者表现出主节点的行为,如处理写请求。
  2. 排查步骤
    • 确认节点角色:在从节点执行 INFO replication 命令,查看 role 字段是否为 slave。如果不是,可能是配置错误导致节点角色异常。例如,如果在从节点配置文件中误删除了 slaveof [主节点IP] [主节点端口] 配置项,节点可能会以独立节点启动,而非从节点。重新添加正确的 slaveof 配置项,并重启 Redis 服务。
    • 检查配置文件:仔细检查从节点的配置文件,除了 slaveof 配置项,还需确认其他与复制相关的配置是否正确,如 repl-disable-tcp-nodelay 配置项,它决定是否禁用 TCP_NODELAY。若配置错误,可能影响数据同步性能。如果设置为 yes,数据会批量发送,可能会减少网络交互次数,但会增加数据传输延迟;若设置为 no,数据会及时发送,但可能增加网络带宽消耗。根据实际需求调整该配置项。另外,检查 repl-ping-slave-period 配置项,它设置了主节点向从节点发送心跳的间隔时间,默认值为 10 秒。若设置过短或过长,可能影响主从节点之间的连接检测。
  3. 代码示例
# 在从节点查看角色
redis-cli INFO replication 

# 重启 Redis 服务(以 systemd 为例)
sudo systemctl restart redis 

总结常见故障排查思路

在排查 Redis 旧版复制功能故障时,首先要根据故障现象确定可能的故障类型,如网络连接、SYNC 命令、数据不一致或节点角色问题。然后按照相应的排查步骤,从网络配置、Redis 配置、系统资源、命令执行等多个方面进行深入检查。在排查过程中,合理运用 INFODEBUGSLOWLOG 等 Redis 命令以及系统命令(如 pinglsoftcpdump 等)获取关键信息,逐步定位并解决问题。同时,要注意在生产环境中操作时,对配置文件的修改和命令执行应谨慎,避免影响业务正常运行。

希望通过以上详细的故障排查技巧,能帮助大家快速有效地解决 Redis 旧版复制功能中遇到的各种问题,确保 Redis 主从架构的稳定运行。在实际应用中,还需要不断积累经验,针对不同的故障场景灵活运用这些方法。