open-courses
  • 公开课笔记
  • CMU 15-445/645 Database Systems
    • Relational Data Model
    • Advanced SQL
    • Database Storage
    • Buffer Pools
    • Hash Tables
    • Tree Indexes
    • Index Concurrency Control
    • Query Processing
    • Sorting&Aggregations
    • Join Algorithms
    • Query Optimization
    • Parallel Execution
    • Embedded Database Logic
    • Concurrency Control Theory
    • Two Phase Locking
    • Timestamp Ordering Concurrency Control
    • Multi-Version Concurrency Control
    • Logging Schemes
    • Database Recovery
    • Introduction to Distributed Databases
    • Distributed OLTP Databases
    • Distributed OLAP Databases
  • UCB - CS162
    • OS intro
    • Introduction to the Process
    • Processes, Fork, I/O, Files
    • I/O Continued, Sockets, Networking
    • Concurrency: Processes & Threads
    • Cooperating Threads, Synchronization
    • Semaphores, Condition Variables, Readers/Writers
    • Scheduling
    • Resource Contention & Deadlock
    • Address Translation, Caching
    • File System (18,19,20)
    • Distributed Systems, Networking, TCP/IP, RPC (21,22)
    • Distributed Storage, Key-Value Stores, Security (23)
    • Security & Cloud Computing (24)
    • Topic: Ensuring Data Reaches Disk
  • MIT - 6.006
    • Sequence and Set Interface
    • Data Structure for Dynamic Sequence Interface
    • Computation Complexity
    • Algorithms and Computation
    • Structure Of Computation
    • Graph & Search
    • Tree & Search
    • Weighted Shortest Paths
    • String Matching, Karp-Rabin
    • Priority Queue Interface & Implementation
    • Dictionary Problem & Implementation
    • Sorting
    • Dynamic Programming
    • Backtracking
    • Self-Balancing Tree
  • MIT - 6.824
    • 2PC & 3PC
    • Introduction and MapReduce
    • RPC and Threads
    • Primary/Backup Replication
    • Lab: Primary/Backup Key/Value Service
    • Google File System (GFS)
    • Raft
    • Lab: Raft - Leader Election
    • Lab: Raft - Log Replication
  • Stanford-CS107
    • 原始数据类型及相互转化
    • 指鹿为马
    • 泛型函数
    • 泛型栈
    • 运行时内存结构
    • 从 C 到汇编
    • 函数的活动记录
    • C 与 C++ 代码生成
    • 编译的预处理过程
    • 编译的链接过程
    • 函数的活动记录续、并发
    • 从顺序到并发和并行
    • 信号量与多线程 1
    • 信号量与多线程 2
    • 复杂多线程问题
    • 函数式编程 - Scheme 1
    • 函数式编程 - Scheme 2
    • 函数式编程 - Scheme 3
    • 函数式编程 - Scheme 4
    • 函数式编程 - Scheme 5
    • Python 基础
  • MIT - 6.001 - SICP
    • 什么是程序
    • 程序抽象
    • 替代模型
    • 时间/空间复杂度
    • 数据抽象
    • 高阶函数
    • Symbol
    • 数据驱动编程与防御式编程
    • 数据抽象中的效率与可读性
    • 数据修改
    • 环境模型
    • 面向对象-消息传递
    • 面向对象 - Scheme 实现
    • 构建 Scheme 解释器
    • Eval-Apply Loop
    • Normal Order (Lazy) Evaluation
    • 通用机
    • 寄存器机器
    • 子程序、栈与递归
    • 在寄存器机器中执行
    • 内存管理
  • MIT - 6.046
    • Randomized Algorithms
    • Skip Lists
  • System Design
    • Twitter
    • Cache Consistency & Coherence
  • DDIA 笔记
    • Replication
    • Transactions
    • The Trouble with Distributed Systems
    • Consistency & Consensus
  • Papers We Love
    • Consistent Hashing and Random Trees (1997)
    • Dynamic Hash Tables (1988)
    • LFU Implementation With O(1) Complexity (2010)
    • Time, Clocks, and the Ordering of Events in a Distributed System (1978)
    • Dapper, a Large-Scale Distributed Systems Tracing Infrastructure (2010)
    • Gorilla: A Fast, Scalable, In-Memory Time Series Database (2015)
  • Release It 笔记
    • Anti-patterns & Patterns in Microservice Architecture
  • Database Design
    • Log Structured Merge (LSM) Tree & Usages in KV Stores
    • Prometheus
Powered by GitBook
On this page
  • 复制 (Replication)
  • 容错(Fault Tolerance)
  • 故障模型 (Failure Model)
  • 复制
  • 论文研读:Remus
  • 基本思想
  • 故障模型
  • 思路一
  • 让思路一可行
  • 参考
  1. MIT - 6.824

Primary/Backup Replication

6.824 2015 Lecture 3/2018 Lecture 4

复制 (Replication)

容错(Fault Tolerance)

我们都希望一个服务能够在发生故障后还能正常提供服务,这要求系统:

  • 可用(Available):即使出现(某些)故障还能够使用

  • 正确(Correct):服务的正确性不受影响,如同在单机上运行

这特别有用,却也特别困难。而这正复制技术尝试解决的一个问题。但再强大的复制技术,也不可能解决所有故障,因此我们需要定义一个故障模型(Failure Model):

故障模型 (Failure Model)

一个故障模型可以从以下方面来分析:

  • 不同计算节点的宕机相关性

  • 区域性断电(最终重启)

  • 网络分区(断网)

复制

使用 2 台或多台服务器,构成一个复制集合(Replica Set),每个复制单元(Replica)都保持服务的所有状态,如果其中一个复制单元发生故障,其它复制单元可以继续提供服务。

举例:Fault-tolerant MapReduce Master

在实验 1 中,MapReduce Workers 已经具备容错能力,然而 Master 是单点故障(single point of failure)。如果引入复制技术,比如两个 Master 节点,当其中一个发生故障,另一个能顶上去。

每个 MapReduce Master 的状态可能包含:

  • 当前 Worker 列表

  • Jobs 进度信息

  • 空闲 Worker 列表

  • TCP 连接状态

  • 程序计数器

  • ...

主要问题

  • 哪些状态需要复制?

  • 复制节点如何获取状态?

  • 如何切换到备用节点?

  • 在切换过程中会出现问题吗?

  • 如何接入新节点或故障恢复的节点?

两种保持节点状态一致的思路

  • 状态转移:Primary 执行服务,把实时状态发送给 Backups

    • 更简单

    • 需要转移的状态较大

  • 复制状态机:所有节点,不论 Primary 还是 Backups 都执行所有请求操作,并保证操作一致、顺序一致且操作结果是完全可确定的

    • 更复杂,保证执行顺序的逻辑复杂

    • 需要转移的状态较小

论文研读:Remus

基本思想

Remus 的想法非常大胆,它尝试在系统级别上通过复制技术来实现系统的高可用性,从而基于此系统开发的所有软件都自动获得了高可用性。

故障模型

  • 可以容忍单个节点发生故障

  • 当主从节点都发生故障时,系统处于崩溃一致(crash-consistent)状态,即数据是一致的,重启以后系统能正常工作

  • 在所有系统状态被确认提交到备用节点后,当前的系统输出才会对外部可见

思路一

Primary/Backup 复制集,Primary 上运行 Remus 代码及其它应用程序,Backup 上只运行 Remus 代码,负责同步系统状态,每秒按以下步骤执行多次(每次成为一个 epoch):

  1. 暂停 Primary

  2. 将 Primary 的所有内存,寄存器,硬盘数据传输到 Backup 中

  3. 恢复 Primary

当 Primary 发生故障时,启动 Backup 运行软件。

Q1:思路一正确吗?

不正确。例如 Client 向 Primary 发送一个 DB 写请求,Primary 将数据写入 DB 后,告诉 Client 已经完成,但在 Primary 尚未向 Backup 同步最新状态时,Primary 发生故障,这时候启动 Backup,Backup 中的 DB 尚未写入数据,而 Client 认为数据已经写入。

Q2:思路二高效吗?

不高效。光硬盘数据就不可能在 1 秒内写完,更不用说每秒同步多次了。

让思路一可行

针对 Q1:我们可以在 Primary 与 Backup 完成当前写操作的状态同步后,才允许 Primary 将请求结果返回给 Client,如下图所示:

针对 Q2:Remus 有两种改进手段

  • 每次同步只做增量更新

  • 在同步的时候,可以超前执行新的请求

其它实现过程中可能遇到的问题:

  • 如果 Primary 在于 Backup 同步数据之后,发送响应给 Client 之前崩溃,怎么办?

  • 网络分区可能引起 Remus 误将 Backup 激活

  • 如果区域性断电导致 Primary 和 Backup 都故障了怎么办

  • 当 Primary 回复,Remus 如何让 Primary 的状态更新到最新

  • epoch 的时间长短如何决定

参考

PreviousRPC and ThreadsNextLab: Primary/Backup Key/Value Service

Last updated 6 years ago

6.824-2015-Lecture 3: Primary/Backup Replication, ,

notes
video
图 1 - Remus Primary/Backup 结构示意图
图 2 - Remus Primary/Backup 同步过程示意图