Redis Sentinel下的数据一致性

Redis Sentinel 的配置是最终一致性的,所以每个分区会被统一到一个可用的更高版本的配置。但是,在使用 Sentinel 的真实世界系统中有三个不同的角色:

  • Redis 实例。
  • Sentinel 实例。
  • 客户端。

下面是一个有三个节点的简单网络,每一个节点运行一个 Redis 实例和一个 Sentinel 实例:
Redis Sentinel下的数据一致性_第1张图片

在这个系统中,初始状态是 Redis 3 是主服务器,Redis 1 和 Redis 2 是从服务器。分割发生了,隔断了老的主服务器。Sentinel 1 和 2 开始故障转移,提升 Sentinel 1 作为新的主服务器。

Sentinel 的属性保证,Sentinel 1 和 2 现在拥有主服务器的最新配置。但是,Sentinel 3 仍是旧的配置,因为它存在于一个不同的分割中。

当网络分割恢复正常了,Sentinel 3 将会更新其配置,但是,如果有客户端与老的主服务器被分割在一起,在分割期间会发生什么事情呢?

客户端会继续向 Redis 3 写,即老的主服务器。当分割又聚合在一起,Redis 3 将会变成 Redis 1 的从服务器,分割期间所有写入的数据会丢失。

你可能想或者不想这种场景发生,取决于你的配置:

  • 如果你将 Redis 用作缓存,客户端 B 可以继续往老的主服务器写,即使这些数据会丢失。
  • 如果你将 Redis 用作存储,这样就不好了,你需要来配置系统以部分地阻止问题的发生。

因为 Redis 是异步复制,这种场景下没有完全阻止数据丢失的办法,但是你可以使用下面的 Redis 配置选项,来限制 Redis 3 和 Redis 1 之间的分歧:

min-slaves-to-write 1  
min-slaves-max-lag 10 

有了上面的配置(请查看 Redis 分发版本中自带的 redis.conf 文件中的注释获取更多的信息),扮演主服务器的 Redis 实例如果没有至少一台从服务器连接,将会停止接受写请求。由于复制是异步的,不能写入的意思就是从服务器也是断开的,或者在指定的 max-lag 秒数没有发送异步回应 (acknowledges)。

使用这个配置,上面例子中的 Redis 3 在 10 秒钟之后变得不可用。当分割恢复了,Sentinel 3 的配置将会统一为新的,客户端 B 可以获取合法的配置并且继续。

文档中解释如下:
Redis Sentinel下的数据一致性_第2张图片

你可能感兴趣的:(redis,sentinel,NoSQL)