主从复制能对读请求水平拓展,但是对写请求无能为力。它可以承受从节点的失败,但不能承受主节点的失败。从本质上讲,主节点任然是一个瓶颈和单点故障。对等(Peer To Peer)复制没有主节点,所以不存在这个问题。所有副本的地位都是相同的,他们都可以接受写请求,任何节点的失败都不会阻碍数据集的可用性。
看起来对等复制系统非常好,任何节点的故障都不会导致数据的不可访问。此外,你还可以通过增加节点来提高系统的性能。但是也有缺点:最大的缺点仍然是一致性。当两个不同的节点同时响应两个写请求时,可能两个请求在同时修改同一个记录:这是一个写写冲突。读的不一致虽然也不太好,但这种不一致是比较短暂的。不一致的写入是永远不一致的。
目前来说:我们可以确保每当写数据时,副本之间互相协调,以确保避免冲突。这能使我们达到只有一个主节点时候的一致性,虽然需要节点之间的网络协调。我们并不需要所有的副本同意写,只需要多数,所以即使少部分节点宕机,整个系统仍然可以稳定运行。
另一个做法是我们不处理写的不一致性,应用程序可以应对不一致的写。在应用程序的上下文里,我们可以找到合并不一致写入的方法。在这种情况下,我们可以得到写任何副本的全部性能优势。
关键点仍然是我们如何权衡一致性和可用性。