原理

Sentinel(哨兵)可以管理多个 Redis 服务器,它提供了监控,提醒以及自动的故障转移的功能,

Replication(复制)则是负责让一个 Redis 服务器可以配备多个备份的服务器。

Redis 也是利用这两个功能来保证 Redis 的高可用的

主从复制实现高可用

通过主从架构,一个主节点,两个从节点。

通过手动监控的方式,监控 master 的宕机,以及出现故障将故障转移的方式可以做到高可用。

比如:如果主节点宕机,我们手动监控到主节点的宕机,并将某一个 Slave 变成主节点。 但是这样话,如何手动监控也是很麻烦的事情。所以使用 sentinel 机制就可以解决了这个问题,Sentinel(哨兵)是 Redis 的高可用性解决方案。

  • 它能自动进行故障转移。
  • 客户端连接 sentinel,不需要关心具体的 master。
  • 当 master 地址改变时由 sentinel 更新到客户端。

架构原理

  1. 多个 sentinel 发现并确认 master 有问题。
  2. sentinel 内部选举领导
  3. 选举出 slave 作为新的 master
  4. 通知其余的 slave 成为新 master 的 slave
  5. 通知客户端 主从变化
  6. 如果老的 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 可以用在以下这些方面:

  1. 同一个 sentinel 对同一个 master 两次 failover 之间的间隔时间。

  2. 当一个 slave 从一个错误的 master 那里同步数据开始计算时间。直到 slave 被纠正为向正确的 master 那里同步数据时。

  3. 当想要取消一个正在进行的 failover 所需要的时间。

  4. 当进行 failover 时,配置所有 slaves 指向新的 master 所需的最大时间。不过,即使过了这个超时,slaves 依然会被正确配置为指向 master,但是就不按 parallel-syncs 所配置的规则来了。

要实现上边的功能的主要细节主要有以下三个定时任务:

  1. 每 10 秒,哨兵会向 master 和 slave 发送 INFO 命令(目的就是监控每一个节点信息)
  2. 每 2 秒,哨兵会向 master 库和 slave 的频道(sentinel:hello)发送自己的信息 (sentinel 节点通过sentinel:hello 频道进行信息交换,比如加入哨兵集群,分享自己节点数据)
  3. 每 1 秒,哨兵会向 master 和 slave 以及其他哨兵节点发送 PING 命令(目的就是 redis 节点的状态监控,还有领导选举,主备切换选择等)

策略总结

  • 尽量为每一个主节点部署一个哨兵
  • 哨兵也要搭建集群(防止哨兵单点故障)
  • 每一个节点都同时设置 quorum 的值超过半数(N/2)+1

问题

主从复制,以及哨兵和集群之间区别?

主从复制是 redis 实现高可用的一个策略。将会有主节点和从节点,从节点的数据会完整的从主节点中复制一份。

哨兵:当系统节点异常宕机的时候,开发者可以手动进行故障转移恢复,但是手动比较麻烦,所以通过哨兵机制自动进行监控和恢复。为了解决哨兵也会单点故障的问题,可以建立哨兵集群。

集群:即使使用哨兵,redis 每个实例也是全量存储,每个 redis 存储的内容都是完整的数据,浪费内存且有木桶效应。为了最大化利用内存,可以采用集群,就是分布式存储。这个时候可以使用 redis 集群。将不同的数据分配到不同的节点中,这样就可以横向扩展,扩容。