http://blog.51cto.com/pmghong/1399385
LVS 和 LVS+keepalived 這兩種架構在平時聽得多了,最近才接觸到另外一個架構LVS+OSPF。這個架構實際上是LVS+Keepalived 的升級版本,我們所知道LVS+Keepalived 架構是這樣子的:
隨着業務的擴展,我們可以對web服務器做水平擴展,以此來提高系統的處理能力。但是我們會發現,兩台Director間始終只有一台是處於工作狀態,而另一台處於不工作的備份狀態,即使訪問的流量再大,同時也只能由一台Director 去應對。換句話說,Director在這個架構里面沒辦法像web服務器那樣做水平擴展,實現負載均衡。那么是否有辦法讓兩台Director都處於工作的狀態呢?答案是肯定的,LVS+OSPF 架構就是用來解決這個問題的。
LVS+OSPF架構圖如下:
這個架構與LVS+keepalived 最明顯的區別在於,兩台Director都是Master 狀態,而不是Master-Backup,如此一來,兩台Director 地位就平等了。剩下的問題,就是看如何在這兩台Director 間實現負載均衡了。這里會涉及路由器領域的一個概念:等價多路徑
ECMP(等價多路徑)
ECMP(Equal-CostMultipathRouting)等價多路徑,存在多條不同鏈路到達同一目的地址的網絡環境中,如果使用傳統的路由技術,發往該目的地址的數據包只能利用其中的一條鏈路,其它鏈路處於備份狀態或無效狀態,並且在動態路由環境下相互的切換需要一定時間,而等值多路徑路由協議可以在該網絡環境下同時使用多條鏈路,不僅增加了傳輸帶寬,並且可以無時延無丟包地備份失效鏈路的數據傳輸。
ECMP最大的特點是實現了等值情況下,多路徑負載均衡和鏈路備份的目的,在靜態路由和OSPF中基本上都支持ECMP功能。
例如下圖中的路徑A、路徑B、路徑C 3條路徑的COST值相同,既是等價路徑。在路由器選路的時候,便可以同時使用這3條路徑,從而實現負載均衡。
注:雖然鏈路COST值相同,但是實際情況是,各路徑的帶寬、時延和可靠性等不一樣,把Cost認可成一樣,不能很好地利用帶寬,尤其在路徑間差異大時,效果會非常不理想。這時可以使用
WCMP(Weight-CostMultipathRouting)加權多路徑,能夠非常靈活地按照比例在鏈路上傳遞流量。
回到前面的那個問題:如何實現對多個Director 的負載均衡?相信看到這里,應該都清楚了,沒錯,就是利用OSFP的等價多路徑來實現。那么新的問題又來了:我們知道Director 是一台LINUX/Unix機器,不是路由器,那它如何跑OSPF協議?如何實現等價多路徑?
實際上就是將調度器模擬成路由器,將多台調度器與真實的路由器組成OSPF網絡,需要做的就是為調度器安裝quagga這個軟件,並進行相關的配置即可。
【實驗步驟】
實驗平台 :Ubuntu12.04
路由器:使用GNS3橋接網卡模擬真實路由器
GNS3配置
vmnet2、vmnet3網卡配置如下:(vmware 菜單欄 編輯 -- 虛擬網絡編輯器)
GNS3橋接vmware網卡,e1/0 橋接vmware的vmnet2網卡,e1/1 橋接vmware的vmnet3網卡。GNS3總共需要3個設備:兩個雲設備(用於橋接網卡)和一台路由器(模擬真實路由器)
完成后GNS3 的拓撲是這樣的:
#配置真實路由器R1
R1#conf t
R1(config)#int lo1
R1(config-if)#ip addr 2.2.2.2 255.255.255.0
R1(config-if)#int e1/0
R1(config-if)#ip add 192.168.20.120 255.255.255.0
R1(config-if)#no shut
R1(config-if)#int e1/1
R1(config-if)#ip add 192.168.30.120 255.255.255.0
R1(config-if)#no shut
R1(config-if)#int e1/0
R1(config-if)#ip ospf hello-interval 1
R1(config-if)#ip ospf dead-interval 3
R1(config-if)#ip ospf network point-to-point
R1(config-if)#ip ospf priority 100
R1(config-if)#int e1/1
R1(config-if)#ip ospf hello-interval 1
R1(config-if)#ip ospf dead-interval 3
R1(config-if)#ip ospf network point-to-point
R1(config-if)#ip ospf priority 99
R1(config-if)#exit
R1(config)#router ospf 1
R1(config-router)#network 192.168.20.0 0.0.0.255 area 0
R1(config-router)#network 192.168.30.0 0.0.0.255 area 0
R1(config-router)#network 2.2.2.2 0.0.0.0 area 0
調度器上配置quagga,模擬路由器
#安裝quagga
root@node1:~# apt-get install quagga -y
#修改配置文件
ospfd=yes
root@node1:~# chown quagga.quagga /etc/quagga/zebra.conf
#啟動quagga
root@node1:~# /etc/init.d/quagga restart
#查看是否有相應監控端口
tcp 0 0 127.0.0.1:2604 0.0.0.0:* LISTEN 1741/ospfd
node2上的安裝步驟同上
#嘗試遠程連接quagga、配置quagga
Password: #默認密碼為zebra
#估計看到這,學過網絡的童鞋都已經很熟悉了,可以大展身手了。閑話少說,繼續配置:
node1 配置如下
ospfd> en
ospfd# configure terminal
ospfd(config)# router ospf
ospfd(config-router)# router-id 192.168.20.101
ospfd(config-router)# network 192.168.20.0/24 area 0
ospfd(config-router)# network 1.1.1.1/24 area 0
ospfd(config-router)# exit
ospfd(config)# interface eth0
ospfd(config-if)# ospf hello-interval 1
ospfd(config-if)# ospf dead-interval 3
ospfd(config-if)# ip ospf network point-to-point
ospfd(config-if)# end
ospfd# wr
Configuration saved to /etc/quagga/ospfd.conf
ospfd# exit
Connection closed by foreign host.
node2配置如下
ospfd> en
ospfd# configure terminal
ospfd(config)# router ospf
ospfd(config-router)# router-id 192.168.30.100
ospfd(config-router)# network 192.168.30.0/24 area 0
ospfd(config-router)# network 3.3.3.3/24 area 0
ospfd(config-router)# exit
ospfd(config)# interface eth0
ospfd(config-if)# ospf hello-interval 1
ospfd(config-if)# ospf dead-interval 3
ospfd(config-if)# ip ospf network point-to-point
ospfd(config-if)# end
ospfd# wr
Configuration saved to /etc/quagga/ospfd.conf
ospfd# exit
Connection closed by foreign host.
#在node1和node2上分別啟用一個loopback口,用於測試
root@node1:~# ifconfig lo:1 1.1.1.1 netmask 255.255.255.0
root@node2:~# ifconfig lo:1 3.3.3.3 netmask 255.255.255.0
測試
在路由器R1 上執行show ip ospf neighor 可以看到OSPF的鄰居
R1#show ip ospf neighbor
Neighbor ID Pri State Dead Time Address Interface
192.168.30.100 0 FULL/ - 00:00:02 192.168.30.100 Ethernet1/1
192.168.20.101 0 FULL/ - 00:00:02 192.168.20.101 Ethernet1/0
在node1上面ping node2
至此,ospf的配置完成!
至於LVS的配置,基本上同LVS+Keepalived 架構,在配置的過程中,應注意的地方有以下幾點:
1、配置router_id 的時候,為了區分開,可用ip地址作為router_id ,例如:
global_defs {
router_id 192.168.30.102
}
2、因為兩台調度器都是要提供服務的,因此兩台調度器應都處於Master的狀態,那么這里有3個方面要注意:
(1)首先是狀態那里,兩台調度器都要是MASTER
vrrp_instance VI_1 {
state MASTER
... ...
}
(2)其次,要以雙主的模式啟動,需要使調度器處於不同的域中。(一山不容二虎么... ...)
node1
vrrp_instance VI_1 {
... ...
virtual_router_id 51
... ...
}
node2
vrrp_instance VI_1 {
... ...
virtual_router_id 52
... ...
}
(3)這里的優先級應一致,統一由真實路由器R1進行調度。
node1
vrrp_instance VI_1 {
... ...
priority 110
... ...
}
node2
vrrp_instance VI_1 {
... ...
priority 110
... ...
}