31.10. 共用地址冗余协议 (CARP

Contributed by Tom Rhodes.
Updated by Allan Jude.

共用地址冗余协议(Common Address Redundancy Protocol,简称 CARP)能够使多台主机共享同一 IP 地址和虚拟主机 ID(Virtual Host ID,简称 VHID)。 在某些配置中, 这样做可以提高可用性, 或实现负载均衡。

除了共享IP,每个主机都有自己的独立IP地址,方便管理和配置。共享IP地址的所有计算机都具有相同的VHID。每个虚拟IP地址的VHID必须在网络接口的广播域中是唯一的。

FreeBSD 内建 CARP,不过随着 FreeBSD 版本不通,配置可能会有些许不通。本节适用于 FreeBSD 10 之后的版本。

这个例子配置了三个主机的故障转移支持,这些主机都有唯一的IP地址,但提供相同的 web 内容。它有两个不同的主站,分别命名为hosta.examplex.orghostb.examplex.org,并有一个共享备份,命名为hostc.examplex.org

这些机器采用DNS轮询配置进行负载均衡。除了主机名和管理IP地址外,主机和备份机的配置完全相同。这些服务器必须具有相同的配置并运行相同的服务。发生故障切换时,只有当备份服务器能够访问相同的内容时,对共享的 IP地址上的服务请求才能得到正确的响应。备份机有两个额外的CARP接口,每个主内容服务器的都有一个IP地址。当发生故障时,备份服务器将接收故障的主机的IP地址。

31.10.1. 在FreeBSD 10 或更高版本使用 CARP

在启动时开启CARP,需加载 if_carp.ko 模块。 把如下的这行加入到 /boot/loader.conf

carp_load="YES"

要立即加载模块而不重新启动:

# kldload carp

对于喜欢使用自定义内核的用户,请在自定义内核配置文件中包括以下行,并按照 第 8 章 配置 FreeBSD 内核 章节介绍的方法重新联编内核:

device	carp

主机名、管理IP地址和子网掩码、共享IP地址和VHID都是通过在/etc/rc.conf中添加条目来设置的。这个例子是针对hosta.examplex.org的:

hostname="hosta.example.org"
ifconfig_em0="inet 192.168.1.3 netmask 255.255.255.0"
ifconfig_em0_alias0="inet vhid 1 pass testpass alias 192.168.1.50/32"

下一组条目为hostb.examplex.org。由于它代表第二个主站,所以它使用了不同的共享IP地址和VHID。但是,用pass指定的密码必须相同,因为CARP只会监听并接受来自具有正确密码的机器的广告(advertisement)。

hostname="hostb.example.org"
ifconfig_em0="inet 192.168.1.4 netmask 255.255.255.0"
ifconfig_em0_alias0="inet vhid 2 pass testpass alias 192.168.1.51/32"

第三台机器,hostc.examplex.org,配置为处理故障转移。该机器配置了两个CARP VHID,其中一个用于处理 master 的虚拟IP地址。CARP广告偏移(advertising skew),advskew用于确保备份主机的广告发布时间晚于主站,因为当有多个备份服务器时,advskew决定优先级。

hostname="hostc.example.org"
ifconfig_em0="inet 192.168.1.5 netmask 255.255.255.0"
ifconfig_em0_alias0="inet vhid 1 advskew 100 pass testpass alias 192.168.1.50/32"
ifconfig_em0_alias1="inet vhid 2 advskew 100 pass testpass alias 192.168.1.51/32"

配置了两个CARP VHID,意味着如果其中一个主服务器变得不可用,hostc.example.org就会注意到。如果一个主服务器在备份服务器之前不可用,备份服务器将接收共享的IP地址,直到主服务器再次变得可用。

注意:

如果原始主服务器可以使用,hostc.examplex.org将不会自动释放虚拟IP地址返回给它。要做到这一点,必须启用预置功能。该功能默认是禁用的,它是通过sysctl(8)net.inet.carp.preempt变量来控制的。管理员可以强制备份服务器将IP地址返回给主服务器:

# ifconfig em0 vhid 1 state backup

配置完成后,重启网络或操作系统。这样就启动了高可用功能。

CARP功能可以通过sysctl(8)手册页面中记录的几个carp(4)变量来控制。通过使用devd(8)可以从CARP事件中触发其他操作。

31.10.2. 在 FreeBSD 9(或更早版本)上使用 CARP

这些版本的 FreeBSD的 配置与上一节中描述的配置类似,不同之处在于必须首先创建CARP设备并在配置中引用它。

若需在系统启动时加载 CARP 内核支持模块if_carp.ko,请将以下内容添加到/boot/loader.conf中:

if_carp_load="YES"

要立即加载模块而不重新启动:

# kldload carp

对于喜欢使用自定义内核的用户,请在自定义内核配置文件中包括以下行,并按照 第 8 章 配置 FreeBSD 内核 章节介绍的方法重新联编内核:

device	carp

接下来在每台主机上创建 CARP 设备:

# ifconfig carp0 create

通过在/etc/rc.conf中添加所需的行来设置主机名、管理IP地址、共享IP地址和VHID。由于使用的是虚拟的CARP设备而不是别名,所以实际的子网掩码为/24,而不是/32。下面是hosta.examplex.org的配置条目:

hostname="hosta.example.org"
ifconfig_fxp0="inet 192.168.1.3 netmask 255.255.255.0"
cloned_interfaces="carp0"
ifconfig_carp0="vhid 1 pass testpass 192.168.1.50/24"

hostb.example.org

hostname="hostb.example.org"
ifconfig_fxp0="inet 192.168.1.4 netmask 255.255.255.0"
cloned_interfaces="carp0"
ifconfig_carp0="vhid 2 pass testpass 192.168.1.51/24"

第三台机器,hostc.example.org,配置为在主机发生故障时处理故障转移的机器:

hostname="hostc.example.org"
ifconfig_fxp0="inet 192.168.1.5 netmask 255.255.255.0"
cloned_interfaces="carp0 carp1"
ifconfig_carp0="vhid 1 advskew 100 pass testpass 192.168.1.50/24"
ifconfig_carp1="vhid 2 advskew 100 pass testpass 192.168.1.51/24"

注意:

FreeBSD GENERIC 内核中禁用了抢占。如果在自定义内核启用了抢占,则 hostc.example.org 可能不会将 IP 地址释放回原来的内容服务器。管理员可以使用以下命令强制备用服务器将 IP 地址返回给主服务器:

# ifconfig carp0 down && ifconfig carp0 up

这应该在与正确的主机对应的carp 接口上进行。

配置完成后,重启网络或操作系统。这样就启动了高可用功能。

本文档和其它文档可从这里下载: ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

如果对于FreeBSD有问题,请先阅读 文档,如不能解决再联系 <questions@FreeBSD.org>.

关于本文档的问题请发信联系 <doc@FreeBSD.org>.