redis 简单整理——哨兵简单介绍[二十八]

前言

简单介绍一下哨兵模式。

正文

Redis的主从复制模式下,一旦主节点由于故障不能提供服务,需要人 工将从节点晋升为主节点,同时还要通知应用方更新主节点地址,对于很多 应用场景这种故障处理的方式是无法接受的。

也就是我们前面提及的主从复制的模式下,主和从是固定的,当主宕机后,那么只能等待主的恢复,这样不利于高可用性,也就是没有一定的容错性。

Redis从2.8开始正式 提供了Redis Sentinel(哨兵)架构来解决这个问题。

在了解sentinel 之前需要了解一些名词。

Redis Sentinel是Redis的高可用实现方案,在实际的生产环境中,对提 高整个系统的高可用性是非常有帮助的。

Redis的主从复制模式可以将主节点的数据改变同步给从节点,这样从 节点就可以起到两个作用:第一,作为主节点的一个备份,一旦主节点出了 故障不可达的情况,从节点可以作为后备“顶”上来,并且保证数据尽量不丢 失(主从复制是最终一致性)。

第二,从节点可以扩展主节点的读能力,一 旦主节点不能支撑住大并发量的读操作,从节点可以在一定程度上帮助主节点分担读压力。

但是主从复制也带来了以下问题:

一旦主节点出现故障,需要手动将一个从节点晋升为主节点,同时需 要修改应用方的主节点地址,还需要命令其他从节点去复制新的主节点,整个过程都需要人工干预。

·主节点的写能力受到单机的限制。

·主节点的存储能力受到单机的限制。

那么往上总结一下,单从主从这种模式上说呢,就是主只有一台,故而会受到单机影响。同时主从有两个作用,那就是可以分摊主库的读取能力,同样起到一个备份的作用。

同样单纯的主从还有一个问题,那么就是当起到一个备份容灾的作用的时候,那么不会自动将从库设置为主库,同样每个应用的主从都是固定死的,那么同样需要修改应用端。

这样就进入了人工阶段了,人工有一个缺点,就是恢复速度慢。

怎么说呢?可以看下下面的步骤。

  1. 当主节点挂机后,且无法恢复的情况下,那么需要选取一个从节点做为主节点。

其中的一个问题就是选取哪一台作为主库。

  1. 当设置其中一个从节点为主节点后,这个时候需要另外一台机器作为从节点,不然宕机的风险就很大了。

  2. 这时候应该修改应用方的主节点信息,然后重启应用方(或者热更新配置)。

  3. 当原来的主节点恢复后,那么这个节点应该作为从节点。

其中2 和 3可能反过来,但是无论如何,这样要花费大量的时间。

为了让下次恢复的时间更短一些,通常会写成一个或多个脚本。

那么问题是否就解决了呢?从工程学的角度上说远远没有解决。

为何这样说呢? 因为脚本是固定的,不同的人操控熟练度不一样,难免出现问题。

其二脚本对于redis来说毕竟是外部程序,外部程序很难全面的去了解内部程序发生的变化。

第三呢,随着redis的更新,那么脚本可能出现不适用的情况,维护成本就来了。

redis sentinel 这个时候就来解决这个问题了。

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

如果被标识的是主节点,它还 会和其他Sentinel节点进行“协商”,当大多数Sentinel节点都认为主节点不可 达时,它们会选举出一个Sentinel节点来完成自动故障转移的工作,同时会 将这个变化实时通知给Redis应用方。

整个过程完全是自动的,不需要人工 来介入,所以这套方案很有效地解决了Redis的高可用问题。

故障转移步骤:

  1. 主节点出现故障,此时两个从节点失去连接,主从复制失败

  2. 每个Sentinel节点通过定期监控发现主节点出现了故障

  3. 每个Sentinel节点通过定期监控发现主节点出现了故障

  4. Sentinel领导者节点执行了故障转移

故障转移后的拓扑结构图:

redis sentinel 有下面几个功能:

·监控:Sentinel节点会定期检测Redis数据节点、其余Sentinel节点是否 可达。

·通知:Sentinel节点会将故障转移的结果通知给应用方。

·主节点故障转移:实现从节点晋升为主节点并维护后续正确的主从关系。

·配置提供者:在Redis Sentinel结构中,客户端在初始化的时候连接的 是Sentinel节点集合,从中获取主节点信息。

同时看到,Redis Sentinel包含了若个Sentinel节点,这样做也带来了两个 好处:

·对于节点的故障判断是由多个Sentinel节点共同完成,这样可以有效地 防止误判。

·Sentinel节点集合是由若干个Sentinel节点组成的,这样即使个别Sentinel 节点不可用,整个Sentinel节点集合依然是健壮的。

但是Sentinel节点本身就是独立的Redis节点,只不过它们有一些特殊, 它们不存储数据,只支持部分命令。

下一节redis sentinel 的部署。

posted @ 2021-09-12 19:55  敖毛毛  阅读(68)  评论(0编辑  收藏  举报