文档章节

PacificA 一致性协议解读

黑客画家
 黑客画家
发布于 06/21 14:31
字数 1229
阅读 36
收藏 0

PacificA 的 paper 在 08 年左右发出来的,比 Raft 早了 6,7 年。

在 PacificA 论文中,他们强调该算法使用范围是 LAN (Local Area Network),讲白了就是对跨机房不友好。

不管是 ZAB,Raft,还是 PacificA,都是基于实用主义,把 log replication 和 leader election 分开,不像 paxos,把两个问题合在一起想。

log replication

日志复制流程与 raft 相似:每条日志具有一个序列号(serial number),primary 复制日志给 secondaries,secondary 接收到后返回 ack。

唯一不同的是,PacificA 要求收到所有节点的 ack 后,该请求才算提交,而在 raft 中,只需过半节点(quorum)即可提交。这也是该算法不利跨机房的原因,但这种限制很大程度上能够简化协议。

leader election

一般高可用系统会用 zk/etcd 选主,而 zk/etcd 作为管理者本身,则需要用复杂的一致性协议来选主。PacificA 作为一个一致性协议另辟蹊径,不守套路,选择直接用 zk/etcd(用论文的说法叫 global configuration manager)来做选主。

一个一致性协议实现选主的方法是使用另一个一致性协议,这算是一个亮点。因为 zk/etcd 更多是针对元数据存储做的系统,需要做普通数据分布式存储的时候,PacificA 就有其意义了。换句话说,PacificA 只是保障普通数据高可用的,不会抢占其他一致性协议的市场,它们是互补的关系。

PacificA 中 primary 与 secondaries 之间会使用心跳探活(论文里把 心跳 叫 Beacon )。与 Raft 类似的,secondary 探测不到 primary,就会向 configuration manager 申请换主

PacificA 的 leader election 以 membership reconfiguration (成员变更)的方式来进行,这点很不一样,因为 reconfiguration 在其他一致性协议里是一个比较难的事情,一般不轻易做。下面细讲。

reconfiguration

由于有 configuration manager 的帮助,reconfiguration 变得比较简单:向 zk 做一次 compare-and-swap 原子配置更新即可。

理论上这种方式可以轻松做到一次性变更多个成员(相比起 raft 要简单许多)。

上面说到,secondary 探测不到 primary,就会向 configuration manager 申请换主,做法就是要求让 primary 退群;而 primary 探测不到 secondary 时,日志复制无法进行下去,这时 primary 也会申请让 secondary 退群。

这里很显然的一个问题是 secondary 和 primary 互不相通的时候,会互相让对方退群,造成一败俱伤局面。PacificA 在这里做了一个约定:primary 总会先于 secondary 让对方退群。做法也很简单,让 primary timeout < secondary timeout 即可。

alternative

论文里虽然用组内心跳(primary 与 secondaries 之间的 heartbeat)来判活,但我们可以想,这不是必须的:

分布式系统里,每个节点通常会与一个中心资源管理器做心跳,一旦节点挂了,资源管理器就会找一台空闲机器新开节点。

在 PacificA,资源管理器可以作为 configuration manager,同时由于它能够做心跳探活,组内心跳则可以直接省去。换句话说:

资源管理器看到 primary 失活,则进行换主,看到 secondary 失活,则令其退群,primary 和 secondary 之间没有任何心跳。

在节点数较小的场景下,让资源管理器做成员心跳不存在什么压力。

group check

虽然 primary 和 secondaries 之间可以没有组内心跳,但是绝对不能没有状态同步

首先 commit point 需要同步。secondary 在收到 commit point 之后,才能够让这部分已提交日志被清理。

其次当前 term / ballot 和当前的 leader / primary 都需要同步。

另外事实上,需要组内同步的可能还包括一些应用相关的状态。在 XiaoMi/pegasus 中,这一负责组内同步的 rpc 被称为 group check。我们也用它同步热备份时的备份点。

在 Raft 中,group check 和 heartbeat 的功能被组合在一起,避免长时间无写请求时,节点间状态无法同步。

reconciliation

换主的时候一个问题是新 primary 需要把尚未提交的日志项提交了,算是完成旧 primary 的未竟之事。这个过程叫做 reconciliation

Implementation

众所周知 Raft 没有讲如何做日志存储的方案,尽管大家看了 logcabin 的 SegmentedLog 以后都知道大概怎么做了。PacificA 在论文里讲了这个问题,因为 PacificA 的 log 也需要考虑 overwriting,log compaction (checkpoint) 。不过一些相关点基本以前在 Raft 里讲过了,neverchanje/consensus-yaraft,这里就不再赘述。

本文转载自:

共有 人打赏支持
黑客画家
粉丝 127
博文 187
码字总数 463897
作品 0
杭州
高级程序员
Pegasus — 小米开源的分布式 Key-Value 存储系统

小米云存储团队开发的一个分布式 Key-Value 存储系统,最初的动机是弥补 HBase 在可用性和性能上的不足。系统的 Server 端完全采用 C++ 语言开发,使用 PacificA 协议支持强一致性,使用 Ro...

局长
2017/10/23
6
0
架构设计:系统存储(26)——数据一致性与Paxos算法(终)

(接上文《架构设计:系统存储(25)——数据一致性与Paxos算法(下)》) 如上图所示,Server 2在宕机前正在对log7 、log8 、log9 进行Paxos,并且自身已经完成赋值过程(但是其它节点都还没...

yinwenjie
2017/03/26
0
0
Pegasus 1.11.0 发布,小米分布式 KV 储存系统

Pegasus 是小米云存储团队开发的一个分布式 Key-Value 存储系统,最初的动机是弥补 HBase 在可用性和性能上的不足。Pegasus 系统的 Server 端完全采用 C++ 语言开发,使用 PacificA 协议支持...

王练
09/08
0
0
比传统事务快10倍?一张图读懂阿里云全局事务服务GTS

近日,阿里云全局事务服务GTS正式上线,为微服务架构中的分布式事务提供一站式解决方案。GTS的原理是将分布式事务与具体业务分离,在平台层面开发通用的事务中间件GTS,由事务中间件协调各服...

中间件小哥
05/28
0
0
Waymo旧金山重启自动驾驶汽车实地测试,意欲何为?

近日,谷歌旗下自动驾驶公司Waymo的克莱斯勒Pacifica车辆现身旧金山,在公共道路上进行测试。 虽然在旧金山测试自动驾驶车辆并不是什么新鲜事,但是Waymo的克莱斯勒Pacifica车辆再次现身让人...

雷锋网
01/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

web打印控件 LODOP的详细api

web打印控件 LODOP的详细api

wangxujun59
31分钟前
1
0
从一次小哥哥与小姐姐的转账开始, 浅谈分布式事务从理论到实践

分布式事务是个业界难题,在看分布式事务方案之前,先从单机数据库事务开始看起。 什么是事务 事务(Transaction)是数据库系统中一系列操作的一个逻辑单元,所有操作要么全部成功要么全部失...

中间件小哥
33分钟前
5
0
荣登Github日榜!微信最新开源MMKV

MMKV 开源当日即登Github Trending日榜,三日后荣登周榜。MMKV 在腾讯内部开源半年,得到公司内部团队的广泛应用和一致好评。 MMKV 是基于 mmap 内存映射的移动端通用 key-value 组件,底层序...

腾讯开源
43分钟前
3
0
前端取色工具:jcpicker

http://annystudio.com/software/colorpicker/#jcp-download

轻量级赤影
45分钟前
1
0
Swift - 将图片保存到相册

import Photos func loadImage(image:UIImage) { UIImageWriteToSavedPhotosAlbum(image, self, #selector(saveImage(image:didFinishSavingWithError:contextInfo:)), ni......

west_zll
51分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部