高并发redis - 哨兵机制保证4个9高可用

2020-03-29  本文已影响0人  coder爱唱歌

在上一篇读写分离支撑qps10w+,讲到使用redis读写分离,能够通过增加slave,来成倍的增加读操作的qps。
但是如何保证主从架构承受99.99%的高可用性?

所以,需要在主从复制读写分离中引入sentinel哨兵机制,哨兵是用来监测master和slave状态的工具。
如果检测到master宕机,马上就会通过一系列的选举操作,在slave中选出一个节点来顶替master的工作,
让系统继续保持运转。

本文从以下几点来介绍哨兵:

1、哨兵的介绍与几个基础问题

1.介绍

2.哨兵的注意事项

3.经典的三节点哨兵集群。

经典三节点哨兵架构.png

2、哨兵的工作流程以及7个核心底层原理

sdown:subjective down,主观宕机,当一个哨兵认为master挂了,就是sdown

odown:objective down,客观宕机,当超过quorum个哨兵认为master挂了,就是odown

哨兵工作流程

7个底层核心原理

3、两个主备切换过程中的数据丢失问题

(1).异步复制导致数据丢失现象
- 因为master -> slave的复制是异步的,所以可能有部分数据还没复制到slave,master就宕机了,此时这些部分数据就丢失了

异步复制导致的数据丢失问题.png

(2).脑裂导致的数据丢失
- 脑裂,也就是说,某个master所在机器突然脱离了正常的网络,跟其他slave机器不能连接,但是实际上master还运行着此时哨兵可能就会认为master宕机了,然后开启选举,将其他slave切换成了master,这个时候,集群里就会有两个master,也就是所谓的脑裂
- 此时虽然某个slave被切换成了master,但是可能client还没来得及切换到新的master,还继续写向旧master的数据可能也丢失了
- 因此旧master再次恢复的时候,会被作为一个slave挂到新的master上去,自己的数据会清空,重新从新的master复制数据

![集群脑裂导致的数据丢失问题.png](https://img.haomeiwen.com/i21341666/fbe76cd46b5d070c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

解决异步复制和脑裂导致的数据丢失:在master新增如下两个配置

4、实战:手动搭建3个节点主备集群+哨兵(附带redis配置和docker启动脚本)

sentinel.conf

daemonize no
protected-mode no
port 26379
dir "/data"
logfile "sentinel.log"
sentinel monitor mymaster 192.168.5.10 6379 2
sentinel down-after-milliseconds mymaster 10000
sentinel failover-timeout mymaster 180000
sentinel auth-pass mymaster 123456
sentinel config-epoch mymaster 0
sentinel leader-epoch mymaster 0

docker 启动sentinel的指令

docker run -d --name sentinel --restart=always --net=host -p 26379:26379  -v /data/redis:/data redis redis-sentinel /data/sentinel.conf

步骤:

观察哨兵集群成功后的sentinel.conf文件.png

5、sentinel容灾演练

步骤:

通过日志查看主备切换过程.png

6、总结

上一篇 下一篇

猜你喜欢

热点阅读