第16章 Sentinel

Huan Lee Lv5

Sentinel(哨岗, 哨兵)是Redis的高可用性(high availability)解决方案: 由一个或多个Sentinel实例组成的系统可以监视任意多个主服务器及其所有从服务器, 并在主服务器下线时自动升级从服务器为新主服务器代替原先主服务器.

16.1 启动并初始化Sentinel

使用命令 redis-sentinel /path/to/sentinel.conf 或者 redis-server /path/to/sentinel.conf --sentinel

启动时的步骤:

  1. 初始化服务器。

  2. 将普通Redis服务器使用的代码替换成Sentinel专用代码。

  3. 初始化Sentinel状态。

  4. 根据给定的配置文件,初始化Sentinel的监视主服务器列表。

  5. 创建连向主服务器的网络连接。

16.2 获取主服务器信息

Sentinel默认以10秒一次的频率向主服务器发送INFO命令, 并根据回复内容获取主服务器当前信息, 包括:

  • 主服务器本身的信息, 包括run_id, 以及服务器角色
  • 主服务器下所有从服务器的信息, 包括IP和端口.

16.3 获取从服务器信息

当Sentinel发现主服务器有新的从服务器出现时(通过向主服务器的INFO命令), 除了为其创建实例数据结构, 还会创建连接到从服务器的命令连接和订阅连接.

建立命令连接后, 也会以默认10秒每次的频率向从服务器发送INFO命令, 从回复提取以下信息:

  • 从服务器的运行D run id。
  • 从服务器的角色role。
  • 主服务器的IP地址master_host,以及主服务器的端口号master_port。
  • 主从服务器的连接状态master_link_status。
  • 从服务器的优先级slave_priority
  • 从服务器的复制偏移量slave_repl_offset。

16.4 向主服务器和从服务器发送信息

Sentinel默认以每两秒一次的频率向所有被监视的主服务器和从服务器发送以下命令(信息)

1
PUBLISH sentinel:hello "<s_ip>,<s_port>,<s_runid>,<s_epoch>,<m_name>,<m_ip>,<m_port>,<m_epoch>"

16.5 接收来自主服务器和从服务器的频道信息

当Sentinel与一个主服务器或者从服务器建立起订阅连接之后,Sentinel就会通过订阅连接,向服务器发送以下命令:

SUBSCRIBE sentinel_:hello

Sentinel对 sentinel:hello 频道的订阅会一直持续到Sentinel与服务器的连接断开为止。

对于监视同一个服务器的多个Sentinel, 其中一个Sentinel发送的信息会被其他Sentinel接收到, 用于更新Sentinel对彼此的认知, 也会更新其他Sentinel对被监视服务器的认知(信息).

16.6 检测主观下线状态

Sentinel默认以每秒一次的频率向所有创建了连接的实例(主从服务器和其他Sentinel)发送PING命令, 从而检测实例是否在线.

16.7 检查客观下线状态

当Sentinel将一个主服务器判断为主观下线后, 为了进行确认, 会向监视该主服务器的其他Sentinel进行询问. 当从其他Sentinel接收到足够数量的已下线判断后, 就会将主服务器判定为** 客观下线** ,并进行故障转移操作.

16.8 选举领头Sentinel

当一个主服务器被判断为客观下线后, 监视该服务器的多个Sentinel会通过协商选举出一个领头Sentinel, 由其执行故障转移.

16.9 故障转移

由领头Sentinel执行的故障转移操作包括三个步骤:

  1. 在已下线主服务器属下的所有从服务器里面,挑选出一个从服务器,并将其转换为主服务器。

  2. 让已下线主服务器属下的所有从服务器改为复制新的主服务器。

  3. 将已下线主服务器设置为新的主服务器的从服务器,当这个旧的主服务器重新上线时,它就会成为新的主服务器的从服务器。

  • Title: 第16章 Sentinel
  • Author: Huan Lee
  • Created at : 2023-08-28 22:23:35
  • Updated at : 2024-02-26 04:53:15
  • Link: https://www.mirthfullee.com/2023/08/28/notion-第16章 Sentinel-2d9e38a3/
  • License: This work is licensed under CC BY-NC-SA 4.0.