本文共 746 字,大约阅读时间需要 2 分钟。
放宽一致性约束:在权衡分布式数据库的一致性时,参与交互的节点越多,一致性就越好,但是每新增一个节点,都会使交互操作的响应时间变长。我们可以根据用户对陈旧数据的忍受程度,适当放宽一致性约束,只要求数据的最终一致性。
放宽持久性约束:在某些场合,我们可以牺牲一些持久性以换取更好的性能。如果一个数据库大部分时间都在内存中运行,那么我们可以把更新操作直接写入内存,并且定期将数据变更写会磁盘。这会大大提高响应请求的速度,但是一旦服务器发生故障,任何尚未写回磁盘的更新数据都将丢失。我们可以在每次发出写入请求时,指定该请求所需的持久性,这样就可以把某些极为重要的更新操作立刻写回磁盘。但是针对保存会话状态,则可以使用上述方案。
仲裁:对于一致性和持久性之间的取舍,有一个很好的解决方案,就是写入仲裁和读取仲裁。
例如,某份数据被复制到了三个节点中。为了保证强一致性,不需要所有的节点都确认写入操作,只需要其中两个节点(超过半数)确认就可以了。在这种情况下,如果发生两个相互冲突的写入操作,那么只有其中一个操作能为超过半数的节点所认可。这就是写入仲裁。即参与写入操作的节点数(W),必须超过副本节点数(N,复制因子)的一半,W>N/2。
而此时读取操作需要两个节点来确认,即至少要联系两个节点,才能保证读取到最新的数据。(W=2,R=2)这就是读取仲裁。
只有当W+R>N时,才能保证读取数据的强一致性。
即使一个集群中有100个节点,复制因子也可能仅等于3,因为大部分数据都是分片存储在各个节点上的,但是有说法称3个复制因子就可以获得足够好的故障恢复能力了。
例如:N=3,W=3,R=1,此时写入操作比较慢,因为需要三个节点全部确认写入操作,但是可以保证读取时从任何一个节点读到的数据都是最新数据。
转载地址:https://mortal.blog.csdn.net/article/details/83007341 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!