这是我参与「第五届青训营 」伴学笔记创作活动的第 8 天
什么是分布式
分布式系统是计算机程序的集合,这些程序利用跨多个独立计算机节点的计算资源来实现共同的目标,可以分为分布式计算,分布式存储,分布式数据库等。
- 优势
- 去中心化:提高计算能力和存储能力
- 低成本:相同的价钱做更多的事情
- 弹性:白天在线服务,夜里离线计算;促销扩容,结束缩容
- 资源共享:集中数据,发挥分布式能力
- 可靠性高:一个节点坏了可以用其他副本顶替
- 劣势
- 普遍的节点故障:节点数量过多,使低概率事件绝对发生
- 不可靠网络:节点交流导致状态增加
- 异构的机器与硬件环境:使得程序性能不能完全发挥
- 安全性低:一旦服务器集群被攻破,将面临大量数据安全问题
故障模型
业务中通过问题定位到模型从而高效解决问题
-
Byzhantine failure:节点可以任意篡改发送给其他节点的数据
-
ADB(Byzhantine failure 特例):节点只是可以篡改数据,但是不可以伪造其他节点的数据
-
Performance failure:节点未在特定时间段内收到数据,即时间太早或太晚,一个节点处理不了还可以给其他节点处理,“处理得慢不如死掉”
-
Omission failure:节点收到的数据无限晚,即收不到数据
-
Crash failure:在Omission failure的基础上增加了节点停止响应的假设,即持续性的Omission failure
-
Fail-stop failure:在Crash failure的基础上增加了错误可检测的假设(最好处理的)
分布式事务
二阶段提交(Two-phase Commit)
为了使基于分布式系统架构下的所有节点在进行事务提交时保持一致性而设计的一种演算法(二阶段提交的 Prepare 阶段拆封优化可演变为“三阶段提交”,即进行一个预先确认是否具备事务发生条件再决定是否发起提交
在二阶段提交算法中,我们需要引入三个假设:
- 引入
协调者(Coordinator)和参与者(Participants),互相进行网络通信 - 所有节点都采用预写式日志,且日志被写入后即被保持在可靠的存储设备上
- 所有节点不会永久性损坏,即使损坏后依然可以恢复
在以上三个假设中,二阶段提交算法以如下方式工作:
- 以
协调者为一个中心节点,负责处理参与者之间可能存在的冲突,参与者负责提交事务并告知协调者 - 当希望提交事务时,会先进入 Prepare 阶段,
协调者向参与者发送询问信息,参与者执行事务,但不提交,返回自己当前的状态是否正常。 - 当所有
参与者返回正常的确认信号后,进入 Commit 阶段,协调者即可通知参与者进行事务的 commit,并收到 Ack 信号确认 commit 完成。
可能出现以下异常情况:
协调者未宕机,但参与者宕机,Prepare 阶段的参与者向协调者返回错误信号;此时协调者将通知所有参与者对已进行的 commit 进行 rollback 操作以保证数据一致协调者宕机,但参与者未宕机,此时只需更换新的协调者,然后重新进行二阶段提交即可协调者和参与者均宕机,此时由于无法确认状态,需要数据库管理员接入,防止数据库进入不一致的状态
今天分享到此为止,课程后半截讲到了分布式下的多版本并发控制,当然还是有缘再学