#gossip #swim #distributed-systems #service-discovery #networking

memberlist-core

一个高度可定制、适应性强、异步运行时无关的Gossip协议,有助于管理集群成员和成员故障检测

5个版本

0.2.1 2024年4月14日
0.2.0 2024年4月13日
0.1.5 2024年3月27日

#12 in #gossip

每月47次下载
用于 5 个crate(4个直接使用)

MPL-2.0 许可证

600KB
15K SLoC

Memberlist

一个高度可定制、适应性强、运行时无关且WASM/WASI友好的Gossip协议,有助于管理集群成员和成员故障检测。

将HashiCorp的memberlist移植并改进到Rust。

github LoC Build codecov

docs.rs crates.io crates.io license

英文 | 简体中文

介绍

memberlist是一个使用基于Gossip协议管理的集群成员和成员故障检测的Rust crate。

此类库的使用范围很广:所有分布式系统都需要成员资格,而memberlist是管理集群成员和节点故障检测的可重用解决方案。

memberlist最终是一致的,但平均收敛速度很快。可以通过协议的各种旋钮来大幅调整其收敛速度。通过尝试通过多个路由与可能已死亡节点通信来检测节点故障和部分容忍网络分区。

memberlist对WASM/WASI友好,所有crate都可以编译为wasm-wasiwasm-unknown-unknown(需要配置crate功能)。

设计

与原始的Go实现不同,Rust的memberlist使用高度通用和分层的架构,用户可以轻松实现自己的组件并将其插入到memberlist中。用户甚至可以自定义自己的IdAddress

以下是层次结构

  • 传输层

    默认情况下,Rust的memberlist提供两种传输方式 — QuicTransportNetTransport

    • 运行时层

      agnostic trait的Runtime trait提供异步运行时无关性,默认支持tokioasync-stdsmol。用户可以实现自己的Runtime并将其插入到memberlist中。

    • 地址解析层

      地址解析层由nodecraft's AddressResolver trait

      支持。

    • 序列化/反序列化层

      默认情况下,Rust的memberlist使用length-prefix encoding (Lpe)来序列化和反序列化消息为字节或反之。Lpe的实现试图在序列化和反序列化过程中尽量避免重新分配。

      但是,用户可以通过实现Wire trait来使用任何其他序列化和反序列化框架。

    • NetTransport

      NetTransport的三个不同的内置流层

    • QuicTransport

      QUIC传输是一个实验性的传输实现,它经过了良好的测试,但仍处于实验阶段。

      QuicTransport的两种不同的内置流层

    用户仍然可以为自己不同的传输实现实现自己的流层。

  • 代理层

    此层用作不同类型消息的触发器。

    • 代理

      如果客户端想要挂钩到Memberlist的gossip层,则必须实现Delegate trait。所有方法都必须是线程安全的,因为它们可能会并发调用。

      以下是一些子代理trait

      • AliveDelegate

        用于使客户端参与处理节点“存活”消息。当一个节点通过数据包gossip或承诺推送/拉取加入时,我们通过存活消息更新该节点的状态。这可以用于使用应用特定逻辑过滤节点,并防止将其视为对等节点。

      • ConflictDelegate

        用于通知客户端,一个节点已尝试加入,这将导致名称冲突。如果两个客户端配置了相同的名称但不同的地址,就会发生这种情况。

      • EventDelegate

        一个更简单的代理,仅用于接收有关成员加入和离开的通知。此代理中的方法可能会由多个线程调用,但永远不会并发调用。这允许你进行排序推理。

      • MergeDelegate

        用于使客户端参与潜在集群合并操作。具体来说,当节点执行承诺推送/拉取(作为加入的一部分)时,代理会参与并允许根据自定义逻辑取消加入。合并代理不是作为推送/拉取反熵的一部分调用的。

      • NodeDelegate

        用于管理节点相关事件。例如,元数据

      • PingDelegate

        用于通知观察者完成一个ping消息往返所需的时间。它也可以用于将任意字节数据写入ack消息中。请注意,为了在RTT估计中有意义,此委托不适用于间接ping,也不适用于通过承诺连接发送的备用ping。

    • CompositeDelegate

      CompositeDelegate是一个有用的结构体,可以将Delegate拆分为多个小委托,这样用户在只想自定义Delegate中的一些方法时,无需实现完整的Delegate

协议

memberlist基于"SWIM: Scalable Weakly-consistent Infection-style Process Group Membership Protocol"。然而,Hashicorp的开发者在多个方面扩展了该协议。

为了提高传播速度和收敛速度,进行了一些扩展。另一组扩展,Hashicorp的开发者称之为Lifeguard,是为了使memberlist在消息处理缓慢(由于CPU饥饿、网络延迟或丢失等因素)的情况下更加健壮。有关所有这些扩展的详细信息,请参阅Hashicorp的论文"Lifeguard : SWIM-ing with Situational Awareness",以及memberlist源代码。

安装

[dependencies]
memberlist = "0.1"

问答

  • Rust的memberlist实现与Go的memberlist兼容吗?

    不兼容,但也兼容!默认情况下,它们不兼容。但关键是序列化/反序列化层,Go的memberlist使用msgpack作为序列化/反序列化框架,所以从理论上讲,如果你可以实拟一个与Go的memberlist兼容的Wire特质,那么它们就兼容了。

  • 如果Go的memberlist添加更多功能,这个项目也会支持吗?

    是的!而且这个项目可能还会添加更多Go的memberlist所没有的功能。例如,支持wasmer、绑定到其他语言等。

  • agnostic:帮助您开发运行时不可知crate
  • nodecraft:为分布式系统提供无缝节点操作,提供节点识别和地址解析的基础特质。
  • transformable:在结构化和字节表示之间转换。
  • peekable:可查看的读取器和异步读取器

许可证

memberlist受MPL-2.0许可证的约束。

有关详细信息,请参阅LICENSE

版权(c)2024 Al Liu。

版权(c)2013 HashiCorp,Inc。

依赖项

~13–27MB
~409K SLoC