1.1 LVS簡(jiǎn)介
LVS(Linux Virtual Server),也就是Linux虛擬服務(wù)器, 是一個(gè)自由軟件項(xiàng)目。使用LVS技術(shù)要達(dá)到的目標(biāo)是:通過LVS提供的負(fù)載均衡技術(shù)和Linux操作系統(tǒng)實(shí)現(xiàn)一個(gè)高性能、高可用的服務(wù)器群集,它具有良好可靠性、可擴(kuò)展性和可操作性。從而以低廉的成本實(shí)現(xiàn)最優(yōu)的服務(wù)性能。
LVS主要用來做四層負(fù)載均衡。
1.2 Keepalived簡(jiǎn)介
Keepalived是分布式部署系統(tǒng)解決系統(tǒng)高可用的軟件,結(jié)合LVS(Linux Virtual Server)使用,其功能類似于heartbeat,解決單機(jī)宕機(jī)的問題。
Keepalived是以VRRP協(xié)議為實(shí)現(xiàn)基礎(chǔ)的,VRRP全稱Virtual Router Redundancy Protocol,即虛擬路由冗余協(xié)議。通過VRRP協(xié)議結(jié)合LVS,對(duì)組群服務(wù)器監(jiān)控情況,若master出現(xiàn)宕機(jī)情況,則將VIP漂移到backup機(jī)上。實(shí)現(xiàn)了分布式系統(tǒng)高可用。可以理解為:keepalived是LVS的管理軟件,根據(jù)監(jiān)控情況,將宕機(jī)服務(wù)器從ipvsadm移除掉。
Keepalived的誕生最初是為L(zhǎng)VS ipvs(director)提供高可用性的,后來發(fā)展一個(gè)多功能、通用的輕量級(jí)高可用組件,可以為ipvs、nginx、haproxy等諸多服務(wù)提供高可用功能,主要應(yīng)用在負(fù)載均衡調(diào)度器上,同時(shí)也可以檢查后端各realserver的健康狀態(tài)。
1.3 負(fù)載均衡
四層負(fù)載均衡工作在OSI模型的傳輸層,由于在傳輸層,只有TCP/UDP協(xié)議,這兩種協(xié)議中除了包含源IP、目標(biāo)IP以外,還包含源端口號(hào)及目的端口號(hào)。四層負(fù)載均衡服務(wù)器在接受到客戶端請(qǐng)求后,以后通過修改數(shù)據(jù)包的地址信息(IP+端口號(hào))將流量轉(zhuǎn)發(fā)到應(yīng)用服務(wù)器。
七層負(fù)載均衡工作在OSI模型的應(yīng)用層,應(yīng)用層協(xié)議較多,常用http、radius、dns等。七層負(fù)載就可以基于這些協(xié)議來負(fù)載。這些應(yīng)用層協(xié)議中會(huì)包含很多有意義的內(nèi)容。比如同一個(gè)Web服務(wù)器的負(fù)載均衡,除了根據(jù)IP加端口進(jìn)行負(fù)載外,還可根據(jù)七層的URL、瀏覽器類別、語(yǔ)言來決定是否要進(jìn)行負(fù)載均衡。
四層通過虛擬 IP + 端口接收請(qǐng)求,然后再分配到真實(shí)的服務(wù)器,七層通過虛擬的 URL 或主機(jī)名接收請(qǐng)求,然后再分配到真實(shí)的服務(wù)器。所謂的四到七層負(fù)載均衡,就是在對(duì)后臺(tái)的服務(wù)器進(jìn)行負(fù)載均衡時(shí),依據(jù)四層的信息或七層的信息來決定怎么樣轉(zhuǎn)發(fā)流量。
2. 搭建過程及測(cè)試
2.1 主機(jī)配置
主機(jī)名
|
ip
|
操作系統(tǒng)
|
軟件
|
端口
|
lvs01
|
10.1.28.253
|
CentOS 7.0
|
lvs keepalived
|
8080
|
lvs02
|
10.1.28.70
|
CentOS 7.0
|
lvs keepalived
|
8080
|
Nginxsever01
|
10.1.28.30
|
CentOS 7.0
|
nginx
|
8080
|
Nginxsever01
|
10.1.28.40 | CentOS 7.0 | nginx | 8080 |
2.3 搭建準(zhǔn)備
2.3.1 關(guān)閉所有機(jī)器防火墻
[root@lvs01 ~]#systemctl stop firewalld.service
2.3.2 關(guān)閉防selinux
關(guān)閉所有服務(wù)器selinux,修改/etc/selinux/config,將SELINUX由enforcing設(shè)置為disabled,重啟服務(wù)器。
2.4 ipvs安裝
LVS無需安裝,安裝的是管理工具,第一種叫ipvsadm,第二種叫keepalive。ipvsadm是通過命令行管理,而keepalive讀取配置文件管理。
分別在lvs01和lvs02執(zhí)行如下操作:
[root@lvs01 ~]# yum -y install ipvsadm
2.4.1 把模塊加載進(jìn)系統(tǒng)
[root@lvs01 ~]#ipvsadm
2.5 keepalived安裝
分別在lvs01和lvs02執(zhí)行如下操作:
[root@lvs01 ~]# yum -y install keepalived
2.6 keepalived配置
! Configuration File for keepalived
global_defs {
router_id MASTER ## keepalived 服務(wù)器標(biāo)識(shí)符,可以隨意設(shè)定( 貌似也是全局唯一 )
}
vrrp_instance VI_1 { ## 定義一個(gè)名為 VI_1 的 VRRP 實(shí)例
state MASTER ## Keepalived 服務(wù)器角色,MASTER 為主、BACKUP 為備
interface eth0 ## 指定 HA 監(jiān)測(cè)網(wǎng)絡(luò)接口
virtual_router_id 51 ## 虛擬路由標(biāo)識(shí),同一個(gè) VRRP 實(shí)例使用唯一的標(biāo)識(shí),主備必須一樣
priority 100 ## 節(jié)點(diǎn)優(yōu)先級(jí),同一 VRRP 實(shí)例中 MASTER 的優(yōu)先級(jí)必須大于 BACKUP
advert_int 1 ## MASTER / BACKUP 之間同步檢查間隔時(shí)間,單位 秒
authentication { ## 節(jié)點(diǎn)之間通信驗(yàn)證類型、密碼 ,同一 VRRP 實(shí)例中,MASTER / BACKUP 必須使用相同的密碼才可以通信
auth_type PASS
auth_pass 123456
}
virtual_ipaddress { ## 虛擬 IP 地址,又稱漂移 IP ??梢酝ㄟ^ ip add 在 MASTER 上查看是否綁定
10.1.28.123
}
}
virtual_server 10.1.28.123 8080 { ## 定義虛擬服務(wù)器
delay_loop 6 ## 定義健康檢查時(shí)間間隔,單位 秒
lb_algo rr ## 負(fù)載均衡調(diào)度算法,支持 rr 、wrr 、lc 、wlc 、lblc 、sh 、dh 等
lb_kind DR ## LVS 負(fù)載均衡機(jī)制,支持 NAT 、TUN 、DR
persistence_timeout 120 ## 會(huì)話保持時(shí)間,單位 秒。提供動(dòng)態(tài)頁(yè)面 session 保持功能,同一 IP 該值時(shí)間內(nèi)被持續(xù)分配到同一臺(tái)節(jié)點(diǎn)服務(wù)器上
protocol TCP ## 轉(zhuǎn)發(fā)協(xié)議類型,支持 TCP 、UDP
real_server 10.1.28.30 8080 { ## 定義節(jié)點(diǎn)服務(wù)器
weight 1 ## 節(jié)點(diǎn)權(quán)重值,數(shù)字越大權(quán)重越高,分配到的連接越多。主要用于后端節(jié)點(diǎn)服務(wù)器性能不統(tǒng)一
notify_down /etc/keepalived/real_down.sh ## 該節(jié)點(diǎn)服務(wù)器處于 DOWN 狀態(tài)后執(zhí)行的腳本
TCP_CHECK { ## 健康檢測(cè)方式,支持 HTTP_GET 、SSL_GET 、TCP_CHECK 、SMTP_CHECK 、MISC_CHECK
connect_port 8080 ## 檢測(cè)端口,不指定時(shí)默認(rèn)為 real_server 指定的端口
connect_timeout 3 ## 無響應(yīng)超時(shí)時(shí)間,單位 秒
nb_get_retry 3 ## 重試次數(shù)
delay_before_retry 3 ## 重試間隔,單位 秒
}
}
real_server 10.1.28.40 8080 { ## 第二臺(tái)節(jié)點(diǎn)服務(wù)器
weight 1
notify_down /etc/keepalived/real_down.sh
TCP_CHECK {
connect_port 8080
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
lvs02配置
! Configuration File for keepalived
global_defs {
router_id lvs02
}
vrrp_instance VI_1 {
state BACKUP
interface ens160
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.1.28.123
}
}
virtual_server 10.1.28.123 8080 {
delay_loop 6
lb_algo rr
lb_kind DR
# persistence_timeout 50
protocol TCP
real_server 10.1.28.30 8080 {
weight 1
TCP_CHECK{
connetct_timeout 10
retry 3
delay_before_retry 3
connetct_port 8080
}
}
real_server 10.1.28.40 8080 {
weight 2
TCP_CHECK{
connetct_timeout 10
retry 3
delay_before_retry 3
connetct_port 8080
}
}
}
2.7 參數(shù)說明
IPVS三種IP負(fù)載均衡技術(shù):
VS/NAT: 即(Virtual Server via Network Address Translation)
也就是網(wǎng)絡(luò)地址翻譯技術(shù)實(shí)現(xiàn)虛擬服務(wù)器,當(dāng)用戶請(qǐng)求到達(dá)調(diào)度器時(shí),調(diào)度器將請(qǐng)求報(bào)文的目標(biāo)地址(即虛擬IP地址)改寫成選定的Real Server地址,同時(shí)報(bào)文的目標(biāo)端口也改成選定的Real Server的相應(yīng)端口,最后將報(bào)文請(qǐng)求發(fā)送到選定的Real Server。在服務(wù)器端得到數(shù)據(jù)后,Real Server返回?cái)?shù)據(jù)給用戶時(shí),需要再次經(jīng)過負(fù)載調(diào)度器將報(bào)文的源地址和源端口改成虛擬IP地址和相應(yīng)端口,然后把數(shù)據(jù)發(fā)送給用戶,完成整個(gè)負(fù)載調(diào)度過程??梢钥闯觯贜AT方式下,用戶請(qǐng)求和響應(yīng)報(bào)文都必須經(jīng)過Director Server地址重寫,當(dāng)用戶請(qǐng)求越來越多時(shí),調(diào)度器的處理能力將稱為瓶頸。
VS/TUN:即(Virtual Server via IP Tunneling)
也就是IP隧道技術(shù)實(shí)現(xiàn)虛擬服務(wù)器。它的連接調(diào)度和管理與VS/NAT方式一樣,只是它的報(bào)文轉(zhuǎn)發(fā)方法不同,VS/TUN方式中,調(diào)度器采用IP隧道技術(shù)將用戶請(qǐng)求轉(zhuǎn)發(fā)到某個(gè)Real Server,而這個(gè)Real Server將直接響應(yīng)用戶的請(qǐng)求,不再經(jīng)過前端調(diào)度器,此外,對(duì)Real Server的地域位置沒有要求,可以和Director Server位于同一個(gè)網(wǎng)段,也可以是獨(dú)立的一個(gè)網(wǎng)絡(luò)。因此,在TUN方式中,調(diào)度器將只處理用戶的報(bào)文請(qǐng)求,集群系統(tǒng)的吞吐量大大提高。
VS/DR: 即(Virtual Server via Direct Routing)
也就是用直接路由技術(shù)實(shí)現(xiàn)虛擬服務(wù)器。它的連接調(diào)度和管理與VS/NAT和VS/TUN中的一樣,但它的報(bào)文轉(zhuǎn)發(fā)方法又有不同,VS/DR通過改寫請(qǐng)求報(bào)文的MAC地址,將請(qǐng)求發(fā)送到Real Server,而Real Server將響應(yīng)直接返回給客戶,免去了VS/TUN中的IP隧道開銷。這種方式是三種負(fù)載調(diào)度機(jī)制中性能最高最好的,但是必須要求Director Server與Real Server都有一塊網(wǎng)卡連在同一物理網(wǎng)段上,且真實(shí)服務(wù)器網(wǎng)絡(luò)設(shè)備或設(shè)備別名不作 ARP 響應(yīng)。
IPVS調(diào)度器實(shí)現(xiàn)了如下八種負(fù)載調(diào)度算法:
輪叫(Round Robin)
調(diào)度器通過”輪叫”調(diào)度算法將外部請(qǐng)求按順序輪流分配到集群中的真實(shí)服務(wù)器上,它均等地對(duì)待每一臺(tái)服務(wù)器,而不管服務(wù)器上實(shí)際的連接數(shù)和系統(tǒng)負(fù)載。
加權(quán)輪叫(Weighted Round Robin)
調(diào)度器通過”加權(quán)輪叫”調(diào)度算法根據(jù)真實(shí)服務(wù)器的不同處理能力來調(diào)度訪問請(qǐng)求。這樣可以保證處理能力強(qiáng)的服務(wù)器處理更多的訪問流量。調(diào)度器可以自動(dòng)問詢真實(shí)服務(wù)器的負(fù)載情況,并動(dòng)態(tài)地調(diào)整其權(quán)值。
最少鏈接(Least Connections)
調(diào)度器通過”最少連接”調(diào)度算法動(dòng)態(tài)地將網(wǎng)絡(luò)請(qǐng)求調(diào)度到已建立的鏈接數(shù)最少的服務(wù)器上。如果集群系統(tǒng)的真實(shí)服務(wù)器具有相近的系統(tǒng)性能,采用”最小連接”調(diào)度算法可以較好地均衡負(fù)載。
加權(quán)最少鏈接(Weighted Least Connections)
在集群系統(tǒng)中的服務(wù)器性能差異較大的情況下,調(diào)度器采用”加權(quán)最少鏈接”調(diào)度算法優(yōu)化負(fù)載均衡性能,具有較高權(quán)值的服務(wù)器將承受較大比例的活動(dòng)連接負(fù)載。調(diào)度器可以自動(dòng)問詢真實(shí)服務(wù)器的負(fù)載情況,并動(dòng)態(tài)地調(diào)整其權(quán)值。
基于局部性的最少鏈接(Locality-Based Least Connections)
“基于局部性的最少鏈接” 調(diào)度算法是針對(duì)目標(biāo)IP地址的負(fù)載均衡,目前主要用于Cache集群系統(tǒng)。該算法根據(jù)請(qǐng)求的目標(biāo)IP地址找出該目標(biāo)IP地址最近使用的服務(wù)器,若該服務(wù)器 是可用的且沒有超載,將請(qǐng)求發(fā)送到該服務(wù)器;若服務(wù)器不存在,或者該服務(wù)器超載且有服務(wù)器處于一半的工作負(fù)載,則用”最少鏈接”的原則選出一個(gè)可用的服務(wù) 器,將請(qǐng)求發(fā)送到該服務(wù)器。
帶復(fù)制的基于局部性最少鏈接(Locality-Based Least Connections with Replication)
“帶復(fù)制的基于局部性最少鏈接”調(diào)度算法也是針對(duì)目標(biāo)IP地址的負(fù)載均衡,目前主要用于Cache集群系統(tǒng)。它與LBLC算法的不同之處是它要維護(hù)從一個(gè) 目標(biāo)IP地址到一組服務(wù)器的映射,而LBLC算法維護(hù)從一個(gè)目標(biāo)IP地址到一臺(tái)服務(wù)器的映射。該算法根據(jù)請(qǐng)求的目標(biāo)IP地址找出該目標(biāo)IP地址對(duì)應(yīng)的服務(wù) 器組,按”最小連接”原則從服務(wù)器組中選出一臺(tái)服務(wù)器,若服務(wù)器沒有超載,將請(qǐng)求發(fā)送到該服務(wù)器,若服務(wù)器超載;則按”最小連接”原則從這個(gè)集群中選出一 臺(tái)服務(wù)器,將該服務(wù)器加入到服務(wù)器組中,將請(qǐng)求發(fā)送到該服務(wù)器。同時(shí),當(dāng)該服務(wù)器組有一段時(shí)間沒有被修改,將最忙的服務(wù)器從服務(wù)器組中刪除,以降低復(fù)制的 程度。
目標(biāo)地址散列(Destination Hashing)
“目標(biāo)地址散列”調(diào)度算法根據(jù)請(qǐng)求的目標(biāo)IP地址,作為散列鍵(Hash Key)從靜態(tài)分配的散列表找出對(duì)應(yīng)的服務(wù)器,若該服務(wù)器是可用的且未超載,將請(qǐng)求發(fā)送到該服務(wù)器,否則返回空。
源地址散列(Source Hashing)
“源地址散列”調(diào)度算法根據(jù)請(qǐng)求的源IP地址,作為散列鍵(Hash Key)從靜態(tài)分配的散列表找出對(duì)應(yīng)的服務(wù)器,若該服務(wù)器是可用的且未超載,將請(qǐng)求發(fā)送到該服務(wù)器,否則返回空。
本例中采用DR負(fù)載均衡和wrr負(fù)載調(diào)度算法
3. 負(fù)載均衡及高可用測(cè)試
3.1 啟動(dòng)Keepalived
lvs01和lvs02分別執(zhí)行:
[root@lvs01 ~]# service keepalived start
執(zhí)行ip a,lvs01上有vip10.1.28.123,lvs02沒有
3.2 頁(yè)面訪問
通過不同瀏覽器訪問http://10.1.28.30:8080
3.3 Master上檢查連接情況
lvs01上執(zhí)行ipvsadm -ln:
3.4 ipvsadm參數(shù)說明
ipvsadm:
-L|-l(–list):顯示內(nèi)核虛擬服務(wù)器表
-n(–numeric):輸出IP 地址和端口的數(shù)字形式
輸出參數(shù)說明:
Forward 轉(zhuǎn)發(fā)方式,當(dāng)前是路由轉(zhuǎn)發(fā)
Weight 權(quán)重
ActiveConn 當(dāng)前活躍的連接數(shù)
InActConn 當(dāng)前不活躍的連接數(shù)
3.5 修改keepalived參數(shù)
通過ipvsadm命令發(fā)現(xiàn)訪問請(qǐng)求都被分配到92(nginx02)這臺(tái)服務(wù)器,沒有實(shí)現(xiàn)負(fù)載均衡。這個(gè)和keepalived參數(shù)配置persistence_timeout有關(guān),這個(gè)參數(shù)的意義是保持客戶端的請(qǐng)求在這個(gè)時(shí)間段內(nèi)全部發(fā)到同一個(gè)真實(shí)服務(wù)器。
分別注釋lvs01和lvs02的persistence_timeout:
[root@lvs01 keepalived]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
[root@lvs01 keepalived]# view /etc/keepalived/keepalived.conf #persistence_timeout 50
重啟兩臺(tái)lvs服務(wù)器keepalived服務(wù):
[root@lvs01 keepalived]# service keepalived restart
再次測(cè)試:
發(fā)現(xiàn)連接均勻的分配到后臺(tái)兩臺(tái)nginx服務(wù)器。
3.5.5 lvs高可用測(cè)試
恢復(fù)keepalived配置并重啟服務(wù)。
lvs01宕機(jī)前訪問頁(yè)面:
停止lvs01的keepalived服務(wù),模擬lvs01宕機(jī):
systemctl stop keepalived
查看lvs02情況:
發(fā)現(xiàn)vip已飄至lvs02。

http://10.1.28.123:8080,訪問正常:
恢復(fù)lvs01的keepalived服務(wù):

發(fā)現(xiàn)vip飄回至lvs01,vip頁(yè)面訪問正常
總結(jié):
當(dāng) MASTER 服務(wù)器無法提供服務(wù)時(shí),VIP 會(huì)在 MASTER 上自動(dòng)移除,BACKUP 服務(wù)器會(huì)提升為 MASTER 狀態(tài),綁定 VIP 、接管服務(wù)。
當(dāng) MASTER 修復(fù)加入網(wǎng)絡(luò)后,會(huì)自動(dòng)搶回 VIP ,成為 MASTER 身份。