1. 知识点总结

  1. 虚拟化和数据中心
    • 两种 Hypervisor:直接在硬件上和在操作系统上
    • 两种 Hypervisor 实现方法:全虚拟化和半虚拟化
    • 软件定义网络
    • 两种RDMA:被授权后直接写和一方写一方收
  2. 高可用性背景
    • 衡量分布式算法:为了保持复制副本需要发送的信息数和节点数的关系,越小越好
    • 正确性
      • Safety
      • Liveness
  3. 时序
    • Total Order: 服务端接收一致
    • Linearizability: 遵守真实时间,平行系统并发数据结构锁
    • FIFO Order: 客户端顺序不变,客户之间无关联
    • Happen-Before Order
      • Lamport’s Logical clock a < b -> LC(a) < LC(b)
        • 只能辨别潜在因果,不能辨别因果
    • Causal Order
      • Vector clock a < b <-> VC(a) < VC(b)
  4. 领导人选举
    • 领导人选举 和 互斥锁
      • 互斥锁不处理死去的领导人
      • 互斥锁讨厌饥饿,但领导人可以一直获取锁
    • Bully算法 - 寻找最大 ID 作为领导人
      • 复杂度 O(n2)O(n^2)
  5. 错误
    • Crash Failure
      • 异步不可检测,同步可检测
      • fail-stop 可检测错误,当发生错误时,变为一种能让人察觉到的状态
      • crash-stop 不可检测错误
    • Byzantine Failure
      • 考虑所有可能的错误
      • 多数情况下用来应对不信任问题
    • 错误检测
      • complete: 不会丢失任何错误通知
      • accurate: 不会有任何错误的判断
      • 异步系统下不能同时 complete 和 accurate
      • 分布式系统下偏向于 complete
      • 如何检测:Ping/HeartBeat
  6. 一致性
    • 一致性问题
      • Crash Fault tolerant
      • 每个节点有自己的初始值
      • 所有节点最终达成一致意见(liveness)
      • 有效性:最终的决定必须是选举过程所能决定的
    • 一致性问题的难点
      • 异步系统
        • 不可能在具有一个错误进程的系统中达到分布式一致性
      • 同步系统
        • 拜占庭错误:不可能在节点数小于等于3和有一个有害节点中达成一致性
    • 拜占庭问题
      • OM algorithm
    • PAXOS 不考虑 拜占庭问题
    • PBFT 考虑 拜占庭问题
  7. Raft
    • Leader Election
    • Log Replication
  8. 一致性模型
    • CAP 理论
    • 一致性模型
      • 线性一致性
      • 结果一致性 (total order)
      • 因果一致性
      • FIFO一致性
      • 最终一致性
    • 保持一致性的花费是吞吐量和Scalability的瓶颈
  9. CRDT
    • Conflict-Free Replicated Data Type
    • 最终一致性:可能看到暂时的不一致
    • 问题解决:commutative 可交换的
    • 两种:
      • CmRDT 基于操作:变化的状态一个一个发,丢失会引起故障
      • CvRDT 基于状态:可以直接发送最后的状态
  10. ZooKeeper
    • 目的:高性能,raft并不是为了高性能
    • 妥协
      • 延迟同时返回多个Put请求的OK
      • 从任意跟随者处读取
        • 违反了 linearizability:改进,向leader写入后得到 commitIndex,只有当追随者的 commitIndex赶上了leader的commitIndex之后才可以返回用户的get请求
        • 改进之后不会再出现:第一次写入得到最新数据,第二次得到旧数据
        • 还会出现的问题:之前并没有写入任何信息的客户端,直接读取到旧信息
        • 如何解决:使用API的方式,看客户端是否需要在读取后被通知“Sorry!读取的数据是旧数据”
  11. 流和分布式快照
    • 流系统
      • collect - log - analyze - serve & store
      • Exactly-once Consistency
        • 实现方式:分布式快照
      • 时间
        • Event Time: 创建时间
        • Processing Time: 被处理时间
        • group by processing time - > group by event time
    • 分布式快照
      • cut: 每个进程至少一个事件
      • consistent cut: 每个进程的前驱节点也在其中
        • consistent cut 的边界是一个快照
      • Chandy-Lamport Snapshot 算法
        • Initiator: 记录自己状态 c_i, 并将 c_i 作为标记 发送给所有的出通道
        • Peer: 第一次接收到 c_i, 记录自己的状态,转发给自己所有的出通道
        • 等待从所有入通道接收到 c_i,结束
  12. 键值存储
    • Consistent Hashing 环状结构:顺时针选择最近节点
    • Distributed Hash Table - Chrod
      • 搜索:寻找大于 h(K) 的最小节点
      • 添加节点
      • 节点离开
      • 节点失效:在节点的前驱和后继中做副本
  13. 链式复制
    • Raft 不是为了高性能,而是为了高可用,要实现高性能但较低可用的

    • 在头部写,在尾部读,只有更新从头部到达尾部,才能返回 ok

    • Raft 维护心跳

    • 发生crash

      • 头结点 crash,后一个节点成为头结点
      • 尾节点 crash,前一个节点成为尾节点
      • 中间节点 crash,前一个节点跳过他发给下一个节点
    • 添加节点

      • 添加在尾部,开始复制尾节点信息,复制完之后,成为新的尾节点,原尾节点把消息发给新尾节点
    • 优点:读写负载分开;线性;头结点发送负担小;实现简单

    • 缺点:一个节点失效,客户端等待回复;写入延迟高

    • 提高读取并发性:将数据流分为多个线路,不同节点担当不同的头尾节点,实现读取负载均衡和线性

    • EBS 使用 Chain Replication

  14. 云数据库
    • ACID on sigle node (Isolation)
      • 悲观锁
        • 2 Prase Locking (2PL)
          • 想要访问就要获取锁
          • 只要开始释放锁,就不能再获取锁
          • 确保线性
        • Fine grained lock
          • 读使用共享锁
          • 写使用排它锁
      • 乐观锁
        • 基于时间戳
        • 时间戳+多版本
        • 基于验证的 (OCC)
          • 保存自己读取和写入涉及到的集合,验证是否与其他事务有重叠,无重叠则提交,有重叠则终止重启
    • ACID (Durable)
      • WAL (write-ahead logging)
        • 数据写入硬盘之前,必须先将日志写入磁盘
    • ACID (Atomic)on multi-node
      • 2 Phrase Commit
        • all or nothing
  15. Aurora
    • 历代
      • 第一代:MySQL部署在服务器上,不能容错硬盘宕机
      • 第二代:在一个数据中心上的多个硬盘上使用链式复制,不能容错数据中心挂掉
      • 第三代:在不同数据中心的多个硬盘上使用链式复制,慢
      • 第四代:不同数据中心多副本
    • 区别
      • 传统数据库
        • 提交时将日志从缓存传给远程磁盘日志
        • 提交时将数据更新从缓存传给远程磁盘数据
      • Aurora
        • 提交时将日志从缓存传给远程磁盘日志
        • 从日志重建数据
        • Quorum-Based replication
    • Qurum-Based replication
      • N个节点中,一个写数据需要 W 票,一个读数据需要 R 票
      • 需满足 W + R > N, W > N / 2
      • 写只在 W 票时成功,读从 R 个副本中找最新版本号数据
    • 数据库复制模式
      • 同步:多节点,写入所有节点,读取任一节点;所有节点副本一致
      • 异步:主从模式,从节点只负责备份,主从节点达到最终一致性
      • Qurum-Based replication

术语缩写

  • FLP:三个人名的缩写,在网络可靠,但允许节点失效(即便只有一个)的最小化异步模型系统中,不存在一个可以解决一致性问题的确定性共识算法(No completely asynchronous consensus protocol can tolerate even a single unannounced process death)
  • CAP:ConsistencyAvailabilityPartition
    • 强一致性。强一致性意味着,当系统的更新操作成功并返回客户端完成后,所有节点在同一时间的数据完全一致。
    • 分布式系统可以正常响应时间内提供相应的服务。
    • 分布式系统在遇到某节点或网络分区故障的时候,仍然能够对外提供满足一致性和可用性的服务。

2. Lab 知识总结

Lab 1: Serverless Function

  1. 建立 Lambda 函数:选择环境,角色
  2. 添加代码到函数,设置 Handler 指向该函数名
  3. 部署、创建用例进行测试

练习

  1. A serverless function:

    (a) dose not run on any server machine (be it virtual/physical).

    (b) has a start-up time faster than virtual machine.

    (c) is stateful (i.e. you don’t need an external service to maintain its state across multiple invocations)

    (d) must be written in Actor model

Lab 2: FaaS

创建步骤:

  1. 用 S3 创建桶(bucket),用于上传图片
  2. 在 DynamoDB 创建表,存储结果
  3. 在 Lambda 中为第三方库创建 Lambda 层,上传库文件
  4. 在 Lambda 中创建图像识别函数,写入代码
  5. 在 Lambda 中创建管道
    • 触发器为桶
    • 层选择建立的层
    • 环境变量中添加数据库表名

习题

  1. In AWS Lambda, we usually put our third party libraries in :
    (a) Lambda function.
    (b) Layers. √
    (c) Triggers.
    (d) Local client.

  2. An AWS Lambda layer:

    (a) contains alls ource code of your lambda function.

    (b) contains all resources (such as image) as the input of the lambda function.

    (c) contains all additional code such as the third party librarise. √

    (d) contains the logs of the lambda function.

Lab 3: gRPC

创建步骤:

  1. docker环境:Protobuf、Maven、Java/Go、Protoc gRPC GO plugin protoc-gen-go
  2. 编写 .proto 文件:包含 gRPC 定义、请求和响应类型信息
  3. 使用 Java 实现服务端和客户端
    • 创建 pom.xml 引入依赖
    • 生成两个java文件,是通过 .proto 文件生成的
      • CalculatorGrpc.java
      • CalculatorOuterClass.java
    • 编写 CalculatorServer.java
      • 服务内部静态类继承了 CalculatorGrpc 类
      • 静态类的请求和响应类型对象来自 CalculatorOuterClass
      • main函数注册服务绑定端口
      • 生成 jar 包
    • 编写 CalculatorClient.java 使用 java 实现客户端
      • 使用 stub 来调用 gRPC 服务
      • 生成 jar 包
  4. 使用 Go 实现客户端
    • 利用 .proto 文件生成 Go 的 stub
    • 编写 main.go
      • 创建 gRPC 连接
      • 利用 stub 调用 gRPC 服务
      • 编译

习题

  1. In gRPC:
    (a) a .proto file can be executed directly as a program.
    (b) a .proto file is usually generated automatically from your source code by protobuf.
    (c) clients in different programming languages can reuse the same client stubs.
    (d) a .proto file is required to generate stubs using protobuf. √

Lab 7: CRDT

Conflict-Free Replicated Data Type

使用的开源库: Yjs

依赖 解释
Quill.js API驱动的富文本编辑器
React-quilljs Quill 的钩子包装,使得可以制作可协作协作文本框的React组件
而不是ReactQuill
Yjs CRDT框架
y-websocket 为 Yjs 提供 WebSocket 连接

步骤:

  1. 运行 docker 容器,到达 App 目录,为 Create-React-App 创建
    • src/App.js: 三个 ClickToEdit 组件,分别包含一个 Yjs 提供的文档数据结构 Y.doc
    • src/ClickToEdit.js: 使用了 React 的钩子,来建立 WebSocket 连接,实现了连接和断开连接的切换按钮
  2. 运行代码

习题:

  1. Which library was not used to implement our CRDT application?
    (a) Quill.js
    (b) ReactQuill √
    (c) Yjs
    (d) y-websocket

Flink: Connector - flatMap() - keyBy() - sum() - PrintSink

  1. flatMap() emits 0 or more records
  2. keyBy(0) 按照第一个元素进行分组
  3. sum(1) 对分组的第二个元素求和

练习

  1. When using Flink:

    (a) flatMap() emits 0 or more records (i.e., 1:n mapping). √

    (b) In a Flink Cluster, there will be 1x JobManager and 1x TaskManager.

    (c) JobManager will also execute tasks if TaskManager is too busy.

    (d) User can only submit their program through WebUI.

3. 期末考回忆

  1. DC 虚拟化

    1. ……的技术有两种虚拟机,容器等,Function as a Service 的实现技术是什么
    2. 没有CPU参与的RDMA技术是哪一种
    3. 设计一个数据中心需要考虑什么
  2. Clock

    1. 按图给出 Lamport Clock
    2. 按图给出 Vector Clock
    3. 分别给出两种 Clock 的优点
  3. Raft

    S1:

    1. 按题目写出每个 term 可能的 Leader
    2. 3.2 有没有可能被提交
    3. 如果xx成为 Leader,给出其他节点要 drop 的 log entries
  4. SnapShot

    1. 图中两条线的 cut 是不是 consistent cut
    2. 在图中画出每个节点至少有3个状态的最小的 consistent cut
    3. 如果 channel 不按照 FIFO的顺序,Chandy Lamport 算法是否可行
  5. Linearizability

    给了一个图,图里边 4 个进程,有对同一个数据同时读写的操作,并且读写操作需要花费一定的时间才会 return,问这个系统是不是线性的。如果不是线性的,要尝试在图中用箭头画出一个 cycle 来反证。

  6. Chrod key-value store

    1. 写出一个节点的 finger table
    2. H(x) = x mod 10,从N_12开始访问,写出 get(58) 访问的节点
  7. Aruora 原题(还是不会做,建议去读论文试试)

  8. CRDT

    1. 两个人同时对一个文档进行写入,一个人写“true ==”,另一个人写 “(一个单词)”,有没有可能出现结果为 “(一个单词) == true”,说明过程
  9. Consistency

    1. 在 Partitioning 和 异步的情况下,最好的一致性模型是
    2. 在 同步 和 ?的情况下,最好的一致性模型是
  10. 选择,不少原题

    1. Faas 是无状态的,那么状态是谁保存的(有疑惑的选项是 WebServer 和 都不是,其他俩选项忘了)