CARP
CARP
CARP(Common Access Redundancy Protocol)共用地址冗餘協議,能夠使多台主機共享同一 IP 地址。在某些配置中,這樣做可以提高可用性,或實現負載均衡。這些主機也可以同時使用其他的不同的 IP 地址。
組合/聚合原則 [Composition/Aggregation Principle] CARP
用於軟體設計時指:
組合:Class Car{Tyre tyre;Engine engine} Class Tyre { } Class Engine { }
聚合:Class Man{Arm arm:Leg leg} Class Arm{ } Class Leg{ }
區別:聚合關係表明類之間不僅有簡單的組合關係,而且主類還可以決定聚合子類的生命周期。主類滅亡子類必滅。
使用CARP決定通過陣列解析Web請求的最佳路徑。請求解析路徑要麼判斷所請求的信息緩存在陣列中的精確位置,要麼決定ISA Server是否把請求路由到Internet上以檢索所請求的信息。
CARP是一個協議草案,用於在代理陣列中劃分URL空間。請求將被智能地路由到代理陣列中最有可能處理請求的任何成員。相關的協議是SCSP(伺服器高速緩衝存儲器同步協議),設計用於在冗餘伺服器環境中保存高速緩存信息。RFC 2334(Server Cache Synchron—ization Protocol—scsP,Aprill998)將SCSP描述為一個嘗試解決高速緩衝存儲器(同步/高速緩衝存儲器)複製問題的協議,當一組伺服器希望對它們的高速緩存中的被服務客戶機的狀態信息進行同步時發生該問題。SCSP演演算法被說成是與OSPF中使用的那些演演算法類似。該協議運行於一組伺服器之間,這些伺服器與服務客戶機一起同步工作,例如,在一個Web站點或一個企業伺服器場。這些伺服器在地理上也可以是分散的,其中一些伺服器位於遠程站點。
要啟用 CARP 支持,必須在 FreeBSD 內核配置中增加下列選項,並重新編譯內核:
device carp
這樣就可以使用 CARP 功能了,一些具體的參數,可以通過一系列 sysctl OID 來調整。
OID | 描述 |
net.inet.carp.allow | 接受進來的CARP包。默認啟用。 |
net.inet.carp.preempt | 當主機中有一個CARP網路介面失去響應時,這個選項將停止這台主機上所有的CARP介面。默認禁用。 |
net.inet.carp.log | 當值為0表示禁止記錄所有日誌。值為1表示記錄損壞的CARP包。任何大於1表示記錄CARP網路介面的狀態變化。默認值為1。 |
net.inet.carp.arpbalance | 使用ARP均衡本地網路流量。默認禁用。 |
net.inet.carp.suppress_preempt | 此只讀OID顯示抑制搶佔的狀態。如果一個介面上的連接失去響應,則搶佔會被抑制。當這個變數的值為0時,表示搶佔未被抑制。任何問題都會使OID遞增。 |
CARP 設備可以通過 ifconfig 命令來創建。
# ifconfig carp0 create
在真實環境中,這些介面需要一個稱作 VHID 的標識編號。這個 VHID 或 Virtual HostI dentification(虛擬主機標識)用於在網路上區分主機。
CARP 的作用之一是改善服務的可用性。
這個例子中,將為三台主機提供故障轉移服務,這三台伺服器各自有獨立的 IP 地址,並提供完全一樣的 web 內容。三台機器以 DNS 輪詢的方式提供服務。用於故障轉移的機器有兩個 CARP 介面,分別配置另外兩台伺服器的 IP 地址。當有伺服器發生故障時,這台機器會自動得到故障機的 IP 地址。這樣以來,用戶就完全感覺不到發生了故障。故障轉移的伺服器提供的內容和服務,應與其為之提供熱備份的伺服器一致。
兩台機器的配置,除了主機名和 VHID 之外應完全一致。在例子中,這兩台機器的主機名分別是 hosta.example. org 和 hostb.example. org。首先,需要將 CARP 配置加入到 rc.conf。對於 hosta.example. org 而言,rc.conf 文件中應包含下列配置:
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上,對應的rc.conf配置則是:
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"
注意:在兩台機器上由 ifconfig 的 pass 選項指定的密碼必須是一致的,這一點非常重要。carp 設備只會監聽和接受來自持有正確密碼的機器的公告。此外,不同虛擬主機的 VHID 必須不同。
第三台機器,provider.example. org 需要進行配置,以便在另外兩台機器出現問題時接管。這台機器需要兩個 carp 設備,分別處理兩個機器。對應的 rc.conf 配置類似下面這樣:
hostname="provider.example. org"
ifconfig_fxp0="inet 192.168.1.5 netmask 255.255.255.0"
cloned_interfaces="carp0carp1"
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"
配置兩個 carp 設備,能夠讓 provider.example. org 在兩台機器中的任何一個停止響應時,立即接管其 IP 地址。
注意:默認的 FreeBSD 內核可能啟用了主機間搶佔。如果是這樣的話,provider.example. org 可能在正式的內容伺服器恢復時不釋放IP地址。此時,管理員必須手工強制IP回到原來內容伺服器。具體做法是在 provider.example. org 上使用下面的命令:
# ifconfig carp 0 down &&i fconfig carp 0 up
這個操作需要在與出現問題的主機對應的那個carp介面上進行。
現在已經完成了CARP的配置,並可以開始測試了。測試過程中,可以隨時重啟或切斷兩台機器的網路。