分布式理论系列算法
2PC到3PC到Paxos到Raft到ISRsegmentfault
复制、分片和路由网络
副本更新策略架构
RWN及Quorum与强一致性负载均衡
本文主要讲述分布式系统开发的一些相关理论基础。分布式
事务的四个特征:code
事务必须是一个原子的操做序列单元,事务中包含的各项操做在一次执行过程当中,要么所有执行成功,要么所有不执行,任何一项失败,整个事务回滚,只有所有都执行成功,整个事务才算成功。进程
事务的执行不能破坏数据库数据的完整性和一致性,事务在执行以前和以后,数据库都必须处于一致性状态。
在并发环境中,并发的事务是相互隔离的,一个事务的执行不能被其余事务干扰。即不一样的事务并发操纵相同的数据时,每一个事务都有各自完整的数据空间,即一个事务内部的操做及使用的数据对其余并发事务是隔离的,并发执行的各个事务之间不能相互干扰。
SQL中的4个事务隔离级别:
(1)读未提交
容许脏读。若是一个事务正在处理某一数据,并对其进行了更新,但同时还没有完成事务,所以事务没有提交,与此同时,容许另外一个事务也可以访问该数据。例如A将变量n从0累加到10才提交事务,此时B可能读到n变量从0到10之间的全部中间值。
(2)读已提交
容许不可重复读。只容许读到已经提交的数据。即事务A在将n从0累加到10的过程当中,B没法看到n的中间值,之中只能看到10。同时有事务C进行从10到20的累加,此时B在同一个事务内再次读时,读到的是20。
(3)可重复读
容许幻读。保证在事务处理过程当中,屡次读取同一个数据时,其值都和事务开始时刻时是一致的。禁止脏读、不可重复读。幻读即一样的事务操做,在先后两个时间段内执行对同一个数据项的读取,可能出现不一致的结果。保证B在同一个事务内,屡次读取n的值,读到的都是初始值0。幻读,就是不一样事务,读到的n的数据多是0,可能10,多是20
(4)串行化
最严格的事务,要求全部事务被串行执行,不能并发执行。
若是不对事务进行并发控制,咱们看看数据库并发操做是会有那些异常情形
(1)一类丢失更新:两个事物读同一数据,一个修改字段1,一个修改字段2,后提交的恢复了先提交修改的字段。
(2)二类丢失更新:两个事物读同一数据,都修改同一字段,后提交的覆盖了先提交的修改。
(3)脏读:读到了未提交的值,万一该事物回滚,则产生脏读。
(4)不可重复读:两个查询之间,被另一个事务修改了数据的内容,产生内容的不一致。
(5)幻读:两个查询之间,被另一个事务插入或删除了记录,产生结果集的不一致。
一个事务一旦提交,它对数据库中对应数据的状态变动就应该是永久性的,即便发生系统崩溃或机器宕机,只要数据库可以从新启动,那么必定可以将其恢复到事务成功结束时的状态。
一个分布式系统不可能同时知足一致性Consistency、可用性Availability、分区容错性Partition tolerance这三个基本需求,最多只能同时知足其中的两项。
分布式环境中,一致性是指多个副本之间可否保持一致的特性。在一致性的需求下,当一个系统在数据一致的状态下执行更新操做后,应该保证系统的数据仍然处理一致的状态。
系统提供的服务必须一直处于可用的状态,对于用户的每个操做请求老是可以在有限的时间内返回结果。
(1)有限时间内
对于用户的一个操做请求,系统必须可以在指定的时间(响应时间)内返回对应的处理结果,若是超过了这个时间范围,那么系统就被认为是不可用的。即这个响应时间必须在一个合理的值内,不让用户感到失望。
(2)返回正常结果
要求系统在完成对用户请求的处理后,返回一个正常的响应结果。正常的响应结果一般可以明确地反映出对请求的处理结果,即成功或失败,而不是一个让用户感到困惑的返回结果。好比返回一个系统错误如OutOfMemory,则认为系统是不可用的。
即分布式系统在遇到任何网络分区故障时,仍然须要可以保证对外提供知足一致性和可用性的服务,除非是整个网络环境都发生了故障。
网络分区,是指分布式系统中,不一样的节点分布在不一样的子网络(机房/异地网络)中,因为一些特殊的缘由致使这些子网络之间出现网络不连通的状态,但各个子网络的内部网络是正常的,从而致使整个系统的网络环境被切分红了若干孤立的区域。组成一个分布式系统的每一个节点的加入与退出均可以看作是一个特殊的网络分区。
放弃分区容错性的话,则放弃了分布式,放弃了系统的可扩展性
放弃可用性的话,则在遇到网络分区或其余故障时,受影响的服务须要等待必定的时间,再此期间没法对外提供政策的服务,即不可用
放弃一致性的话(这里指强一致),则系统没法保证数据保持实时的一致性,在数据达到最终一致性时,有个时间窗口,在时间窗口内,数据是不一致的。
对于分布式系统来讲,P是不能放弃的,所以架构师一般是在可用性和一致性之间权衡。
Basically Available(基本可用)、Soft state(软状态)、Eventually consistent(最终一致性),基于CAP定理演化而来,核心思想是即时没法作到强一致性,但每一个应用均可以根据自身业务特色,采用适当的方式来使系统达到最终一致性。
基本可用是指分布式系统在出现不可预知的故障的时候,容许损失部分可用性,但不等于系统不可用。
(1)响应时间上的损失
当出现故障时,响应时间增长
(2)功能上的损失
当流量高峰期时,屏蔽一些功能的使用以保证系统稳定性(服务降级)
与硬状态相对,便是指容许系统中的数据存在中间状态,并认为该中间状态的存在不会影响系统的总体可用性,即容许系统在不一样节点的数据副本之间进行数据同步的过程存在延时。
强调系统中全部的数据副本,在通过一段时间的同步后,最终可以达到一个一致的状态。其本质是须要系统保证最终数据可以达到一致,而不须要实时保证系统数据的强一致性。
最终一致性可分为以下几种:
(1)因果一致性(Causal consistency)
即进程A在更新完数据后通知进程B,那么以后进程B对该项数据的范围都是进程A更新后的最新值。
(2)读己之所写(Read your writes)
进程A更新一项数据后,它本身老是能访问到本身更新过的最新值。
(3)会话一致性(Session consistency)
将数据一致性框定在会话当中,在一个会话当中实现读己之所写的一致性。即执行更新后,客户端在同一个会话中始终能读到该项数据的最新值
(4)单调读一致性(Monotonic read consistency)
若是一个进程从系统中读取出一个数据项的某个值后,那么系统对于该进程后续的任何数据访问都不该该返回更旧的值。
(5)单调写一致性(Monotoic write consistency)
一个系统须要保证来自同一个进程的写操做被顺序执行。
BASE定理是提出经过牺牲一致性来得到可用性,并容许数据在一段时间内是不一致的,但最终达到一致状态。
待补充