在Redis集群中提供强大的一致性



我需要在主节点的redis中加载一次静态数据,只有当所有从节点的同步完成时,我才能读取。这是因为我们将有大量的阅读和写作,数据在很长一段时间内不会改变。

我阅读了一份官方文件https://docs.redis.com/latest/rs/concepts/data-access/consistency-durability/,https://docs.redis.com/latest/rs/concepts/data-access/consistency-durability/和https://redis.io/topics/cluster-tutorialRedis集群中的一致性保证。

我还读到WAIT命令能在Redis中提供强大的一致性吗?但没有得出结论。

如果我使用同步复制并等待命令来检查复制是否成功,我是否对一致性有一些保证?

默认情况下,Redis集群无法保证强一致性。这意味着在某些情况下,Redis Cluster可能会丢失系统向客户端确认的写入。

Redis Cluster可能丢失写入的原因是它使用异步复制,但是,您可以通过强制数据库在回复客户端之前将数据刷新到磁盘来提高一致性,但这通常会导致性能低下。这相当于Redis集群中的同步复制。基本上,如果你对此很满意的话,在性能和一致性之间需要进行权衡!

Redis Cluster在绝对需要时支持同步写入,通过WAIT命令实现。这使得失去写作的可能性大大降低。但是,请注意,即使使用同步复制,Redis Cluster也无法实现强一致性:在更复杂的故障场景下,无法接收写操作的副本总是有可能被选为主副本。

还有一种值得注意的情况是,Redis Cluster将丢失写入,这种情况发生在网络分区期间,其中客户端与少数实例隔离,其中至少包括一个主实例。

例如,想象一个由a、B、C、A1、B1、C1组成的6节点集群,其中有3个主节点和3个副本。还有一个客户端,我们称之为Z1。

在分区发生后,可能在分区的一侧有a、C、A1、B1、C1,而在另一侧有B和Z1。

Z1仍然能够向B写入,B将接受其写入。如果分区在很短的时间内恢复,集群将正常继续。然而,如果该分区持续足够的时间,B1将被提升为该分区多数侧的主分区,Z1在此期间发送给B的写入将丢失。

请注意,Z1将能够发送到B的写入量有一个最大窗口:如果已经过了足够的时间让分区的多数侧选择副本作为主节点,则少数侧的每个主节点都将停止接受写入。

这个时间量是Redis Cluster的一个非常重要的配置指令,被称为节点超时

节点超时后,主节点被视为发生故障,可以由其一个副本替换。类似地,在节点超时后,主节点无法感测大多数其他主节点,它将进入错误状态并停止接受写入。

最新更新