帮助理解分布式系统复制算法的开源项目


分布式系统中,快速编码和测试对于理解Paxos等复杂概念至关重要。这个小框架来快速编写和测试各种复制机制。

可以快速实现复制算法并编写 JUnit 测试。它还提供了引入进程崩溃、网络断开、网络延迟和时钟偏差等故障的基本方法。

这是快速构建和测试复制算法的基本框架。它不需要任何额外的设置(例如 Docker)来设置集群,并且允许编写简单的 JUnit 测试来测试复制机制。创建该框架是为了学习和教授各种分布式系统技术,以便在探索分布式系统概念的同时测试工作代码。

它提供了在副本和测试实用程序之间建立消息传递通信的机制,以快速形成副本集群、引入网络故障以及断言副本的状态。

该存储库还包含基本复制算法的示例代码,例如基本多数仲裁、Paxos、MultiPaxos 和 Viewstamped 复制。

Replica类
Replica类实现了网络服务的基本构建块,包括:

  • 侦听提供的 IP 地址和端口。
  • 管理用于请求处理的单线程执行器,实现 单一更新队列模式
  • 提供请求等待列表模式的基本实现。
  • 支持消息的序列化和反序列化(目前使用JSON)。

这些构建块足以实现和测试任何网络服务。

编写 JUnit 测试
提供实用程序来创建多个Replica实例。这些实例是 Java 对象,很容易检查和测试。查看QuorumKVStoreTest以获取如何编写测试的示例。可以通过创建您创建的副本实现的多个实例来形成集群。

例如,创建一个具有名为“athens”、“byzantium”和“cyrene”副本的三节点集群,如下所示:

class QuorumKVStoreTest {
  QuorumKVStore athens;
  QuorumKVStore byzantium;
  QuorumKVStore cyrene;
  
  @Override
  public void setUp() throws IOException {
    //no. servers = no. of replicas.
    this.nodes = TestUtils.startCluster(Arrays.asList(
"athens",
                   
"byzantium", "cyrene"),
            (name, config, clock, clientConnectionAddress, peerConnectionAddress, peerAddresses) -> new QuorumKVStore(name, config, clock, clientConnectionAddress, peerConnectionAddress, peerAddresses));

    athens = nodes.get(
"athens");
    byzantium = nodes.get(
"byzantium");
    cyrene = nodes.get(
"cyrene");
  }
}

失败
Replica允许您使用用于丢弃或延迟消息的实用方法向其他节点引入网络故障。可以在QuorumKVStoreTest中找到引入网络故障的测试示例。例如,将消息从节点“athens”删除到“byzantium”
 athens.dropMessagesTo(byzantium);

可以使用以下命令重新建立连接
 athens.reconnectTo(cyrene);

复制算法
该存储库包含示例复制机制,包括:

  1. 基本读/写仲裁
  2. 法定人数共识
  3. 单值 Paxos
  4. 基于 Paxos 的键值存储
  5. 基于Paxos的复制日志
  6. 多进程Paxos
  7. 查看标记复制

探索这些算法以了解和试验不同的复制技术。

该框架是在编写《分布式系统模式》一书时构建的。作者用它来在研讨会上教授复制技术。