使用redis-sentinel在进行redis复制时,通过SSH端口转发需要注意的事项
作为自己的备忘录替代品。
事件
在测试环境中,按照以下方式。
-
- srv1
redis master (port 6400)
redis sentinel
srv2
redis slave (from srv1 master) (port 6400)
我编写了这样的结构。
srv1和srv2位于不同的网络上,为了进行复制,进行了SSH端口转发。
+---------------+ +-------------+ ssh port forwarding +------------+
| srv1:sentinel | --> | srv1:master | ---------------------> | srv2:slave |
+---------------+ +-------------+ +------------+
在这种情况下,直到将srv2:slave连接到srv1:master之前,预期中的是srv1:master的redis将会成为master。
但是,srv2:redis
slaveof localhost [forwarding port]
当通过srv2到srv1的SSH隧道进行连接时,srv1的redis主节点会被sentinel从主节点降级为从节点的现象发生了。
造成某种结果的原因可以有很多。
由于Sentinel连接到了master服务器srv1,并识别出了srv2从服务器的Redis,使用了srv1的本地IP地址加上srv2从服务器的监听端口。
换言之,sentinel试图将连接到srv1:master的srv2:slave变为从节点并在srv1:master的redis上执行slaveof命令。
应对措施
srv2: 我改变了 Redis 的端口。
在这个时刻,srv1:sentinel
- srv1 IPアドレス + srv2:slave port
由于认知的目的是不变的,因此需要注意确保 srv1 中不存在与 srv2:slave 的 redis 在同一端口上运行的情况。