这是我参与「第五届青训营 」伴学笔记创作活动的第 8 天。
概述
分布式系统是计算机程序的集合,这些程序利用跨多个独立计算节点的计算资源来实现共同的目标。可以分为分布式计算、分布式存储、分布式数据库等。
系统模型
分布式系统面临的一大难题是故障引起的共识与消息一致性问题。分布式系统要做到在单个发生故障的情况下依旧做到数据的正确性,为此需要设计一系列算法。
理论基础
CAP理论
- C: Consistence,一致性,指数据在多个副本之间能够保持一致的特性。
- A: Availability,可用性,指系统提供的服务必须一直处于可用的状态,但是不保证请求数据为最新数据。
- P: Network partitioning,分区容错性,分布式系统在遇到任何网络分区故障的时候,仍对外提供一致性和可用性。
在网络发生分区的情况下,必须在可用性和一致性之间做出角色。解决方法是故障转移。
ACID理论
数据库事务拥有四个特性ACID:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。
- 原子性:操作要么全部成功,要么全部回退。
- 一致性:事务执行前后必须都处于一致性状态。
- 隔离性:多个用户并发访问时,用户之间的事务必须相互隔离。
- 持久性:一个事务一旦被提交,即使系统故障也不能丢失提交事务的操作。
BASE理论
BASE是对CAP的妥协,其核心思想是:Basically Available(基本可用)、Soft state(软状态)和Eventually consistent(最终一致性)。
分布式事务
为了分布式节点进行提交时保持事务的一致性,需要一些算法。
二阶段提交
三个假设:
- 引入协调者(Coordinator)和参与者(Participant)
- 所有节点都采用预写日志,保持在可靠存储设备上
- 所有节点损坏后可以恢复
分为两个阶段:
- Prepare阶段
- Commit阶段
可能的情况
- 协调者不宕机,参与者宕机,需要回滚操作
- 协调者宕机,参与者不宕机,可以起新协调者,重复二阶段提交
- 都宕机
三阶段提交
将二阶段提交中的Prepare阶段差分为CanCommit和PreCommit,解决了单点故障和阻塞问题。
MVCC
- 悲观锁: 操作数据时直接锁住数据,操作完成后释放锁
- 乐观锁:不会上锁,只会更新时判断数据是否被修改,冲突时放弃操作
MVCC是一种并发控制的方式,维持一个数据的多个版本,所以不会阻塞读写。MVCC为每一个修改保存版本,和事务的时间戳关联。
共识协议
- Quorum NWR
- Raft
- Paxos