前言

上篇文章我们讲了Redis的​​主从复制​​​搭建,但是大家这里​​思考​​​一个问题,如果我的主节点​​挂了​​​,那是不是就只有从节点了。那就没有机器接受Redis的​​写请求​​了,那这样肯定是不行的对吧。

这里我们的​​哨兵机制​​​就是解决这个问题:​​故障转移​​​,如果主节点挂掉,就进行​​主从切换​​​,让从节点​​升级​​为主节点,继续对外提供服务。

文章结尾可以发表一些问题、或者建议。你们的反馈能让老哥写出更好的文章。

Redis哨兵实现主从切换,故障转移_服务器

哨兵简介

Redis哨兵实现主从切换,故障转移_redis_02

​Sentinel​​​(哨兵)是Redis​​高可用​​的解决方案,可以运行多个Sentinel组成一个哨兵分布式系统。

使用流言协议(gossip protocols)来接收主机​​是否下线​​​;并使用投票协议(agreement protocols)来决定是否执行​​自动故障迁移​​​;以及选择哪个从服务器作为​​新的主服务器​​。

Sentinel哨兵职责如下:

  • ​监控​​(Monitoring):Sentinel 会不断地定期检查你的主服务器和从服务器是否运作正常。

  • ​提醒​​(Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。

  • ​自动故障迁移​​​(Automaticfailover): 当一个主服务器​​不能正常工作​​​时, Sentinel 会开始一次​​自动故障迁移​​​操作,它会将失效主服务器的其中一个从服务器​​升级​​​为新的主服务器,并让失效主服务器的其他从服务器改为复制新的主服务器; 当​​客户端​​试图连接失效的主服务器时,集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器。

  • ​统一的配置管理​​:连接者询问sentinel取得主从的地址。

哨兵搭建

机器准备

​主从复制​​的搭建,之前的文章讲过了,大家可以去参考


服务器名称

节点类型

IP地址

端口

Node1

Redis服务1(主节点Master)

192.168.14.101

6379

Node2

Redis服务2(从节点slave1)

192.168.14.102

6380

Node3

Redis服务3(从节点slave2)

192.168.14.103

6381

Sentinel1

哨兵服务1

192.168.14.101

26379

Sentinel2

哨兵服务2

192.168.14.102

26380

Sentinel3

肖兵服务3

192.168.14.103

26381

五个主要配置讲解

在每个主从Redis目录下新建一个名为sentinel.conf的文件,在该文件下配置如下命令。

​命令总格式​​:sentinel <option_name> <master_name> <option_value>

一:配置sentinel监控master

​示例​​:sentinel monitor mymaster 127.0.0.1 6380 1

​详解​​:sentinel监控的master的名字叫做mymaster,地址为127.0.0.1:6380;sentinel在集群中,需要多个sentinel互相沟通来确认某个master是否真的死了;数字1代表,当集群中有1个sentinel认为master死了时,才能真正认为该master已经不可用了。

二:配置sentinel心跳

​示例​​:sentinel down-after-milliseconds mymaster 5000

​详解​​​:sentinel向master发送心跳PING,确认master是否存活,如果master在​​down-after-milliseconds​​​时间(单位毫秒)范围内没有给sentinel回应​​PONG​​,或者回复一个错误消息,那么sentinel就主观的认为这个master不可用了

三:配置主从切换时,同步新master的salve个数

​示例​​:sentinel parallel-syncs mymaster 1

​详解​​:在发生failover主备切换时,这个选项指定了最多可以有多少个slave同时对新的master进行同步数据。这个数字越小,完成failover所需的时间就越长,但是如果这个数字越大,就意味着越多的slave因为replication而不可用。可以设为 1 来保证每次只有一个slave处于不能处理命令请求的状态

四:配置故障转移最大时间

​示例​​:sentinel failover-timeout mymaster 60000(毫秒)

​详解​​:若Sentinel进程在该配置值内未能完成故障转移的操作,则认为本次故障转移操作失败。

五:配置报警脚本

​示例​​:sentinel notification-script mymaster

​详解​​:Sentinel检测到Master主服务器异常时,所要调用的报警脚本。

sentinel配置文件示例

大家按照这个配置,分别给3个sentinel节点进行配置

# 哨兵sentinel实例运行的端口 默认26379
port 26379

#以守护进程模式启动
daemonize yes

# 哨兵sentinel的工作目录
dir /tmp

#日志文件名
logfile "sentinel_26379.log"

# sentinel监控的master主机
sentinel monitor mymaster 192.168.1.108 6379 2

# sentinel连接主从密码验证,注意必须为主从设置一样的密码
# sentinel auth-pass <master-name> <password>
sentinel auth-pass mymaster 1234

# 指定多少毫秒之后 主节点没有应答哨兵sentinel 此时 哨兵主观上认为主节点下线 默认30秒
sentinel down-after-milliseconds mymaster 30000

sentinel parallel-syncs mymaster 1

# 失效转移最大时间设置
sentinel failover-timeout mymaster 180000

#如果了这个脚本路径,那么必须保证这个脚本存在于这个路径,并且是可执行的,否则sentinel无法正常启动成功。
sentinel notification-script mymaster /var/redis/notify.sh

启动sentinel

​方式1​​:redis-sentinel redis-sentinel.conf

​方式2​​:redis-server sentinel.conf --sentinel

验证主从切换

kill掉master主节点,模拟主机出现故障

Redis哨兵实现主从切换,故障转移_redis_03

上面截图红框框住的几个重要信息,这里先介绍最后一行,​​switch-master mymaster​​​ 192.168.14.101 6379 192.168.14.103 6381,表示master服务器由​​6379​​​切换为​​6381​​端口的redis服务器。

​PS:+switch-master​​ 表示切换主节点

查看6381端口Redis服务器

通过命令info replication查看,我们发现,6381的Redis服务已经切换成master节点了.

另外,也可以查看sentinel.conf 配置文件,里面的 sentinel monitor mymaster 192.168.14.101 6379 2 也自动更改为6381了

Redis哨兵实现主从切换,故障转移_服务器_04

至此,哨兵模式搭建验证完成。

Redis哨兵实现主从切换,故障转移_redis_05

IT 老哥

Redis哨兵实现主从切换,故障转移_java_06

​一个在大厂做高级Java开发的程序猿​

关注微信公众号:IT 老哥

回复:Java实战项目视频教程:即可获取200G,27套实战项目视频教程

回复:Java 学习路线,即可获取最新最全的一份学习路线图

回复:Java 电子书,即可领取 13 本顶级程序员必读书籍

回复:Java 全套教程,即可领取:Java 基础、Java web、JavaEE 全部的教程,包括 spring boot 等

回复:简历模板,即可获取 100 份精美简历