?简介
概述:哨兵模式是主从的升级版,因为主从的出现故障后,不会自动恢复,需要人为干预,这就很麻烦。在主从的基础上,实现哨兵模式就是为了监控主从的运行状况,对主从的健壮进行监控,就好像哨兵一样,只要有异常就发出警告,对异常状况进行处理
Redis Sentinel:是一个分布式系统,Redis Sentinel为Redis提供高可用性。可以在没有人为干预的情况下 阻止某种类型的故障?
主要作用:从redis会代替宕了的主redis
其原理是哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例。同时 sentinel是一个分布式系统,可以在一个架构中运行多个Sentinel进程,可以做到sentinel的高可用
?如图:
?关于sentinel的三个定时任务: 1、每1秒每个sentinel对其他sentinel和redis节点执行ping操作,心跳检测 2、每10秒每个sentinel会对master和slave执行info命令,目的是发现slave结点,确定主从关系 3、每2秒每个sentinel通过master节点的channel交换信息(pub/sub)。master节点上有一个发布订阅的频道(sentinel:hello)。sentinel节点通过__sentinel__:hello频道进行信息交换(对节点的"看法"和自身的信息),达成共识
?Redis Sentinel的工作方式
Redis 的 Sentinel 系统用于管理多个 Redis 服务器(instance)
工作方式如下:
1、监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常 2、提醒(Notification): 当被监控的某个 Redis 服务器出现问题时,Sentinel 可以通过 API 向管理员或者其他应用程序发送通知 3、自动故障迁移(Automatic failover):如果 master 没有按预期工作,Sentinel 可以启动一个故障转移过程,其中一个副本被提升为 master,其他额外的副本被重新配置为使用新的 master,并且使用 Redis 服务器的应用程序会被告知要使用的新地址连接时
配置提供程序 : Sentinel 充当客户端服务发现的权威来源:客户端连接到 Sentinel 以请求负责给定服务的当前 Redis 主节点的地址。如果发生故障转移,Sentinels 将报告新地址?
?代替主redis的过程如图:
?默认情况下:Sentinel 使用 TCP 端口 26379 运行(请注意,6379 是普通的 Redis 端口)Sentinel 接受使用 Redis 协议的命令,因此可以使用redis-cli 或任何其他未修改的 Redis 客户端来与 Sentinel 对话。并且可以直接查询 Sentinel 以从其角度检查受监控 Redis 实例的状态,查看它知道的其他 Sentinel,等等?
一、部署Redis Sentinel?群集
系统类型 | IP地址 | 主机名称 | 端口 | CentOS7.4 | 192.168.2.5 | master | 6379;2379 | CentOS7.4 | 192.168.2.6 | salve1 | 6379 | CentOS7.4 | 192.168.2.7 | salve2 | 6379 |
master、salve1、salve2都需安装
2、配置主从复制
[root@salve1 ~]# echo 'slaveof 192.168.2.5 6379' >> /usr/local/redis/redis.conf
[root@salve1 ~]# echo 'masterauth 123.com' >> /usr/local/redis/redis.conf
[root@salve1 ~]# systemctl restart redis
————————————————————————————————————————————————————————————————————
[root@salve2 ~]# echo 'slaveof 192.168.2.5 6379' >> /usr/local/redis/redis.conf
[root@salve2 ~]# echo 'masterauth 123.com' >> /usr/local/redis/redis.conf
[root@salve1 ~]# systemctl start redis
2.1验证主从复制
——————————————————————————————————————————————主上测试
[root@master ~]# redis -h 192.168.2.5 -p 6379 -a 123.com
....
192.168.2.5:6379> set qvq 1233211234567
OK
192.168.2.5:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.2.6,port=6379,state=online,offset=14,lag=0
slave1:ip=192.168.2.7,port=6379,state=online,offset=14,lag=0
master_failover_state:no-failover
master_replid:58970ae4319d3d9ca3a0a6ecc64f6c64317acde2
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:14
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:14
192.168.2.5:6379> quit
——————————————————————————————————————————————— salve1 上查看
[root@salve1 ~]# redis -h 192.168.2.6 -p 6379 -a 123.com
.....
192.168.2.6:6379> keys *
1) "qvq"
192.168.2.6:6379> quit
—————————————————————————————————————————————— salve2 从上查看
[root@salve2 ~]# redis -h 192.168.2.7 -p 6379 -a 123.com
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
192.168.2.7:6379> keys *
1) "qvq"
192.168.2.7:6379> quit
3、配置Redis sentinel
[root@master ~]# cp redis-6.2.6/src/redis-sentinel /usr/local/redis/ #复制sentinel启动脚本
[root@master ~]# cp redis-6.2.6/sentinel.conf /usr/local/redis/ #复制sentinel配置文件
[root@master ~]# mkdir -p /var/redis/data #创建日志存放位置
[root@master ~]# vim /usr/local/redis/sentinel.conf
.....
..
21 port 26379
.....
26 daemonize yes #开启后台运行
....
36 logfile "26379.log" #日志名称
....
65 dir /var/redis/data #指定路径
...
..
84 sentinel monitor mymaster 192.168.2.5 6379 1 # 1:当一台master 出现故障进行切换
......
116 sentinel auth-pass mymaster 123.com #手动输入;连接master与slave节点的密码
....
125 sentinel down-after-milliseconds mymaster 1000 #指定master的失效时间,单位毫秒;1s
....
..
225 sentinel failover-timeout mymaster 200000 #切换操作成功的时间周期为200s,超过认为切换失败
保存
?3.1、启动Redis sentinel
[root@master ~]# /usr/local/redis/redis-sentinel /usr/local/redis/sentinel.conf #启动Redis sentinel
[root@master ~]# tail -9 /usr/local/redis/sentinel.conf
# Generated by CONFIG REWRITE
protected-mode no
user default on nopass ~* &* +@all
sentinel myid fc06c9ec190c1d80a05d06b891f19a63b7905259
sentinel config-epoch mymaster 0
sentinel leader-epoch mymaster 0
sentinel current-epoch 0
sentinel known-replica mymaster 192.168.2.7 6379
sentinel known-replica mymaster 192.168.2.6 6379
[root@master ~]# netstat -utpln|grep redis-sen
tcp 0 0 0.0.0.0:26379 0.0.0.0:* LISTEN 107083/redis-sentin
tcp6 0 0 :::26379 :::* LISTEN 107083/redis-sentin
4、测试Redis sentinel,关闭master节点后群集切换
[root@master ~]# systemctl stop redis
?查看日志:
[root@master redis]# cat /var/redis/data/26379.log
43681:X 24 Dec 2021 05:06:38.860 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
43681:X 24 Dec 2021 05:06:38.860 # Redis version=6.2.6, bits=64, commit=00000000, modified=0, pid=43681, just started
43681:X 24 Dec 2021 05:06:38.860 # Configuration loaded
43681:X 24 Dec 2021 05:06:38.860 * Increased maximum number of open files to 10032 (it was originally set to 1024).
43681:X 24 Dec 2021 05:06:38.860 * monotonic clock: POSIX clock_gettime
43681:X 24 Dec 2021 05:06:38.860 * Running mode=sentinel, port=26379.
43681:X 24 Dec 2021 05:06:38.860 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
43681:X 24 Dec 2021 05:06:38.861 # Sentinel ID is fc06c9ec190c1d80a05d06b891f19a63b7905259
43681:X 24 Dec 2021 05:06:38.861 # +monitor master mymaster 192.168.2.6 6379 quorum 1
43681:X 24 Dec 2021 05:06:39.895 # +sdown slave 192.168.2.5:6379 192.168.2.5 6379 @ mymaster 192.168.2.6 6379
Redis-Sentinel集群日志信息 | +reset-master | 主服务器已被重置 | +slave | 一个新的从服务器已经被Sentinel识别并关联 | +failover-state-reconf-slaves | 故障转移状态切换到了reconf-slaves状态 | +failover-detected | 另一个Sentinel开始了一次故障转移操作,或者一个从服务器转换成了主服务器 | +slave-reconf-sent | 领头(leader)的Sentinel向实例发送了SLAVEOF命令,为实例设置新的主服务器 | +slave-reconf-inprog | 实例正在将自己设置为指定主服务器的从服务器,但相应的同步过程仍未完成 | +slave-reconf-done | 从服务器已经成功完成对新主服务器的同步 | -dup-sentinel | 对给定主服务器进行监视的一个或多个Sentinel已经因为重复出现而被移除当Sentinel实例重启的时候,就会出现这种情况 | +sentinel | 一个监视给定主服务器的新Sentinel已经被识别并添加 | +sdown | 给定的实例现在处于主观下线状态 | -sdown | 给定的实例已经不再处于主观下线状态 | +odown | 给定的实例现在处于客观下线状态 | -odown | 给定的实例已经不再处于客观下线状态 | +new-epoch | 当前的纪元(epoch)已经被更新 | +try-failover | 一个新的故障迁移操作正在执行中,等待被大多数Sentinel选中(waitingtobeelectedbythemajority) | +elected-leader | 赢得指定纪元的选举,可以进行故障迁移操作了 | +failover-state-select-slave | 故障转移操作现在处于select-slave状态——Sentinel正在寻找可以升级为主服务器的从服务器 | no-good-slave | Sentinel操作未能找到适合进行升级的从服务器。Sentinel会在一段时间之后再次尝试寻找合适的从服务器来进行升级,又或者直接放弃执行故障转移操作 | selected-slave | Sentinel顺利找到适合进行升级的从服务器 | failover-state-send-slaveof-noone | Sentinel正在将指定的从服务器升级为主服务器,等待升级功能完成 | failover-end-for-timeout | 故障转移因为超时而中止,不过最终所有从服务器都会开始复制新的主服务器(slaveswilleventuallybeconfiguredtoreplicatewiththenewmasteranyway) | failover-end | 故障转移操作顺利完成。所有从服务器都开始复制新的主服务器了 | +switch-master | 配置变更,主服务器的IP和地址已经改变。这是绝大多数外部用户都关心的信息 |
5、测试新master节点与slave节点之间的主从同步
[root@salve1 ~]# redis -h 192.168.2.6 -p 6379 -a 123.com
......
192.168.2.6:6379> keys *
1) "qvq"
192.168.2.6:6379> set aaa aaaa
OK
————————————————————————————————————————————————————————————————-
[root@salve2 ~]# redis -h 192.168.2.7 -p 6379 -a 123.com
...................
192.168.2.7:6379> keys *
1) "qvq"
2) "aaa"
192.168.2.7:6379> set adb ase
(error) READONLY You can't write against a read only replica.
6、恢复master节点,查看群集状态
[root@master redis]# systemctl start redis
[root@master redis]# redis -h 192.168.2.5 -a 123.com
...........
192.168.2.5:6379> info replication
# Replication
role:slave
master_host:192.168.2.6
master_port:6379
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:1
slave_read_repl_offset:1
slave_repl_offset:1
master_sync_total_bytes:-1
master_sync_read_bytes:0
master_sync_left_bytes:-1
master_sync_perc:-0.00
master_sync_last_io_seconds_ago:0
master_link_down_since_seconds:-1
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:cfc33cdad2f9a2b7a2aa07f10e75a6bc4bad6729
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
?如要实现IP地址的统一性,可以使用keepalived及shell脚本实现
|