什么是哨兵模式?(Sentinel)
在普通的主从复制模式中,当主服务器宕机了故障了,需要手动将从服务器转换为主机。哨兵模式就是创建一个哨兵进程用来监控各个服务器的状态,通过向服务器发送命令,等待服务器响应,来判断这个服务器是否正常,当master主服务器不正常的时候,会自动选择一个slave从服务器变成主服务器,然后通过订阅模式通知其他服务器,来更换主机。
但是当只有一个哨兵的情况下,如果这个哨兵出问题了,就无法再继续进行监控,就无法自动切换主服务器了。所以这种情况下需要多个哨兵,让他们来对对方相互监督,形成一个多哨兵模式。
故障切换(failover)的过程。假设主服务器宕机,哨兵1先检测到这个结果,系统并不会马上进行failover过程,仅仅是哨兵1主观的认为主服务器不可用,这个现象成为主观下线。当后面的哨兵也检测到主服务器不可用,并且数量达到一定值时,那么哨兵之间就会进行一次投票,投票的结果由一个哨兵发起,进行failover操作。切换成功后,就会通过发布订阅模式,让各个哨兵把自己监控的从服务器实现切换主机,这个过程称为客观下线。这样对于客户端而言,一切都是透明的。
如何用docker搭建哨兵环境?
先在docker上搭建一个主从集群,已经搭建好了,1个主服务器,2个从服务器
配置sentinel的配置文件
#哨兵的端口
port 26379
#日志文件名
logfile "sentinel1.log"
#哨兵监控的主服务器ip和端口,最后的2是需要多少个哨兵节点认为主服务器故障才会客观下线,一般是总哨兵节点数的一半+1
sentinel monitor mymaster 172.17.0.2 6379 2
#指定了在发生failover主备切换时最多可以有多少个slave同时对新的master进行同步,数字越小完成failover的时间越长
sentinel parallel-syncs mymaster 1
使用docker来启动3个哨兵容器,-d是后台运行,–name指定容器名称,-v挂载本地目录到容器中
docker run -d -p 26379:26379 --name sentinel1 -v
/usr/local/docker/sentinel1.conf:/etc/redis/sentinel1.conf -v
/usr/local/docker/sentinel:/data redis redis-sentinel /etc/redis/sentinel1.conf
另外两个是一样的方法启动。启动完成后如下
进行测试
直接将主服务器shutdown,这时候从服务器中显示已经下线
过一会后发现,slave2服务器成为了主机
然后将曾经的主服务器上线,发现变成了从服务器,现在我的slave2服务器才是主服务器了,哨兵模式至此搭建完毕
哨兵的配置文件详细说明
# 哨兵sentinel实例运行的端口 默认26379
port 26379
# 哨兵sentinel的工作目录
dir /data
# 哨兵sentinel监控的redis主节点的 ip port
# master-name 可以自己命名的主节点名字 只能由字母A-z、数字0-9 、这三个字符".-_"组成。
# quorum 配置多少个sentinel哨兵统一认为master主节点失联 那么这时客观上认为主节点失联了
# sentinel monitor <master-name> <ip> <redis-port> <quorum>
sentinel monitor mymaster 127.0.0.1 6379 2
# 当在Redis实例中开启了requirepass foobared 授权密码 这样所有连接Redis实例的客户端都要提供 密码
# 设置哨兵sentinel 连接主从的密码 注意必须为主从设置一样的验证密码
# sentinel auth-pass <master-name> <password>
sentinel auth-pass mymaster ********
# 指定多少毫秒之后 主节点没有应答哨兵sentinel 此时 哨兵主观上认为主节点下线 默认30秒
# sentinel down-after-milliseconds <master-name> <milliseconds>
sentinel down-after-milliseconds mymaster 30000
# 这个配置项指定了在发生failover主备切换时最多可以有多少个slave同时对新的master进行 同步,
#这个数字越小,完成failover所需的时间就越长,
#但是如果这个数字越大,就意味着越 多的slave因为replication而不可用。
#可以通过将这个值设为 1 来保证每次只有一个slave 处于不能处理命令请求的状态。
# sentinel parallel-syncs <master-name> <numslaves>
sentinel parallel-syncs mymaster 1
# 故障转移的超时时间 failover-timeout 可以用在以下这些方面:
#1. 同一个sentinel对同一个master两次failover之间的间隔时间。
#2. 当一个slave从一个错误的master那里同步数据开始计算时间。直到slave被纠正为向正确的master那 里同步数据时。
#3.当想要取消一个正在进行的failover所需要的时间。
#4.当进行failover时,配置所有slaves指向新的master所需的最大时间。不过,即使过了这个超时, slaves依然会被正确配置为指向master,但是就不按parallel-syncs所配置的规则来了
# 默认三分钟
# sentinel failover-timeout <master-name> <milliseconds>
sentinel failover-timeout my
哨兵模式的优点
- 哨兵模式基于主从复制模式,具有主从复制所有优点
- 实现了主从服务器切换,故障后能够转移,具有高可用性
- 自动切换,很强大