欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Redis架构——有哨兵的主从模式

程序员文章站 2022-05-17 22:39:48
...

有哨兵的主从模式

Sentinel 相关概念

Sentinel (哨兵) 是 Redis 中高可用性的解决方案;有一个或多个 Sentinel 实例组成的Sentinel 系统可以监视任意多个服务器,以及这些主服务器属下的所有从服务器。

Redis Sentinel 是一个分布式系统, 你可以在一个架构中运行多个 Sentinel 进程(progress), 这些进程使用 流言协议(gossip protocols) 来接收关于主服务器是否下线的信息, 并使用 投票协议(agreement protocols) 来决定是否执行自动故障迁移, 以及选择哪个从服务器作为新的主服务器。

Sentinel 是一个分布式系统中监控 redis 主从服务器,并在主服务器下线时自动进行故障转移的哨兵节点,具有的功能是:

  • 监控(Monitoring):Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。
  • 提醒(Notification):当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。
  • 自动故障迁移(Automatic failover): 当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作。

当一个 Sentinel 启动时,需要执行以下步骤:

  1. 初始化服务器;
  2. 将普通 Redis 服务器使用的代码替换成 Sentinel 专用代码;
  3. 初始化 Sentinel 状态;
  4. 根据给定的配置文件,初始化 Sentinel 的监视主服务器列表;
  5. 创建连向主服务器的网络连接。

启动 Sentinel

对于 redis-sentinel 程序,可以用以下命令来启动 Sentinel 系统。

$ redis-sentinel /path/to/your/sentinel.conf

或者对于 redis-server 程序,可以使用以下命令

$ redis-server /path/to/your/sentinel.conf --sentinel

两种方法都可以启动一个 Sentinel 实例。

配置 Sentinel

举个例子,如果用户在启动Sentinel时,指定了包含以下内容的配置文件:

#####################################
####### master configure ############
#####################################
sentinel monitor master 127.0.0.1 6379 2
sentinel down-after-millisenconds master 30000
sentinel parallel-syncs master 1
sentinel failover-timeout master 900000
  • 第1行配置指示 Sentinel 去监视一个名为 master 的主服务器, 这个主服务器的 IP 地址为 127.0.0.1 , 端口号为 6379 , 而将这个主服务器判断为失效至少需要 2 个 Sentinel 同意 (只要同意 Sentinel 的数量不达标,自动故障迁移就不会执行)。
  • 第2行配置指定了 Sentinel 认为服务器已经断线所需的毫秒数。
    如果服务器在给定的毫秒数之内,没有返回 Sentinel 发送的 ping 命令,或者返回一个错误,那么 Sentinel 将这个服务器标记为主观下线(subjectively down, 简称SDOWN)
  • 第3行配置指定了在执行故障转移时, 最多可以有多少个从服务器同时对新的主服务器进行同步, 这个数字越小, 完成故障转移所需的时间就越长。
  • 第4行配置指示了刷新故障迁移状态的最大时限。

主观下线和客观下线

主观下线(Subjectively Down,简称 SDOWN):单个Sentinel 实例对服务器做出的下线判断。
客观下线(Objectively Down,简称 ODOWN):多个Sentinel 实例在对同一个服务器做出主观下线判断,并且通过 sentinel is-master-down-byaddr 命令互相交流之后,得出的服务器下线判断。

客观下线条件只适用于主服务器 :对于任何其他类型的 Redis 实例, Sentinel 在将它们判断为下线前不需要进行协商, 所以从服务器或者其他 Sentinel 永远不会达到客观下线条件。

每个 Sentinel 都需要定期执行的任务

  • 每个 Sentinel 以每秒钟一次的频率向它所知的主服务器、从服务器以及其他 Sentinel 实例发送一个 PING 命令。
  • 如果一个实例(instance)距离最后一次有效回复 PING 命令的时间超过 down-after-milliseconds 选项所指定的值,那么这个实例会被 Sentinel 标记为主观下线。 一个有效回复可以是:+PONG 、 -LOADING 或者 -MASTERDOWN。
  • 如果一个主服务器被标记为主观下线, 那么正在监视这个主服务器的所有 Sentinel 要以每秒一次的频率确认主服务器的确进入了主观下线状态。
  • 如果一个主服务器被标记为主观下线,并且有足够数量的 Sentinel (至少要达到配置文件指定的数量)在指定的时间范围内同意这一判断, 那么这个主服务器被标记为客观下线。
  • 在一般情况下,每个 Sentinel 会以每 10 秒一次的频率向它已知的所有主服务器和从服务器发送 INFO 命令。 当一个主服务器被 Sentinel 标记为客观下线时, Sentinel 向下线主服务器的所有从服务器发送 INFO 命令的频率会从 10 秒一次改为每秒一次。
  • 当没有足够数量的 Sentinel 同意主服务器已经下线,主服务器的客观下线状态就会被移除。
  • 当主服务器重新向 Sentinel 的 PING 命令返回有效回复时, 主服务器的主管下线状态就会被移除。

当一个主服务器被判断为客观下线时,监视这个下线主服务器的各个 Sentinel 会进行协商,选出一个领头 Sentinel,并由领头 Sentinel 对下线主服务器执行故障转移操作。

故障转移

在领头 Sentinel 将对已下线的主服务器执行故障转移操作,该操作包括以下三个步骤:

  1. 在已下线主服务器属下的所有从服务器里面,挑选出一个从服务器,并将其转换为主服务器;
  2. 让已下线主服务器属下的所有从服务器改为复制新的主服务器;
  3. 将已下线主服务器设置为新的主服务器的从服务器,当这个旧的主服务器重现上线时,它就会成为新的主服务器的从服务器。

Redis 架构

Redis架构——有哨兵的主从模式

特点

  • 保证高可用;
  • 监控各个节点,实现自动故障迁移;
  • 主从模式,切换需要时间丢数据;
  • 没有解决 master 写的压力

Sentinel 概念