我需要在主节点redis中加载一次静态数据,并且只有在完成所有从节点的同步时,我才能读取。这是因为我们将会有大量读取和少量写入,而且数据在很长一段时间内不会改变。
我阅读了官方文档https://docs.redis.com/latest/rs/concepts/data-access/consistency-durability/、Redis集群一致性保证中的
https://docs.redis.com/latest/rs/concepts/data-access/consistency-durability/和https://redis.io/topics/cluster-tutorial。
我也读过在Redis中,等待命令能提供很强的一致性吗?,但没有得出结论。
如果我使用同步复制和等待命令来检查复制是否成功,是否对一致性有一些保证?
发布于 2022-03-18 10:38:43
默认情况下,Redis群集无法保证强一致性。这意味着在某些情况下,Redis群集可能会丢失系统向客户端确认的写操作。
Redis群集可能会丢失写操作的原因是因为它使用异步复制,但是,您可以通过强制数据库在响应客户端之前将数据刷新到磁盘来提高一致性,但这通常会导致性能低下的。在Redis集群的情况下,这相当于同步复制。基本上,在性能和一致性之间有一个权衡,如果你对此很满意的话!
Redis集群在绝对需要时支持同步写入,并通过等命令实现。这使得输掉写作的可能性要小得多。但是,请注意,即使使用同步复制,Redis群集也不会实现很强的一致性:在更复杂的故障场景中,总是有可能选择无法接收写入的副本作为主服务器。
还有另一个值得注意的场景,Redis群集将丢失写操作,这种情况发生在一个网络分区中,其中客户端与少数实例隔离,其中至少包括一个主实例。
例如,设想一个由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集群的一个非常重要的配置指令,被称为节点超时。
在节点超时之后,主节点被认为是失败的,并且可以被它的一个副本替换。类似地,在没有主节点的节点超时之后,它进入错误状态并停止接受写操作。
https://stackoverflow.com/questions/71504772
复制相似问题