1 个不稳定版本
使用旧的 Rust 2015
0.1.0 | 2016 年 4 月 29 日 |
---|
#25 在 #openbsd
99KB
2K SLoC
通用地址冗余协议
carp-rs 允许多台主机共享相同的虚拟 IP 地址,以便提供自动故障转移。它是一个安全的、无专利的通用地址冗余协议(CARP,OpenBSD 对专利充盈的 VRRP 的替代方案)的便携式用户空间实现。
CARP 协议的优点是:非常低的开销、加密签名消息、不同操作系统之间的互操作性,以及无需在冗余主机之间建立任何专用额外网络链路。
该项目是从 https://github.com/jedisct1/UCarp 分支出来的,并重新许可为 LGPL。原始 BSD 许可证已移动到 COPYING.OLD 文件。
编译
- 系统上必须安装 libpcap (http://www.tcpdump.org/),包括开发文件(头文件)。
- 在 Ubuntu 上:
apt-get install libtool autoconf gettext libpcap0.8 libpcap0.8-dev libpcap-dev sqlite3 libsqlite3-dev
- 在 Ubuntu 上:
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 广告,则节点将过渡为自己成为主节点。
从备份过渡到主节点意味着
- 调用指定的回调函数以将 vip 分配给本地系统。
- 向网络发送免费 ARP 以声明 vip。
- 每隔一定时间向网络发送 CARP 广告。
从主节点过渡到备份节点意味着
- 调用指定的回调函数以从本地系统删除 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