準備
準備3臺centos服務器172.20.x.40
,172.20.x.41
,172.20.x.42
作爲一個LVS+nginx的負載集羣,其中172.20.x.40
作爲LVS-master,172.20.x.36.41
作爲LVS-Backup;172.20.x.42
和172.20.x.44
作爲nginx負載向後面業務服務器負載。
第一次接觸lvs+nginx+keepalived的集羣負載,好多不懂,中間折騰了好久,截圖與實際的ip有些不符合,最終的集羣服務信息如下
名稱 | ip | 說明 | 備註 |
---|---|---|---|
虛擬地址 | 172.20.36.222:81 | 對外的ip地址 | 虛擬的IP地址,注意不能與局域網中的IP地址重複 |
lvs-master | 172.20.36.41 | lvs主節點 | 真實IP地址,需要該機器上的keepalived配置端口,用於VIP的漂移 |
lvs-backup | 172.20.36.42 | lvs備節點 | 真實IP地址,需要該機器上的keepalived配置端口,用於VIP的漂移 |
nginx-01 | 172.20.36.43:81 | nginx節點01 | 真實IP地址,實現應用層的業務負載 |
nginx-02 | 172.20.36.44:81 | nginx節點02 | 真實IP地址,實現應用層的業務負載 |
一、環境配置
1. 防火牆
查看防火牆狀態firewall-cmd --state
,對於運行的將防火牆關閉systemctl stop firewalld.service
,systemctl disablefirewalld.service
2.selinux設置
關閉每臺服務器selinux,修改/etc/selinux/config
,將SELINUX由enforcing修改爲disabled,重啓服務器。
修改selinux的命令# sed -i 's/^ *SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
重啓之後,查看服務器selinux狀態sestatus -v
:
二、ipvs和keepalived安裝及配置
1.LVS服務器上安裝虛擬服務
1)ivps安裝
在LVS-Master和LVS-Backup的服務器上安裝ipvs,輸入命令行:yum -y install ipvsadm
,安裝完畢如下:
2)keepalived安裝
在LVS-Master和LVS-Backup的服務器上安裝keepalive,輸入命令行:yum -y install keepalived
,如下:
2.配置
分別配置兩臺LVS服務器上的keepalive配置信息。
1)配置Master
配置LVS-Master上的keepalive配置,打開/etc/keepalived/keepalived.conf
,修改爲以下配置:
! Configuration File for keepalived
global_defs {
router_id lvs01
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 100
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.20.36.222
}
}
virtual_server 172.20.36.222 81 {
delay_loop 6
lb_algo wrr
lb_kind DR
#persistence_timeout 50
protocol TCP
real_server 172.20.36.43 81 {
weight 1
TCP_CHECK {
connect_timeout 10
retry 3
delay_before_retry 3
connect_port 81
}
}
real_server 172.20.36.44 81 {
weight 1
TCP_CHECK {
connect_timeout 10
retry 3
delay_before_retry 3
connect_port 81
}
}
}
2)配置Backup
打開/etc/keepalived/keepalived.conf
,修改爲以下配置:
! Configuration File for keepalived
global_defs {
router_id lvs02
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 100
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.20.36.222
}
}
virtual_server 172.20.36.222 81 {
delay_loop 6
lb_algo wrr
lb_kind DR
#persistence_timeout 50
protocol TCP
real_server 172.20.36.43 81 {
weight 1
TCP_CHECK {
connect_timeout 10
retry 3
delay_before_retry 3
connect_port 81
}
}
real_server 172.20.36.44 81 {
weight 1
TCP_CHECK {
connect_timeout 10
retry 3
delay_before_retry 3
connect_port 81
}
}
}
3)Master和Backup的區別
配置說明:
==router_id ==設置當前節點的名稱
==virtual_ipaddress == 設置了虛擬的IP地址172.20.36.100
開放端口81
,真實的兩個LVS的IP地址爲172.20.36.40
和172.20.36.41
,LVS開放端口80
以上示例的配置採用DR負載均衡和wrr負載調度算法。
3.ipvs簡單介紹
1)三種的ip負載方式:
- VS/NAT (Virtual Server via Network Address Translation)
也就是網絡地址翻譯技術實現虛擬服務器,當用戶請求到達調度器時,調度器將請求報文的目標地址(即虛擬IP地址)改寫成選定的Real Server地址,同時報文的目標端口也改成選定的Real Server的相應端口,最後將報文請求發送到選定的Real Server。在服務器端得到數據後,Real Server返回數據給用戶時,需要再次經過負載調度器將報文的源地址和源端口改成虛擬IP地址和相應端口,然後把數據發送給用戶,完成整個負載調度過程。
可以看出,在NAT方式下,用戶請求和響應報文都必須經過Director Server地址重寫,當用戶請求越來越多時,調度器的處理能力將稱爲瓶頸 - VS/TUN(Virtual Server via IP Tunneling)
也就是IP隧道技術實現虛擬服務器。它的連接調度和管理與VS/NAT方式一樣,只是它的報文轉發方法不同,VS/TUN方式中,調度器採用IP隧道技術將用戶請求轉發到某個Real Server,而這個Real Server將直接響應用戶的請求,不再經過前端調度器,此外,對Real Server的地域位置沒有要求,可以和Director Server位於同一個網段,也可以是獨立的一個網絡。因此,在TUN方式中,調度器將只處理用戶的報文請求,集羣系統的吞吐量大大提高。 - VS/DR(Virtual Server via Direct Routing)
也就是用直接路由技術實現虛擬服務器。它的連接調度和管理與VS/NAT和VS/TUN中的一樣,但它的報文轉發方法又有不同,VS/DR通過改寫請求報文的MAC地址,將請求發送到Real Server,而Real Server將響應直接返回給客戶,免去了VS/TUN中的IP隧道開銷。這種方式是三種負載調度機制中性能最高最好的,但是必須要求Director Server與Real Server都有一塊網卡連在同一物理網段上,且真實服務器網絡設備或設備別名不作 ARP 響應。
2)八種負載調度算法
-
輪叫(Round Robin)
調度器通過"輪叫"調度算法將外部請求按順序輪流分配到集羣中的真實服務器上,它均等地對待每一臺服務器,而不管服務器上實際的連接數和系統負載。 -
加權輪叫(Weighted Round Robin)
調度器通過"加權輪叫"調度算法根據真實服務器的不同處理能力來調度訪問請求。這樣可以保證處理能力強的服務器處理更多的訪問流量。調度器可以自動問詢真實服務器的負載情況,並動態地調整其權值。 -
最少鏈接(Least Connections)
調度器通過"最少連接"調度算法動態地將網絡請求調度到已建立的鏈接數最少的服務器上。如果集羣系統的真實服務器具有相近的系統性能,採用"最小連接"調度算法可以較好地均衡負載。 -
加權最少鏈接(Weighted Least Connections)
在集羣系統中的服務器性能差異較大的情況下,調度器採用"加權最少鏈接"調度算法優化負載均衡性能,具有較高權值的服務器將承受較大比例的活動連接負載。調度器可以自動問詢真實服務器的負載情況,並動態地調整其權值。 -
基於局部性的最少鏈接(Locality-Based Least Connections)
“基於局部性的最少鏈接” 調度算法是針對目標IP地址的負載均衡,目前主要用於Cache集羣系統。該算法根據請求的目標IP地址找出該目標IP地址最近使用的服務器,若該服務器 是可用的且沒有超載,將請求發送到該服務器;若服務器不存在,或者該服務器超載且有服務器處於一半的工作負載,則用"最少鏈接"的原則選出一個可用的服務 器,將請求發送到該服務器。 -
帶複製的基於局部性最少鏈接(Locality-Based Least Connections with Replication)
"帶複製的基於局部性最少鏈接"調度算法也是針對目標IP地址的負載均衡,目前主要用於Cache集羣系統。它與LBLC算法的不同之處是它要維護從一個 目標IP地址到一組服務器的映射,而LBLC算法維護從一個目標IP地址到一臺服務器的映射。該算法根據請求的目標IP地址找出該目標IP地址對應的服務 器組,按"最小連接"原則從服務器組中選出一臺服務器,若服務器沒有超載,將請求發送到該服務器,若服務器超載;則按"最小連接"原則從這個集羣中選出一 臺服務器,將該服務器加入到服務器組中,將請求發送到該服務器。同時,當該服務器組有一段時間沒有被修改,將最忙的服務器從服務器組中刪除,以降低複製的 程度。 -
目標地址散列(Destination Hashing)
"目標地址散列"調度算法根據請求的目標IP地址,作爲散列鍵(Hash Key)從靜態分配的散列表找出對應的服務器,若該服務器是可用的且未超載,將請求發送到該服務器,否則返回空。 -
源地址散列(Source Hashing)
"源地址散列"調度算法根據請求的源IP地址,作爲散列鍵(Hash Key)從靜態分配的散列表找出對應的服務器,若該服務器是可用的且未超載,將請求發送到該服務器,否則返回空。
三、啓動LVS-Master和LVS-Backup上的ipvs服務和keepalived服務
1.ipvs啓動
執行sudo lsmod |grep ip_vs
查看ipvs是否已經啓動,若沒有什麼結果則需要啓動ipvs,分別在機器172.20.36.40
和172.20.36.41
上執行啓動命令啓動ipvs,如下:
啓動systemctl start ipvsadm.service
停止systemctl stop ipvsadm.service
重啓systemctl restart ipvsadm.service
查看ipvs的狀態systemctl status ipvsadm.service
查看狀態如下,說明ipvs已經啓動。
遇到一個啓動錯誤時的日誌:
最後查詢一圈使用ipvsadm --save > /etc/sysconfig/ipvsadm
成功解決,啓動成功:
2.keepalived啓動
查看狀態systemctl status keepalived
啓動systemctl start keepalived
停止systemctl stop keepalived
重啓systemctl restart keepalived
未執行啓動前,查看狀態:
執行啓動命令後,查看狀態:
keepalived的默認日誌文件在/var/log/messages
下,有問題可以根據日誌描述解決。
四、安裝和配置nginx節點
1.nginx安裝及配置
詳細請查看 nginx的源碼編譯和安裝。
2.配置nginx所有服務器的“路由”
根據上面描述,使用的虛擬IP爲172.20.36.222
,需要再真實的nginx服務器上設置虛擬ip、關閉“ARP查詢”功能和設置迴環ip,執行下面的腳本即可:
#!/bin/bash
VIP=172.20.36.222
case "$1" in
start)
/sbin/ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP
/sbin/route add -host $VIP dev lo:0
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
sysctl -p >/dev/null 2>&1
echo "RealServer Start OK"
;;
stop)
/sbin/ifconfig lo:0 down
/sbin/route del $VIP >/dev/null 2>&1
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
echo "RealServer Stoped"
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac
exit 0
我手邊兩臺nginx的真實ip是172.20.36.43:81
和172.20.36.44:81
,需要在這兩臺機器上執行上面的腳本,執行完成後如下:
這一塊在一開始測試的時候由於參考【參考鏈接】中的腳本,中間一行==/etc/rc.d/init.d/functions==似乎並沒有用,並且會報錯,最後經過測試就刪除了這句。
五、測試
到此爲止我們已經搭建好了基於lvs+keepalived+nginx的集羣負載,我們做一些測試,驗證一下幾個點:
1)VIP漂移和高可用
2)nginx可用性檢測
1.VIP漂移
VIP漂移指的是當ipvs的主節點出現故障的時候,ipvs的備用節點在配置的時間內完成主備切換,對用戶不可感知,並以郵件的方式通知管理員修復出現的故障,keepalived的配置就是用來解決這個問題的。
1)ipvs主備節點無故障時:
A. 主節點紅色框,可用真實nginx負載節點綠色框
B. 主節點的網卡信息,紅色爲虛擬IP
C. 備用節點的網卡信息,並無上圖紅色框的內容,說明此時的master節點正常
D. 數據訪問也正常
2)ipvs主節點故障時,發生VIP漂移
A. 關閉主節點上的keepalived服務製造故障
B. 查看主備用節點的網卡
主節點網卡信息
備用節點網卡信息
從上面兩張圖看,說明已經發生了VIP漂移,並且訪問也正常
2.nginx可用性
製造一個nginx節點異常,將nginx01
節點網卡關閉。
直接訪問正常,且返回的是節點2的ip和nginx名稱
到此爲止,lvs+nginx+keepalived的直連權重負載就配置完了。
六、番外篇
除了上面的配置之外,可以手動的去維護ipva集羣信息,主要用於動態的負載一些配置。包括:
1)增刪改ipvs虛擬服務地址
2)給虛擬服務地址增加新的nginx負載地址
1.添加ipvs集羣服務
1)添加ipvs集羣
查看 ipvsadm -ln
,在服務器172.20.36.40
上執行該命令,查看當前ipvs集羣的狀態,當前ipvs沒有集羣信息。如下:
執行ipvsadm -A -t 172.20.36.100:81 -s rr
添加一個ipvs集羣節點,但是報了錯,如下:
排查了很久,最後發現是因爲中間修改過LVS的配置,雖然重啓了LVS,但是並沒有重啓keepalived。調用重啓keepalive的重啓命令後重新加載虛擬IP時成功了:
其中,紅色是重啓指令,綠色是已經配置的兩個LVS的主備地址。
2)給集羣服務中添加真實服務
上一步驟中我們已經添加了ipvaadm的集羣,現在我們需要將兩個LVS-主備真實IP添加到虛擬集羣中去,使用指令
ipvsadm -a -t 172.20.36.100:81 -r 172.20.36.40:80 -m -w 1
添加LVS01,ipvsadm -a -t 172.20.36.100:81 -r 172.20.36.41:80 -m -w 1
添加LVS02,沒有錯誤提示說明已經添加成功,查看如下:
參考鏈接:
ipvsadm命令
ipvsadm啓動失敗
DR模式下realserver無響應
ipvsadm的統計
自動運維ipvs