#ip-address #primary #host #protocols #virtual #addresses #openbsd

carp

用于通用地址冗余协议(CARP)的纯 Rust 库

1 个不稳定版本

使用旧的 Rust 2015

0.1.0 2016 年 4 月 29 日

#25#openbsd

MIT/Apache

99KB
2K SLoC

通用地址冗余协议

carp-rs 允许多台主机共享相同的虚拟 IP 地址,以便提供自动故障转移。它是一个安全的、无专利的通用地址冗余协议(CARP,OpenBSD 对专利充盈的 VRRP 的替代方案)的便携式用户空间实现。

CARP 协议的优点是:非常低的开销、加密签名消息、不同操作系统之间的互操作性,以及无需在冗余主机之间建立任何专用额外网络链路。

该项目是从 https://github.com/jedisct1/UCarp 分支出来的,并重新许可为 LGPL。原始 BSD 许可证已移动到 COPYING.OLD 文件。

Build Status

编译

  • 系统上必须安装 libpcap (http://www.tcpdump.org/),包括开发文件(头文件)。
    • 在 Ubuntu 上:apt-get install libtool autoconf gettext libpcap0.8 libpcap0.8-dev libpcap-dev sqlite3 libsqlite3-dev

Rust 库仅在与 Ubuntu precise 64 测试过。

示例

examples/basic.rs 中有一个基本示例。要运行此示例

sudo RUST_LOG=carp=debug cargo run --example basic -- -i eth3 -s 10.0.2.40

注意:carp 使用 pcap 库,某些操作需要 root 权限。

您应该看到类似以下输出的内容

INFO:carp::carp: Using [eth3] as a network interface
INFO:carp::carp: Local advertised ethernet address is [08:00:27:f4:18:d5]
DEBUG:carp::carp: srcip = 10.0.2.40
DEBUG:carp::carp: mcast = 224.0.0.18
DEBUG:carp::carp: Next primary timeout in SystemTime { tv_sec: 1461942434, tv_nsec: 156471873 }
DEBUG:carp::carp: Interface switched to running
DEBUG:carp::carp: Next primary timeout in SystemTime { tv_sec: 1461942434, tv_nsec: 157813524 }
INFO:carp::carp: Remote primary down. Switching to Primary state
In my_up_callback()
DEBUG:carp::carp: Next primary timeout in SystemTime { tv_sec: 1461942435, tv_nsec: 177767553 }

主选择过程

当 carp 首次运行时,它以备份模式启动并监听网络以确定是否应成为主节点。如果在任何时间点,超过节点广告间隔的三倍(定义为广告基(秒)加上一个调整因子,广告偏差)没有听到对等体的 CARP 广告,则节点将过渡为自己成为主节点。

从备份过渡到主节点意味着

  1. 调用指定的回调函数以将 vip 分配给本地系统。
  2. 向网络发送免费 ARP 以声明 vip。
  3. 每隔一定时间向网络发送 CARP 广告。

从主节点过渡到备份节点意味着

  1. 调用指定的回调函数以从本地系统删除 vip

要了解CARP(虚拟路由冗余协议)的工作原理,重要的是要注意广告间隔不仅用于主节点发送每个CARP广告的时间间隔,而且作为一种优先级机制,较短(即更频繁)的间隔更好。间隔基数和偏移值存储在CARP广告中,并被其他节点用来做出某些决策。

默认情况下,一旦一个节点成为主节点,它将无限期地保持为主节点。如果您喜欢/想要/需要这种行为,或者没有首选的主节点,那么请在所有主机上选择相同的间隔。如果由于任何原因您要在主机上选择不同的间隔,那么随着时间的推移,具有最短间隔的那个节点倾向于成为主节点,因为机器重新启动、故障等。

值得注意的是,有一个冲突解决算法,如果在主节点听到另一个具有相同(就广告间隔而言)的主节点时,具有较低IP地址的那个将保持为主节点,而另一个将立即降级自己。这只是为了消除波动并快速确定谁应该保持为主节点。这种情况不应该经常发生,但确实可能发生。

如果您希望“首选”主节点始终成为主节点(即使另一个主机已经是主节点),请添加抢占开关,并通过广告基数和偏移值分配一个较短的间隔。这将导致首选节点忽略广告较长间隔的主节点并提升自己为主节点。旧的主节点将很快听到首选节点广告较短的间隔并立即降级自己。

总之,以下情况下备份将成为主节点:

  • 没有人广告3次其自己的广告间隔
  • 您指定了--preempt并且它听到了具有较长间隔的主节点

主节点将成为备份,如果

  • 另一个主节点广告了较短的间隔
  • 另一个主节点广告了相同的间隔,并且具有较低的IP地址

原作者

carp-rs项目基于原UCarp项目许多人的辛勤工作。

  • Frank DENIS
  • Eric Evans - Debian软件包的维护者。
  • David H - Fink软件包的维护者。
  • Richard Bellamy - 在Solaris可移植性方面有很大帮助。
  • Russell Mosemann - 中立模式和错误修复。
  • Dean Gaudet - EINTR处理、记录执行错误、--passfile。
  • Steve Kehlet和Marcus Goller - 修复了发出有害的免费ARP的无效代码,并在具有相同间隔和偏移值的多个节点启动时改善了行为。Steve在很多事情上都提供了很大帮助。
  • Tim Niemeyer - 确保在首选主节点的网络连接波动时重制工作。
  • Serve Sireskin - --ignoreifstate选项。

依赖项

~10MB
~173K SLoC