eraft 精解课程
我们团队致力于解读国外优秀的分布式存储相关开源课程,下面是课程体系图
我们始终坚信优秀的本科教学不应该是照本宣科以及应付考试,一门优秀的课程,应该具备让学生学会思考、动手实践、找到问题、反复试错、并解决问题的能力,同时应该尽量用最直白,最简单的语言传达关键的知识点。作为计算机工业界的工作者,我相信做课程和做技术一样,并不是越复杂越好,应该尽量的让设计出来的东西简单化。
关注我们的最新动态,欢迎关注
https://www.zhihu.com/people/liu-jie-84-52
接下来我们进入正题,如何实现一个分布式系统。
-
MIT6.824 分布式系统系列
MIT 分布式系统(七)分布式事务初探 #
事务介绍
在介绍分布式事务之前,我们先来通过一个例子看看事务是什么?
开始讨论我们系统中可能发生的事情之前,我们要重新说一下事务的定义。事务是对数据库的一系列操作,这些操作满足 ACID 的属性。
我们看到上图的例子,假设我们现在实现的分布式存储系统存储了银行账户数据。
T1 表示储蓄用户的账户为 Y,他有 10 块钱,然后他给 X 转账 1 块钱,那么对应的数据操作就是对 x + 1, 对 Y - 1 。用户提交这个转账后,系统就开始修改数据库中的值了。
T2 表示银行对账人员,她需要统计用户 X, Y 的账户总和。如果 T2 在 T1 开始且还没有操作的时候执行 x', y' 值得获取,那么能拿到 20 块的总和,这是符合预期的。
但是,因为两个用户使用系统的时候,他们访问的顺序是随机的,我们无法保证,一旦 T2 在 T1 执行 add(x, 1) 之后读取 x', y' 的值。我们将得到 X + Y = 21,统计莫名的多出了一块钱(似乎银行亏1块钱也没啥问题),如果这笔转账金额很大呢,比如一个小目标 1个亿,那就是绝对不能容忍的错误了。
这时候就需要我们的事务保障了。
ACID
atomic 原子性。数据库管理系统保证事务是原子的,事务要么执行其所有操作,要么不执行任何操作。
cosistent 一致性。这个表示数据库是一致的。应用程序访问的有关数据的所有查询都将返回正确的结果。
isolated 隔离性。数据库管理系统提供了事务在系统中单独运行的假象。他们看不到并发事务的影响。这等同于事务的执行是以串行的顺序的。但是为了更好的性能,数据库管理系统必须交错并发的执行事务操作。
durable 持久性。在系统崩溃和重启之后,提交事务的所有更改都必须是持久化的。数据库管理系统可以使用日志记录或者影子页面来确保所有的更改都是持久化的。
两阶段提交
在一个分布式系统中,数据被分割存储在不同的机器上。例如我们 eraft 中将数据按哈希值分布到不同的 bucket,然后有不同的机器去负责这个 bucket 数据的存取。这个时候,事务处理就更复杂了。单节点我们可以通过锁保证事务正确性,但是分布式场景就不一样的,我们把上述转账示例带入分布式场景下:
账户数据存储在 S1, S2 两台不同的机器上。T1 在 S1 上执行 +1 操作,X 现在等于11。当 T1 执行到对 Y 减 1 操作的时候,服务 S2 奔溃掉了。那么这时候这个操作返回用户失败,但是 S1 上的账户已经脏了,这时候对账人员去对账也会得到错误的数据。
面对这种场景分布式系统是如何去解决的呢?
这个时候就需要一个节点作为事务协调者(Transaction Coordinator),来协调事务的执行了,S1,S2 负责执行事务,他们被称为事务参与者(Participants)。
我们首先概览以下两阶段提交是如何工作的
首先在我们的图中,假定 TC, S1, S2 都位于不同的服务器。TC 是事务执行的协调者。S1, S2 是持有数据的服务节点。
事务协调器 TC 会给 S1 发消息告诉它要对 X 进行 +1 操作,给服务器 S2 发消息告诉它对 Y 进行 -1 操作。后面会有一系列的消息来确认,要么 S1, S2 都成功执行了相应的,要么两个服务器都没有执行操作,不会出现非原子操作的状态,这就是两阶段提交的大致流程。
捐赠
整理这本书耗费了我们大量的时间和精力。如果你觉得有帮助,一瓶矿泉水的价格支持我们继续输出优质的分布式存储知识体系,2.99¥,感谢大家的支持。
遵循MIT协议开源。
感谢 「赫蹏」 提供如此优秀的中文排版系统