WAIT命令可以在Redis中提供强大的一致性吗?

gee*_*eko 7 consistency redis redis-sentinel redis-cluster

问候溢出者,

在Redis的标记/集群设置中,我们是否可以使用带有从站总数的WAIT命令来确保Redis服务器之间的一致性?为什么不?

亲切的问候

ant*_*rez 13

WAIT实现Redis的同步复制.需要同步复制,但不足以实现强一致性.强一致性实际上是两件事的总和:

  1. 同步复制到分布式系统上的大多数节点.
  2. 一种协调领导变革(基本上是故障转移)的方法,以确保只有一个节点可以选出保留前一个领导者中已确认操作的完整历史的节点.

WAIT不提供"2".Redis中的复制过程由Sentinel或Redis Cluster执行,并且无法提供属性2(因为Redis中的同步复制不是规则的异常,因此没有太多关注该方面).但是,Redis复制的作用是尝试提升看似保留最大数据量的从属.虽然这不会改变Redis故障转移的理论保证,但仍然会丢失已确认的写入,这意味着如果您使用WAIT,则会有更多的从属服务器在其内存中具有给定的操作,反过来,它更有可能在如果发生故障转移,将保留该操作.但是,虽然这将使失败模式丢弃难以触发的已确认操作,但始终存在具有此属性的故障模式.

TLDR: WAIT不会使Redis可线性化,它的作用是确保指定数量的从设备将接收写入,这反过来使故障转移更加强大,但没有任何硬保证.

  • 如果你想要有硬保证的分布式锁,你有更好的方法来做到这一点![redlock](http://redis.io/topics/disklock)算法是使用N个不同主服务器的实现,同步复制在客户端实现,并且可用于多种语言.我希望这有帮助! (4认同)
  • 是的@ptntialunrlsd,通过在失败期间完全牺牲任何类型的可用性,你确实是安全的.因此,您的副本将不允许存在故障,但会使写入更安全,因为您可以在不同的地理位置运行不同的节点.如果你在`fsync = always`模式下运行AOF,这一切都是有意义的,否则在重启期间,每个副本可能会丢失使模式变弱的写入. (3认同)
  • 我不认为你的算法是安全的.例如,故障转移后会发生什么?如果您选择没有给定锁定的从站,即使锁本身已经到达其他N/2 + 1节点,(新)主站中的SETNX也会成功,WAIT也会成功,因为现在其他实例正在复制主.如果您没有进行故障转移,那么您可以只使用一个实例:-)因为您在故障期间无论如何都有一个不可用的系统.顺便说一句,处理一个多主系统是恕我直言,所以我会选择redlock无论如何. (2认同)