Redis——sentinel哨兵模式

x33g5p2x  于2021-10-18 转载在 Redis  
字(4.5k)|赞(0)|评价(0)|浏览(362)

在主从模式的基础上提供高可用,在master宕机情况下自动切换slave为master,当旧的master重新连接后哨兵会将其转为新master的slave;

相关的知识:

  • 哨兵有3个定时任务:

1、每隔10s,哨兵会向master和slave发送INFO命令,用于获取主从结构和探测发现slave;

2、每隔2s,哨兵会向__sentinel__:hello频道发布订阅消息,消息包含对master的认知和自身信息,其他哨兵通过订阅获得该消息;

3、每隔1s,哨兵会发送ping心跳给master、slave、其他哨兵,用于判断其他成员的主观下线;

  • 主观下线 SDOWN:

每隔1s的ping在超过down-after-milliseconds设置的时间后没有收到回复或回复错误,则认定该成员主观下线;(如果master又有了正确的ping回复,则主观下线状态会被移除)

  • 客观下线 ODOWN:(master才有)

当master主观下线时,哨兵会询问其他哨兵master的状态,如果达到<quorum>个哨兵也认为下线,才会认为master客观下线;(如果没有达到<quorum>个则不会客观下线,只有master可观下线才可以进行故障转移)

  • 故障转移流程:

哨兵每秒发送ping心跳;心跳超过down-after-milliseconds没有回复或回复错误,认为主观下线;如果master主观下线,则询问其他哨兵master状态,达到<quorum>个烧饼也认为master下线,则标记master为客观下线;最先完成master客观下线的哨兵发起leader选举,通过Raft协议最终选举出一个leader;由leader发起故障转移,选出slave中优先级高复制最完整的一个升级为新master,宕机master降为slave(哨兵会持续关注宕机master,连接后让宕机master变为slave去同步当前的新master),通知其他slave连接新的master,并通知其他哨兵主从变化;

当前redis版本5.0.4;

哨兵使用的sentinel.conf的配置项:(使用默认文件修改,用过的文件会被哨兵修改)

  • bind 127.0.0.1 192.168.1.1
  • protected-mode no

默认哨兵只能由localhost访问,也可以通过bind手动绑定地址或者使用protected-mode no关闭保护模式(确保防火墙等保护措施到位的情况下);

  • port <sentinel-port>

哨兵使用的端口;

  • daemonize no

默认哨兵不作为守护程序运行,如果设置yes,就会写入一个pidfile指定的pid文件;

  • pidfile /var/run/redis-sentinel.pid

指定pid文件(daemonize设置yes时);

  • logfile ""

指定日志文件名,空字符串时强制哨兵使用标准输出(当使用标准输出并使用守护模式时日志会重定向到/dev/null);

  • sentinel announce-ip <ip>
  • sentinel announce-port <port>

以上两项通常用在NAT环境中明确指定哨兵的ip和端口,当提供明确的announce-ip时,sentinel会在HELLO消息里发布出来,而不是像通常那样自动检测本地ip,当提供明确的非零announce-port时,sentinel也会发布出来(以上两项不需要同时指定,如果只指定ip,则会发布指定的ip和由port项配置的端口,如果只指定port,则会发布指定的port和自动检测的ip);

  • dir <working-directory>

定义工作目录;

  • sentinel monitor <master-name> <ip> <redis-port> <quorum>

告诉哨兵监控这个master(一个哨兵可以监控多个master),并且只有<quorum>个哨兵同意的情况下才将该master标记为客观离线(无论<quorum>为多少,进行故障转移还是需要大多数哨兵的同意);副本是自动被发现的,不需要自己配置,哨兵会自己重写这个配置文件来添加副本(副本被提升为master时配置文件也会被重写);<master-name>不能有特殊字符,可用大小写字母、数字、下划线命名;

  • sentinel auth-pass <master-name> <password>

设置master和slave的密码(所以master和slave要使用一样的密码),也可以使用需要认证和不需要认证的master、slave混用(AUTH命令在无认证的redis中无效);

  • sentinel down-after-milliseconds <master-name> <milliseconds>

设置master(或任何连接着的slave、sentinel)主观下线超时(毫秒值,默认30s,即30000);

  • sentinel parallel-syncs <master-name> <numreplicas>

在故障转移时,重新配置多少个副本指向新的master;如果slave提供查询服务需要将该值设置低一些,避免所有的副本同时与master同步导致无法访问;

  • sentinel failover-timeout <master-name> <milliseconds>

指定故障转移超时时间(毫秒,默认3分钟,即180000);该设置会用于多个地方:当给定的哨兵重新进行故障转移时并且之前的故障转移是同一个master,需要的时间是failover-timeout的两倍。当让一个依据哨兵当前配置的从错误master同步的副本去强制同步正确的master的时间,正好就是这个failover-timeout的时间。当一个故障转移正在进行但未产生任何配置改变时,取消该故障转移所需的时间。当故障转移正在进行时,等待所有的副本被重新分配给新的master所用的最大时间,即使超过该时间副本最终也会被哨兵重新分配,只不过不是按照之前确定的并行同步进行的。

  • sentinel notification-script <master-name> <script-path>

用于配置故障转移后,通知管理员的script脚本;对于在WARNING级别中生成的任何哨兵事件(例如-sdown、-odown等)调用通知脚本;脚本应该通过邮件、SMS或者其他消息系统将所监控的redis服务错误通知给管理员;(脚本需要两个参数,第一个是事件类型,第二个是事件描述;如果提供了该项,脚本必须存在并可执行,以便哨兵能够正常启动)

脚本错误处理:如果脚本返回“1”,稍后重试执行(当前最多执行10次);如果脚本返回“2”(或更高值),则不会重试执行;如果脚本因收到信号终止,则跟返回1一样;脚本最大执行时间为60秒,如果超时,脚本会以SIGKILL终止并重试执行;

  • sentinel client-reconfig-script <master-name> <script-path>

用于配置故障转移后,重新配置客户端的script脚本;当故障转移导致master变动时,可以调用一个执行特殊任务的脚本通知客户端配置变动和master地址改变;(传递给脚本的参数是:<master-name> <role> <state> <from-ip> <from-port> <to-ip> <to-port>,<state>参数总是“failover”,<role>参数是“leader”和“observer”中的一个,后面四个ip和port参数用于说明旧的master和新的master地址)(脚本应该能够被多次调用)

脚本错误处理同上;

  • sentinel deny-scripts-reconfig yes

默认情况下SENTINEL SET将不能在运行时改变通知管理员的脚本和配置客户端的脚本;(这避免了一个安全问题:客户端可以设置任意脚本并在故障转移时执行它)

  • SENTINEL rename-command mymaster CONFIG GUESSME

有时候为了防止客户端在外部使用管理员控制台使用某些敏感命令(如“CONFIG”、“SLAVEOF”),redis服务器会给这些命令重命名,但是哨兵又必须要用这些命令。由于这个原因提供该命令用来告诉哨兵某个master的命令被重命名了;(注意命令不区分大小写,CONFIG GUESSME和config guessme是相同的)

也可以使用SENTINEL SET来执行此设置;

为了还原命令名字(撤销重命名),设置为原本的命令名字即可;(就像:SENTINEL rename-command mymaster CONFIG CONFIG)

测试实验:

redis版本5.0.4;虚拟机地址192.168.1.31;

先搭建一主二从的主从模式:主(6379)、从(6380和6381);

(主redis也需要配置masterauth,用于被切换为slave时使用)

准备3个哨兵配置文件:

设置端口:port 26379 (其余两个哨兵26380和26381)

设置监听的master:sentinel monitor mymaster 192.168.1.31 6379 2

设置master的密码:sentinel auth-pass mymaster 654321

修改超时时间利于测试:sentinel down-after-milliseconds mymaster 5000

(哨兵26379超时为默认30000)

其他配置使用默认的;

先正常启动主从,再启动哨兵;

启动26379哨兵:

启动26380哨兵:(26379也会多一条日志)

启动26381哨兵:(其他两个哨兵也会多一条日志)

启动完后,主6379的info:

哨兵26379的info:

关掉主6379,哨兵26379、26380、26381的日志分别为:(26381成为leader并故障转移到6380,并发送重写配置通知)

从6380、6381日志分别为:(都跟6379断开,6381重新从6380同步)

哨兵26379的info变为:

新master6380的info:(自己变为主,只有6381一个从)

重启6379,哨兵26379、26380、26381日志:

同时新主6380收到了6379的同步请求:

主6380的info也发生了改变:(6379变为了从)

关掉哨兵26381和主6380,哨兵26397、26380日志:(26379超时为30s)

6379被选为新master:

相关文章

微信公众号

最新文章

更多