写点什么

分布式系统架构学习总结(分布式数据库和 NoSQL)

用户头像
qihuajun
关注
发布于: 2020 年 07 月 14 日



分布式数据库



数据分片

分片方式:

  • 硬编码实现分片

  • 映射表外部存储

  • 分布式数据库中间件



现实场景中,更通用的方案是采用数据库中间件比如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

来源:掘金

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。



发布于: 2020 年 07 月 14 日阅读数: 62
用户头像

qihuajun

关注

还未添加个人签名 2009.05.15 加入

还未添加个人简介

评论

发布
暂无评论
分布式系统架构学习总结(分布式数据库和NoSQL)