在多IDC的环境下,一个很现实的问题就是如何进行数据同步,如何保证数据的完整性?
分布式存储业界已经有很多经验,甚至有了理论依据来描述这些问题。通过对分布式存储相关理论,算法,方案进行了一段时间的浅尝辄止的研究,对整体概念有了一个初步的认识,梳理出来记录下来形成此文。
本文试图从实际角度出发,对分布式存储的算法,理论进行一些简单的介绍,并根据现实的需求最终选择其中一种作为将来演进系统依赖的方案。
提到分布式系统,不得不提到CAP理论,这是由Eric A. Brewer 在2000年提出的猜想,由Gilbert and Lynch在2003年证明。
Brewer认为在设计一个大规模可扩放的网络服务时候会遇到三个特性:一致性 、可用性、分区容错都需要的情景,然而这是不可能都实现的。只能在以下三者其中选择两者:
对三种特性的解释
举例来说:系统有两个节点N1,N2,客户A连接了N1节点操作了某条数据X1 加一使之变为X2, 客户B连接到N2节点需要读取X的最新数据。
C+A
放弃了P ,意味着没有网络分区,意味着N1,N2必须合并到一个节点,这就相当于回到传统的单点数据库系统,由数据库保证事务的正确性
C+P
放弃了A,意味着当分区发生时,用户无法进行操作,必须等待N1,N2节点的数据完全同步完成,才可继续操作。这一点可以以银行跨行转账系统举例,当网络断开的时候,会直接告诉客户,服务不可用
A+P
放弃了C, 意味着当客户读取数据时,没有读到X的最新数据。
以Mysql的replication为例,在MS结构中,节点M和节点S,都可以对外提供服务,当其中的一个节点故障,另一个节点仍然能够对外提供服务,所以MS方案认为是满足Availability的;目前MS结构仍然是异步的方式运行,即当主库写入时,备库未必一定也写入了,备库甚至允许短暂和主库断开连接,而且当主库处理请求时,也无需确认备库的状态,所以MS结构是满足Partition tolerance的;但是由于MS结构的异步特性,我们看到主备的数据是可能不一致的,即不满足Consistency。
如果MySQL使用DRBD(严格模式) 做HA方案,则实现了Consistency,就失去了Partition tolerance。
传统关系型数据库系统的事务都有ACID的属性,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。英文为:
中译为:
BASE理论:
在BASE中,强调可用性的同时,引入了最终一致性这个概念,不像ACID,并不需要每个事务都是一致的,只需要整个系统经过一定时间后最终达到是一致的。以用户头像为例,首先要保证A,B用户都能获得正常服务,都能得到头像,即使是过时的。但是一定时间之后,最终新头像会在N1,N2两个结点之间保证同步。
从理论上说,BASE与ACID是一定程度对立的,ACID强调CAP中的C,BASE强调CAP中的A。
字面上BASE是碱,ACID是酸,恰恰也是对立。
paxos选择了CAP理论中的”Consistency, Partition”, 需要牺牲availability。它可以在多个IDC之间实现强一致性复制。
Paxos缺点
PNUTS模式是目前最看好的多IDC数据同步方式。它的算法大部分是为多IDC设计。
PNUTS主要为Web应用设计,而不是离线数据分析(相比于Hadoop/HBase)。
根据以上的数据特征,Yahoo!的PNUTS实现算法是
Yahoo!的PNUTS实际可理解为master-master模式。
一致性:由于记录都需通过master修改,master再复制到其他IDC, 因此可达到所有IDC数据具有最终一致性。
可用性:
数据库理论之ACID和BASE的比较
http://www.sigma.me/2011/06/17/database-acid-and-base.html
The CAP-Theorem & Yahoo’s PNUTS
http://www.math.hu-berlin.de/~muellste/CAP-PNUTS-Text.pdf
多IDC的数据分布设计(=)
http://timyang.net/data/multi-idc-design/
CAP理论十二年回顾:"规则"变了
http://www.infoq.com/cn/articles/cap-twelve-years-later-how-the-rules-have-changed
Brewer's CAP理论
http://code.alibabatech.com/blog/dev_related_728/brewers-cap-theorem.html
Trying to understand CAP
http://www.warski.org/blog/2011/07/trying-to-understand-cap/