双活无共享数据库架构( 三 )


分区容限:当删除数据存储副本之间的消息时,应用程序仍可以运行吗?这不能保证尚存的副本都已同步 。
简解释说,CAP定理指出,在任何设计中,我们只能拥有这三个属性中的两个 。不是全部三个 。
她解释说,解决这个问题的另一种方法是通过下面显示的维恩图 。请注意,在某些地方,三个属性中的两个重叠了 。但是这三个空间都没有汇合的空间 。简强调说,非常重要的一点是要理解这三者不可能完全融合 。例如,如果我们追求一致性,就无法设计可用性 。但是当副本丢失时会发生什么呢?恢复副本后,我们必须暂停数据存储上的操作,直到我们可以将新恢复的副本与尚存的副本同步 。否则,新启动的分区将不一致,从而违反了CAP中的" C" 。

双活无共享数据库架构

文章插图
 
最终一致的状态因此,观众问,如果副本不一致,维护副本的意义何在?
维护副本只是意味着数据存储异步同步 。因此它们最终将保持同步 。但是在给定的时间点,系统无法保证数据存储100%同步 。这称为最终一致性,而不是立即一致性 。欣赏差异至关重要 。
为了说明这一点,Jane向他们展示了一个数据系统的示例体系结构,该体系结构具有三个数据存储,这些数据存储满足CAP定理中的A和P,从而使C排除在外,即最终保持一致 。
双活无共享数据库架构

文章插图
 
她解释了这种情况:假设数据元素的值为1,最初在所有三个数据存储区中都相同 。现在,应用程序A2将值更新为2 。由于该体系结构优先考虑可用性和分区容忍度而不是一致性,因此其他两个数据存储区可能尚未更新 。此时,如果应用程序A3读取数据元素,则它可能会获得值1,而不是2,这是最近的值 。在许多情况下,最新的价值不仅是理想的,而且是绝对必要的,这可能是不可接受的 。例如在电子商务订单中 。数据存储区D3最终将获得更新后的值3;但不是立即 。
解决冲突
双活无共享数据库架构

文章插图
 
简解释了第二个问题 。她考虑另一种情况,如下图所示 。我们像以前一样从原始值1开始,应用程序A2在数据存储区D2中将其更新为2 。但是在将其传播到所有其他数据存储区之前,连接到数据存储区D3的应用程序A3会将值更新为3 。数据存储区D1中的值将是什么?
她警告说,由于数据复制是异步的,因此无法预测哪个更新将首先到达 。如果从D2更新首先到达它,它将是2,否则将是3 。在许多情况下,这种不可预测性可能是不可接受的 。
对于D2,出现类似的问题 。它应该忽略自己的更新并将元素更新为3吗?同样的问题也适用于D3 。
解决冲突的技术Ted和听众现在对Active-Active Shared-Nothing体系结构的潜在问题有了清晰的了解 。但他们大声怀疑,是否有任何技术可以避免这些问题,尤其是解决冲突?
Jane回答说,有解决冲突的方法,但是没有一种对应用程序的功能和数据准确性透明 。以下是一些技术,按照从最小到最复杂的顺序实施:
· Last Man Standing:无论来源如何,都会应用最新更新 。在上述情况下,假设消息以该顺序发生,则值3将同时应用于数据存储D1和D2 。但是,可能存在竞争情况,其中更新将被级联多次 。数据库系统通常具有内置的终止开关,以避免这些竞争情况 。
· 时间戳权重:与最后一个站立的解决方案非常相似,但有一个警告 。它不依赖于更新的顺序,而是检查更新的时间戳并仅沿时间戳比较更新 。这要求将所有三个数据存储都与单个时间服务器同步(这在某种程度上侵蚀了"无共享"部分);但它可能更公平,并且避免了比赛条件 。
· 位置权重:为每个数据存储分配一个权重 。权重最高的存储的更新将获胜,并将应用于所有其他数据存储 。在前面的示例中,如果D1,D2和D3的权重分别为300、200和100,则该值最终将为2,因为这是D2在权重为200时与D3在权重为100时的更新 。因此,该值将在D3中更新为2,覆盖其自身的更改3 。类似地,D1将重新更新为2 。
【双活无共享数据库架构】· 应用程序权重:每个更新都用应用程序ID标记,并且每个应用程序也被加权 。最终,权重最高的应用程序更改将被保存 。
简在这里停下来指示观众思考这些技巧的影响 。她说:"我们正在谈论放弃数据存储中的更改,然后将其替换为另一个 。"无论选择哪种技术,对数据准确性的影响都非常大 。我们必须从应用程序的设计中考虑到它;而不是数据存储架构 。"


推荐阅读