201903 Distributed Fault Tolerant System Design 学习笔记 (0) - xiaoxianfaye/Learning GitHub Wiki
- 0 Overview
- 1 Elements of Distributed System Design
- 2 A Tour of Erlang
- 3 Bully Algorithm
- 4 Paxos
- 5 分布式容错KV存储服务的设计与实现
- 6 Summary
0 Overview
本次课程的授课时间从2019年3月27日到3月30日,共三天半。这次培训的主题是“分布式容错系统设计”,主要包括以下几部分内容:
0.1 Elements of Distributed System Design
讲述了分布式系统设计中的思维方式、基本概念、基本问题/解决问题的基本技术,以及设计要素等。
通过学习这部分内容:
-
看分布式系统相关的论文和专著时能更容易看明白,学习开源软件时能理解它的设计思想、为何要这样做设计、它的假设是什么、它的适用性如何等。一方面可以提升学习效率,另一方面,应用到工作中时可以做出比较好的选择,知道哪一个更合适。
-
在自己做一个分布式系统设计的时候,有章可循,知道从哪些方面考虑入手,有哪些指导原则。
0.2 A Tour of Erlang
快速学习一下Erlang,包括关键语法要素、编程技术等。
0.3 Bully Algorithm
编写分布式系统中的一个经典的Leader选举算法——Bully Algorithm。
0.4 Paxos
讲述分布式系统中最重要的算法——Paxos。它解决的问题、为何这样考虑、为何这样设计等。
整个云计算系统很庞大,为何成千上万的服务器能够协同工作呢?最核心的思想就是Paxos。
除了彻底理解Paxos算法,还编写了实现——basic paxos。
0.5 分布式容错KV存储服务的设计与实现
一个大的编程实战。
从一个简单的内存KV存储变成一个分布式、可持久化、容错的KV存储系统。涉及到很多分布式系统设计中的思考方法、设计技术。
0.6 小结
整个课程的学习过程是一个思考、编程密集型的。
根据授课内容,整理出本次课程的学习笔记。
1 Elements of Distributed System Design
详见 201903 Distributed Fault Tolerant System Design 学习笔记 (1) Elements of Distributed System Design。
2 A Tour of Erlang
详见 201903 Distributed Fault Tolerant System Design 学习笔记 (2) A Tour of Erlang。
3 Bully Algorithm
详见 201903 Distributed Fault Tolerant System Design 学习笔记 (3) Bully Algorithm。
4 Paxos
详见 201903 Distributed Fault Tolerant System Design 学习笔记 (4) Paxos。
5 分布式容错KV存储服务的设计与实现
详见 201903 Distributed Fault Tolerant System Design 学习笔记 (5) 分布式容错KV存储服务的设计与实现。
6 Summary
有幸参加过多次老师的培训,每次都觉得新鲜有趣、收获满满,而且需要很长的时间去反复理解与实践,这次一点儿也不例外。在这次培训中,我感受最深的是贯穿始终的系统思维。
“Elements of Distributed System Design”是本次培训的理论部分。老师从系统思维而不是程序员惯常使用的程序思维,以热门的“微服务”为引子,从再普通不过的日常软件开发工作切入,不断发问,引导思考,娓娓道来,讲述了为何要引入分布式系统,系统思维的运用给我留下了非常深刻的印象。事实上,老师已经不止一次用这种系统思维的方式讲课了,2016年的《Algebra of Programming-下一代软件建模核心技术》、2018年的《从问题到系统》等都令人叹服。反观自己,还需要再勤奋一些,多观察、多思考、多深入思考、多实践。
我将“为何要引入分布式系统”这部分内容的系统思维的逻辑主干整理如下:
1. 工作中,最怕的问题是什么?
在现场,用户感知到系统行为跟预期不一致。
2. 如何解决这些问题?
重启。
3. 重启为何有效?
把系统恢复到一个已知状态重新开始运行。
4. 重启能解决哪些Bug?
可复现 偶发
核心功能 不能 能
附属功能 看情况 能
5. 什么情况下重启也没用?
当系统核心数据(Essential Data)被破坏掉了以后,重启也没用。
6. 如何提高可用性(Availability)?
重启有效且快,可用性就高。
7. 如何才能重启快?
将系统拆分为多个独立的小系统,每个小系统定义好各自的核心数据。
出了问题重启小系统,不需要重启整个系统,重启就快了。
8. 如何拆分系统?
容错、重启快 —— 拆分系统的核心原则。
9. 硬件坏了怎么办?
要想做一个容错系统,至少需要两个节点,它们之间要进行数据复制。
一旦开始数据复制,就进入分布式的世界了。
至此,引入了分布式系统。
“分布式容错KV存储服务的设计与实现”是本次培训的最后一个大设计编程实战。老师依然是运用系统思维,带着我们从一个最简单的内存KV存储开始,不断提出问题,引导我们运用系统思维思考解决问题的方法,逐步演进,最终实现了一个分布式、可持久化、容错的KV存储系统,精彩有趣,非常有成就感。我将主要的设计实现步骤整理如下:
1 内存、单节点
2 持久化、单节点
3 一主一备(手工指定主或备)
3.1 异步replicate
3.2 同步replicate
3.3 简单流控(限制replicating列表的长度)
3.4 定时重发replicate(At Least Once)
3.5 Seq持久化
4 一主多备
4.1 复制因子
4.2 Exactly Once
5 落后备节点同步数据(OpLog)
5.1 OpLog
5.2 同步单条OpLog(one_update)
5.3 同步多条OpLog(batch_update)
5.4 同步所有OpLog(full_update)
6 主备切换
6.1 手动切换active
6.2 自动选出active
7 解耦Leader选举切换与业务代码
8 集群管理模块(db_cluster)
9 API(db_api)
9.1 一次性API
9.2 带重试策略的API(At Least Once)
10 Stop
10.1 Leader选举模块(cluster_leader)增加stop
10.2 集群管理模块(db_cluster)增加stop
11 其他语言可访问API
11.1 tcp_server
11.2 db_acceptor
11.3 db_cluster增加API
11.4 db_client
12 保证主收到的Seq的连续顺序(pending)
13 Supervisor
我一直都想系统性地学习分布式系统设计,以往也断断续续学习过一些内容,但都是碎片化的知识点,一直苦恼于脑子里没有一个全局的视图。这次培训特别及时,老师讲授的内容提供了一个全局的视图,同时也是一个非常清晰的学习脉络。