[分布式系统初步 | 青训营笔记]

93 阅读3分钟

这是我参与「第五届青训营」伴学笔记创作活动的第 9 天。

今天,我主要学习了分布式系统的相关知识。

一、分布式系统的引入

在昨天关于架构的笔记中,我提到过:单台服务器的性能是有上限的,与其拼命在一个机器上堆性能,还不如多凑几台服务器组成一个集群。就像你想要搭配一个存储NAS,与其买一个超大的机械,不如买几个小硬盘组一个RAID更方便一些。

分布式系统主要有两个方向:分布式计算和分布式存储。前者的典型代表有Hadoop、Spark、Yarn,后者则分成了分布式文件存储(GFS、ZooKeeper、HDFS)和分布式数据库(例如TiDB和MongoDB)。

二、拜占庭将军问题

我们考虑这样一个问题:两支军队的将军打算互相派出信使,跨过敌方控制区进行沟通,就何时打击敌人达成共识。问题在于,由于信使会通过敌人的控制区,所以信息有可能会被篡改(或者无法正确传输),所以必须设置出一套合理的方案,以成功达成共识。

而拜占庭问题则是上述问题的加强版:拜占庭境内存在众多将军,其中还有着一些间谍和叛徒,他们会尽可能的扰乱战略部署,而正直的将军必须在这种情况下安全保卫国土(或发起军事进攻)。

我们对这个问题进行抽象,就得到了分布式系统中的一个核心问题:当若干个节点损坏、异常运行、甚至有意识的尝试破坏整个系统时,我们应该如何进行处理,以保证系统的正常运行?

为了解决问题,一代代数学家和计算机科学家设计了各式各样的共识算法,其中最为著名的莫过于比特币提出的算力理论(通过算力的贡献来判断哪个版本是正确的)。

三、ACID

事务是数据库系统理论中的一个重要部分,它是数据库管理系统运行过程中的最小单位。一个事务中有若干条指令,而这些指令要么全部执行,要么全部不被执行。

事务拥有ACID性质,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability):

  • 原子性:事务是一个整体,所有操作要么全部执行成功,要么失败后全部撤销
  • 一致性:数据库在事务执行前到执行后都必须处于一致性状态
  • 隔离性:当并发访问数据库的时候,各个并发事务必须互相隔离,互不干扰
  • 持久性:事务一旦执行成功,其对数据库的数据的改变就是永久性的