目录
1、哨兵简介:Redis Sentinel
Sentinel(哨兵)是用于监控redis集群中Master状态的工具,其已经被集成在redis2.4+的版本中是Redis官方推荐的高可用性(HA)解决方案。
2、作用
1):Master状态检测
2):如果Master异常,则会进行Master-Slave切换,将其中一个Slave作为Master,将之前的Master作为Slave
3):Master-Slave切换后,master_redis.conf、slave_redis.conf和sentinel.conf的内容都会发生改变,即master_redis.conf中会多一行slaveof/replicaof的配置,sentinel.conf的监控目标会随之调换
3、工作模式
1):每个Sentinel以每秒钟一次的频率向它所知的Master,Slave以及其他 Sentinel 实例发送 一个 PING 命令
2):如果一个实例(instance)距离最后一次有效回复 PING 命令的时间超过 down-after- milliseconds 选项所指定的值, 则这个实例会被 Sentinel 标记为主观下线。
3):如果一个Master被标记为主观下线,则正在监视这个Master的所有 Sentinel 要以每秒一 次的频率确认Master的确进入了主观下线状态。
4):当有足够数量的 Sentinel(大于等于配置文件指定的值)在指定的时间范围内确认 Master的确进入了主观下线状态, 则Master会被标记为客观下线。
4、主观下线和客观下线
主观下线:Subjectively Down,简称 SDOWN,指的是当前 Sentinel 实例对某个redis服务器做出的下线判断。
客观下线:Objectively Down, 简称 ODOWN,指的是多个 Sentinel 实例在对Master Server做出 SDOWN 判断,并且通过 SENTINEL is-master-down-by-addr 命令互相交流之后,得出的Master Server下线判断,然后开启failover
5、配置哨兵模式
环境准备:
localhost | rocky_linux9.4 | 192.168.226.20 | redis5.0.10 | Master |
localhost | rocky_linux9.4 | 192.168.226.21 | redis5.0.10 | Slave |
localhost | rocky_linux9.4 | 192.168.226.22 | redis5.0.10 | Slave |
localhost | rocky_linux9.4 | 192.168.226.23 | redis5.0.10 | Slave |
关闭防火墙,selinux,时间同步
现在对四台虚拟机进行安装redis
[root@localhost ~]# wget http://download.redis.io/releases/redis-5.0.10.tar.gz #下载redis
[root@localhost ~]# tar xzf redis-5.0.10.tar.gz -C /usr/local #解压
[root@localhost ~]# cd /usr/local/
[root@localhost local]# mv redis-5.0.10/ redis
[root@localhost local]# cd redis/
[root@localhost redis]# yum install -y gcc make #安装编译工具
[root@localhost redis]# make
注:如果报错请将刚才解压的安装包删除掉,再次重新解压并进行make安装即可。
#配置redis为systemctl启动
[root@redis-master redis]# cd /lib/systemd/system
[root@redis-master system]# vim redis.service
[Unit]
Description=Redis
After=network.target
[Service]
ExecStart=/usr/local/redis/src/redis-server /usr/local/redis/redis.conf --daemonize no
ExecStop=/usr/local/redis/src/redis-cli -h 127.0.0.1 -p 6379 shutdown
[Install]
WantedBy=multi-user.target
#以下为需要定义参数
[root@localhost ~]# cd /usr/local/redis
[root@localhost redis]# cp redis.conf redis.conf.bak #备份配置文件
[root@localhost redis]# vim redis.conf #在配置文件中找到修改如下
bind 0.0.0.0 #Redis 服务器监听的网络接口地址
daemonize yes #开启后台模式将on改为yes
timeout 300 #连接超时时间
protected-mode no #关闭 Redis 的保护模式
port 6379 #端口号
dir /usr/local/redis/data #本地数据库存放持久化数据的目录该目录-----需要存在
pidfile /var/run/redis_6379.pid #定义pid文件
logfile /var/log/redis.log #定义log文件
#创建存放数据的目录
[root@localhost redis]# mkdir /usr/local/redis/data
对三台Slave修改配置
[root@localhost ~]# vim /usr/local/redis/redis.conf +286
replicaof 192.168.226.20 6379
#启动redis
[root@localhost ~]# systemctl enable --now redis
[root@localhost ~]# ss -tnlp
接下来对四台虚拟机配置修改sentinel.conf配置文件
[root@localhost ~]# vim /usr/local/redis/sentinel.conf
#需要调整下面的四个参数,然后保存退出即可
protected-mode no #关闭加密模式--新添加到sentinel配置文件中
sentinel monitor mymaster 10.0.0.137 6379 2 #当集群中有2个sentinel认为master死了时,才能真正认为该master已经不可用了。 (slave上面写的是master的ip,master写自己ip)
sentinel down-after-milliseconds mymaster 3000 #单位毫秒
sentinel failover-timeout mymaster 10000 #若sentinel在该配置值内未能完成failover(故障转移)操作(即故障时master/slave自动切换),则认为本次failover失败。
四台虚拟机都要开启哨兵模式
[root@localhost ~]# /usr/local/redis/src/redis-sentinel /usr/local/redis/sentinel.conf &
+monitor 表示 Redis Sentinel 正在监视一个新的主节点。
master mymaster 指定了被监视的主节点名称为 mymaster。
192.168.226.20 6379 是主节点的 IP 地址和端口号。
quorum 2 指定了用于决策主节点是否下线的 Sentinel 数量。
+slave 表示这是一个从节点(slave)的信息。
每行描述一个从节点的连接信息:从节点的 IP 地址和端口号,从节点的连接地址,从节点复制的主节点名称和地址。
现在将master的哨兵模式退出,再将redis服务停止了,在三台slave上面查看其中一台是否切换为master:(没有优先级,为随机切换)
#关闭哨兵模式的进程
[root@localhost ~]# ps aux | grep redis-sentinel
root 5572 0.3 0.7 48916 13668 pts/0 Sl 15:43 0:03 /usr/local/redis/src/redis-sentinel *:26379 [sentinel]
root 5621 0.0 0.1 3880 1920 pts/0 S+ 16:00 0:00 grep --color=auto redis-sentinel
[root@localhost ~]# kill -9 5572
#关闭redis服务
[root@localhost src]# systemctl stop redis
观察别的节点上的信息
登陆任意Slave服务器查看有没有切换
[root@localhost ~]# redis-cli
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:192.168.226.23
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:398116
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:1feec7692d09b418b4bc55ff61c7366b5c6620e3
master_replid2:389c67ed1051667fc15f4d9882af2de87720e02d
master_repl_offset:398116
second_repl_offset:299814
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:398116
可以看到主节点已经切换到了192.168.226.23主机上。
登陆新的master(即192.168.226.23)机器查看:
然后重新开启192.168.226.20主机的redis服务和哨兵模式
[root@localhost ~# systemctl start redis
[root@localhost ~]# /usr/local/redis/src/redis-sentinel /usr/local/redis/sentinel.conf &
原来的主节点就成为了从节点。
6、常见哨兵日志消息含义
在 Redis 哨兵模式的日志分析中,常见的日志消息及其意义如下:
-
+monitor: 哨兵开始监视指定的 Redis 主服务器。
- 意义: 哨兵正在监视一个新的 Redis 主服务器,记录了主服务器的相关信息。
-
+slave-reconf-sent: 哨兵向从服务器发送重新配置命令。
- 意义: 哨兵在执行故障转移时,通知从服务器切换到新的主服务器。
-
+slave-reconf-inprog: 重新配置过程正在进行中。
- 意义: 标志着从服务器正在进行主服务器切换的重新配置过程。
-
+slave-reconf-done: 重新配置过程完成。
- 意义: 重新配置成功完成,从服务器已经切换到了新的主服务器。
-
+failover-end: 故障转移结束。
- 意义: 标志着故障转移过程的正式结束。
-
+switch-master: 主服务器切换事件。
- 意义: 哨兵宣布主服务器已经切换到了新的 IP 和端口。
-
+slave: 添加新的从服务器到新的主服务器。
- 意义: 哨兵将新的从服务器加入到新的主服务器的复制集中。
-
+sdown: 哨兵检测到节点宕机或不可达。
- 意义: 标志着哨兵检测到了一个 Redis 节点(可以是主服务器、从服务器或其他哨兵)宕机或不可用。
-
-sentinel down: 哨兵节点被标记为下线。
- 含义: 哨兵节点不可用或已被其他哨兵节点标记为不可用。
-
-failover-detected: 检测到故障转移正在进行中。
- 含义: 哨兵监测到主服务器发生故障,正在尝试进行自动故障转移。
-
-switch-master: 发生了主服务器切换。
- 含义: 主服务器已经成功切换到另一个节点,通常是在故障转移完成后出现的消息。
-
-failover-end: 故障转移过程结束。
- 含义: 故障转移成功完成,新的主服务器已经选举完成并且开始接受客户端请求。
-
-failover-abort-not-elected: 故障转移中止,因为当前节点没有被选为新的主服务器。
- 含义: 故障转移过程中,当前节点没有被选为新的主服务器,故障转移被中止。
-
-dup-sentinel: 发现重复的哨兵节点 ID。
- 含义: 哨兵集群中存在多个拥有相同 ID 的哨兵节点,可能导致竞争或冲突。