Google Kubernetes Engine中Redis主从复制失败问题求助
我之前在GKE上部署Java版GuestBook时也碰到过几乎一模一样的Redis主从复制问题——主节点读写正常,但从节点就是同步不了数据。给你几个针对性的排查方向,一步步来应该能找到根源:
先确认从节点的主节点配置是否正确
进入Redis从节点的Pod,手动检查复制状态:# 进入从节点Pod kubectl exec -it <你的redis-slave-pod名称> -- bash # 连接Redis客户端 redis-cli # 查看复制相关信息 INFO replication重点关注这几个字段:
master_host:是不是Redis主节点的Service名称(比如默认的redis-master),别用固定Pod IP——Pod重启后IP会变,用Service名称才是可靠的方式master_link_status:状态是不是up,如果是down说明主从连接有问题master_last_io_seconds_ago:如果数值很大,说明从节点很久没和主节点通信了
检查主从节点的网络连通性
在从节点Pod里测试能不能正常访问主节点:# ping主节点Service,验证DNS解析和网络连通性 ping redis-master # 测试6379端口是否能正常访问 telnet redis-master 6379如果不通,先确认两个Pod是不是在同一个Namespace下,再检查有没有配置NetworkPolicy限制了主从之间的流量——GKE默认没有NetworkPolicy,但如果之前手动添加过,可能会挡住Redis的端口。
检查主节点的复制权限和状态
进入主节点Pod,确认有没有设置密码,以及内存使用是否正常:kubectl exec -it <你的redis-master-pod名称> -- bash redis-cli # 检查是否设置了访问密码 CONFIG GET requirepass # 检查内存使用情况,避免主节点内存满了停止复制 INFO memory如果主节点设置了
requirepass,从节点必须配置masterauth参数才能正常同步,不然会出现认证失败的错误。查看从节点日志找错误线索
直接看从节点的Pod日志,很多时候错误信息会直接告诉你问题所在:kubectl logs <你的redis-slave-pod名称>常见的错误比如
Could not connect to master(网络或主节点地址配置错误)、Authentication failed(密码不匹配)、Master replied with error: NOAUTH Authentication required(从节点没配置masterauth),这些都能快速定位问题。确认Deployment配置是否正确
检查Redis从节点的Deployment配置,看启动命令或环境变量有没有正确设置主从关系:- 如果是用命令行参数启动,应该包含
--slaveof redis-master 6379(Redis 5及以上版本用--replicaof) - 如果是用配置文件挂载,确认配置文件里的
slaveof(或replicaof)参数指向正确的主节点地址
- 如果是用命令行参数启动,应该包含
手动触发同步测试
如果上面的检查都没问题,可以在从节点手动执行同步命令试试:# 在从节点的redis-cli里执行(Redis 4及以下版本) SLAVEOF redis-master 6379 # Redis 5+版本用 REPLICAOF redis-master 6379执行完再用
INFO replication查看状态,如果能正常同步,说明启动时的配置没生效,可能是Deployment的启动命令写错了,或者环境变量没正确传递。
内容的提问来源于stack exchange,提问作者Siva Reddy Vippala

