redis

redis Sentinel(哨兵)架构下的高可用

2020-05-18  本文已影响0人  宇晨棒棒的

1.哨兵模式简单介绍

Redis Sentinel是一个分布式架构,其中包含若干个Sentinel节点和Redis数据节点,每个Sentinel节点会对数据节点和其余Sentinel节点进行监控,当它发现节点不可达时,会对节点做下线标识。

如果被标识的是主节点,它还会和其他Sentinel节点进行“协商”,当大多数Sentinel节点都认为主节点不可达时,它们会选举出一个Sentinel节点来完成自动故障转移的工作,同时会将这个变化通知给Redis应用方。整个过程完全是自动的,不需要人工来介入,所以这套方案很有效地解决了Redis的高可用问题。

哨兵架构图

2.Redis 的 Sentinel 系统用于管理多个 Redis 服务器(instance), 该系统执行以下三个任务

1)监控任务:

A.每隔10秒,每个Sentinel节点会向主节点和从节点发送info命令获取最新的拓扑结构。

B.每隔2秒,每个Sentinel节点会向Redis数据节点的__sentinel__:hello频道上发送该Sentinel节点对于主节点的判断以及当前Sentinel节点的信息,同时每个Sentinel节点也会订阅该频道,来了解其他Sentinel节点以及它们对主节点的判断。

C.每隔一秒,每个Sentinel节点会向主节点、从节点、其余Sentinel节点发送一条ping命令做一次心跳检测,来确认这些节点当前是否可达。

2)提醒(Notification): 

A.主观下线:因为每隔一秒,每个Sentinel节点会向主节点、从节点、其余Sentinel节点发送一条ping命令做一次心跳检测,当这些节点超过down-after-milliseconds没有进行有效回复,Sentinel节点就会对该节点做失败判定,这个行为叫做主观下线

B.客观下线:当Sentinel主观下线的节点是主节点时,该Sentinel节点会向其他Sentinel节点询问对主节点的判断,当超过<quorum>个数,那么意味着大部分的Sentinel节点都对这个主节点的下线做了同意的判定,于是该Sentinel节点认为主节点确实有问题,这时该Sentinel节点会做出客观下线的决定。

C.领导者Sentinel节点选举

假设s1(sentinel-1)最先完成客观下线,它会向其余Sentinel节点发送命令,请求成为领导者;收到命令的Sentinel节点如果没有同意过其他Sentinel节点的请求,那么就会同意s1的请求,否则拒绝;如果s1发现自己的票数已经大于等于某个值,那么它将成为领导者

3)自动故障迁移(Automatic failover): 

当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会将失效主服务器的其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器; 当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器

哨兵故障迁移

实现哨兵模式:

1.基础环境:一个master和两个slave的基础架构

2.配置哨兵模式

cp /usr/local/src/redis-4.0.12/sentinel.conf  /usr/local/redis/sentinel.conf 

默认端口:26379

3.配置三个哨兵:

cp sentinel.conf  sentinel27000.conf

cp sentinel.conf  sentinel27001.conf

修改配置文件(sentinel27000.conf和sentinel27000.conf依据下面的配置文件):

port 26379

bind 0.0.0.0

logfile "/usr/local/redis/log/sentinel-${port}.log"

dir /usr/local/redis/sentinel

sentinel monitor mymaster 127.0.0.1 6379 2

sentinel down-after-milliseconds mymaster 30000

sentinel parallel-syncs mymaster 1

// 180 秒后开始故障自动装换

sentinel failover-timeout mymaster 180000

sentinel deny-scripts-reconfig yes

参数解释:

1)down-after-milliseconds 选项指定了 Sentinel 认为服务器已经断线所需的毫秒数。

如果服务器在给定的毫秒数之内, 没有返回 Sentinel 发送的 PING 命令的回复, 或者返回一个错误, 那么 Sentinel 将这个服务器标记为主观下线(subjectively down,简称 SDOWN )

2)parallel-syncs 选项指定了在执行故障转移时, 最多可以有多少个从服务器同时对新的主服务器进行同步, 这个数字越小, 完成故障转移所需的时间就越长

3)sentinel monitor 自定义的主节点名称 主节点的 IP 主节点端口 票数

票数是指最少有n个Sentinel 实例同意一台 redis 服务器宕机,才会认为 客观下线

4.启动哨兵:

/usr/local/redis/bin/redis-sentinel /usr/local/redis/sentinel.conf

/usr/local/redis/bin/redis-sentinel /usr/local/redis/sentinel27000.conf

/usr/local/redis/bin/redis-sentinel /usr/local/redis/sentinel27001.conf

5.查看sentinel的状态:

/usr/local/redis/bin/redis-cli -p 26379/27001/27000

执行info sentinel

查看sentinel的状态

6.关闭master查看哨兵状态

master进程

kill -9  19340

查看哨兵状态:(不断的刷新其中一个 Sentinel 节点的信息,观察最后一行信息的变化)

master的ip发生的变化

6.如果原先master恢复,此时的master的ip不会发生变化

上一篇下一篇

猜你喜欢

热点阅读