标签:PhxPaxos

共 4 篇文章

PhxPaxos 源码阅读笔记(三):PhxPaxos 设计简介

前置内容:建议对 Paxos 有基本理解后再阅读。

本篇主要是为了后续几篇讲算法实现做些铺垫,个人觉得在看代码之前对设计进行基本的了解是必须的,否则会是一头雾水。

因为只是简介,我只会把 PhxPaxos 中的一些概念稍微讲讲,更为详细的内容还是建议大家阅读微信团队的原文

我个人感觉 PhxPaxos 的实例-日志-状态机这样的设计是常见的一种实现思路,之前也有向同学请教了一下 X-Paxos 的设计,发现确实很类似,但是各个库出于各自对性能的要求,有着不同的优化取舍罢了(比如 X-Paxos 需要服务一些跨数据中心的高时延场景,所以 Pipelining 是个很好的优化手段)。

实例

相信了解过 Paxos 算法的读者都应该知道它最基本的能力:让多个进程(或节点)间达成一致,即它们均确定出同一个值。在确定值后,Paxos 组的成员中只要仍旧有多数派存活,该值将会一直被保持,从而能够容忍部分成员临时断线、掉线重启甚至丢失了该值。

我们知道,由于 Paxos 组内可能有多个 Proposer 同时提案 ...

阅读全文

PhxPaxos 源码阅读笔记(二):存储层

我原以为本篇不需要很多前置内容,但越写越发现还是需要,毕竟存储层存的内容已经和算法及实现息息相关了,所以建议还是先补充前置内容。

类似网络层,PhxPaxos 对存储层也进行了抽象,给用户留下了自行扩展的能力。本篇将对 PhxPaxos 内部实现的默认存储层进行介绍,方便有自行实现需求的用户可以将官方的设计作为参考。我大概理了一遍设计后,发现并不是太复杂,所以篇幅应该不会太长。

接口

在 include/phxpaxos/storage.h 中定义了存储层所需要提供的一些接口,如下:

class LogStorage
{
public:
    virtual ~LogStorage() {}

    virtual const std::string GetLogStorageDirPath(const int iGroupIdx) = 0;

    virtual int Get(const int iGroupIdx, const uint64_t llInstanceID, std::string & sValue) = 0 ...
阅读全文

PhxPaxos 源码阅读笔记(一):网络层

本篇不需要前置内容。

我在看源码的时候,如果对整体架构上有一些了解的话,会尽可能地以自底向上的顺序去看。PhxPaxos 因为之前阅读过相关的文章,所以对于架构也比较清楚,于是也优先去阅读和消息交换相关的代码。毕竟是一个分布式算法的实现,起码现阶段是逃不开网络的,所以先把它看完也有利于后续忘掉消息交换细节专心理解算法。

接口

对于网络层,PhxPaxos 为使用者留了扩展的余地,在 include/phxpaxos/network.h 中定义了网络层所需要提供的一些接口,这里简单的贴一下:

class NetWork
{
public:
    NetWork();
    virtual ~NetWork() {}

    //Network must not send/recieve any message before paxoslib called this funtion.
    virtual void RunNetWork() = 0;

    //If paxoslib call this function, network ...
阅读全文