Redis旧版复制功能的故障排查技巧
2022-08-215.4k 阅读
Redis 旧版复制功能概述
Redis 旧版复制功能是主从架构实现的基础,主节点负责处理写操作,从节点复制主节点的数据以实现数据冗余和读负载均衡。在这种模式下,从节点会向主节点发送 SYNC 命令,主节点收到命令后执行 BGSAVE 生成 RDB 文件,并将文件发送给从节点。同时,主节点会缓存新的写命令,等 RDB 文件发送完毕后,再将缓存的写命令发送给从节点,从而使从节点的数据与主节点保持一致。
常见故障类型及排查方法
网络连接故障
- 故障现象:从节点无法连接到主节点,日志中出现连接失败相关信息。例如,从节点日志可能显示 “Connecting to MASTER... Could not connect to Redis at [主节点IP]:[主节点端口]: Connection refused”。
- 排查步骤:
- 检查网络配置:使用
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 :[端口号]
命令查看指定端口是否被占用。
- 检查网络配置:使用
- 代码示例:
# 检查网络连通性
ping 192.168.1.100
# 查看防火墙规则
iptables -L
# 查看端口占用情况
lsof -i :6379
SYNC 命令相关故障
- 故障现象:从节点发送 SYNC 命令后,长时间未完成同步,主节点日志出现异常,如 “MASTER <-> REPLICA sync: received SYNC but replication is not in progress”。
- 排查步骤:
- 检查主节点状态:在主节点上执行
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
数据不一致故障
- 故障现象:从节点数据与主节点数据不一致,在执行读操作时,从节点返回的数据与主节点预期数据不同。例如,在主节点设置
SET key value
,在从节点获取GET key
时返回空值或错误值。 - 排查步骤:
- 检查复制偏移量:在主节点和从节点分别执行
INFO replication
命令,对比master_repl_offset
和slave_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-than
和slowlog-max-len
配置项),查看写命令的执行情况。在主节点和从节点的配置文件中设置slowlog-log-slower-than 10000
(表示记录执行时间超过 10 毫秒的命令)和slowlog-max-len 1000
(表示最多记录 1000 条慢查询日志),然后通过redis-cli SLOWLOG GET
命令查看日志,检查是否有写命令在从节点执行异常。如果发现从节点执行写命令缓慢或失败,可能是从节点的 CPU、内存等资源不足,需要进一步排查系统资源使用情况。 - 检查过期键处理:Redis 中键可能设置了过期时间,主从节点在过期键处理上可能出现不一致。确保主从节点的
maxmemory-policy
配置一致,若设置为volatile-lru
或allkeys-lru
等淘汰策略,可能会因为内存使用情况不同导致过期键提前被淘汰。另外,从节点在同步过程中可能对过期键的处理存在延迟。可以通过DEBUG OBJECT [key]
命令查看键的详细信息,包括过期时间等,在主从节点上对比同一键的信息,确认过期键处理是否一致。
- 检查复制偏移量:在主节点和从节点分别执行
- 代码示例:
# 在主从节点查看复制偏移量
redis-cli INFO replication
# 在主从节点查看慢查询日志
redis-cli SLOWLOG GET
# 查看键详细信息
redis-cli DEBUG OBJECT key
从节点角色故障
- 故障现象:从节点行为异常,不接受读请求,或者表现出主节点的行为,如处理写请求。
- 排查步骤:
- 确认节点角色:在从节点执行
INFO replication
命令,查看role
字段是否为slave
。如果不是,可能是配置错误导致节点角色异常。例如,如果在从节点配置文件中误删除了slaveof [主节点IP] [主节点端口]
配置项,节点可能会以独立节点启动,而非从节点。重新添加正确的slaveof
配置项,并重启 Redis 服务。 - 检查配置文件:仔细检查从节点的配置文件,除了
slaveof
配置项,还需确认其他与复制相关的配置是否正确,如repl-disable-tcp-nodelay
配置项,它决定是否禁用 TCP_NODELAY。若配置错误,可能影响数据同步性能。如果设置为yes
,数据会批量发送,可能会减少网络交互次数,但会增加数据传输延迟;若设置为no
,数据会及时发送,但可能增加网络带宽消耗。根据实际需求调整该配置项。另外,检查repl-ping-slave-period
配置项,它设置了主节点向从节点发送心跳的间隔时间,默认值为 10 秒。若设置过短或过长,可能影响主从节点之间的连接检测。
- 确认节点角色:在从节点执行
- 代码示例:
# 在从节点查看角色
redis-cli INFO replication
# 重启 Redis 服务(以 systemd 为例)
sudo systemctl restart redis
总结常见故障排查思路
在排查 Redis 旧版复制功能故障时,首先要根据故障现象确定可能的故障类型,如网络连接、SYNC 命令、数据不一致或节点角色问题。然后按照相应的排查步骤,从网络配置、Redis 配置、系统资源、命令执行等多个方面进行深入检查。在排查过程中,合理运用 INFO
、DEBUG
、SLOWLOG
等 Redis 命令以及系统命令(如 ping
、lsof
、tcpdump
等)获取关键信息,逐步定位并解决问题。同时,要注意在生产环境中操作时,对配置文件的修改和命令执行应谨慎,避免影响业务正常运行。
希望通过以上详细的故障排查技巧,能帮助大家快速有效地解决 Redis 旧版复制功能中遇到的各种问题,确保 Redis 主从架构的稳定运行。在实际应用中,还需要不断积累经验,针对不同的故障场景灵活运用这些方法。