Redis 哨兵集群
哨兵集群的多实例 : 共同判断,能降低对主库下线的误判率
配置哨兵 :
sentinel monitor <master-name> <ip> <redis-port> <quorum>
哨兵实例的相互发现 : 基于 pub/sub 机制 (发布 / 订阅机制)
- 哨兵和主库建立连接,就在主库上发布消息,如 : 发布连接信息 (IP , 端口)
- 并从主库上订阅消息,获得其他哨兵发布的连接信息
- 哨兵发布/订阅了主库的
sentinel:hello
频道,之间知道 IP , 端口
哨兵互相发现例子 :
- 哨兵 1 把 IP , 端口发布到
sentinel:hello
频道上,哨兵 2 和 3 订阅该频道 - 哨兵 2、3 与哨兵 1 建立网络连接
哨兵与从库建立连接 :
- 哨兵向主库发送 INFO 命令
- 主库收到该命令后,就把从库列表返回给哨兵
- 哨兵根据从库列表的信息,和每个从库建立连接
当主从库切换后,哨兵会把新主库信息发给客户端
客户端事件通知
每个哨兵也提供 pub/sub 机制 :
- 客户端能从哨兵订阅消息
事件 | 频道 | 含义 |
---|---|---|
主库下线 | +sdown | 进入主观下线状态 |
-sdown | 退出主观下线状态 | |
+odown | 进入客观下线状态 | |
-odown | 退出客观下线状态 | |
从库重新配置 | +slave-reconf-sent | 哨兵发 slaveof 重新配置从库 |
+slave-reconf-inprog | 从库配置新主库, 但没同步 | |
+slave-reconf-done | 从库配置新主库, 完成同步 | |
新主库切换 | switch-master | 主库地址变化 |
订阅所有实例进入客观下线状态的事件 :
subscribe +odown
订阅所有事件 :
psubscribe *
客户端看到 switch-master
事件 : 主库已切换
switch-master <master name> <oldip> <oldport> <newip> <newport>
主从切换
哨兵判断 :
- 哨兵判断主库为主观下线后,会给其他哨兵发送
is-master-down-by-addr
- 其他哨兵会根据与主库的连接情况,响应 Y 或 N
- 当 Y数 >=
quorum
时 , 就认为主库为 客观下线 - 哨兵发给其他哨兵要进行主从切换 , 商议后选出 Leader
Leader 的哨兵的条件 :
- 拿半数以上的 Y
- 拿的 Y 数 >=
quorum
3 个哨兵 , quorum=2 的选举过程 :
时间 | 哨兵1(S1) | 哨兵2 (S2) | 哨兵3 (S3) |
---|---|---|---|
T1 | 给自己投1 票 Y, 向 S2, S3 发投票请求 , 表示要成为 Leader | ||
T2 | 给自己投1 票 Y, 向 S1, S2 发投票请求 , 表示要成为 Leader | ||
T3 | 收到 S3 请求 , 回 N | 收到 S3 请求 , 回 Y | |
T4 | 收到 S3 请求 , 回 N | ||
T5 | 1票 Y , 1票 N | 2票 Y , 成为 Leader |