Redis哨兵模式
原理
Sentinel(哨兵)可以管理多个 Redis 服务器,它提供了监控,提醒以及自动的故障转移的功能,
Replication(复制)则是负责让一个 Redis 服务器可以配备多个备份的服务器。
Redis 也是利用这两个功能来保证 Redis 的高可用的
主从复制实现高可用
通过主从架构,一个主节点,两个从节点。
通过手动监控的方式,监控 master 的宕机,以及出现故障将故障转移的方式可以做到高可用。
比如:如果主节点宕机,我们手动监控到主节点的宕机,并将某一个 Slave 变成主节点。 但是这样话,如何手动监控也是很麻烦的事情。所以使用 sentinel 机制就可以解决了这个问题,Sentinel(哨兵)是 Redis 的高可用性解决方案。
- 它能自动进行故障转移。
- 客户端连接 sentinel,不需要关心具体的 master。
- 当 master 地址改变时由 sentinel 更新到客户端。
架构原理
- 多个 sentinel 发现并确认 master 有问题。
- sentinel 内部选举领导
- 选举出 slave 作为新的 master
- 通知其余的 slave 成为新 master 的 slave
- 通知客户端 主从变化
- 如果老的 master 重新复活,那么成为新的 master 的 slave
配置
redis 源码目录下的 sentinel.conf
文件说明
1 | port 26379 |
sentinel 监听端口,默认是 26379
1 | sentinel monitor <master-name> <ip> <redis-port> <quorum> |
告诉 sentinel 去监听地址为 ip:port 的一个 master,这里的 master-name 可以自定义
quorum 是一个数字,指明当有多少个 sentinel 认为一个 master 失效时,master 才算真正失效
1 | sentinel auth-pass <master-name> <password> |
设置连接 master 和 slave 时的密码,注意的是 sentinel 不能分别为 master 和 slave 设置不同的密码,因此 master 和 slave 的密码应该设置相同
1 | sentinel down-after-milliseconds <master-name> <milliseconds> |
这个配置项指定了需要多少失效时间,一个 master 才会被这个 sentinel 主观地认为是不可用的。 单位是毫秒,默认为 30 秒
1 | sentinel parallel-syncs <master-name> <numslaves> |
这个配置项指定了在发生 failover 主备切换时最多可以有多少个 slave 同时对新的 master 进行同步,这个数字越小,完成 failover 所需的时间就越长,但是如果这个数字越大,就意味着越多的 slave 因为 replication 而不可用。可以通过将这个值设为 1 来保证每次只有一个 slave 处于不能处理命令请求的状态。
1 | sentinel failover-timeout <master-name> <milliseconds> |
failover-timeout 可以用在以下这些方面:
同一个 sentinel 对同一个 master 两次 failover 之间的间隔时间。
当一个 slave 从一个错误的 master 那里同步数据开始计算时间。直到 slave 被纠正为向正确的 master 那里同步数据时。
当想要取消一个正在进行的 failover 所需要的时间。
当进行 failover 时,配置所有 slaves 指向新的 master 所需的最大时间。不过,即使过了这个超时,slaves 依然会被正确配置为指向 master,但是就不按 parallel-syncs 所配置的规则来了。
要实现上边的功能的主要细节主要有以下三个定时任务:
- 每 10 秒,哨兵会向 master 和 slave 发送 INFO 命令(目的就是监控每一个节点信息)
- 每 2 秒,哨兵会向 master 库和 slave 的频道(sentinel:hello)发送自己的信息 (sentinel 节点通过sentinel:hello 频道进行信息交换,比如加入哨兵集群,分享自己节点数据)
- 每 1 秒,哨兵会向 master 和 slave 以及其他哨兵节点发送 PING 命令(目的就是 redis 节点的状态监控,还有领导选举,主备切换选择等)
策略总结
- 尽量为每一个主节点部署一个哨兵
- 哨兵也要搭建集群(防止哨兵单点故障)
- 每一个节点都同时设置 quorum 的值超过半数(N/2)+1
问题
主从复制,以及哨兵和集群之间区别?
主从复制是 redis 实现高可用的一个策略。将会有主节点和从节点,从节点的数据会完整的从主节点中复制一份。
哨兵:当系统节点异常宕机的时候,开发者可以手动进行故障转移恢复,但是手动比较麻烦,所以通过哨兵机制自动进行监控和恢复。为了解决哨兵也会单点故障的问题,可以建立哨兵集群。
集群:即使使用哨兵,redis 每个实例也是全量存储,每个 redis 存储的内容都是完整的数据,浪费内存且有木桶效应。为了最大化利用内存,可以采用集群,就是分布式存储。这个时候可以使用 redis 集群。将不同的数据分配到不同的节点中,这样就可以横向扩展,扩容。