今天在打算在开发环境利用docker布暑一套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


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




通过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网络达到容器与容器间通信。
总结
从节点注册到主节点时按容器内的端口注册,所以在跨主机且通过普通网络访问的情况下会导致网络不通。在同一台主机下,容器与容器间可以直接通信,所以同一主机不会出现此问题。
网友评论