说明:
我有六个数据库(mysql)部署在世界各地的特定地区,将建立复制。每个数据库都由一个web服务器连接,因此总共有6个web服务器分别连接到一个数据库。
要求:
出于保密的原因,我不能直接告诉我的系统需要什么,但想象一下我正在做某种苹果捐赠模块,所以有两个实体,捐赠者(谁捐赠)和受赠者(谁接受)
每个捐赠者都有很多苹果,不管他们有多少,想象一下他们有数百万个苹果。当受赠人拿走苹果时,数量会减少。
二。每个受赠人一次只能从捐赠者手中拿走一个苹果,如果还有剩余的话。
问题:
假设有捐赠者帕特里克,他只剩下一个苹果了。这些信息存储在数据库中,并复制到所有六个数据库中,显示他还有一个苹果。
A区的受赠人山姆和D区的受赠人亚历克斯试图同时带走帕特里克的苹果。
数据库A和D显示帕特里克还剩下一个苹果,所以萨姆和亚历克斯成功地从帕特里克那里得到了一个苹果,把帕特里克的苹果减少了2个。
复制完成后,根据数据库逻辑,我们最终会让patrick拥有0或-1个apple,这两个都是错误的,我需要能够对“taking”过程进行排队。
我的问题是如何在不同的地区做到这一点?
我考虑过将复制拓扑从环更改为星型,其中所有update语句都将转到一个且只有一个中央数据库,因此可以在那里进行锁定。
但这种实现需要中央数据库具有很高的处理能力,因为它必须处理来自全世界的更新,同时实现锁机制。
有没有人知道更好的方法来完成这种类型的系统设计?

最佳答案

你正在讨论cap定理的含义。从您的需求来看,您主要需要一致性和可用性,但可能会牺牲分区。这意味着数据在所有区域都是一致的,当一个节点关闭时系统不会崩溃,但是如果六个节点中的一个节点关闭,则该节点的客户端无法使用它。
一种方法是对数据进行分区。你能把捐赠者和受赠者分开,让他们“属于”特定的地区吗?如果是这样,您可以在该区域内保持一致性和可用性,并为脱机审核提供最终的一致性。
如果不能对数据进行分区,可以考虑Percona XtraDB Cluster。我个人没有这方面的经验,但他们声称mysql复制的替代品有所减少,它以牺牲分区安全为代价提供了一致性和可用性。

08-18 10:47
查看更多