負載均衡之四

6.4 vrrp_instance 負載均衡應用
  作者:田逸([email protected]
 
在“CDN緩存服務器的負載均衡”一節中,我們詳細的介紹了單實例(vrrp_instance)、單虛擬地址(vip)實現負載均衡的方方面面,在這個應用場景中,它最主要的特徵就是:主負載均衡器負責轉發,而備份負載均衡器則處於等待狀態,只有主負載均衡器失效,備份負載均衡器才承擔用戶請求轉發任務。在多vrrp_instance負載均衡應用場景下,我將讓兩個負載均衡器都轉發用戶請求,其主要用意在於提高資源的利用率。
6.4.1 vrrp_instance負載均衡需求描述
本方案要實現一個web及自定義的tcp服務的負載均衡.其中web爲3個站點,運行在同一個服務器上,以虛擬機的方式實現;自定義的tcp服務,使用兩個端口號,運行在不同的服務器上。
在這個環境中,共有14個服務器:2個負載均衡器(分別命名爲 lvs-1、lvs-2),4個web服務器,4個運行自定義端口爲3000 tcp服務的服務器,以及4個運行自定義端口爲4000 tcp服務的服務器。本方案仍然使用負載均衡的DR模式,爲了有效地使用緊缺的ip地址資源,我們只需要使用2個vip地址就可達到目的----web服務使用一個vip, 後面2個服務共用一個vip。爲了更清楚地理解前面的描述,表6-4、6-5對整個需求進行了彙總。
負載均衡器
Vip
Vrrp_instance
角色
Lvs-1
61.135.93.99
60.135.93.100
VI_WEB
VI_CTCP
VI_WEB -à MASTER
VI_CTCP-à BACKUP
Lvs-2
61.135.93.99
60.135.93.100
VI_WEB
VI_CTCP
VI_WEB--à BACKUP
VI_CTCP-à MASTER
表6-4 負載均衡器需求彙總
項目
Vip
轉發端口(TCP)
轉發規則
Web(bbs、blog、www)
61.135.93.99
80
61.135.93.99:80à 61.135.93.x:80
自定義服務1
61.135.99.100
3000
61.135.93.100:3000à61.135.93.y:
3000
自定義服務2
61.135.93.100
4000
61.135.93.100:4000->61.135.93.z:
4000
表6-5 應用服務需求彙總
Web服務支持的3個站點均爲動態網站,其運行環境爲apache加php,因爲涉及帳號登錄,因此負載均衡過程必須啓用會話保持。這裏把3個站點整合到一個物理服務器上,既能保持服務配置的一致性,又能最大限度的利用資源。關於動態站點及apache虛擬的配置,請參看其他章節的內容。
6.4.2 vrrp負載集羣部署
參照“6.3.2 cdn緩存服務器集羣部署”操作步驟,多vrrp_instance集羣的部署也按真實服務器和負載均衡器2個環節來處理。
● 真實服務器上進行的操作
1、 編寫負載均衡客戶端配置腳本。本例中有3組真實服務器,每組服務器使用相同的lvs客戶端配置腳本。配置腳本除了vip而外,其餘的部分與本章其他部分所列的lvs客戶端配置腳本完全相同。關於3個組vip地址使用情況,請看參表6-4,表6-5。
2、 檢驗lvs客戶端配置腳本的正確性。
● 負載均衡器上的操作
1、 負載均衡器lvs_1
(1) 安裝ipvsadm。方法如前文所敘。
(2) 安裝keepalived。方法如前文所敘。
(3) 新增配置文件 /etc/keepalived/keepalived.conf。爲了跟第二個lvs負載均衡器做比較,我在後面把2個配置文件放在一個表格裏(表6-6),方便查看。
2、 負載均衡器lvs_2
(1)安裝ipvsadm。方法如前文所敘。
(2)安裝keepalived。方法如前文所敘。
(3)新增配置文件 /etc/keepalived/keepalived.conf。
負載均衡器lvs_1配置文件/etc/keepalived/keepalived.conf
負載均衡器lvs_2配置文件/etc/keepalived/keepalived.conf
#guration File for keepalived,writed by sery
#global define
global_defs {
router_id lvs_1
}
vrrp_sync_group VGM {
group {
VI_WEB
}
}
vrrp_sync_group VGB {
group {
VI_CTCP
}
}
vrrp_instance VI_WEB{
state MASTER
interface eth0
lvs_sync_daemon_inteface eth0
virtual_router_id 51
priority 180
advert_int 5
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
61.135.93.99
}
}
# setting port 80 forward
virtual_server 61.135.93.99 80 {
delay_loop 6
lb_algo wlc
lb_kind DR
persistence_timeout 10
protocol TCP
real_server 61.135.99.80 80 {
weight 100
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 61.135.93.81 80 {
weight 100
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 61.135.93.82 80 {
weight 90
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 61.135.93.83 80 {
weight 90
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
vrrp_instance VI_CTCP {
state BACKUP
interface eth0
lvs_sync_daemon_inteface eth0
virtual_router_id 52
priority 150
advert_int 5
authentication {
auth_type PASS
auth_pass 2222
}
virtual_ipaddress {
61.135.93.100
}
}
virtual_server 61.135.93.100 3000 {
delay_loop 6
lb_algo wlc
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 61.135.93.84 3000{
weight 100
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 3000
}
}
real_server 61.135.93.85 3000{
weight 100
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 3000
}
}
real_server 61.135.93.86 3000{
weight 100
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 3000
}
}
real_server 61.135.93.87 3000{
weight 100
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 3000
}
}
}
virtual_server 61.135.93.100 4000 {
delay_loop 6
lb_algo wlc
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 61.135.93.88 4000{
weight 100
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 4000
}
}
real_server 61.135.93.89 4000{
weight 100
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 4000
}
}
real_server 61.135.93.90 4000{
weight 100
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 4000
}
}
real_server 61.135.93.91 4000{
weight 100
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 4000
}
}
}
#guration File for keepalived,writed by sery
#global define
global_defs {
router_id lvs_2
}
vrrp_sync_group VGM {
group {
VI_CTCP
}
}
vrrp_sync_group VGB {
group {
VI_WEB
}
}
vrrp_instance VI_WEB{
state BACKUP
interface eth0
lvs_sync_daemon_inteface eth0
virtual_router_id 51
priority 150
advert_int 5
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
61.135.93.99
}
}
# setting port 80 forward
virtual_server 61.135.93.99 80 {
delay_loop 6
lb_algo wlc
lb_kind DR
persistence_timeout 10
protocol TCP
real_server 61.135.99.80 80 {
weight 100
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 61.135.93.81 80 {
weight 100
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 61.135.93.82 80 {
weight 90
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 61.135.93.83 80 {
weight 90
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
vrrp_instance VI_CTCP {
state MASTER
interface eth0
lvs_sync_daemon_inteface eth0
virtual_router_id 52
priority 180
advert_int 5
authentication {
auth_type PASS
auth_pass 2222
}
virtual_ipaddress {
61.135.93.100
}
}
virtual_server 61.135.93.100 3000 {
delay_loop 6
lb_algo wlc
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 61.135.93.84 3000{
weight 100
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 3000
}
}
real_server 61.135.93.85 3000{
weight 100
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 3000
}
}
real_server 61.135.93.86 3000{
weight 100
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 3000
}
}
real_server 61.135.93.87 3000{
weight 100
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 3000
}
}
}
virtual_server 61.135.93.100 4000 {
delay_loop 6
lb_algo wlc
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 61.135.93.88 4000{
weight 100
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 4000
}
}
real_server 61.135.93.89 4000{
weight 100
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 4000
}
}
real_server 61.135.93.90 4000{
weight 100
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 4000
}
}
real_server 61.135.93.91 4000{
weight 100
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 4000
}
}
}
表6-6 lvs負載均衡器配置文件keepalived.conf
6.4.3 vrrp_instance負載均衡集羣功能測試
在進行測試之前,需要把lvs客戶端、負載均衡器(keepalived)、各真實服務器上的服務都啓動,並逐個檢驗其正確性,具體的檢查方法可參照本章前面的內容,不再贅述。
● 健康檢查功能(故障隔離)測試
多vrrp_instance健康檢查功能(故障隔離)測試的方法與單vrrp_instance相同。因多vrrp_instance所涉及的服務較多(本案3個),因此需要多花些時間逐個測試。如果多vrrp_instance涉及的服務很多,則可採用隨機抽樣的方式進行測試,通過觀察lvs負載均衡器的轉發狀態(ipvsadm)及lvs負載均衡器的系統日誌瞭解健康檢查測試的有效性。
● 負載均衡器失敗切換
本案的多vrrp_instance負載均衡環境正常運行後,每個lvs負載均衡器都有MASTER和BACKUP兩種狀態,每一個lvs負載均衡器都承擔轉發任務。當我們在每個lvs負載均衡器上執行ipvsadm時,其輸出結果正好交錯的,即lvs-1上如果有非0輸出時,則lvs_2相對應的項爲0;反之亦然。表6-7爲某運行環境lvs負載均衡器的輸出截取對比。
Lvs_1 的ipvsadm輸出(部分)
Lvs_2 的ipvsadm輸出(部分)
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 61.128.10.4:9000 wlc persistent 50
-> 61.128.10.16:9000 Route 200 4607 139
-> 61.128.10.17:9000 Route 200 4611 154
-> 61.128.10.5:9000 Route 100 2306 65
-> 61.128.10.8:9000 Route 100 2307 89
………………………………
TCP 61.128.20.124:http wlc persistent 30
-> 61.128.20.98:http Route 100 0 0
-> 61.128.20.93:http Route 100 0 0
-> 61.128.20.81:http Route 100 0 0
-> 61.128.20.82:http Route 100 0 0
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 61.128.10.4:9000 wlc persistent 50
-> 61.128.10.16:9000 Route 100 0 0
-> 61.128.10.17:9000 Route 100 0 0
-> 61.128.10.5:9000 Route 100 0 0
-> 61.128.10.8:9000 Route 100 0 0
……………………………
TCP 61.128.20.124:http wlc persistent 20
-> 61.128.20.98:http Route 100 821 1437
-> 61.128.20.93:http Route 100 823 1562
-> 61.128.20.82:http Route 100 823 1336
-> 61.128.20.81:http Route 100 825 1033
表6-7 多vrrp_instance 負載均衡器轉發輸出對比(注意觀察ActiveConn InActConn的值)
現在,我們來停掉lvs_1的keepalived進程,觀察lvs_2的系統日誌,將會發現vrrp_instance(VI_WEB)從BACKUP狀態變成MASTER.於是lvs_2負載均衡器有了兩個 MASTER狀態;另外lvs_2的ipvsadm的輸出字段 “ActiveConn ”的值將全部變成非零。同樣,當我們啓動lvs_1的keepalived進程、關閉lvs_2的keepalived進程,則lvs_1的狀態都是MASTER,所有的轉發請求都被轉移到lvs_1。
在上述lvs_1和lvs_2手動切換過程中,我們可以通過在客戶端瀏覽器地址欄輸入站點名(dns解析域名到lvs的vip),來驗證lvs的可用性。自定義服務可以通過在客戶端執行 telnet 61.135.93.100 3000 及 telnet 61.135.93.100 4000 來初步驗證。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章