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

907 阅读5分钟

前言

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

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

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

哨兵简介

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

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

Sentinel哨兵职责如下:

  • 监控(Monitoring):Sentinel 会不断地定期检查你的主服务器和从服务器是否运作正常。
  • 提醒(Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。
  • 自动故障迁移(Automaticfailover): 当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作,它会将失效主服务器的其中一个从服务器升级为新的主服务器,并让失效主服务器的其他从服务器改为复制新的主服务器; 当客户端试图连接失效的主服务器时,集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器。
  • 统一的配置管理:连接者询问sentinel取得主从的地址。

哨兵搭建

机器准备

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

服务器名称节点类型IP地址端口
Node1Redis服务1(主节点Master)192.168.14.1016379
Node2Redis服务2(从节点slave1)192.168.14.1026380
Node3Redis服务3(从节点slave2)192.168.14.1036381
Sentinel1哨兵服务1192.168.14.10126379
Sentinel2哨兵服务2192.168.14.10226380
Sentinel3肖兵服务3192.168.14.10326381

五个主要配置讲解

在每个主从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主节点,模拟主机出现故障

上面截图红框框住的几个重要信息,这里先介绍最后一行,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了

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

IT 老哥

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

关注微信公众号:IT 老哥

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

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

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

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

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