数据库一致性

CAP

C:Consistency
一致性:访问所有的节点,得到的数据结果都是一样的。注意:这里的一致性指的是强一致性,也就是数据更新完,访问任意节点,看到的数据完全一致,要和弱一致性、最终一致性区分开来

A:Availability
可用性:所有节点都保持高可用性。注意:这里的高可用还包括,不能出现延迟,如节点B由于等待数据同步而阻塞了请求,那么节点B就不满足高可用性。也就是说,任何没有发生故障的服务必须在有限的时间内返回合理的结果集。

P:Partiton tolerance
分区容错性:一个分布式系统里面,节点组成的网络本来应该是连通的。然而可能因为一些故障 ,使得有些节点之间不连通了,整个网络就分成了几块区域。数据就散布在了这些不连通的区域中。这就叫分区。当你一个数据项只在一个节点中保存,那么分区出现后,和这个节点不连通的部分就访问不到这个数据了。这时分区就是无法容忍的。提高分区容忍性的办法就是一个数据项复制到多个节点上,那么出现分区之后,这一数据项就可能分布到各个区里。容错性就提高了。然而,要把数据复制到多个节点,就会带来一致性的问题,就是多个节点上面的数据可能是不一致的。要保证一致,每次写操作就都要等待全部节点写成功,而这等待又会带来可用性的问题。总的来说就是,数据存在的节点越多,分区容忍性越高,但要复制更新的数据就越多,一致性就越难保证。为了保证一致性,更新所有节点数据所需要的时间就越长,可用性就会降低。

一个数据分布式系统,不可能同时满足CAP这三个条件。所以系统架构师在设计系统时,不需要将精力浪费在如何设计满足三者的完美分布式系统,而是应该做出取舍。由于我们能确定的就是网络的一个不可靠性质,那么大多开源的分布式系统都会实现P,也就是分区容错性,之后在C与A中做出抉择。

顺序一致性

一个线程内部的所有操作是顺序执行的,但不保证线程之间是顺序执行的。

假设线程p1的执行顺序为A->B->C

线程p2的执行顺序为D->E->F

顺序保证性可以保证其他的所有线程见到的顺序是这两个线程指定的顺序。

可能是D->E->F->A->B->C

也可能是A->D->B->E->C->F

这都是满足顺序一致性的,因为每个线程的顺序没变。

线性一致性

也称为强一致性,原子一致性
在并发编程中,如果一个操作对于系统的其他部分是不可中断的,那这个操作就可以称之为原子的,线性的,不可分割的。那这个操作就可以称之为具有线性一致性的特性。原子操作具有”要么成功要么失败”的特性,就是说要么这个操作成功修改系统的状态,要么不会有任何作用。多线程情况下,线程之间串行执行;在分布式数据库中,一个线程的读写操作完成之后,才会执行下一个线程的读写操作。只要满足线性一致性就肯定满足顺序一致性。
如果说顺序一致性只保证单节点事件先后顺序的话,线性一致性还保证节点间的事件先后顺序。
即上面的例子中假设p1先执行,p2后执行
那么事件的执行顺序就只能是A->B->C->D->E->F

在这里插入图片描述
假设这分别是p1 和p2的执行顺序

如果只满足顺序一致性,那么可能的顺序就是Read(a),Write(a,2),read(b),Write(b,2);

因为只要满足write(a,2)在read(b)之前,以及Read(a)在write(b,2)之前

如果满足线性一致性,那么保证的就是Write(a,2),read(a),Write(b,2),read(b);

因果一致性

因果一致性往往发生在分区(也称为分片)的分布式数据库中。

分区后,每个节点并不包含全部数据。不同的节点独立运行,因此不存在全局写入顺序。如果用户A提交一个问题,用户B提交了回答。问题写入了节点A,回答写入了节点B。因为同步延迟,发起查询的用户可能会先看到回答,再看到问题。

为了防止这种异常,需要另一种类型的保证:因果一致性。 即如果一系列写入按某个逻辑顺序发生,那么任何人读取这些写入时,会看见它们以正确的逻辑顺序出现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值