关于redis多个哨兵sentinel在阿里云的坑
sentinel之间不能相互通信的坑
这两天在三台阿里云服务器上搭建redis集群,遇到个问题,试了网上的bind 0.0.0.0
和protected-mode no
仍然还是有问题,网上百度和谷歌了很久,都没有看到网上有解决办法,故记录这个坑,便别人参考。
redis环境: 一主二从三哨兵,都运行在阿里云服务器上
运行主服务器两从服务器,ok,相互数据也没问题,然后在三台服务器上运行这三个哨兵
+sdown sentinel xxxxxxxxx
在检测时间到后(默认30s),3个哨兵都显示另外两哨兵挂了(sdown sentinel)
模拟 主服务器
宕机,shutdown掉, 三个哨兵都无法选举 并且各自都显示+sdown master
了
,但是无法+odown master
因为设置的哨兵投票需要2票(sentinel monitor mymaster xx.xx.xx.xx 6379 2
),然后三个哨兵都只显示sdown
并不能odown
所以无法重新选举,故想着把投票数要求设置为1(sentinel monitor mymaster xx.xx.xx.xx 1
),这次再模拟挂机,能够成功odown了,但是却任然无法重新选举:
failover-abort-not-elected
解决方案(下面两个选一)
这里问题在于sentinel无法相互通信,而我已经放行了阿里的外网端口对应安全组,和linux的防火墙,仍然无法通信,这个为什么呢?其实是sentinel默认使用的阿里云服务器17开头的内网ip,并不是对应的外网ip,而它们内网之间默认是无法访问的,解决办法自然就是让他们正常访问就行了:
(1)阿里云安全组内网访问
这个在这里只是提供一种思路,你去百度就行了,一搜一大把,让安全组内网之间可以相互通信就可以了
(2)推荐:定义sentinel通信被发现的ip地址
这个方法是推荐的方法,很简单,你只需要在sentinel.conf中定义
sentinel announce-ip "你服务器的ip"
来指定sentinel对外发现的ip地址就可以了,这样,其它sentinel相互通信的时候就不是使用内网ip了,直接使用你定义的当前服务器的ip,就能成功通信了。