分布式复述,深度历险前哨

上一篇介绍了Redis的主从服务器之间是如何同步数据的。试想下,在一主一从或一主多从的结构下,如果主服务器挂了,整个集群就不可用了,单点问题并没有解决。Redis使用Sentinel解决该问题,保障集群的高可用。

如何保障集群高可用

保障集群高可用,要具备如下能力:

  • 能监测服务器的状态,当主服务器不可用时,能及时发现

  • 当主服务器不可用时,选择一台最合适的从服务器替代原有主服务器

  • 存储相同数据的主服务器同一时刻只有一台

要实现上述功能,最直观的做法就是,使用一台监控服务器来监视Redis
服务器的状态。分布式Redis深度历险-Sentinel

监控服务器和主从服务器间维护一个心跳连接,当超出一定时间没有收到主服务器心跳时,主服务器就会被标记为下线,然后通知从服务器上线成为主服务器。分布式Redis深度历险-Sentinel

当原来的主服务器上线后,监控服务器会将其转换为从服务器。
分布式Redis深度历险-Sentinel

按照上述流程似乎解决了集群高可用的问题,但似乎有哪里不对:如果监控服务器出了问题怎么办?我们可以在加上一个从监控服务器,当主服务器不可用的时候顶上。
分布式Redis深度历险-Sentinel

但问题是谁来监控’监控服务器’呢?子子孙孙无穷尽也。。

先把疑问放在一旁,先来看下Redis Sentinel集群的实现

Sentinel

和上一小节的想法一样,Redis通过增加额外的Sentinel服务器来监控数据服务器,Sentinel会与所有的主服务器和从服务器保存连接,用以监听服务器状态以及向服务器下达命令。

分布式Redis深度历险-Sentinel

Sentinel本身是一个特殊状态的Redis服务器,启动命令:
redis-server/xxx/sentinel.null

分布式复述,深度历险前哨