Redis在Docker环境下无法主从复制问题

今天在打算在开发环境利用docker布暑一套redis主从架构,期间出现了一此问题,在此记录一下。

架构如下:


redis 主从架构

过程

#host1运行master

docker run -d --name redis-master -v /data/redis/master:/data -p 6379:6379 registry.cn-hangzhou.aliyuncs.com/adair/redis

#host1 运行slave1

docker run -d --name redis-slave1 -v /data/redis/slave1:/data -p 6380:6379 registry.cn-hangzhou.aliyuncs.com/adair/redis

#设置redis-slave1为redis-master的从机

docker exec -it redis-slave1 redis-cli -a xxx

slaveof 192.168.99.100 6379

#host2运行slave2

docker run -d --name redis-slave2 -v /data/redis/slave2:/data -p 6380:6379 registry.cn-hangzhou.aliyuncs.com/adair/redis

#设置redis-slave2为redis-master的从机

docker exec -it redis-salve2 redis-cli -a xxx

slaveof 192.168.99100 6379


host1 docker container
host2 docker container

这么一通操作下来,通过客户端连接各redis节点,发现slave1能正常同步数据,slave2不能正常同步master的数据。首先想到的容器间网络是否连通,经测试slave2容器能正常ping通host1。其次查看master、slave2的info replication和日志。


master info replication
master log
slave2 info replication
slave2 info

通过master的info replication命令显示的connected_slaves:2能看到其下确实有两台slave节点,但从slave2的master_link_status:down信息看master节点是down状态的,且通过master日志发现master一直在bgslave,并向salve2同步信息,但连接一直lost,通过slave2日志,则一直向master请求同步全量信息,为什么会出现这样的问题呢?经过细看日志下,发现master连接的是slave2的HOST2宿主机的6379端口,但我slave2映射到宿主机是6380端口,想这问题一定是这个原因。

解决

重做redis-slave2容器,把宿主机端口与容器端口一致,问题解决。

docker run -d --name redis-slave2 -v /data/redis/slave2:/data -p 6379:6379 registry.cn-hangzhou.aliyuncs.com/adair/redis

还可通过overlay网络达到容器与容器间通信。

总结

从节点注册到主节点时按容器内的端口注册,所以在跨主机且通过普通网络访问的情况下会导致网络不通。在同一台主机下,容器与容器间可以直接通信,所以同一主机不会出现此问题。

你可能感兴趣的:(Redis在Docker环境下无法主从复制问题)