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),