這兩天在詳細的看man carp文檔。發現原來carp不僅僅可以實現容錯移轉(failover)叢集,通過簡單配置還是可以先本地區域網路的負載平衡。
carp的負載平衡使用的是arpbalance功能,從字面意思理解為使用arp的負載平衡,也就是說是屬於osi7層模型的第二層——資料連結層。所以用arpbalance 只能應用於本地區域網路,無法實現更高層次的balance。
其原理大致如下
兩台伺服器a、b,分別建立兩個carp虛擬網卡a1、a2、b1、b2,其中a1、b1為一個carp組(即相同的vhid),其餘的兩塊網卡為另一個carp組。在第一個carp組中a1為 master,b1為slave。在第二個carp組中,正好與此相反,a2為slave,b2為master。這兩個carp組的虛擬ip相同。
於是arpbalance就可以在這兩個組之間進行輪轉。當使用carp1組的時候,由於a1為master。所以此時由a提供服務,當使用carp2組的時候,由於b2為master則此時由b提 供服務。
同時輪轉演算法是根據源ip地址進行hash演算法,保證同一個源地址由固定的carp組提供服務,可以保證用戶端的session等應用。
實現步驟如下
在伺服器a上修改設定檔
ee /etc/rc.conf #配置rc.conf檔案,分別建立carp虛擬網卡。增加如下內容
cloned_interfaces="carp0 carp1"
ifconfig_carp0="vhid 1 advbase 5 pass passwd 192.168.1.100/24"
ifconfig_carp1="vhid 2 advbase 5 advskew 100 pass passwd 192.168.1.100/24"
ee /etc/sysctl.conf #修改sysctl檔案啟用carp的arpbalance和carp搶佔功能。增加如下內容
net.inet.carp.preempt=1
net.inet.carp.arpbalance=1
在伺服器b上修改大致相同,只是carp網卡的有一點變動
ee /etc/rc.conf #配置rc.conf檔案,分別建立carp虛擬網卡。增加如下內容
cloned_interfaces="carp0 carp1"
ifconfig_carp0="vhid 1 advbase 5 advskew 100 pass passwd 192.168.1.100/24"
ifconfig_carp1="vhid 2 advbase 5 pass passwd 192.168.1.100/24"
ee /etc/sysctl.conf #修改sysctl檔案啟用carp的arpbalance和carp搶佔功能。增加如下內容
net.inet.carp.preempt=1
net.inet.carp.arpbalance=1
重啟兩台伺服器即可生效。