1、LVS的DR模式介紹
參考自官網:http://www.linuxvirtualserver.org/zh/lvs3.html
VS/DR利用大多數Internet服務的非對稱特點,負載調度器中只負責調度請求,而服務器直接將響應返回給客戶,可以極大地提高整個集群 系統的吞吐量。該方法與IBM的NetDispatcher產品中使用的方法類似(其中服務器上的IP地址配置方法是相似的),但IBM的 NetDispatcher是非常昂貴的商品化產品,我們也不知道它內部所使用的機制,其中有些是IBM的專利。
VS/DR的體系結構如圖所示:調度器和服務器組都必須在物理上有一個網卡通過不分斷的局域網相連,如通過高速的交換機或者HUB相連。VIP地址為調度器和服務器組共享,調度 器配置的VIP地址是對外可見的,用於接收虛擬服務的請求報文;所有的服務器把VIP地址配置在各自的Non-ARP網絡設備上,它對外面是不可見的,只 是用於處理目標地址為VIP的網絡請求。
VS/DR 的工作流程如圖所示:它的連接調度和管理與VS/NAT和VS/TUN中的一樣,它的報文轉發方法又有不同,將報文直接路由給目標服務器。在VS/DR 中,調度器根據各個服務器的負載情況,動態地選擇一台服務器,不修改也不封裝IP報文,而是將數據幀的MAC地址改為選出服務器的MAC地址,再將修改后 的數據幀在與服務器組的局域網上發送。因為數據幀的MAC地址是選出的服務器,所以服務器肯定可以收到這個數據幀,從中可以獲得該IP報文。當服務器發現 報文的目標地址VIP是在本地的網絡設備上,服務器處理這個報文,然后根據路由表將響應報文直接返回給客戶。
在VS/DR中,根據缺省的TCP/IP協議棧處理,請求報文的目標地址為VIP,響應報文的源地址肯定也為VIP,所以響應報文不需要作任何修改,可以直接返回給客戶,客戶認為得到正常的服務,而不會知道是哪一台服務器處理的。VS/DR負載調度器跟VS/TUN一樣只處於從客戶到服務器的半連接中,按照半連接的TCP有限狀態機進行狀態遷移。
簡單來說:請求由 LVS 接受,由真實提供服務的服務器(RealServer, RS)直接返回給用戶,返回的時候不經過 LVS。
DR 模式下需要 LVS 和綁定同一個 VIP(RS 通過將 VIP 綁定在 loopback 實現)。
一個請求過來時,LVS 只需要將網絡幀的 MAC 地址修改為某一台 RS 的 MAC,該包就會被轉發到相應的 RS 處理,注意此時的源 IP 和目標 IP 都沒變,LVS 只是做了一下移花接木。
RS 收到 LVS 轉發來的包,鏈路層發現 MAC 是自己的,到上面的網絡層,發現 IP 也是自己的,於是這個包被合法地接受,RS 感知不到前面有 LVS 的存在。
而當 RS 返回響應時,只要直接向源 IP(即用戶的 IP)返回即可,不再經過 LVS。
DR 模式是性能最好的一種模式。
優點:效率最高,負載均衡器只用分發請求,應答包通過單獨的路由返回給客戶端,提高了服務器並發能力。
缺點:負載均衡器的網卡必須和物理網卡在同一網段上
部署過程
環境:
lvs eth0:10.0.0.31 eth0:1:10.0.0.32 gateway:10.0.0.254
web01 eth0:10.0.0.71 lo:10.0.0.32 gateway:10.0.0.254
web02 eth0:10.0.0.81 lo:10.0.0.32 gateway:10.0.0.254
1、web服務器准備
在web服務器上安裝httpd服務來進行模擬,每台服務器的web首頁不同,在負載均衡測試的時候以便區分
web01
[root@web01 ~]# yum install -y httpd
[root@web01 ~]# systemctl start httpd.service
[root@web01 ~]# systemctl enable httpd.service
[root@web01 ~]# echo 'web01'> /var/www/html/index.html
[root@web01 ~]# curl 127.0.0.1
web01
web02
[root@web02 ~]# yum install -y httpd
[root@web02 ~]# systemctl start httpd.service
[root@web02 ~]# systemctl enable httpd.service
[root@web02 ~]# echo 'web02'> /var/www/html/index.html
[root@web02 ~]# curl 127.0.0.1
web02
2、lvs服務器配置
[root@lvs ~]# ifconfig eth0:0 10.0.0.32 netmask 255.255.255.255 #為網卡eth0增加輔助ip
[root@lvs ~]# yum install -y ipvsadm #安裝lvs核心管理軟件包
[root@lvs ~]# ipvsadm -C
[root@lvs ~]# ipvsadm -At 10.0.0.32:80 -s rr
[root@lvs ~]# ipvsadm -at 10.0.0.32:80 -r 10.0.0.71:80 -g
[root@lvs ~]# ipvsadm -at 10.0.0.32:80 -r 10.0.0.81:80 -g
[root@lvs ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.0.0.32:80 rr
-> 10.0.0.71:80 Route 1 0 0
-> 10.0.0.81:80 Route 1 0 0
參數說明:
-C --clear清除內核虛擬服務器表中的所有記錄
-A --add-service在內核的虛擬服務器表中添加一條新的虛擬服務器記錄
-t --tcp-service service-address說明虛擬服務器提供的是tcp 的服務
-s --scheduler scheduler使用的調度算法,調度算法可以指定以下8種:rr(輪詢),wrr(權重),lc(最后連接),wlc(權重),lblc(本地最后連接),lblcr(帶復制的本地最后連接),dh(目的地址哈希),sh(源地址哈希),sed(最小期望延遲),nq(永不排隊)
-a --add-server在內核虛擬服務器表的一條記錄里添加一條新的真實服務器記錄。也就是在一個虛擬服務器中增加一台新的真實服務器
-r --real-server server-address指定真實的服務器[Real-Server:port]
-g --gatewaying 指定LVS 的工作模式為直接路由模式(也是LVS 默認的模式)
-L --list 顯示內核虛擬服務器表
-n 不解析端口使用的協議
3、web服務器配置
web01
[root@web01 ~]# ifconfig lo:0 10.0.0.32 netmask 255.255.255.255 #為環回地址增加輔助ip
[root@web01 ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet 10.0.0.32/32 scope global lo:0
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:22:ee:cd brd ff:ff:ff:ff:ff:ff
inet 10.0.0.71/24 brd 10.0.0.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe22:eecd/64 scope link
valid_lft forever preferred_lft forever
以下操作目的是修改內核參數,開啟arp抑制,調整arp內核參數的意義:
a)ARP廣播會產生的問題
當客戶端發起訪問VIP 對應的域名的請求(curl 10.0.0.32)時,根據網絡通信原理會產生ARP 廣播,因為負載均衡器dir和真實的服務器rs在同一網絡並且VIP設置在集群中的每個節點上,此時集群內的真實服務器會嘗試回答來自客戶端計算機的查找VIP的ARP廣播,這就會產生問題,大家都說我是"VIP"。
b)為了達到負載均衡的目的,在所有real server上要關閉所有arp請求,導致不能響應client發出的arp請求(相當於啞巴),只有lvs可以響應,這樣請求就會傳到lvs的vip中,這就是為什么要禁止real server 的 arp請求和響應。因此必須想法辦讓真實服務器忽略來自客戶端計算機的ARP廣播請求 ——》 調整arp內核參數
[root@web01 ~]# echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@web01 ~]# echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@web01 ~]# echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@web01 ~]# echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
web02的配置和web01相同
4、測試
測試的時候用這三台機器測試都不能成功,需要在瀏覽器訪問或者另外找一台機器測試
測試的時候訪問10.0.0.32,訪問到測試內容,配置LVS采用的是輪循模式。第一次是訪問web01,刷新后是訪問web02,再刷新后訪問web01
5、keepalived結合lvs_DR模式
配置keepalived增加虛擬ip,從而管理到lvs,可以進一步配置為lvs服務器的高可用
[root@lvs ~]# yum install keepalived -y
[root@lvs ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL #表示keepalived服務器的一個標識
}
vrrp_instance VI_1 { #定義一個vrrp組,組名唯一
state MASTER #定義改主機為keepalived的master主機
interface eth0 #監控eth0號端口
virtual_router_id 51 #虛擬路由id號為51,id號唯一,這個id決定了多播的MAC地址
priority 100 #節點優先級
advert_int 1 #檢查間隔,默認為1秒
authentication {
auth_type PASS #認證方式,密碼認證
auth_pass 1111 #認證密碼
}
virtual_ipaddress {
10.0.0.32 #虛擬ip地址
}
}
virtual_server 10.0.0.32 80 { #虛擬主機設置
delay_loop 2 #每隔2秒查詢realserver狀態
lb_algo rr #lvs的調度算法
lb_kind DR #lvs的集群模式
protocol TCP #用TCP協議檢查realserver狀態
real_server 10.0.0.71 80 { #后端真實主機ip
weight 1 #每台機器的權重,0表示不給該機器轉發請求,直到它恢復正常
HTTP_GET { #以下為健康檢查項目
url {
path /index.html #訪問的url首頁
status_code 200 #返回狀態碼
}
connect_timeout 3 #連接超時時間,單位為秒
nb_get_retry 3 #檢測失敗后的重試次數,如果達到重試次數仍然失敗,將后端從服務器池中移除
delay_before_retry 3 #失敗重試的間隔時間,單位為秒
}
}
real_server 10.0.0.81 80 {
weight 1
HTTP_GET {
url {
path /index.html
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
[root@lvs ~]# ipvsadm -C
[root@lvs ~]# systemctl start keepalived.service
[root@lvs ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.0.0.32:80 rr
-> 10.0.0.71:80 Route 1 0 0
-> 10.0.0.81:80 Route 1 0 0
這里keepalived服務啟動后,配置的vip也成功實現了lvs負載均衡,而且實現了對web服務器的健康檢查,當某個web服務器宕機,lvs的規則也會自動調整