前言

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

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

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



redis主从模式各节点时差 redis主从节点切换_java

哨兵简介



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主从节点切换_java_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主从模式各节点时差 redis主从节点切换_redis_04

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


redis主从模式各节点时差 redis主从节点切换_redis主从模式各节点时差_05

IT 老哥