分布式系统原理笔记

1. tcp只保证tcp棧消息不丢失,不能保证应用层

2.系统状态:成功,失败,未知

3.一致性类型

强一致(mysql事务),顺序一致性,会话一致性,

最终一致性(paox)

,弱一致性(mysql同步)

1.2 分布式系统评价指标

1.性能  2.可用性 3.扩展性 4.一致性


2.1 数据分布方式

1.hash   

优点:只记录分桶数即可

缺点:扩容数据移动大,值如果分布不均衡发生数据倾斜,

2.按数据范围

缺点:需要维护数据分布的元数据

  3.按数据量切分 chunk

缺点:

2.2 副本的数据分布

1.以机器为单位

缺点:

(1)不好扩容(每台机器是1/3的分片),扩容必须增加三台

(2)一个节点宕机,   copy全量数据


2.数据分段,一个机器多个分片

优点:一个节点宕机,能从所有节点同步数据

2.3 副本协议

1.中心化

更新只针对primary 节点,然后同步给副本

流程:

(1)

2.去中心化

paox

3 分布式协议

1.lease

流程:

   (1)master 想slave同步时发送一个lease,带有有效期。保证在此有效期不对数据做修改

(2)slave上的lease,删除此数据

(3)master收到更新请求

     <1>会阻塞请求

     优化:(开始更新时,不发放lease,或发放的lease是以发放里最大的)

      <2>等待发出的lease过期。

      优化:master主动请求slave清除lease

读取流程:

(1)发现数据有cache,并且lease 未过期,直接本地返回。否则转给master

用途:使用lease选主,中央节点Q给master 发送一个特殊lease,每次收到slave心跳发放一个lease

2.quorum

定义:更新是一系列顺序过程,wi(i是版本号)

类型:

 write-all-read-one(所有节点写成功,才算成功)=

w + r = n+1

缺点:

必须读取到w个节点,才能确定当前成功的最高版本

4.两阶段提交过程

角色:一个中心化协调者,n个参与者

流程:

 协调者:(1)本地写入日子begin-commit ,进入wait状态(2)向参与者发送prpare

(3)等待参与者对prepare的响应,收到全部vote-commit,写入gloabl-commit日志,进入commit状态,并发送gloabl-commit消息。只要收到一个abort,写入gloabl-abort,进入abort状态,发送gloabl-abort消息

(4)等待确认消息,都收到后写入end-transaction日志

参与者(1)写入init日志,进入init状态 (2)等待协调者prepare消息 (3)如果能提交,写入ready日志,进入ready状态(3.1)向协调者发送vote-commit (3.2)等待协调者消息,如果是gloabl-commit,写入commit日志,进入commit状态。如果是gloabl-abort,写入abort日志,进入abort状态,向协调者发送确认消息。

(4)不能提交,写入abort日志,进入abort状态,发送vote-abort消息,后续可响应gloabl-abort消息

缺点: 没有容错能力,如果协调者发送gloabl-commit或者gloabl-abort超时,需要一直不断的重发。如果有参与者宕机或者网络断开,流程卡住了。或者参与者在进入ready状态,等待gloabl-commit超时,只有不断发送vote-commit,如果和协调者网络断开,流程卡住了。

5.mvcc

类似svn。每个事务一个分支,后提交的如果没有冲突就合并。有则失败。


保证不影响真正的数据,有2种方式。(1)copy后在修改,类似svn的checkout (2)只提交修改记录,然后从基础版本计算,类似git。    

6.paxos

角色: proper,acceptor,learner

流程:每轮都有个编号(下面用b来表示)

proper 端

  准备阶段

    (1)发送Proper(b) 

   (2)如果收到一个Reject(B),本轮失败,轮次号加1(b+1)重新执行步骤一

 批准阶段

 (3)如果收到的Promise(b,vi)的数量超过半数,如果v都是空,可以设置任意的值。否则选择i最大的v。广播accept(b,v)

(4)如果收到nack(b),轮次号加1(b+1)重新执行步骤一


acceptor端:

准备阶段:

(1)接收proper(b)

     参数B是之前接收到的最大轮次号,V是之前选定的值(可为空)

   如果b > B ,回复promise(b,V_B),设置B= b。否则回复Rejec(B)

(2)接收accept(b,v)

如果b>B,设置V= v,广播accept消息,否则回复Nack(B),

你可能感兴趣的:(分布式系统原理笔记)