关于docker 构建redis 主从/哨兵/集群网络问题
问题分析
最近在使用docker构建redis集群时,遇到了一个问题:基于docker所构建的redis集群在docker容器内是能够访问的,但是在容器外或者两个无关联的容器间,是无法访问的。经过查阅官方文档,发现了原来是redis与的docker网络模式不兼容的原因。
我们知道docker在运行容器时,容器内部有一个独立的网络(默认情况下),通过docker设置的虚拟网桥与外部通信。并且我们可以使用-p参数来映射docker容器的端口。docker使用的是一种类似端口映射的技术,这导致容器内外的ip和端口可能是不一样。而redis主从节点间通信时,是基于INFO命令的信息来自动发现从节点的ip和端口信息。当集群运行的容器里时,redis获取的信息的容器内部的ip和端口。
运行info 命令,可以看到节点的ip和端口是容器内部ip。
解决方案
这个问题,在主从模式,哨兵模式,集群模式下都会遇到。redis官方提供了3个解决方案:
1.主动配置
redis提供了2个参数(redis.conf),可以强制slave向master声明任意IP和端口对:
replica-announce-ip 5.5.5.5
replica-announce-port 1234
使用这两个参数后,从节点发送给主节点的ip和端口信息就是这里设定好了。<