Sentinel配置错误导致的问题

事情的缘由

某个小规模集群中有三个pika节点(pika 是一个可持久化的兼容redis协议的kv数据库),一主两从,使用 redis-sentinel 做监控和主备切换。

部署好以后,客户端使用 redisson 连接pika集群报错

Redisson At least two sentinels should be defined in Redis configuration

也就是说客户端只发现了一个 sentinel 服务。

排查过程

1 查看其中一个节点的 sentinel 配置,确认sentinel 服务之间没有自动发现彼此

# master1
sentinel myid bc222e81189056294af3e9bc2b2db517464d78a3
sentinel deny-scripts-reconfig yes
sentinel monitor master 172.16.0.115 9221 2
# Generated by CONFIG REWRITE
sentinel parallel-syncs master 2
sentinel auth-pass master xxxxxxxx
daemonize yes
sentinel known-replica master 172.16.0.119 9221
sentinel known-replica master 172.16.0.118 9221

如果发现了其他sentinel服务,配置中应该多出如下信息

sentinel known-sentinel xxxxx
sentinel known-sentinel xxxxxx

2 说明 sentinel 之间通信可能有问题。这里说明下 sentinel 之间互相发现和通信的原理:

sentinel利用了master的发布/订阅机制,去自动发现其它也监控了同一个master的sentinel服务。这个通道名为 __sentinel__:hello

于是进入 pika 查看 __sentinel__:hello 通道中的信息:

127.0.0.1:9221> subscribe __sentinel__:hello
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "__sentinel__:hello"
3) (integer) 1
1) "message"
2) "__sentinel__:hello"
3) "172.16.0.119,29221,bc222e81189056294af3e9bc2b2db517464d78a3,1778,master,172.16.0.115,9221,1778"
1) "message"
2) "__sentinel__:hello"
3) "172.16.0.115,29221,bc222e81189056294af3e9bc2b2db517464d78a3,48,master,172.16.0.115,9221,30"
1) "message"
2) "__sentinel__:hello"
3) "172.16.0.118,29221,bc222e81189056294af3e9bc2b2db517464d78a3,1777,master,172.16.0.115,9221,1777"
1) "message"
2) "__sentinel__:hello"
3) "172.16.0.119,29221,bc222e81189056294af3e9bc2b2db517464d78a3,1778,master,172.16.0.115,9221,1778"
1) "message"
2) "__sentinel__:hello"
3) "172.16.0.115,29221,bc222e81189056294af3e9bc2b2db517464d78a3,48,master,172.16.0.115,9221,30"
1) "message"
2) "__sentinel__:hello"
3) "172.16.0.118,29221,bc222e81189056294af3e9bc2b2db517464d78a3,1777,master,172.16.0.115,9221,1777"
1) "message"
2) "__sentinel__:hello"
3) "172.16.0.119,29221,bc222e81189056294af3e9bc2b2db517464d78a3,1778,master,172.16.0.115,9221,1778"
1) "message"
2) "__sentinel__:hello"
3) "172.16.0.115,29221,bc222e81189056294af3e9bc2b2db517464d78a3,48,master,172.16.0.115,9221,30"
1) "message"
2) "__sentinel__:hello"
3) "172.16.0.118,29221,bc222e81189056294af3e9bc2b2db517464d78a3,1777,master,172.16.0.115,9221,1777"
1) "message"
2) "__sentinel__:hello"
3) "172.16.0.119,29221,bc222e81189056294af3e9bc2b2db517464d78a3,1778,master,172.16.0.115,9221,1778"

发现所有的 sentinel 服务居然用的同一个 myid bc222e81189056294af3e9bc2b2db517464d78a3

真相大白,在部署 sentinel 服务的时候,将带有 myid的 配置文件直接复制到了其他节点,所以其他节点的 sentinel 服务启动的时候使用的同样的 myid, 而 sentinel 之间时通过 myid 来区分彼此的,myid 相同,sentinel 就懵逼了,以为整个集群中只有自己。

解决

将所有 sentinel 配置中的 myid 删除,重新启动,会自动生成一个新的id,问题解决