负载均衡需要有的特性如下:

支持多服务器的服务池和轮询策略 支持自身HA 支持会话同步,在单机失效的情况下操持会话连接 我使用了VirtualBox建议模拟环境。我只是说明它的配置,不会有OpenBSD自身的安装和系统配置。

网络规划如下:

外网网段:192.168.1.xxx PFSYNC网段:10.10.9.xxx 内网网段:10.10.10.xxx 整体拓扑如下:

这里我们可以看到以下关键字,请自行google之,或到OpenBSD FAQ中了解:

CARP(Common Access Redundancy Protocol ) pf(packet fileter) Load Balance

我们对LB1机器的三个网卡配置如下:

/etc/hostname.pcn0 
inet 192.168.1.101 255.255.255.0 192.168.1.255 
/etc/hostname.pcn1 
inet 10.10.10.101 255.255.255.0 10.10.10.255 
/etc/hostname.pcn2 
inet 10.10.9.101 255.255.255.0 10.10.9.255 

相应的LB2也是对应的配置,只是ip不相同

后端服务器网络配置的重点是将它们的网关配置成为LB的后端CARP虚似IP。

/etc/mygate 
10.10.10.100

在LB1和LB2上配置CARP。LB会有两个虚似IP,一个是对外提供服务的VIP,一个是内部用于后端服务器的网关IP。它们都使用CARP来虚似,好在一个机器出现问题后由第二台机器接管它的服务。

先增加外网VIP的CARP接口:

LB1上增加carp0接口:

/etc/hostname.carp0 
inet 192.168.1.100 255.255.255.0 192.168.1.255 vhid 1 pass yourpasswd carpdev pcn2 advskew 10 

LB2上也增加carp0接口:

/etc/hostname.carp0 
inet 192.168.1.100 255.255.255.0 192.168.1.255 vhid 1 pass yourpasswd carpdev pcn2 advskew 20

再增加内网网关的CARP接口:

LB1上增加carp1接口:

/etc/hostname.carp1 
inet 10.10.10.100 255.255.255.0 10.10.10.255 vhid 1 pass yourpasswd carpdev pcn2 advskew 10 

LB2上也增加carp1接口:

/etc/hostname.carp1 
inet 10.10.10.100 255.255.255.0 10.10.10.255 vhid 1 pass yourpasswd carpdev pcn2 advskew 20

以上carp的配置中advskew设置出了优先级别。数字越小的,获得优先级别越高,也就是最先能成为Master。

我们要使用pf来做轮询,以下配置在LB1和LB2上都相同:

在/etc/pf.conf中加入论询:

ext_if="pcn0"

sync_if="pcn2"

web_servers = "{ 10.10.10.11, 10.10.10.12, 10.10.10.13 }" 
rdr on $ext_if proto tcp from any to any port 80 -> $web_servers round-robin sticky-address 
pass on $sync_if proto pfsync

为了在carp生效后,一台机器失效让另一台机器接手服务时把当前的网络连接接手过去,我们需要把pf的状态表进行同步,这是通过pfsync完成的:

为LB1和LB2增加一个做sync的接口,在/etc/hostname.pfsync0中加入

up syncif pcn2

ok了。试试罢。 :)