201903 Distributed Fault Tolerant System Design 学习笔记 (0) - xiaoxianfaye/Learning GitHub Wiki

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

我一直都想系统性地学习分布式系统设计,以往也断断续续学习过一些内容,但都是碎片化的知识点,一直苦恼于脑子里没有一个全局的视图。这次培训特别及时,老师讲授的内容提供了一个全局的视图,同时也是一个非常清晰的学习脉络。