论文:Using Paxos to Build a Scalable, Consistent, and Highly Available Datastore

Motivation

可扩展性: 随着数据量增加, 要求增加新的设备存放数据. 一种做法就是将数据库 按Key拆分, 分布在不同机器上, 每个机器负责一定Key范围内的数据. 而手动实现拆分繁琐, 容易出现问题. 所以需要一种架构支持拆分.

容错性: 数据库保存在成百上千的普通机器上, 因此非常容易出现问题. 为了保证高可用性, 必须实现容错.

Architecture

  • 基于Zookeeper, Paxos.
  • 将数据库按Key拆分. 如Key为0-500, 可拆分为0-199, 200-399, 400-500三个范围, 分别包含对应的行.
  • 使用3副本, 每个副本分别存放在不同机器上, 存放一个范围的多个机器称为一个cohort.
  • 不同范围的数据可以保存在同一机器上, 因此一个机器可以属于多个cohort.
  • log sequence number(LSN): 用于唯一标识cohort中的日志, 随日志单调递增.
  • 一般情况下每个请求都是针对一行数据.

Replication Protocol

写请求的处理

  1. 处理写请求W时, 请求首先被导向请求写的数据所属的cohort的Leader, Leader首先在日志中记录此请求, 然后, 在将日志写到磁盘的同时, 将W附加到commit queue的末尾, 并发送propose message 到它的Follower.
  2. Follower收到写请求时, 记录对应日志到磁盘, 在将W附加到commit queue末尾, 然后向Leader返回ack.
  3. 由于使用3副本, Leader只要收到一个ack就可以保证大多数的要求. 所以, 当收到一个ack时, Leader将W应用到memtable, 并commit W. 最后回复请求, 表明写请求执行成功. Leader周期性地向Follower发送包含一个LSN值的commit message, 通知Follower将小于等于此LSN 的log都commit. 节点记录最后提交的日志的LSN, 记为last committed LSN, 保存到磁盘中.

读请求的处理

读数据时, 可以通过参数指明是strong consistency还是timeline consistency. 前者将向Leader 请求数据, 后者可以向Follower请求数据, 以减小Leader的负载, 但是可能会读到旧数据.

Leader选举

通过Zookeeper实现, 同一cohort的每个机器在相同目录下创建文件, 文件包含了自己的最后一个日志的 LSN, 记为n.lst. 选择n.lst最大的节点作为Leader.

Recovery

Follower Recovery

记 f.cmt 和 f.lst 分别代表节点日志中已commit的最后一个LSN和已保存的最后一个LSN. Follower恢复分为两个阶段: local recovery 节点从最近的checkpoint重放小于等于f.cmt的日志, 节点便恢复到f.cmt对应的状态. catch up 节点向Leader发送f.cmt, Leader就可以确定节点的状态, 并向其发送f.cmt之后的日志记录.

Leader Takeover

当Leader节点发生错误时, 需要选举出新的Leader. 新的Leader必须包含所有之前的Leader已经commit 的log. 选举策略如上所述. 但是可能存在这样的情况, 上一个leader fail后, 可能已经commit了部分write操作, 但是消息没有被其他follower接收到. 因此产生新的leader后, 它就要查看follower的最后commit的写操作是否落后于自己, 如果是, 就再次发送该写消息, 并通知folower commit. 当存在follower已经与leader同步, 就可以开始响应客户端的写操作.

论文研读之Spinnaker的更多相关文章

  1. AD预测论文研读系列2

    EARLY PREDICTION OF ALZHEIMER'S DISEASE DEMENTIA BASED ON BASELINE HIPPOCAMPAL MRI AND 1-YEAR FOLLOW ...

  2. AD预测论文研读系列1

    A Deep Learning Model to Predict a Diagnosis of Alzheimer Disease by Using 18F-FDG PET of the Brain ...

  3. GoogLeNetv4 论文研读笔记

    Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning 原文链接 摘要 向传统体系结构中引入 ...

  4. GoogLeNetv3 论文研读笔记

    Rethinking the Inception Architecture for Computer Vision 原文链接 摘要 卷积网络是目前最新的计算机视觉解决方案的核心,对于大多数任务而言,虽 ...

  5. GoogLeNetv2 论文研读笔记

    Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift 原文链接 摘要 ...

  6. GoogLeNetv1 论文研读笔记

    Going deeper with convolutions 原文链接 摘要 研究提出了一个名为"Inception"的深度卷积神经网结构,其目标是将分类.识别ILSVRC14数据 ...

  7. < AlexNet - 论文研读个人笔记 >

    Alexnet - 论文研读个人笔记 一.论文架构 摘要: 简要说明了获得成绩.网络架构.技巧特点 1.introduction 领域方向概述 前人模型成绩 本文具体贡献 2.The Dataset ...

  8. 《MapReduce: Simplified Data Processing on Large Clusters》论文研读

    MapReduce 论文研读 说明:本文为论文 <MapReduce: Simplified Data Processing on Large Clusters> 的个人理解,难免有理解不 ...

  9. 《The Design of a Practical System for Fault-Tolerant Virtual Machines》论文研读

    VM-FT 论文研读 说明:本文为论文 <The Design of a Practical System for Fault-Tolerant Virtual Machines> 的个人 ...

随机推荐

  1. android 学习 之 布局(上)

    学习安卓布局前,先了解三个属性值: 1.fill_parent: 设置一个构件的布局为fill_parent将强制性地使构件扩展,以填充布局单元内尽可能多的空间 2.match_parent: And ...

  2. mysql 百万级数据库优化方案

    https://blog.csdn.net/Kaitiren/article/details/80307828 一.百万级数据库优化方案 1.对查询进行优化,要尽量避免全表扫描,首先应考虑在 wher ...

  3. django多对多数据库建立 以及数据的传输 并进行增加 删除 修改

    多对多数据库的建立 class Host(models.Model): nid = models.AutoField(primary_key=True) #自增id hostname = models ...

  4. warning LNK4099: PDB 'vc100.pdb' was not found... 解决方案

    使用VS2010在编译得代码工程的时候,原本在debug下是没有问题,但是在release下编译始终会报: “warning LNK4099: PDB 'vc100.pdb' was not foun ...

  5. 将bmp文件转换为jpg文件

    procedure TForm1.Button1Click(Sender: TObject);(*压缩MBP为JPEG;但是没有提供压缩比可选项凑合用吧,大概1/3 ^_^:Note:必须加上JPEG ...

  6. How To Use Google Flags

    [How To Use Google Flags] 1.Commandline flags are flags that users specify on the command line when ...

  7. Java的类名与文件名必须一致

    1.Java保存的文件名必须与类名一致:2.如果文件中只有一个类,文件名必须与类名一致:3.一个Java文件中只能有一个public类:4.如果文件中不止一个类,文件名必须与public类名一致:5. ...

  8. Java API使用(不断更新中)

    实例1 BigInteger的构造函数public BigInteger (String val, int radix)的使用 上面的构造函数,val是各种进制的字符串,比如二进制的110,八进制的7 ...

  9. Error generating final archive: Unable to get debug signature key

    在调试程序时,发生下面的错误: Error generating final archive: Unable to get debug signature key 解决办法: 删除下面的文件: C:\ ...

  10. 解决windows搭建jenkins执行selenium无法启动浏览器问题

    因为jenkins是用windows installer 安装成windows的服务了,那么jenkins是一个后台服务,所以跑selium cases 的时候不显示浏览器 Step 1. Contr ...