哨兵作用:
1 2 3 |
1)Master状态检测 2)如果Master异常,则会进行Master-Slave切换,将其中一个Slave作为Master,将之前的Master作为Slave 3)Master-Slave切换后,master_redis.conf、slave_redis.conf和sentinel.conf的内容都会发生改变,即master_redis.conf中会多一行slaveof的配置,sentinel.conf的监控目标会随之调换 |
1 2 3 |
端口:26379 配置文件:sentinel.conf 使用协议:tcp |
哨兵工作原理:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
01 在一般情况下,每个 Sentinel 会以每 10 秒一次的频率向它已知的所有Master,Slave发送 INFO 命令来获得redis主从的节点信息 02 当Master被 Sentinel 标记为客观下线时,Sentinel 向下线的 Master 的所有 Slave 发送 INFO 命令的频率会从 10 秒一次改为每秒一次 03 每2秒,会订阅获取一下主节点的哨兵信息,来了解哨兵们的信息,有新的哨兵加入,将会记录新哨兵信息,并与他建立连接 04 每秒钟一次的频率向它所知的Master,Slave以及其他 Sentinel 实例发送一个 PING 命令 05 如果一个 实例 距离最后一次有效回复 PING 命令的时间超过 down-after-milliseconds 选项所指定的值, 则这个实例会被 Sentinel 标记为主观下线。 06 当主观下线的节点是 Master 时,则询问其他哨兵,超过一定个数则判断主节点挂掉,进行客观下线。 07 当需要对一个 Master 进行客观下线,就需要在 Sentinel 们中选举一个领导者来执行这个操作,对 Master 进行下线,选举才用Raft算法 08 若没有足够数量的 Sentinel 同意 Master 已经下线, Master 的客观下线状态就会被移除。 09 若 Master 重新向 Sentinel 的 PING 命令返回有效回复, Master 的主观下线状态就会被移除。 10 当对一个 Master 进行客观下线后,会从其它从中选择出一个执行slaveof no one命令,使其升级为主节点。 11 向其它从节点发送命令,指定新主,并对新主进行数据复制 12 当原坏掉的主恢复后,将会作为新主的从节点 13 如果原坏掉的主删除不恢复,Sentinel依然会定期检测,会造成一定资源浪费 |
主观下线:
1 |
Subjectively Down,简称 SDOWN,指的是当前 Sentinel 实例对某个redis服务器做出的下线判断,这个判断只是认为,但并不做任何动作 |
客观下线:
1 2 |
Objectively Down, 简称 ODOWN,指的是多个 Sentinel 实例在对Master Server做出 SDOWN 判断,并且通过 SENTINEL is-master-down-by-addr 命令互相交流之后,得出的Master Server下线判断,然后开启failover |
哨兵部署
基于Redis主从复制环境的三台服务器操作 点击跳转
创建工作目录 (所有节点)
1 2 3 |
[root@redis01 ~]# mkdir /usr/local/redis/sentinel [root@redis02 ~]# mkdir /usr/local/redis/sentinel [root@redis03 ~]# mkdir /usr/local/redis/sentinel |
配置哨兵:(所有节点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
[root@redis01 ~]# vim /usr/local/redis/sentinel/sentinel.conf port 26379 daemonize yes dir "/usr/local/redis/sentinel" pidfile "/usr/local/redis/sentinel/redis-sentinel.pid" logfile "/usr/local/redis/sentinel/sentinel.log" sentinel monitor mymaster 172.16.1.81 6379 2 sentinel deny-scripts-reconfig yes sentinel down-after-milliseconds mymaster 5000 sentinel auth-pass mymaster 1 sentinel failover-timeout mymaster 180000 [root@redis02 ~]# vim /usr/local/redis/sentinel/sentinel.conf port 26379 daemonize yes dir "/usr/local/redis/sentinel" pidfile "/usr/local/redis/sentinel/redis-sentinel.pid" logfile "/usr/local/redis/sentinel/sentinel.log" sentinel monitor mymaster 172.16.1.81 6379 2 sentinel deny-scripts-reconfig yes sentinel down-after-milliseconds mymaster 5000 sentinel auth-pass mymaster 1 sentinel failover-timeout mymaster 180000 [root@redis03 ~]# vim /usr/local/redis/sentinel/sentinel.conf port 26379 daemonize yes dir "/usr/local/redis/sentinel" pidfile "/usr/local/redis/sentinel/redis-sentinel.pid" logfile "/usr/local/redis/sentinel/sentinel.log" sentinel monitor mymaster 172.16.1.81 6379 2 sentinel deny-scripts-reconfig yes sentinel down-after-milliseconds mymaster 5000 sentinel auth-pass mymaster 1 sentinel failover-timeout mymaster 180000 |
创建命令软链接:(所有节点)
1 2 3 4 5 |
[root@redis01 ~]# ln -s /usr/local/redis-6.0.9/src/redis-sentinel /usr/sbin/ [root@redis02 ~]# ln -s /usr/local/redis-6.0.9/src/redis-sentinel /usr/sbin/ [root@redis03 ~]# ln -s /usr/local/redis-6.0.9/src/redis-sentinel /usr/sbin/ |
启动哨兵:(所有节点)
1 2 3 4 5 |
[root@redis01 ~]# redis-sentinel /usr/local/redis/sentinel/sentinel.conf & [root@redis02 ~]# redis-sentinel /usr/local/redis/sentinel/sentinel.conf & [root@redis03 ~]# redis-sentinel /usr/local/redis/sentinel/sentinel.conf & |
测试哨兵可用性:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
#停止主库 [root@redis01 ~]# systemctl stop redis #查看从库redis02 172.16.1.82:6379> INFO replication # Replication role:slave master_host:172.16.1.83 master_port:6379 master_link_status:up master_last_io_seconds_ago:1 master_sync_in_progress:0 slave_repl_offset:1916538 slave_priority:100 slave_read_only:1 connected_slaves:0 master_replid:f90670e31abc570a2bd999f255205d6ddbc43efe master_replid2:f84b9e7ef358901545e70a345b431268785aa75d master_repl_offset:1916538 second_repl_offset:364609 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:867963 repl_backlog_histlen:1048576 #查看从库redis03 172.16.1.83:6379> INFO replication # Replication role:master connected_slaves:1 slave0:ip=172.16.1.82,port=6379,state=online,offset=1917616,lag=1 master_replid:f90670e31abc570a2bd999f255205d6ddbc43efe master_replid2:f84b9e7ef358901545e70a345b431268785aa75d master_repl_offset:1917749 second_repl_offset:364609 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:869174 repl_backlog_histlen:1048576 |
哨兵常用参数与命令:
sentinel的基本状态信息
INFO
列出所有被监视的主服务器,以及这些主服务器的当前状态
SENTINEL masters
列出指定主redis的从节点状态情况
SENTINEL slaves <master-name>
列出指定主redis的监控哨兵信息,不包含他自己
SENTINEL sentinels <master-name>
返回给定名字的主服务器的 IP 地址和端口号
SENTINEL get-master-addr-by-name <master-name>
重置所有名字和给定模式 pattern 相匹配的主服务器。重置操作清除主服务器目前的所有状态,包括正在执行中的故障转移,并移除目前已经发现和关联的,主服务器的所有从服务器和 Sentinel 。
SENTINEL <master-name>
当主服务器失效时 在不询问其他 Sentinel 意见的情况下,强制开始一次自动故障迁移,但是它会给其他sentinel发送一个最新的配置,其他sentinel会根据这个配置进行更新
SENTINEL failover <master-name>
检查当前在线的哨兵节点。如果一共有5个节点,设置4票,但检查后只有3节点在线,那一直无法进行监控切换
sentinel ckquorum <master-name>
将配置强制刷新到本地文件
sentinel flushconfig
取消当前哨兵对某主节点的监控
sentinel remove <master name>
配置文件参数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
#<master-name>是主节点的名称,也就是可以同时监控多组主从 #主节点的地址和端口 #quorum是票数,需要几个哨兵节点认为有问题才进行操作 sentinel monitor <master-name> <ip> <port> <quorum> #哨兵每隔一段时间就检测主节点是否存活,当超过<times>指定的时间,则认为主节点死掉 #虽然看似是对主控制,其实对从节点,其他哨兵节点也是这个参数控制 #默认30000,单位毫秒 sentinel down-after-milliseconds <master-name> <times> #当主节点挂掉,新的主节点接替时,从节点会向新的主节点发起复制操作。这个参数控制同时发起复制操作的从节点个数。 #如果有一个新主,3个从,而<nums>设置为1。从节点会轮询复制 sentinel parallel-syncs <master-name> <nums> #选出合适从节点,切换从为主,让其他从复制新主,让上线的坏主复制新主 #以上4部每个阶段故障时间超过<times>则认为失败 sentinel failover-timeout <master-name> <times> #如果主节点有密码,需要配置密码,防止无法获取主节点信息 sentinel auth-pass <master-name> <password> #当有重要事件,例如客观下线,主观下线时,将执行指定的脚本,并将一些相关参数传进去,可以发送邮件来通知 sentinel notification-script <master-name> <script-path> #当故障转移结束后触发的脚本,并将一些相关参数传进去 sentinel client-reconfig-script <master-name> <script-path> #脚本必须可以执行,开头必须有 #!/bin/bash 脚本头 #脚本最大执行时间不能超过一分钟,超过将杀死脚本 #如果shell脚本以exit 1结束,那么脚本稍后重试执行。如果以exit 2或者更高的值结束,那么脚本不会重试。正常返回值是exit 0 #脚本将传入如下参数 #<master-name> 主节点名称 #<role> 当前哨兵的角色是leader还是observer #<state> 状态,是关闭还是启动 #<from-ip> 原主节点的ip #<from-port> 原主节点的端口 #<to-ip> 新主节点的ip #<to-port> 新主节点的端口 |