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. 哨兵们监控整个系统节点的过程

  1. 首先主节点的信息是配置在哨兵(Sentinel)的配置文件中

  2. 哨兵节点会和配置的主节点建立起两条连接命令连接和订阅连接
    ==PS:Redis发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消 息,订阅者 (sub) 接收消息。 ==

  3. 哨兵会通过命令连接每10s发送一次INFO命令,通过INFO命令,主节点会返回自己的run_id和自己的从节点信息

  4. 哨兵会对这些从节点也建立两条连接命令连接和订阅连接

  5. 哨兵通过命令连接向从节点发送INFO命令,获取到他的一些信息:
    run id(redis服务器id)
    role(职能)
    从服务器的复制偏移量offset
    其他

  6. 通过命令连接向服务器的sentinel:hello频道发送一条消息,内容包括自己的ip端口、run id、配置(后续投票的时候会用到)等

  7. 通过订阅连接对服务器的sentinel:hello频道做了监听,所以所有的向该频道发送的哨兵的消息都能被接受到

  8. 解析监听到的消息,进行分析提取,就可以知道还有那些别的哨兵服务节点也在监听这些主从节点了,更新结构体将这些
    哨兵节点记录下来

  9. 向观察到的其他的哨兵节点建立命令连接----没有订阅连接
    使用一个或者多个哨兵(Sentinel)实例组成的系统,对redis节点进行监控 在主节点出现故障的情况下, 能将从节点中的一个升级为主节点,进行故障转义,保证系统的可用性。

4. 哨兵模式下的故障迁移

  1. 主观下线
    哨兵(Sentinel)节点会每秒一次的频率向建立了命令连接的实例发送PING命令,如果在down-after-milliseconds毫秒内没有做出有效响应包括(PONG/LOADING/MASTERDOWN)以外的响应,哨兵就会将该实例在本结构体中的状态标记为SRI_S_DOWN主观下线

  2. 客观下线
    当一个哨兵节点发现主节点处于主观下线状态是,会向其他的哨兵节点发出询问,该节点是不是已经主观下线了。如果超过配置参数quorum个节点认为是主观下线时,该哨兵节点就会将自己维护的结构体中该主节点标记为SRIO DOWN客观下线询问命令SENTINEL is-master-down-by-addr

  3. master选举
    在认为主节点客观下线的情况下,哨兵节点节点间会发起一次选举,命令为:SENTINEL is-master-down-by-addr
    只是runid这次会将自己的runid带进去,希望接受者将自己设置为主节点。如果超过半数以上的节点返回将该节点标记为leacer的情况下,会有该leader对故障进行迁移

  4. 故障转移
    在从节点中挑选出新的主节点
    通讯正常
    优先级排序
    优先级相同时选择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

总结

猜你喜欢

转载自blog.csdn.net/weixin_55609819/article/details/121342942
今日推荐