LVS-DR模式及lvs結合keepalived實現高可用
lvs定義
LVS的英文全稱是Linux Virtual Server,即Linux虛擬伺服器。它是我們國家的章文嵩博士開發的一個開源專案,1998年5月釋出,是中國國內最早出現的自由軟體專案之一。我們只要在server上裝了ipvsadm軟體包就可以定義ipvs規則,在linux kernel的2.6版本之後kernel是直接支援ipvs的,在此之前的核心版本則需要重新編譯核心。
lvs作用
LVS主要用於多伺服器的負載均衡。它工作在網路層,可以實現高效能,高可用的伺服器叢集技術。它廉價,可把許多低效能的伺服器組合在一起形成一個超級伺服器。它易用,配置非常簡單,且有多種負載均衡的方法。它穩定可靠,即使在叢集的伺服器中某臺伺服器無法正常工作,也不影響整體效果。另外可擴充套件性也非常好。
lvs相關術語
- DS:Director Server。指的是前端負載均衡器節點。
- RS:Real Server。後端真實的工作伺服器。
- VIP:向外部直接面向用戶請求,作為使用者請求的目標的IP地址。
- DIP:Director Server IP,主要用於和內部主機通訊的IP地址。
- RIP:Real Server IP,後端伺服器的IP地址。
- CIP:Client IP,訪問客戶端的IP地址。
lvs的三種模式
在排程器的實現技術中,IP負載均衡技術是效率最高的。在已有的IP負載均衡技術中有通過網路地址轉換(Network Address Translation)將一組伺服器構成一個高效能的、高可用的虛擬伺服器,我們稱之為VS/NAT技術(Virtual Server via Network Address Translation),大多數商品化的IP負載均衡排程器產品都是使用此方法,如Cisco的LocalDirector、F5的Big/IP和Alteon的ACEDirector。在分析VS/NAT的缺點和網路服務的非對稱性的基礎上,我們提出通過IP隧道實現虛擬伺服器的方法VS/TUN (Virtual Server via IP Tunneling),和通過直接路由實現虛擬伺服器的方法VS/DR(Virtual Server via Direct Routing),它們可以極大地提高系統的伸縮性。所以,IPVS軟體實現了這三種IP負載均衡技術,它們的大致原理如下:
1.Virtual Server via Network Address Translation(VS/NAT)
通過網路地址轉換,排程器重寫請求報文的目標地址,根據預設的排程演算法,將請求分派給後端的真實伺服器;真實伺服器的響應報文通過排程器時,報文的源地址被重寫,再返回給客戶,完成整個負載排程過程。
2.Virtual Server via IP Tunneling(VS/TUN)
採用NAT技術時,由於請求和響應報文都必須經過排程器地址重寫,當客戶請求越來越多時,排程器的處理能力將成為瓶頸。為了解決這個問題,排程器把請求報 文通過IP隧道轉發至真實伺服器,而真實伺服器將響應直接返回給客戶,所以排程器只處理請求報文。由於一般網路服務應答比請求報文大許多,採用 VS/TUN技術後,集群系統的最大吞吐量可以提高10倍。
3.Virtual Server via Direct Routing(VS/DR)
VS/DR通過改寫請求報文的MAC地址,將請求傳送到真實伺服器,而真實伺服器將響應直接返回給客戶。同VS/TUN技術一樣,VS/DR技術可極大地 提高集群系統的伸縮性。這種方法沒有IP隧道的開銷,對叢集中的真實伺服器也沒有必須支援IP隧道協議的要求,但是要求排程器與真實伺服器都有一塊網絡卡連 在同一物理網段上。
LVS 的負載排程演算法
在核心中的連線排程演算法上,IPVS 已實現了以下八種排程演算法:
1.輪叫排程(Round-Robin Scheduling )
輪叫排程(Round Robin Scheduling)演算法就是以輪叫的方式依次將請求排程不同的伺服器,即每次排程執行 i = (i + 1) mod n,並選出第 i 臺伺服器。演算法的優點是其簡潔性,它無需記錄當前所有連線的狀態,所以它是一種無狀態排程。
2.加權輪叫排程(Weighted Round-Robin Scheduling )
加權輪叫排程 (Weighted Round-Robin Scheduling)演算法可以解決伺服器間效能不一的情況,它用相應的權值表示伺服器的處理效能,伺服器的預設權值為 1。假設伺服器 A 的權值為 1,B 的 權值為 2,則表示伺服器 B 的處理效能是 A 的兩倍。加權輪叫排程演算法是按權值的高低和輪叫方式分配請求到各伺服器。權值高的伺服器先收到的連線,權值高的伺服器比權值低的伺服器處理更多的連線,相同權值的伺服器處理相同數目的連線數。
3.最小連線排程(Least-Connection Scheduling )
最小連線排程(Least- Connection Scheduling)演算法是把新的連線請求分配到當前連線數最小的伺服器。最小連線排程是一種動態排程演算法,它通過伺服器當前所活躍的連線數來估計伺服器的負載情況。排程器需要記錄各個伺服器已建立連線的數目,當一個請求被排程到某臺伺服器,其連線數加 1;當連線中止或超時,其連線數減一。
4.加權最小連線排程(Weighted Least-Connection Scheduling)
加權最小連線調 度(Weighted Least-Connection Scheduling)演算法是最小連線排程的超集,各個伺服器用相應的權值表示其處理效能。伺服器的預設權值為 1,系統管理員可以動態地設定伺服器的權值。加權最小連線排程在排程新連線時儘可能使伺服器的已建立連線數和其權值成比例。
5.基於區域性性的最少連結(Locality-Based Least Connections Scheduling)
基於區域性性的最少連結排程(Locality-Based Least Connections Scheduling,以下簡稱為LBLC)演算法是針對請求報文的目標IP地址的負載均衡排程,目前主要用於Cache集群系統,因為在Cache叢集中客戶請求報文的目標IP地址是變化的。這裡假設任何後端伺服器都可以處理任一請求,演算法的設計目標是在伺服器的負載基本平衡情況下,將相同目標IP地址的請求排程到同一臺伺服器,來提高各臺伺服器的訪問區域性性和主存Cache命中率,從而整個集群系統的處理能力。LBLC排程演算法先根據請求的目標IP地址 找出該目標IP地址最近使用的伺服器,若該伺服器是可用的且沒有超載,將請求傳送到該伺服器;若伺服器不存在,或者該伺服器超載且有伺服器處於其一半的工作負載,則用 “最少連結”的原則選出一個可用的伺服器,將請求傳送到該伺服器。
6.帶複製的基於區域性性最少連結(Locality-Based Least Connections with Replication Scheduling)
帶複製的基於區域性性最少連結排程(Locality-Based Least Connections with Replication Scheduling,以下簡稱為 LBLCR)演算法也是針對目標IP地址的負載均衡,目前主要用於Cache 集群系統。它與LBLC演算法的不同之處是它要 維護從一個目標IP地址到一組伺服器的對映,而 LBLC 演算法維護從一個目標IP地址到一臺伺服器的對映。對於一個“熱門”站點的服務請求,一臺Cache伺服器可能會忙不過來處理這些請求。這時,LBLC排程演算法會從所有的Cache 伺服器中按“最小連線”原則選出一臺Cache伺服器,對映該“熱門”站點到這臺Cache伺服器,很快這臺Cache伺服器也會超載,就會重複上述過程選出新的Cache伺服器。這樣,可能會導致該“熱門”站點的映像會出現在所有的Cache伺服器上,降低了Cache伺服器的使用效率。LBLCR排程演算法將“熱門”站點對映到一組Cache伺服器(伺服器集合),當該“熱門”站點的請求負載增加時,會增加集合裡的Cache伺服器,來處理不斷增長的負載;當該“熱門”站點的請求負載降低時,會減少集合裡的Cache伺服器數目。這樣,該“熱門”站點的映像不太可能出現在所有的Cache伺服器上,從而提供Cache集群系統的使用效率。LBLCR演算法先根據請求的目標IP地址找出該目標IP地址對應的伺服器組;按“最小連線”原則從該伺服器組中選出一臺伺服器,若伺服器沒有超載,將請求傳送到該伺服器;若伺服器超載;則按“最小連線”原則從整個叢集中選出一臺伺服器,將該伺服器加入到伺服器組中,將請求傳送到該伺服器。同時,當該伺服器組有一段時間沒有被修改,將最忙的服 務器從伺服器組中刪除,以降低複製的程度。
7.目標地址雜湊排程(Destination Hashing Scheduling )
目標地址雜湊排程(Destination Hashing Scheduling)演算法也是針對目標IP地址的負載均衡,但它是一種靜態對映演算法,通過一個雜湊(Hash)函式將一個目標IP地址對映到一臺伺服器。目標地址雜湊排程演算法先根據請求的目標IP地址,作為雜湊鍵(Hash Key)從靜態分配的散列表找出對應的伺服器,若該伺服器是可用的且未超載,將請求傳送到該伺服器,否
則返回空。
8.源地址雜湊排程(Source Hashing Scheduling)
源地址雜湊排程(Source Hashing Scheduling)演算法正好與目標地址雜湊排程演算法相反,它根據請求的源IP地址,作為雜湊鍵(Hash Key)從靜態分配的散列表找出對應的伺服器,若該伺服器是可用的且未超載,將請求傳送到該伺服器,否則返回空。它採用的雜湊函式與目標地址雜湊排程演算法的相同。它的演算法流程與目標地址雜湊排程演算法的基本相似,除了將請求的目標IP地址換成請求的源IP地址,所以這裡不一一敘述。在實際應用中,源地址雜湊排程和目標地址雜湊排程可以結合使用在防火牆叢集中,它們可以保證整個系統的唯一出入口。
LVS-DR模式
DR模式(直接路由模式)是通過改寫請求報文的目標MAC地址,將請求發給真實伺服器的,而真實伺服器響應後的處理結果直接返回給客戶端使用者。同TUN模式一樣,DR模式可以極大的提高集群系統的伸縮性。而且DR模式沒有IP隧道的開銷,對叢集中的真實伺服器也沒有必要必須支援IP隧道協議的要求。但是要求排程器LB與真實伺服器RS都有一塊網絡卡連線到同一物理網段上,必須在同一個區域網環境中。
工作原理
VS/DR模式的工作流程如上圖所示,它的連線排程和管理與NAT和TUN中的一樣,它的報文轉發方法和前兩種不同。DR模式將報文直接路由給目標真實 伺服器。在DR模式中,排程器根據各個真實伺服器的負載情況,連線數多少等,動態地選擇一臺伺服器,不修改目標IP地址和目標埠,也不封裝IP報文,而是將請求報文的資料幀的目標MAC地址改為真實伺服器的MAC地址。然後再將修改的資料幀在伺服器組的區域網上傳送。因為資料幀的MAC地址是真實伺服器的MAC地址,並且又在同一個區域網。那麼根據區域網的通訊原理,真實復位是一定能夠收到由LB發出的資料包。真實伺服器接收到請求資料包的時候,解開IP包頭檢視到的目標IP是VIP。(此時只有自己的IP符合目標IP才會接收進來,所以我們需要在本地的迴環藉口上面配置VIP。另:由於網路介面都會進行ARP廣播響應,但叢集的其他機器都有這個VIP的lo介面,都響應就會衝突。所以我們需要把真實伺服器的lo介面的ARP響應關閉掉。)然後真實伺服器做成請求響應,之後根據自己的路由資訊將這個響應資料包傳送回給客戶,並且源IP地址還是VIP。
LVS-DR模式下的負責均衡
實驗環境
物理機:172.25.254.14
vip:172.25.254.100
server1(VS):172.25.254.1
server2(RS):172.25.254.2
server3(RS):172.25.254.3
server1
修改yum源
vim /etc/yum.repos.d/rhel-source.repo
新增
[LoadBalancer]
name=LoadBalancer
baseurl=http://172.25.254.14/rhel6.5/LoadBalancer
gpgcheck=0
安裝ipvsadm工具
yum install ipvsadm -y
ip addr add 172.25.254.100/24 dev eth0
ipvsadm -A -t 172.25.254.100:80 -s rr #臨時新增vip,rr輪詢模式
ipvsadm -a -t 172.25.254.100:80 -r 172.25.254.2:80 -g #給vip新增rip,-g表示DR模式
ipvsadm -a -t 172.25.254.100:80 -r 172.25.254.3:80 -g
ipvsadm -ln #ip方式顯示核心虛擬伺服器表
server2
配置apache
新增VIP
ip addr add 172.25.254.100/32 dev eth0
隱藏RS上的VIP:
DR模式工作在鏈路層,採用了arp協議,rs表示real server,vs表示vitrual server,假設client的ip為cip,mac地址為m1,排程器vs的ip為vip,mac地址為m2,後端伺服器的ip為rip,mac地址為m3,由於DR模式工作在資料鏈路層,沒有經過路由器,所以vs和rs必須在同一個網段,當client訪問vip時,在DR模式下,vs通過它本身的一些演算法m2改為m3,這樣就可以實現直接將資料包丟給rs(這裡rs上必須有vip,因為客戶端訪問的是vip),rs通過解封,得到了vip,通過與自己vip匹配判斷資料包確實是給自己的,rs在通過封裝,直接將資料發給client,資料包不用原路返回)。由於vs和rs上都有vip,為了避免客戶端直接訪問RS而不經過排程器,因此採用arptables協議,在rs上新增策略,控制資料傳輸
yum install arptables_jf -y
arptables -L # 檢視策略
arptables -A IN -d 172.25.254.100 -j DROP #當有客戶訪問此vip時,拒絕訪問
arptables -A OUT -s 172.25.254.100 -j mangle --mangle-ip-s 172.25.254.2 #將rip偽裝成vip
/etc/init.d/arptables_jf save # 儲存策略
server3
與server2類似
配置apache
ip addr add 172.25.254.100/32 dev eth0
yum install arptables_jf -y
arptables -L
arptables -A IN -d 172.25.254.100 -j DROP
arptables -A OUT -s 172.25.254.100 -j mangle --mangle-ip-s 172.25.254.3
/etc/init.d/arptables_jf save
物理機測試:
curl 172.25.254.100 實現負載均衡
arp -an | grep 100 #檢視vip的vmac地址,此時vmac地址為server1中eth0網絡卡的mac地址
arp -d 172.25.254.100 #清除vip的vmac快取
健康檢查
server1
directord:專門為LVS監控而編寫的,用來監控lvs架構中伺服器池(server pool) 的伺服器狀態。
ldirectord 執行在 IPVS 節點上, ldirectord作為一個守護程序啟動後會對伺服器池中的每個真實伺服器傳送請求進行監控,如果伺服器沒有響應 ldirectord 的請求,那麼ldirectord 認為該伺服器不可用, ldirectord 會執行 ipvsadm 對 IPVS表中該伺服器進行刪除,如果等下次再次檢測有相應則通過ipvsadm 進行新增。
ipvsadm -C ## 清除之前配置的策略
配置yum源
vim /etc/yum.repos.d/rhel-source.repo
新增
[HighAvailability]
name=HighAvailability
baseurl=http://172.25.254.250/rhel6.5/HighAvailability
gpgcheck=0
安裝ldirectord,安裝包需自行下載
yum install ldirectord-3.9.5-3.1.x86_64.rpm -y
rpm -ql ldirectord #檢視軟體在系統中安裝檔案的路徑
cp /usr/share/doc/ldirectord-3.9.5/ldirectord.cf /etc/ha.d/
vim /etc/ha.d/ldirectord.cf
修改
virtual=172.25.254.100:80
real=172.25.254.2:80 gate
real=172.25.254.3:80 gate
fallback=127.0.0.1:80 gate
service=http
scheduler=rr
#persistent=600
#netmask=255.255.255.255
protocol=tcp
checktype=negotiate
checkport=80
request="index.html"
#receive="Test Page"
#virtualhost=www.x.y.z
配置apache
/etc/init.d/ldirectord start
物理機測試
curl 172.25.254.100
當server2 與 server3 http服務都正常工作時,實現訪問輪詢
二者中一個壞了,一直訪問另一個
兩個都壞了,訪問排程器server1
當二者中一個恢復時,又繼續訪問RS
lvs結合keepalived實現高可用
Keepalived
Keepalived在這裡主要用作RealServer的健康狀態檢查以及LoadBalance主機和BackUP主機之間failover的實現。IPVS通常與keepalived配合使用,後者也是LVS專案的子專案之一,用於檢測伺服器的狀態。
在lvs體系中,Keepalived主要有如下3個功能:
1 管理LVS負載均衡軟體
2 實現對LVS叢集節點的健康檢查功能
3 作為系統網路服務的高可用功能
實驗環境
主機系統:RHEL6 系列
selinux and iptables disabled
實驗主機:
LVS ‐ MASTER: 172.25.254.1
LVS ‐ BACKUP: 172.25.254.4
LVS ‐ VIP: 172.25.254.100
Realsever: server2:172.25.254.2 server3:172.25.254.3
server1
關閉剛才的ldirectord
keepalived的編譯安裝及配置,安裝包需自行下載
tar zxf keepalived-2.0.6.tar.gz
cd keepalived-2.0.6
yum install openssl-devel -y #下一條命令需要
./configure --with-init=SYSV --prefix=/usr/local/keepalived ##對即將安裝的軟體進行配置,檢查當前的環境是否滿足要安裝軟體的依賴關係,會生成一個Makefile檔案,此命令需要安裝gcc,--prefix指定安裝路徑
make #是用來編譯的,它從Makefile中讀取指令,然後編譯
make install #是用來安裝的,它也從Makefile中讀取指令,安裝到指定的位置。
chmod +x /usr/local/keepalived/etc/rc.d/init.d/keepalived #加可執行許可權
ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/ #建立軟連結
ln -s /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
ln -s /usr/local/keepalived/etc/keepalived/ /etc/
ln -s /usr/local/keepalived/sbin/keepalived /sbin/
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
[email protected] #設定郵件的傳送地址
}
notification_email_from [email protected]
smtp_server 127.0.0.1 #設定 smtp server 地址
smtp_connect_timeout 30 #設定連線 smtp 伺服器超時時間
router_id LVS_DEVEL #load balancer 的標識 ID,用於 email 警報
vrrp_skip_check_adv_addr
#vrrp_strict #嚴格執行VRRP協議規範,此模式不支援節點單播,必須註釋,否則它會自動給server1上防火牆加一條策略,導致實驗不能進行
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state MASTER
interface eth0 #HA 監測網路介面
virtual_router_id 24 #主、備機的 virtual_router_id 必須相同,取值 0-255
priority 100 #主機的優先順序,主機優先順序一定要大於備機
advert_int 1 #主備之間的通告間隔秒數
authentication { #主備切換時的驗證
auth_type PASS #設定驗證型別,主要有 PASS 和 AH 兩種
auth_pass 1111 #設定驗證密碼,在一個 vrrp_instance 下,MASTER 與 BACKUP 必須使用相同的密碼才能正常通訊
}
virtual_ipaddress { #設定虛擬 IP 地址,可以設定多個虛擬 IP 地址,每行一個
172.25.254.100
}
}
virtual_server 172.25.254.100 80 {
delay_loop 6
lb_algo rr
lb_kind DR
#persistence_timeout 50
protocol TCP
real_server 172.25.254.2 80 {
weight 1
TCP_CHECK {
connect_timeout 3
retry 3
delay_before_retry 3
}
}
real_server 172.25.254.3 80 {
weight 1
TCP_CHECK {
connect_timeout 3
retry 3
delay_before_retry 3
}
}
}
/etc/init.d/keepalived start
scp -r /usr/local/keepalived/ 172.25.254.4:/usr/local #在server1中編譯完了可直接拷給server4,不用在server4中再次編譯
server4
配置yum源及安裝ipvsadm
keepalived配置同server1:
ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
ln -s /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
ln -s /usr/local/keepalived/etc/keepalived/ /etc/
ln -s /usr/local/keepalived/sbin/keepalived /sbin/
scp 172.25.254.1:/etc/keepalived/keepalived.conf /etc/keepalived/ # 將server1的配置檔案拷過來
vim /etc/keepalived/keepalived.conf
修改:
state BACKUP
priority 50
/etc/init.d/keepalived start
server2與server3
配置apache及arptables策略
物理機測試
負載均衡測試:
高可用測試:
關閉server1的keepalived,server4便接管服務,當啟動server1的keepalived時,server1又接管了服務。其間不影響負載均衡
健康檢測:
雙主模式
server2 和 server3 安裝vsftpd服務 並在/var/ftp/建立檔案 新增vip
server2
yum install vsftpd -y
/etc/init.d/vsftpd start
touch /var/ftp/server2
ip addr add 172.25.254.200/32 dev eth0
vim /etc/sysconfig/arptables
新增:
[0:0] -A IN -d 172.25.254.100 -j DROP
[0:0] -A IN -d 172.25.254.200 -j DROP
[0:0] -A OUT -s 172.25.254.100 -j mangle --mangle-ip-s 172.25.254.2
[0:0] -A OUT -s 172.25.254.200 -j mangle --mangle-ip-s 172.25.254.2
/etc/init.d/arptables_jf restart
server3
類似於server2
yum install vsftpd -y
/etc/init.d/vsftpd start
touch /var/ftp/server3
ip addr add 172.25.254.200/32 dev eth0
vim /etc/sysconfig/arptables
新增:
[0:0] -A IN -d 172.25.254.100 -j DROP
[0:0] -A IN -d 172.25.254.200 -j DROP
[0:0] -A OUT -s 172.25.254.100 -j mangle --mangle-ip-s 172.25.254.3
[0:0] -A OUT -s 172.25.254.200 -j mangle --mangle-ip-s 172.25.254.3
/etc/init.d/arptables_jf restart
server1
vim /etc/keepalived/keepalived.conf
新增
vrrp_instance VI_2 {
state BACKUP
interface eth0
virtual_router_id 124
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.200
}
}
virtual_server 172.25.254.200 21 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 172.25.254.2 21 {
weight 1
TCP_CHECK {
connect_timeout 3
retry 3
delay_before_retry 3
}
}
real_server 172.25.254.3 21 {
weight 1
TCP_CHECK {
connect_timeout 3
retry 3
delay_before_retry 3
}
}
}
scp /etc/keepalived/keepalived.conf 172.25.254.4:/etc/keepalived/
/etc/init.d/keepalived restart
server4
vim /etc/keepalived/keepalived.conf
修改vrrp_instance VI_1 與 vrrp_instance VI_2 的狀態與優先順序,使server1與server4互為主備
server1 httpd主 vsftpd備
server4 httpd備 vsftpd主
/etc/init.d/keepalived restart
物理機測試
高可用測試:
當server1與sever4都正常工作時
httpd服務使用的是server1
vsftpd服務使用的是server4
當server1關閉keepalived時,server4接管httpd服務
當server4關閉keepalived時,server1接管vsftpd服務
健康檢查: