11、哨兵sentinel

it2023-05-31  70

Sentinel 命令   PING :返回 PONG 。   SENTINEL masters :列出所有被监视的主服务器,以及这些主服务器的当前状态。   SENTINEL slaves :列出给定主服务器的所有从服务器,以及这些从服务器的当前状态。   SENTINEL get-master-addr-by-name : 返回给定名字的主服务器的 IP 地址和端口号。 如果这个主服务器正在执行故障转移操作, 或者针对这个主服务器的故障转移操作已经完成, 那么这个命令返回新的主服务器的 IP 地址和端口号。   SENTINEL reset : 重置所有名字和给定模式 pattern 相匹配的主服务器。 pattern 参数是一个 Glob 风格的模式。 重置操作清楚主服务器目前的所有状态, 包括正在执行中的故障转移, 并移除目前已经发现和关联的, 主服务器的所有从服务器和 Sentinel 。   SENTINEL failover : 当主服务器失效时, 在不询问其他 Sentinel 意见的情况下, 强制开始一次自动故障迁移 (不过发起故障转移的 Sentinel 会向其他 Sentinel 发送一个新的配置,其他 Sentinel 会根据这个配置进行相应的更新)。

sentinel配置

port 26379 dir “/home/smith/log/redis/sentinels/26379” sentinel monitor <master-name> <ip> <redis-port> <quorum>:监听主服务器,当有 quorum个sentinel节点认为主节点为下线才是真的下线,示例:sentinel monitor mymaster 192.168.25.129 6379 1 sentinel down-after-milliseconds mymaster 30000:指定了需要多少失效时间,一个master才会被这个sentinel主观地认为是不可用的 sentinel parallel-syncs <master-name> <numslaves> :这个配置项指定了在发生failover主备切换时最多可以有多少个slave同时对新的master进行 同步,这个数字越小,完成failover所需的时间就越长,但是如果这个数字越大,就意味着越 多的slave因为replication而不可用。可以通过将这个值设为 1 来保证每次只有一个slave 处于不能处理命令请求的状态。示例sentinel parallel-syncs mymaster 1, sentinel failover-timeout mymaster 180000 sentinel auth-pass <master-name> <password>:连接主节点需要的密码 sentinel notification-script <master-name> <script-path> :通知型脚本:当sentinel有任何警告级别的事件发生时(比如说redis实例的主观失效和客观失效等等),将会去调用这个脚本,这时这个脚本应该通过邮件,SMS等方式去通知系统管理员关于系统不正常运行的信息。调用该脚本时,将传给脚本两个参数,一个是事件的类型,一个是事件的描述。如果sentinel.conf配置文件中配置了这个脚本路径,那么必须保证这个脚本存在于这个路径,并且是可执行的,否则sentinel无法正常启动成功。配置示例:sentinel notification-script mymaster /var/redis/notify.sh .sentinel client-reconfig-script <master-name> <script-path>:当一个master由于failover而发生改变时,这个脚本将会被调用,通知相关的客户端关于master地址已经发生改变的信息。以下参数将会在调用脚本时传给脚本: <master-name> <role> <state> <from-ip> <from-port> <to-ip> <to-port> 目前<state>总是“failover”, <role>是“leader”或者“observer”中的一个。 参数 from-ip, from-port, to-ip, to-port是用来和旧的master和新的master(即旧的slave)通信的。这个脚本应该是通用的,能被多次调用,不是针对性的。

启动sentinel服务器 redis-server sentinel.conf --sentinel或者redis-sentinel sentinel.conf

sentinel启动步骤   1、初始化服务器   2、使用sentinel专用代码,比如端口号,命令表   3、初始化sentinel状态,sentinelState   4、初始化sentinel状态的masters属性   5、创建连向主服务器的网络连接,对于每个被sentinel监视的主服务器来说,sentinel会创建两个连接主服务器的异步连接,一个是命令连接,用来向主服务器发送命令,一个是订阅连接,专门用于订阅主服务器的__sentinel__:hello频道

获取主服务器信息   sentinel默认以10秒一次的频率向主服务器发送INFO命令,并通过回复命令获取主服务器的消息

获取从服务器信息   sentinel默认以10秒一次的频率向主服务器发送INFO命令,并通过回复命令获取从服务器的消息,并且对每个从服务器创建命令和订阅两个连接。

向主从服务器发送订阅消息   默认情况下,sentinel以两秒一次的频率向被监视的主从服务器发送

  s_开头的是sentinel相关节点信息,如果sentinel监听的是主服务器,后面的就是主服务相关信息,如果是从服务器,就是从服务器正在复制的主服务器相关信息,示例:

接收来自主从服务器的订阅消息   当sentinel向被监听的服务器发送publish sentinel:hello消息的时候,订阅该频道的其他sentinel包含自己都会收到订阅消息,如果sentinel发现收到的订阅消息是自己发送的则忽略,如果是其他sentinel发送的,则会将sentinel相关信息保存在sentinels字典表中,这样的话,不需要在配置文件中配置各个sentinel信息,监视同一个主服务器的sentinel可以自动发现对方。

创建连接其他sentinel的命令连接   当sentinel通过频道信息发现一个新的sentinel时,不仅会将该sentinel保存在sentinels中,还会为当前sentinel创建一个命令连接,最终监视同一个服务器的sentinel将形成相互连接的网络。

检测主观下线(subjectively down)状态   在默认情况下,sentinel以每秒一次的频率向所有与他有命令连接的实例(主从服务器、sentinel服务器)发送PING命令,如果回复+PONG、-LOADING、-MASTERDOWN,说明连接正常,如果在down-after-milliseconds内连续返回无效回复,那么sentinel判断该实例为主观下线

检测客观下线(Objectively down)状态   概述:当sentinel将一个主节点判断为主观下线后,为了确认该节点是否真的下线,会向同样监视该节点的sentinel节点进行询问,如果有一定数量sentinel节点认为该节点进入下线状态,sentinel就会将该节点判断为客观下线,并对节点进行故障转移。   ODOWN只适用于Master,对于Slave的 Redis 实例,Sentinel 在将它们判断为下线前不需要进行协商,所以Slave的 Sentinel 永远不会达到ODOWN。

客观下线过程 sentinel is-master-down-by-addr <current_epoch>   ip:被判断主观下线节点的ip   port:被判断主观下线节点的端口   current_epoch:当前sentinel的配置纪元   runid:取值和sentinel的runid,如果是,表示该命令只用于检测主节点的客观下线状态,如果是runid,则用于表示选举领头sentinel   1、发送sentinel is-master-down-by-addr,当一个主节点被判断为主观下线后,sentinel会向监视该节点的其他sentinel发送sentinel is-master-down-by-addr命令,示例:sentinel is-master-down-by-addr 127.0.0.1 6379 0 *   2、接收sentinel is-master-down-by-addr命令,当sentinel接收到sentinel is-master-down-by-addr命令后,会分析并取出ip和port,检查主节点是否下线,然后向源sentinel节点返回一个包含3个参数的命令回复     1、<down_state>:下线状态,0:未下线 1:已下线     2、<leader_runid>:取值和sentinel的runid,如果是,表示该命令只用于检测主节点的客观下线状态,如果是runid,则用于表示选举领头sentinel     3、<leader_epoch>:配置纪元,该参数仅在<leader_runid>不为*的时候有效   3、接收sentinel is-master-down-by-addr的命令回复,根据命令回复结果,sentinel统计同意主节点下线的数量,达到一定下线数量后,sentinel将该节点判断为客观下线

选举leader   1、当一个主节点被判断为客观下线后,监视这个主节点下线的各个sentinel会进行协商,选举出一个领头sentinel   2、sentinel之间会互发sentinel is-master-down-by-addr命令,每个sentinel只有一次设置领头sentinel机会,先到先得。如果回复中的纪元和runid与发送中的纪元和runid相等,则发送的sentinel被选举为局部l领头sentinel。   3、如果某个sentinel被选举为局部领头的数量达到sentinel的半数以上时,该sentinel将被选举为领头sentinel,负责对主节点进行故障转移操作

故障转移   1、从已下线主节点的所有从节点中选出一个来作为新的主节点     a)过滤:“不健康”(主观下线、断线)、5秒内没有回复过Sentinel节点ping响应、与主节点失联超过down-after-milliseconds*10秒。     b)选择slave-priority(从节点优先级)最高的从节点列表,如果存在则返回,不存在则继续。     c)选择复制偏移量最大的从节点(复制的最完整),如果存在则返回,不存在则继续。     d)选择runid最小的从节点。   2、让其他的从节点复制新的主节点   3、将已下线的主节点设置为新主节点的从节点

instance details格式如下:

<instance-type> <name> <ip> <port> @ <master-name> <master-ip> <master-port>

+reset-master – 当master被重置时. +slave – 当检测到一个slave并添加进slave列表时. +failover-state-reconf-slaves – Failover状态变为reconf-slaves状态时 +failover-detected – 当failover发生时 +slave-reconf-sent – sentinel发送SLAVEOF命令把它重新配置时 +slave-reconf-inprog – slave被重新配置为另外一个master的slave,但数据复制还未发生时。 +slave-reconf-done – slave被重新配置为另外一个master的slave并且数据复制已经与master同步时。 -dup-sentinel – 删除指定master上的冗余sentinel时 (当一个sentinel重新启动时,可能会发生这个事件). +sentinel – 当master增加了一个sentinel时。 +sdown – 进入SDOWN状态时; -sdown – 离开SDOWN状态时。 +odown – 进入ODOWN状态时。 -odown – 离开ODOWN状态时。 +new-epoch – 当前配置版本被更新时。 +try-failover – 达到failover条件,正等待其他sentinel的选举。 +elected-leader – 被选举为去执行failover的时候。 +failover-state-select-slave – 开始要选择一个slave当选新master时。 no-good-slave – 没有合适的slave来担当新master selected-slave – 找到了一个适合的slave来担当新master failover-state-send-slaveof-noone – 当把选择为新master的slave的身份进行切换的时候。 failover-end-for-timeout – failover由于超时而失败时。 failover-end – failover成功完成时。 +switch-master – 当master的地址发生变化时。通常这是客户端最感兴趣的消息了。 +tilt – 进入Tilt模式。 -tilt – 退出Tilt模式。

最新回复(0)