CARP(共享地址冗余协议)
2021-03-18 21:12:44 阿炯

共享地址冗余协议(英语:Common Address Redundancy Protocol,缩写 CARP),一种网络协议,能让多台网络主机共享同一个IP地址。它的设计目标在于为故障移转(failover)提供冗余的主机作为备援,能使用在防火墙及路由器上。在某些状况下,还能提供负载平衡的功用。

CARP is the Common Address Redundancy Protocol. It's a free, secure alternative to the "Virtual Router Redundancy Protocol" and the "Hot Standby Router Protocol." CARP was created and is maintained by the OpenBSD project and available on FreeBSD. Properly setup, carp can be a secure insurance policy in case of software malfunction or hardware failure.

这个协议的功能类似于热备份路由器协议(HSRP)与虚拟路由器备援协议(VRRP)。因为思科拥有热备份路由器协议(HSRP)的专利,为了避免美国专利第5,473,599号的限制,由OpenBSD团队开发这个协议来代替,在FreeBSD及OpenBSD操作系统上运行,也可以移植到Linux上。


小插曲

思科发展的热备份路由器协议(HSRP),申请了上述的专利号;在虚拟路由器备援协议(VRRP)中,也应用了思科的部分专利。在OpenBSD开发者将VRRP移植到OpenBSD上之后,思科通知OpenBSD团队,戏曲性地宣称拥有专利。OpenBSD开发者因此决定开发出自有的热备协议,即CARP。

UCARP

UCARP允许多个主机共享一个虚拟的ip地址,以提供自动的故障恢复功能,当其中某个主机宕机时,其它的主机会自动接管服务。UCARP是CARP协议(通用地址冗余协议,最早在OpenBSD上实现)的linux实现版本,同时也能移植到其它多个Unix平台,UCARP的官方网站目前已不可用。CARP协议的特点在于其非常低的开销,主机间使用加密数据传递信息,并且在冗余主机之间不需要任何额外的网络链接(在README中有ucarp的简单部署实例)。


命令参数

--inter (-i <if>: bind interface <if> (网络接口绑定网络接口)
--srcip=<ip> (-s <ip>: source (real) IP address of that host (源地址真实ip)
--vhid=<id> (-v <id>: virtual IP identifier (1-255) (虚拟ip标识 (1-255))
--pass=<pass> (-p <pass>: password (密码)
--preempt (-P): becomes a master as soon as possible (以最快的速度成为主服务器的角色)
--neutral (-n): don't run downscript at start if backup (如果是备份主机,启动的时候不运行downscript.)
--addr=<ip> (-a <ip>: virtual shared IP address( 共享虚拟ip地址)
--help (-h): summary of command-line options (帮助)
--advbase=<seconds> (-b <seconds>: advertisement frequency (广播的频率(秒))
--advskew=<skew> (-k <skew>: advertisement skew (0-255) (不广播)用来设置公告间隔时间, 公式(以秒计)为advskew/256+advbase。advbase可以减少网络流量或设置更长的主力机"轮循"时间(直至备份机来顶替它);advskew设置哪台热备份计算机在故障转移时优先成为主力机(这是必需的)
--upscript=<file> (-u <file>: run <file> to become a master (运行一个脚本文件,使本服务器成为主服务器)
--downscript=<file> (-d <file>: run <file> to become a backup (运行一个脚本文件,使本服务器成为从服务器)
--deadratio=<ratio> (-r <ratio>: ratio to consider a host as dead (认定主机已经死掉的比率(阀值))
--shutdown (-z): call shutdown script at exit (在退出的时候,执行关闭的脚本)
--daemonize (-B): run in background (运行在后台)
--facility=<facility> (-f): set syslog facility (default=daemon) (设置syslog工具,默认在后台)

参数简述:
-v vip标识
-p 密码
-a vip地址
-u 当机器为升为master时运行的脚本
-d 当机器降为slave时运行的脚本
-s 心跳ip地址
-P与-k结合最小的为master机器
-B 以daemon方式运行


Keepalived相比

两者除了在IP层上提供HA服务功能外,Keepalived还能提供基于端口服务的检测,与LVS的搭配使用也是业界主流的HA+LB的解决方案。而Carp似乎继承了OpenBSD的特点,专一而稳定,对功能性并不在乎;系统层的软件稳定性应该重于功能性,相对于Keepalived的频繁更新,Carp显得沉寂了许多,相对于Keepalived提供的多种检测后端服务的方式,Carp更认为这不关我的事,我只保证IP层的存活。

#########################
#ucarp configuration
#下面为在两台debian 10上实验出来的参数
#vip:172.18.0.10
#########################

Master(11)

/usr/sbin/ucarp -i eth0 -s 172.18.0.11 -z -v 10 -p PASSWD -a 172.18.0.10 --preempt --shutdown -u /opt/bin/ucarpup.sh -d /opt/bin/ucarpdn.sh  -k 100 -b 2

/usr/sbin/ucarp --inter eth0 --srcip 172.18.0.11 --pass PASSWD --addr 172.18.0.10 --upscript /opt/bin/ucarpup.sh --downscript /opt/bin/ucarpdn.sh --advskew 100 --advbase 2 --vhid 10 --preempt --shutdown --daemonize

Backup(12)

/usr/sbin/ucarp -i eth0 -s 172.18.0.12 -z -v 10 -p PASSWD -a 172.18.0.10 --shutdown --neutral -u /opt/bin/ucarpup.sh -d /opt/bin/ucarpdn.sh -k 100 -b 2

/usr/sbin/ucarp --inter eth0 --srcip 172.18.0.12 --pass PASSWD --addr 172.18.0.10 --upscript /opt/bin/ucarpup.sh --downscript /opt/bin/ucarpdn.sh --advskew 100 --advbase 2 --vhid 10 --shutdown --daemonize


将其加入到自启动中

# vim /etc/rc.local
#!/bin/bash
#ucarp(master)
/usr/sbin/ucarp --inter eth0 --srcip 172.18.0.11 --pass PASSWD --addr 172.18.0.10 --upscript /opt/bin/ucarpup.sh --downscript /opt/bin/ucarpdn.sh --advskew 100 --advbase 2 --vhid 10 --preempt --shutdown --daemonize
#
# chmod +x /etc/rc.local