NoSQL——redis集群——哨兵
前言
一、哨兵模式(Sentinel)
1. 哨兵模式集群架构
哨兵是Redis集群架构中非常重要的一个组件,哨兵的出现主要是解决了主从复制出现故障时需要人为干预的问题
作用:
-
监控
哨兵会不断地检查主节点和从节点是否运作正常 -
自动故障转移
当主节点不能正常工作时,哨兵会开始自动故障转移操作,它会将失效主节点的其中一个从节点升级为新的主节点,并让其他从节点改为复制新的主节点 -
通知
哨兵可以将故障转移的结果发送给客户端
原理:
它一个分布式系统,用于对主从结构中的每台服务器进行监控,当出现故障时通过投票机制选择新的 Master 并将所有 slave 连接到新的 Master
整个运行哨兵的集群的数量不得少于 3 个节点
结构:
哨兵结构由两部分组成,哨兵节点和数据节点:
-
哨兵节点
哨兵系统由一个或多个哨兵节点组成,哨兵节点是特殊的 redis 节点,不存储数据 -
数据节点
主节点和从节点都是数据节点
工作过程:
- 哨兵的启动依赖于主从模式,所以须把主从模式安装好的情况下再去做哨兵模式,所以节点上都需要部署哨兵模式,哨兵模式会监控所有的 Redis 工作节点是否正常
- 当 Master 出现问题的时候,因为其他节点与主节点失去联系,因此会投票,投票过半就认为这个 Master 的确出现问题,然后会通知哨兵间会推选出一个哨兵来进行故障转移工作(由该哨兵来指定哪个 slave 来做新的 master),然后从 Slaves 中选取一个作为新的 Master
- 筛选方式是哨兵互相发送消息,并且参与投票,票多者当选
需要特别注意的是,客观下线是主节点才有的概念,即如果从节点和哨兵节点发生故障,被哨兵主观下线后,将不会再有后续的客观下线和故障转移操作(及哨兵模式只负责 Master 的方面,而不管 Slaves)- 当某个哨兵发现主服务器挂掉了,会将 master 中的 SentinelRedistance 中的 master
改为SRI_S_DOWN(主观下线),并通知其他哨兵,告诉他们发现 master 挂掉了
其他哨兵在接收到该哨兵发送的信息后,也会尝试去连接 master,如果超过半数(配置文件中设置的)确认 master 挂掉后,会将
master 中的 SentinelRedistance 中的 master 改为 SRI_O_DOWN(客观下线)
2. 哨兵模式主要功能
- 集群监控:负责监控Redismaster和slave进程是否正常工作
- 消息通知:如果某个Redis实例有故障,那么哨兵负责发送消息作为报敬通知给管理员
- 故障转移:如果masternode挂掉了,会自动转移到slave node上
- 配置中心:如果故障转移发生了,通知client客户端新的master地址
3. 哨兵们监控整个系统节点的过程
-
首先主节点的信息是配置在哨兵(Sentinel)的配置文件中
-
哨兵节点会和配置的主节点建立起两条连接命令连接和订阅连接
==PS:Redis发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消 息,订阅者 (sub) 接收消息。 == -
哨兵会通过命令连接每10s发送一次INFO命令,通过INFO命令,主节点会返回自己的run_id和自己的从节点信息
-
哨兵会对这些从节点也建立两条连接命令连接和订阅连接
-
哨兵通过命令连接向从节点发送INFO命令,获取到他的一些信息:
run id(redis服务器id)
role(职能)
从服务器的复制偏移量offset
其他 -
通过命令连接向服务器的sentinel:hello频道发送一条消息,内容包括自己的ip端口、run id、配置(后续投票的时候会用到)等
-
通过订阅连接对服务器的sentinel:hello频道做了监听,所以所有的向该频道发送的哨兵的消息都能被接受到
-
解析监听到的消息,进行分析提取,就可以知道还有那些别的哨兵服务节点也在监听这些主从节点了,更新结构体将这些
哨兵节点记录下来 -
向观察到的其他的哨兵节点建立命令连接----没有订阅连接
使用一个或者多个哨兵(Sentinel)实例组成的系统,对redis节点进行监控 在主节点出现故障的情况下, 能将从节点中的一个升级为主节点,进行故障转义,保证系统的可用性。
4. 哨兵模式下的故障迁移
-
主观下线
哨兵(Sentinel)节点会每秒一次的频率向建立了命令连接的实例发送PING命令,如果在down-after-milliseconds毫秒内没有做出有效响应包括(PONG/LOADING/MASTERDOWN)以外的响应,哨兵就会将该实例在本结构体中的状态标记为SRI_S_DOWN主观下线 -
客观下线
当一个哨兵节点发现主节点处于主观下线状态是,会向其他的哨兵节点发出询问,该节点是不是已经主观下线了。如果超过配置参数quorum个节点认为是主观下线时,该哨兵节点就会将自己维护的结构体中该主节点标记为SRIO DOWN客观下线询问命令SENTINEL is-master-down-by-addr -
master选举
在认为主节点客观下线的情况下,哨兵节点节点间会发起一次选举,命令为:SENTINEL is-master-down-by-addr
只是runid这次会将自己的runid带进去,希望接受者将自己设置为主节点。如果超过半数以上的节点返回将该节点标记为leacer的情况下,会有该leader对故障进行迁移 -
故障转移
在从节点中挑选出新的主节点
通讯正常
优先级排序
优先级相同时选择offset最大的
将该节点设置成新的主节点SLAVEOF no one,并确保在后续的INGO命令时 该节点返回状态为master
将其他的从节点设置成从新的主节点复制,SLAVEOF命令
将旧的主节点变成新的主节点的从节点
PS:优缺点
优点:
- 高可用,哨兵模式是基于主从模式的,所有主从模式的优点,哨兵模式都具有有;主从可以自动切换,系统更
- 健壮,可用性更高
缺点:
- redis比较难支持在线扩容,在群集容量达到上限时在线扩容会变得很复杂
二、搭建哨兵模式
节点名 IP地址
master 192.168.237.123
slave1 192.168.237.124
slave2 192.168.237.125
1. 修改哨兵配置文件
所有节点皆需
vim /opt/redis-5.0.9/sentinel.conf
#17行,关闭保护模式
protected-mode no
#21行,Redis哨 兵默认的监听端口
port 26379
#26行 开启守护进程
daemonize yes
#36行,指定日志存放路径
logfile "/var/log/sentinel.log"
#65行,指定数据库存放路径
dir "/var/lib/redis/6379"
#84行,指定哨兵节点
#2表示,至少需要 2 个哨兵节点同意,才能判定主节点故障并进行故障转移
sentinel monitor mymaster 192.168.226.128 6379 2
#113行,判定服务器down掉的时间周期,默认30000毫秒 (30秒 )
sentinel down-after-milliseconds mymaster 3000
#146行,故障节点的最大超时时间为180000 (180秒)
sentinel failover-timeout mymaster 180000
2. 启动哨兵模式
先启动主节点在启动从节点
cd /opt/redis-5.0.9/
redis-sentinel sentinel.conf &
查看哨兵信息
[root@master redis-5.0.7]# redis-cli -p 26379 info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.226.128:6379,slaves=2,sentinels=1
模拟故障(rm -rf /var/run/redis_6379.pid
)
ps -ef | grep "redis"
#查看 redis-server 的进程号
kill -9 2379
#杀死 Master 节点上的 redis-server 的进程号
查看哨兵信息
[root@master redis-5.0.7]# redis-cli -p 26379 info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=odown,address=192.168.226.128:6379,slaves=2,sentinels=3
PS:status=odown:
o即objectively ,客观
验证结果
#查看master哨兵日志
tail -f /var/log/sentinel.log
redis-cli -p 26379 info Sentinel