为什么不能只对所有的DB读取使用强一致的读取,重试500个响应?根据CAP定理,增加一致性可能会降低可用性,但是减少的可用性(增加了500个响应)不能很容易地使用重试来处理吗?(假设有一小部分查询没有问题,则由于重试需要更长的时间)
以DynamoDB为例,但这可以推广到任何noSQL云产品中--它似乎也像按需扩展的DDB只会增加您在打开强一致性时使用的读取容量单元(RCU),成本会更高($),但在db查询上保持相同的延迟,因此,负面的似乎只是更高的成本。似乎您可以保持垂直缩放DB的处理能力,以满足您的需要。有了一个高流量的noSQL云数据库,你就不能把足够的钱花在它身上,而且它可能会达到一定的缩放限制,从而使读取速度更慢,这真的可信吗?
然后,关于广义到分布式系统的整个问题,对于一个分布式系统来说,它实际上意味着“强一致性”。我以前听说过这种描述系统的方法,但实际上我不知道它意味着“所有DB交互都是强一致性的”。
我的第二个问题可能更基本,但对于理解提供一致性的成本是必要的,但为什么会出现一致的阅读问题,即。为什么会出现陈旧的数据(在像读/写这样的单个查询中,而不是每个事务有多个读/写的事务)?
据我所知,在写完后的任何时候,概率都在下降,一位读者可以读取正确的数据,另一位读者可以在第一位读者读取正确的数据之后再读取陈旧的数据(如果这不是真的,请纠正我,但我的理解是正确的)。这一切为什么要发生?读取不只是从磁盘上的某个位置读取吗?
发布于 2021-01-18 05:23:10
重试不一定会成功。当您的系统正在重新尝试时,它是不可用的。仅仅是阅读,这只是一个小问题。当写作失败时会发生什么?“只是重试”不起作用,因为为了保持一致性,您需要保持正确的顺序。在写入成功之前,整个系统是不可用的(因此以后的读取可以得到正确的结果)。
至于你的第二个问题:不,读取不包括从磁盘上相同的位置读取。为了提供可用性,分布式系统将跨多个磁盘复制数据(通常是不同的机器,通常位于完全不同的数据中心/区域)。当写入在一个节点上成功,但尚未复制到正在读取的节点时,就会发生过时的读取。您可以等到所有的写操作都成功为止(提高一致性),但这需要CAP定理的权衡。
发布于 2021-01-18 14:24:59
为什么不能只对所有的DB读取使用强一致的读取,重试500个响应?
正如您稍后提到的,如果您有陈旧的数据,则不会得到500个响应。
所以看来负面影响只是更高的成本。
由于需要实现读/写锁,因此成本更高,但复杂性也更高。
为了进一步加强锁定机制,密钥的分配被保持为这样,所以读取总是被重定向到一致的服务器(S)。如果复制失败,就会增加一个复杂的滚动层。这确保了数据也是一致的。
为什么会出现陈旧的数据?
如果读取请求指向未填充主写的副本服务器,则返回过期数据。
https://softwareengineering.stackexchange.com/questions/421185
复制相似问题