🌟前言
在上一篇文章中介绍了主从分离+读写分离以及其搭建的多种方式。如果其中的主节点宕机,需要我们手工去重新设置主节点,那么有没有一种方式可以自动设置主节点呢?那就是Redis中的哨兵机制,本文就介绍哨兵机制的原理以及其搭建方式。
🌟概述
哨兵模式:通过发送命令给多个节点来监控Redis的master以及slave的运行状态,并在master服务宕机后,自动将slave节点转为master服务。
哨兵模式的三大工作任务
- 监控:监控master以及其slave节点的运行状态。
- 提醒:将检测的节点信息,通过API向客户端发送相关信息。
- 自动故障转移:当master服务不能正常运行时,内部将从slave节点中选举出最新的master服务,并通知其他的slave节点更新主节点配置信息。
多哨兵模式下的下线名称
- 主观下线:监控的Redis节点没有在规定的时间down-after-milliseconds内作出回应,则为主观下线。适用于所有节点。
- 客观下线:监控的主节点发生故障时,哨兵与哨兵之间通过is-master-down-by-addr命令互相交流,并进行投票,若票数满足要求则判断为下线。只适用于主节点。
- 仲裁:简单来说就是过个哨兵根据相关配置,进行投票选举出最新的主节点。
注意:实际应用中配置一个哨兵往往不能保证主节点一直能正常运行,往往需要配置多个哨兵,哨兵与哨兵之间还会互相监控。
🌟搭建过程
此文的哨兵模式基于【Redis从头学-12】Redis主从复制和读写分离的多种部署方式解析(普通方式、Docker搭建方式、Docker-Compose搭建方式)进行搭建,前置环境可前往这篇文章查看。
前情提要
- 开放相应的哨兵模式端口26379、26380、26381。默认端口为26379。
- 启动时,先启动主节点,再启动从节点,最后启动三个哨兵。
配置文件创建
配置项一览表
配置项 | 描述 |
port |
指定哨兵的监听端口,默认为26379。 |
bind |
指定哨兵绑定的IP地址。 |
dir |
指定哨兵的工作目录,用于存储持久化数据和日志文件。 |
sentinel monitor <master-name> <ip> <port> <quorum> |
定义要监控的主节点。<master-name> :主节点的名称。<ip> 和 <port> :主节点的地址和端口号。<quorum> :需要同意故障转移的最少票数。 |
sentinel down-after-milliseconds <master-name> <milliseconds> |
定义哨兵将主节点标记为下线的时间阈值。 |
sentinel parallel-syncs <master-name> <num> |
定义同时进行故障转移的最大并行同步数量。 |
sentinel failover-timeout <master-name> <milliseconds> |
定义故障转移操作的超时时间。 |
sentinel auth-pass <master-name> <password> |
如果主节点需要密码验证,使用此配置项提供密码。 |
sentinel deny-scripts-reconfig <master-name> |
禁止从节点执行配置修改操作。 |
sentinel leader-epoch <master-name> <epoch> |
指定当前哨兵的领导者纪元。 |
1.在data/路径下创建sentinel文件夹以及在sentinel文件夹下创建三个文件sentinel1.conf、sentinel2.conf、sentinel3.conf。
mkdir -p /data/sentinel--创建文件夹 cd /data/sentinel--进入到sentinel目录 touch sentinel1.conf sentinel2.conf sentinel3.conf---创建存放哨兵模式的配置文件 mkdir log--存放日志。
2.sentinel1.conf配置文件。
port 26379 bind 0.0.0.0 daemonize yes pidfile "/var/run/sentinel1.pid" logfile "/data/sentine/log/sentinel_26379.log" dir "/tmp" sentinel monitor mymaster 48.233.48.98 6379 2 sentinel down-after-milliseconds mymaster 5000 sentinel auth-pass mymaster daencode@top sentinel failover-timeout mymaster 30000
3.sentinel2.conf配置文件。
port 26380 bind 0.0.0.0 daemonize yes pidfile "/var/run/sentinel2.pid" logfile "/data/sentinel/log/sentinel_26380.log" dir "/tmp" sentinel monitor mymaster 48.233.48.98 6379 2 sentinel down-after-milliseconds mymaster 5000 sentinel auth-pass mymaster daencode@top sentinel failover-timeout mymaster 30000
4.sentinel3.conf配置文件。
port 26381 bind 0.0.0.0 daemonize yes pidfile "/var/run/sentinel3.pid" logfile "/data/sentinel/log/sentinel_26381.log" dir "/tmp" sentinel monitor mymaster 48.233.48.98 6379 2 sentinel down-after-milliseconds mymaster 5000 sentinel auth-pass mymaster daencode@top sentinel failover-timeout mymaster 30000
启动哨兵
1.进入到redis安装目录中的bin目录。
cd /usr/local/redis/bin
2.依次启动三个哨兵。这里注意要先启动主从节点。
./redis-server /data/sentinel/sentinel1.conf --sentinel ./redis-server /data/sentinel/sentinel2.conf --sentinel ./redis-server /data/sentinel/sentinel3.conf --sentinel
3.验证是否启动成功。
4.进入到26379哨兵,查看节点信息。从下图红框部分可以看出为一主(name为mymaster),2从,3哨兵。
注意:如果红框内status状态为sdown,则代表没有配置成功。要去检查一下主从复制的配置文件以及哨兵配置文件中的IP地址是否有误、密码是否有误以及要注意关闭防火墙的配置。我这里找了半天,发现是自己的ip地址配错了,配置文件一定要细心编写,关键点在于ip地址、密码、路径
./redis-cli -h 49.233.48.98 -p 26379 #查看节点信息 info sentinel
🌟场景测试
这里对master主节点6379进行shutdown,之后查看哨兵节点的日志信息。
1.下线主节点master-6379。
2.查看其中一个哨兵的日志信息。
日志解读:
- +sdown master mymaster 49.233.48.98 6379:表示主服务器(mymaster)在IP地址为49.233.48.98,端口为6379的节点上被判定为下线(sdown)。这可能是因为主服务器出现了故障或无法正常工作。
- +new-epoch 1:表示一个新的选举轮次(epoch)开始,这是哨兵在选举新的主服务器时使用的计数器。此处的"1"表示当前轮次的编号。
- +vote-for-leader 9ddfd87d9127f7f7f2eb7aba24bd422a7782f121 1:表示哨兵节点已经投票给ID为9ddfd87d9127f7f7f2eb7aba24bd422a7782f121的实例来成为新的主服务器。"1"表示该节点的投票数。
- +odown master mymaster 49.233.48.98 6379 #quorum 3/2:表示主服务器(mymaster)正在执行故障转移操作,并且需要获得至少3个哨兵节点的投票(quorum)以确保操作的可靠性。"3/2"表示当前获得的投票数。
- Next failover delay: I will not start a failover before Mon Aug 28 02:26:03 2023:表示下一次故障转移操作的启动时间将在指定时间之后。在这种情况下,在2023年8月28日02:26:03之前不会执行故障转移操作。
- +config-update-from sentinel 9ddfd87d9127f7f7f2eb7aba24bd422a7782f121 10.0.16.11 26381 @ mymaster 49.233.48.98 6379:表示哨兵节点从ID为9ddfd87d9127f7f7f2eb7aba24bd422a7782f121的实例获取到新的配置更新,并且该实例的IP地址为10.0.16.11,端口为26381。
- +switch-master mymaster 49.233.48.98 6379 49.233.48.98 6380:表示成功将主服务器切换到IP地址为49.233.48.98,端口从6379切换为6380。
- +slave slave 49.233.48.98:6381 49.233.48.98 6381 @ mymaster 49.233.48.98 6380:表示一个新的从属服务器(slave)成功连接到主服务器(mymaster),从属服务器的IP地址为49.233.48.98,端口为6381。
- +sdown slave 49.233.48.98:6379 49.233.48.98 6379 @ mymaster 49.233.48.98 6380:表示从属服务器(位于IP地址为49.233.48.98,端口为6379的节点上)被判定为下线。
3.登录之前的6380从节点,查看节点信息是否已经成为主节点。 可以看到已经成为新的master。
🌟写在最后
有关于一文带你搞懂Redis哨兵机制以及其搭建方式到此就结束了。在搭建时,编写的配置文件一定要详细检查、细心编写,还要注意防火墙的关闭或者端口号的开发。感谢大家的阅读,希望大家在评论区对此部分内容散发讨论,便于学到更多的知识。