在主从模式的基础上提供高可用,在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的状态,如果达到
- 故障转移流程:
哨兵每秒发送ping心跳;心跳超过down-after-milliseconds没有回复或回复错误,认为主观下线;如果master主观下线,则询问其他哨兵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
哨兵使用的端口;
- daemonize no
默认哨兵不作为守护程序运行,如果设置yes,就会写入一个pidfile指定的pid文件;
- pidfile /var/run/redis-sentinel.pid
指定pid文件(daemonize设置yes时);
- logfile ""
指定日志文件名,空字符串时强制哨兵使用标准输出(当使用标准输出并使用守护模式时日志会重定向到/dev/null);
- sentinel announce-ip
- sentinel announce-port
以上两项通常用在NAT环境中明确指定哨兵的ip和端口,当提供明确的announce-ip时,sentinel会在HELLO消息里发布出来,而不是像通常那样自动检测本地ip,当提供明确的非零announce-port时,sentinel也会发布出来(以上两项不需要同时指定,如果只指定ip,则会发布指定的ip和由port项配置的端口,如果只指定port,则会发布指定的port和自动检测的ip);
- dir
定义工作目录;
- sentinel monitor
告诉哨兵监控这个master(一个哨兵可以监控多个master),并且只有
- sentinel auth-pass
设置master和slave的密码(所以master和slave要使用一样的密码),也可以使用需要认证和不需要认证的master、slave混用(AUTH命令在无认证的redis中无效);
- sentinel down-after-milliseconds
设置master(或任何连接着的slave、sentinel)主观下线超时(毫秒值,默认30s,即30000);
- sentinel parallel-syncs
在故障转移时,重新配置多少个副本指向新的master;如果slave提供查询服务需要将该值设置低一些,避免所有的副本同时与master同步导致无法访问;
- sentinel failover-timeout
指定故障转移超时时间(毫秒,默认3分钟,即180000);该设置会用于多个地方:当给定的哨兵重新进行故障转移时并且之前的故障转移是同一个master,需要的时间是failover-timeout的两倍。当让一个依据哨兵当前配置的从错误master同步的副本去强制同步正确的master的时间,正好就是这个failover-timeout的时间。当一个故障转移正在进行但未产生任何配置改变时,取消该故障转移所需的时间。当故障转移正在进行时,等待所有的副本被重新分配给新的master所用的最大时间,即使超过该时间副本最终也会被哨兵重新分配,只不过不是按照之前确定的并行同步进行的。
- sentinel notification-script
用于配置故障转移后,通知管理员的script脚本;对于在WARNING级别中生成的任何哨兵事件(例如-sdown、-odown等)调用通知脚本;脚本应该通过邮件、SMS或者其他消息系统将所监控的redis服务错误通知给管理员;(脚本需要两个参数,第一个是事件类型,第二个是事件描述;如果提供了该项,脚本必须存在并可执行,以便哨兵能够正常启动)
脚本错误处理:如果脚本返回“1”,稍后重试执行(当前最多执行10次);如果脚本返回“2”(或更高值),则不会重试执行;如果脚本因收到信号终止,则跟返回1一样;脚本最大执行时间为60秒,如果超时,脚本会以SIGKILL终止并重试执行;
- sentinel client-reconfig-script
用于配置故障转移后,重新配置客户端的script脚本;当故障转移导致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:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)