
随着大数据时代的到来,互联网每天产生的数据量是十分庞大的,传统的集中式存储系统如IBM的大型数据库系统价格昂贵运维成本高,而且依旧存在着拓展扩容的瓶颈终有一天没法满足需求,因此分布式存储系统以其扩展性强、价格低廉的优势逐渐成为各大企业的最佳选择。
分布式网络存储系统采用可扩展的系统结构,利用多台存储服务器分担存储负荷,利用位置服务器定位存储信息,它不但提高了系统的可靠性、可用性和存取效率,还易于扩展。
数据库事务四要素(ACID)
ACID,指数据库事务正确执行的四个基本要素的缩写。包含:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。
- 原子性:一个数据库事务包括了多个数据库操作对多条记录产生了影响,如果在执行过程中出现了异常便会原先执行的操作全部回滚保证整个事务的操作要么全部执行要么都不执行。(如银行一对一转账业务中涉及到付款方和收款方的两个账户的扣账和入账操作,这个转账事务要么将这两个步骤一同完成要么对扣账进行回滚)。
- 一致性:并发多个事务操作,系统需要如同串行事务一样操作以保证在事务执行过程中系统处于一致的状态。(比如在多个账户中进行多次一对一转账的业务,在转账过程中要保证系统的逻辑一致也即系统账面金额不变,因此这多个事务需要串行执行)。
- 隔离性:当有多个事务同时对同一个数据进行操作,系统需要以隔离状态执行事务(串行化请求)以防止事务操作间的混淆,使得在同一时间仅有一个请求用于同一数据。
- 持久性:事务执行完成后需要将数据在存储组件进行持久化保存,避免故障发生使内存数据丢失。
在实际实现中数据库基本都是使用 Write Ahead Log(WAL)的形式来实现ACID,WAL的主要原理是将元数据的变更操作写入持久的数据库中之前,先将操作写入一个日志中,再由另外的操作将日志实现到数据库中,这样的操作可以避免频繁的数据库写入操作,当系统要进行大量的事务时可以提高效率;此外有了日志的记录在发生故障时可以通过日志对数据进行回滚。
CAP原则
在分布式存储系统中没法严格实现强一致性,仅可以实现最终一致性,这里就需要提及分布式系统中的CAP定理。

在分布式系统架构中我们需要在多个地区配置设备组成子网络(partition,区),分区容错的意思便是区间通信可能失败,分区容错在分布式系统中无法避免所以P总是成立。当P总是成立的情况下,CAP原则提出只能实现AP或者CP的情况。
CP
一致性(Consistency)表示分布式系统中的数据备份在同一时刻是同样的值。
比如下面有一个分布式存储系统中有两个分区存储着相同的数据,这两个分区存储系统时时地进行数据同步。

client向G1节点写入数据V1,但是此时出现了分区通信故障(分区容错)导致G2节点数据依旧是V0没有进行同步,在这个时刻两个备份节点的数据是不一致的但是这并不会对业务造成影响,但如果我们现在对这两个节点进行查询操作便会出现数据不一致的情况,这就不满足一致性。

系统的不一致性体现在业务访问出现数据不一致的异常,此时的系统可以用锁拒绝访问(不可访问也即是不具备A可用性)等待备份节点同步数据完成,这便是牺牲了可用性的CP模式。


AP
可用性(Availability)意味着系统可用,就是对分区服务器发起请求时可以响应请求,而不是处于同步锁定的拒绝访问状态。正如上面提到的出现分区通信异常的情况下,我们不管系统的同步情况依旧提供访问服务,这便是保障了可用性而牺牲了多节点数据一致性。

总结:
在分区通信故障发生时(P),两个节点的数据必定会出现不一致情况,AP和CP模式都会出现这种情况,这两种模式的区别在于是否面向业务提供服务是否提供数据一致,若利用锁拒绝访问进行数据同步等到同步完成就面向业务提供了一致的数据这便是CP,但是在同步过程中拒绝访问失去了A(可用性);同理如果直接不管数据一不一致,直接提供数据访问(保证A)那么很可能就会访问到不一致的数据(失去C)。
CP还是AP
对于银行等对数据一致性强的场景下,比如取款的时候由于数据不一致容许用户取出过量的钱便会对银行造成损失,因此选择CP更加合理。
对于网页的业务更新,那么部分用户使用旧版本,另一些用户拿到新版本,问题不会特别大。
网友评论