Redis高可用哨兵模式

在日常的 Redis 的master-slave模式下,我们一般为了实现读写分离,这样不但可以提高效率,同时在master出现故障时,我们关闭slave的只读模式,让应用去连接slave完成服务的正常使用。Sentinel可以帮助我们自动完成切换。
Sentinel是独立于Redis-server运行的一个分布式的服务。在Sentinel部署的时候,是不需要修改任何redis的配置的。Sentinel可以在运行过程中,不断的去探测redis集群中master和slave的状态,在判断出有节点故障时,可以通过Sentinel本身的API或者其他应用程序发出通知,多个Sentinel可以通过投票等方式,实现故障转移。把一个其他slave服务器升级为master。用来替换失效的master。最后通过Sentinel的服务返回给客户端一个新地址。保障应用正常运行。

toc

Sentinel安装与配置

这里用不同的端口来区分,就不打开太多服务器了

Redis服务搭建主从复制,其中Master为192.168.1.1,这里就不演示过程了,不会的出门左拐看Redis主从架构

Sentinel配置

在Redis源码包中有Sentinel配置文件的模板,可以复制出来修改也可以不用模板直接写

port 26379       ## 端口
daemonize yes      ## 后台启动
dir /soft/redis/data    ## 工作目录
logfile "/soft/redis/log/sentinel.log"    ## 日志目录
sentinel monitor mymaster 192.168.1.1 6379 2   ## 监控master,当判断失效时,至少需要2个sentinel判定master失败才可以。
sentinel down-after-milliseconds mymaster 10000    ## Sentinel 判断master失效的时间,单位为毫秒。
sentinel parallel-syncs mymaster 1   # 故障转移后每次有多少个slave向slave发起复制请求。
sentinel failover-timeout mymaster 60000  #1、同一个Sentinel对同一个master两次tailover的间隔。

#########################我是分割线#########################
#以下配置是当所有Sentinel节点启动之后,自动写入的配置

//自动发现的两个slave节点
sentinel konwn-slave mymaster 192.168.1.2 6379
sentinel konwn-slave mymaster 192.168.1.3 6379
//自动发现的两个Sentinel节点
sentinel known-sentinel mymaster 192.168.1.2 26379 814149a8600fede18177b7cc0611a86eab61699c
sentinel known-sentinel mymaster 192.168.1.3 26379  9ec521108aacc04347b0b5aa36d32680f394dc4b
sentinel current-epoch 0 #当前配置信息版本,如果配置文件发生变化,版本信息也会变化。

启动Sentinel

## 第一种启动方式(推荐)
[root@Master ~]# /soft/redis/bin/redis-sentinel /soft/redis/conf/sentlnel.conf 
## 第二种启动方式
[root@Master ~]# /soft/redis/bin/redis-server /soft/redis/conf/sentlnel.conf --sentinel

三台服务器都配置启动后,查看Sentinel配置文件,多出来发现其他角色信息。

Sentinel工作原理解释

1)一般每个Sentinel服务器都需要 每间隔 10s 一次的频率向一直的master和slaves 发送INFO命令。通过这个任务可以发现Slaves节点是否增加或者删除。当一个Master被标记为下线时,会修改为每秒发送一次命令。

2)每个Sentinel以每秒钟一次的频率向已知的master、slaves以及其他的Sentinel实例发送一个 ping 命令。如果 ping 命令无法得到一个有效的回复,并且距离上次响应时间超过down-after-milliseconds 选项设定的值,则会被标记为主观下线

3)每个Sentinel会以每2秒一次的频率,通过发布订阅的功能,向其他被它监视的所有主服务器和从服务器的Sentinel发送hello包,信息中包含了Sentinel的IP地址、端口号和运行ID(runid)

如何发现Redis-Server的Slave

1.执行任务1,发送 INFO 命令,通过解析 INFO 命令的返回值,发现Slave的节点,并对Slave进行监控。这也就是为什么在Sentinel配置的时候,不需要配置Redis-Server从节点的信息的原因。

2.信息拓扑 INFO 命令查看到Redis-Server拓扑发生主从切换,或者增加删除节点时,都可以实时更新到Sentinel的监控列表。

Sentinel如何发现其他节点

1.执行任务3 每个Sentinel都订阅了被它监视的所有主服务器和从服务器的Sentinel:hello频道,查找之前未出现过的Sentinel(looking for unknown sentinels)。当一个Sentinel发现一个新的Sentinel时,它会将新的Sentinel添加到一个列表中,并与该节点创建连接,这个列表保存了Sentinel已知的,监视同一个主服务器的所有其他Sentinel。

2.Sentinel发送的信息还包括完整的主服务器的当前配置。如果一个Sentinel包含的主服务器的配置比Sentinel发送的配置要旧,那么这个Sentinel会立即更新配置。

3.Sentinel节点之间的交换主节点状态信息,会作为后边客观下线以及领导者选举的依据。

如何判定节点失败

1.通过以上的任务,我们可以发现新的Redis-Server节点,也可以获取最新信息,以及获取Sentinel的节点信息。

2.通过定时任务2,每秒钟向Redis-Server的Master以及Slave节点。以及Sentinel的其他节点发送 ping 命令。

3.通过与每个节点的心跳检测,实现对每个节点的监控(Redis以及Sentinel),这个任务是节点判定失败的重要依据。

4.例如Sentinel-1发现某个节点相应超过down-after-milliseconds时间段没有有效回复,Sentinel节点会判定为失败和标记下线。这个行为叫做主观下线。

5.当Sentinel主观下线的节点时redis的master的时候,Sentinel会通过sentinel is master-down-by-addr 命令向其他的Sentinel节点询问对主节点的判断。当超过设定的票数时(我们三个节点,设定票数2,忘记的回顾一下前边配置),该节点会做出客观下线的决定。客观下线一旦判定之后,后边大家就都知道了,就开始切换了。

猜你喜欢

转载自www.cnblogs.com/songguoyou/p/11884192.html