分布式系统架构学习总结(分布式数据库和 NoSQL)
分布式数据库
数据分片
分片方式:
硬编码实现分片
映射表外部存储
分布式数据库中间件
现实场景中,更通用的方案是采用数据库中间件比如Mycat。
数据库部署方案
单一服务器单一数据库
主从复制
业务分库
综合部署
NoSQL
CAP原理
一致性Consistency
一致性是说,每次读取的数据都应该是最近写入的数据或者返回一个错误( Every read receives the most recent write or an error),而不是过期数据,也就是说,数据是一致的
可用性Availability
可用性是说,每次请求都应该得到一个响应,而不是返回一个错误或者失去响应,不过这个响应不需要保证数据是最近写入的( Every request receives a( non-error Response, without the guarantee that it contains the most recent write),也就是说系统需要一直都是可以正常使用的,不会引起调用者的异常,但是并不保证响应的数据是最新的
分区耐受性
分区耐受性说,即使因为网络原因,部分服务器节点之间消息丢失或者延迟了,系统然应该是可以操作的
CAP原理
在分布式系统必须要满足分区耐受性的前提下, 可用性和一致性无法同时满足.
最终一致性
写冲突处理策略:
根据时间戳保留最新的数据
客户端冲突解决
投票解决冲突
ACID和BASE
基本可用弱状态最终一致性
分布式一致 zookeeper
分布式系统脑裂
在一个分布式系统中,不同服务器获得了互相冲突的数据信息或者执行指令,导致整个集群陷入混乱,数据损坏,本称作分布式系统脑裂。
分布式一致性算法 Paxos
3个角色
Proposer
Acceptor
Leaner
3个阶段
第一阶段: Prepare阶段。 Proposer向 Acceptors发出 Prepare请求, Acceptors针对收到的 Prepare请求进行 Promise承诺第二阶段: Accept阶段。 Proposer收到多数 Acceptors承诺的 Promise后,向Acceptors发出 Propose请求, Acceptors针对收到的 Propose请求进行 Accept处理。第三阶段: Learn阶段。 Proposer在收到多数 Acceptors的 Accept之后,标志着本次Accept成功,決议形成,将形成的决议发送给所有 Learners。
ZAB协议
Leader选举
Phase 0: Leader election(选举阶段)
节点在一开始都处于选举阶段,只要有一个节点得到超半数节点的票数,它就可以当选准 leader。只有到达 Phase 3 准 leader 才会成为真正的 leader。这一阶段的目的是就是为了选出一个准 leader,然后进入下一个阶段。
协议并没有规定详细的选举算法,后面我们会提到实现中使用的 Fast Leader Election。
Phase 1: Discovery(发现阶段)
在这个阶段,followers 跟准 leader 进行通信,同步 followers 最近接收的事务提议。这个一阶段的主要目的是发现当前大多数节点接收的最新提议,并且准 leader 生成新的 epoch,让 followers 接受,更新它们的 acceptedEpoch。
一个 follower 只会连接一个 leader,如果有一个节点 f 认为另一个 follower p 是 leader,f 在尝试连接 p 时会被拒绝,f 被拒绝之后,就会进入 Phase 0。
Phase 2: Synchronization(同步阶段)
同步阶段主要是利用 leader 前一阶段获得的最新提议历史,同步集群中所有的副本。只有当 quorum 都同步完成,准 leader 才会成为真正的 leader。follower 只会接收 zxid 比自己的 lastZxid 大的提议。
Phase 3: Broadcast(广播阶段)
到了这个阶段,Zookeeper 集群才能正式对外提供事务服务,并且 leader 可以进行消息广播。同时如果有新的节点加入,还需要对新节点进行同步。
ZAB 提交事务并不像 2PC 一样需要全部 follower 都 ACK,只需要得到 quorum (超过半数的节点)的 ACK 就可以了。
请求处理
Client的请求会由Leader节点来进行处理,leader节点会发起proposal到所有的Follower节点,Follower节点收到proposal后确认并向Leader节点返回ack确认信息,Leader节点确认收到半数以上的Follower 确认之后即可确认propose成功,并向各Follower节点发送commit请求,由各节点完成commit操作。
参考文档:
作者:慕容千语
链接:https://juejin.im/post/5b924b0de51d450e9a2de615
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
版权声明: 本文为 InfoQ 作者【qihuajun】的原创文章。
原文链接:【http://xie.infoq.cn/article/c96ef40967d03a731b80c0a6d】。文章转载请联系作者。
评论