使用LVS負載均衡搭建web群集的原理及安裝配置詳解
LVS是 Linux Virtual Server 的簡稱,也就是Linux虛擬服務器。這是一個由章文嵩博士發起的一個開源項目,它的官方網站是 http://www.linuxvirtualserver.org。 LVS是Linux內核標準的一部分。LVS是一個實現負載均衡集群的開源軟件項目,通過 LVS 的負載均衡技術和 Linux操作系統可以實現一個高性能高可用的 Linux 服務器集群,它具有良好的可靠性、可擴展性和可操作性。LVS架構從邏輯上可分為調度層、Server集群層和共享存儲。LVS實際上相當於基於IP地址的虛擬化應用。
二、LVS的組成
LVS 由2部分程序組成,包括 ipvs 和 ipvsadm。
- ipvs(ip virtual server):工作在內核空間,是真正生效實現調度的代碼。
- ipvsadm:工作在用戶空間,負責為ipvs內核框架編寫規則,定義誰是集群服務,而誰是後端真實的服務器(Real Server)
三、LVS相關術語
- DS:Director Server, 指的是前端負載均衡器節點。
- RS:Real Server, 後端真實的工作服務器。
- VIP:向外部直接面向用戶請求,作為用戶請求的目標的IP地址。
- DIP:Director Server IP, 前端負載均衡器IP地址,主要用於和內部主機通信。
- RIP:Real Server IP, 後端服務器的IP地址。
- CIP:Client IP, 訪問客戶端的IP地址
四、LVS的工作模式介紹
LVS負載均衡常見的有三種工作模式,分別是地址轉換(簡稱NAT模式)、IP隧道(簡稱TUN模式)和直接路由(簡稱DR模式),其實企業中最常用的是 DR 實現方式,而 NAT 配置上比較簡單和方便,下面總結 DR 和 NAT 原理和特點:
1. LVS-NAT模式
(1) LVS-NAT原理
類似於防火墻的私有網絡結構,Director Server作為所有服務器節點的網關,,即作為客戶端的訪問入口,也是各節點回應客戶端的訪問出口,其外網地址作為整個群集的VIP地址,其內網地址與後端服務器Real Server在同一個物理網絡,Real Server必須使用私有IP地址。
數據包流向分析
-
用戶發送請求到Director Server,請求的數據報文(源IP是CIP,目標IP是VIP)到達內核空間。
-
內核空間判斷數據包的目標IP是本機,此時IPVS比對數據包請求的服務是否為集群服務,若是,修改數據包的目標IP地址為後端服務器IP,重新封裝數據包(源IP為CIP,目標IP為RIP),然後選路將數據包發送給Real Server。
-
Real Server比對發現目標IP是本機的IP,重新封裝報文(源IP為RIP,目標IP為CIP)發回給Director Server。
- Director Server重新封裝數據包,將源IP地址修改為自己的VIP地址,然後響應給客戶端。 此時報文的源IP為VIP,目標IP為CIP。
(2) LVS-NAT模型的特點
-
RS必須使用私有IP地址,網關指向DIP。
-
DIP與RIP必須在同一網段內。
-
DS作為所有服務器節點的網關,也就是說請求和響應報文都需要經過Director Server。
-
支持端口映射
- 高負載場景中,Director Server壓力比較大,易成為性能瓶頸。
2. LVS-DR模式
(1) LVS-DR原理
Director Server作為群集的訪問入口,但不作為網關使用,後端服務器池中的Real Server與Director Server在同一個物理網絡中,發送給客戶機的數據包不需要經過Director Server。為了響應對整個群集的訪問,DS與RS都需要配置有VIP地址。
數據包流向分析
-
用戶發送請求到Director Server,請求的數據報文(源IP是CIP,目標IP是VIP)到達內核空間。
- 由於DS和RS在同一個網絡中,所以是通過二層數據鏈路層來傳輸。
- 內核空間判斷數據包的目標IP是本機IP,此時IPVS比對數據包請求的服務是否為集群服務,若是,重新封裝數據包,修改源MAC地址為DIP的MAC地址,目標MAC地址為RIP的MAC地址,源IP地址與目標IP地址沒有改變,然後將數據包發送給Real Server.
- RS發現請求報文的MAC地址是自己的MAC地址,就接收此報文,重新封裝報文(源IP地址為VIP,目標IP為CIP),將響應報文通過lo接口傳送給eth0網卡然後向外發出。
- RS直接將響應報文傳送到客戶端。
(2) LVS-DR模型的特點
- RS和DS必須在同一個物理網絡中。
- RS可以使用私有地址,也可以使用公網地址,如果使用公網地址,可以通過互聯網對RIP進行直接訪問。
- 所有的請求報文經由Director。 Server,但響應報文必須不能經過Director Server。
- RS的網關絕不允許指向DIP(不允許數據包經過director)。
- RS上的lo接口配置VIP的IP地址。
LVS-DR模式需要註意的是:
保證前端路由將目標地址為VIP報文統統發給Director Server,而不是RS。
解決方案是:修改RS上內核參數(arp_ignore和arp_announce)將RS上的VIP配置在lo接口的別名上,並限制其不能響應對VIP地址解析請求。
-
arp_ignore=1表示系統只響應目的IP為本地IP的ARP請求。
- arp_announce=2表示系統不使用IP包的源地址來設置ARP請求的源地址,而選擇發送接口的IP地址。
五、LVS的負載調度算法
最常用的有四種;輪詢(rr)、加權輪詢(wrr)、最少連接(lc)和加權最少連接(wlc)。
- 輪詢(rr):將收到的訪問請求按照順序輪流調度到不同的服務器上,不管後端真實服務器的實際連接數和系統負載。
- 加權輪詢(wrr):給RS設置權重,權重越高,那麽分發的請求數越多,權重的取值範圍0–100。根據每臺服務器的性能,給每臺服務器添加權值,如果RS1的權值為1,RS2的權值為2,那麽調度到RS2的請求會是RS1的2倍。權值越高的服務器,處理的請求越多。這種算法是對rr算法的一種優化和補充。
- 最少連接(lc):根據後端RS的連接數來決定把請求分發給誰,比RS1連接數比RS2連接數少,那麽請求就優先發給RS1。
- 加權最少連接(wlc):根據後端RS的權重和連接數來決定把請求分發給誰,權重較高,連接數少的RS會優先處理請求。
六、LVS的共享存儲服務器
為後端真實服務器提供穩定、一致的文件存取服務,在Linux/Unix環境中,共享存儲可以使用NAS設備或者提供NFS(網絡文件系統)共享服務的專用服務器。一般放在私有網絡中。
七、實現LVS的NAT模式
1.實驗環境
IP地址規劃
客戶端訪問服務的請求IP地址:VIP 12.0.0.1
Server | IP | 系統 |
---|---|---|
Director Server | DIP 192.168.10.1 | CentOS7 |
NFS Server | 192.168.10.50 | RedHat6 |
Real Server1 | RIP 192.168.10.51 | CentOS7 |
Real Server2 | RIP 192.168.10.52 | CentOS7 |
在配置的Director的服務器上添加兩塊網卡,詳細步驟可參考DNS分離解析這篇博文有介紹,設置外網ens37為VIP,內網ens33為DIP,把兩個 real server 的網關設置為 Director 的內網 iP即DIP。
在虛擬機的配置中DIP網絡連接方式設置為僅主機模式,Real Server也配置為僅主機模式。
2.安裝和配置
yum安裝軟件
方法一:如果虛擬機網絡是僅主機模式,沒有網絡,可以本地創建yum倉庫,然後進行yum安裝。
方法二:如果虛擬機網絡是NAT模式,有網絡,可以在線yum安裝。
(1) 配置NFS服務器
yum install nfs-utils -y #7系統版本需要安裝nfs工具包
service rpcbind start
service nfs restart
#創建共享目錄
mkdir /opt/wwwroot1
mkdir /opt/wwwroot2
#給共享目錄寫入權限
chmod 777 /opt/wwwroot1
chmod 777 /opt/wwwroot2
#編輯配置文件
vim /etc/exports
/opt/wwwroot1 192.168.10.0/24(rw,sync)
/opt/wwwroot2 192.168.10.0/24(rw,sync)
#發布共享
exportfs -rv
#關閉防火墻
service iptables stop
(2) 配置兩個real server服務器
#安裝nfs客戶端
yum install nfs-utils -y
systemctl start rpcbind.service
systemctl start nfs.service
#查看nfs掛載
showmount -e 192.168.10.50
#掛載nfs
#Real Server1掛載nfs
#法一:直接掛載
mount.nfs 192.168.10.50:/opt/wwwroot1 /var/www/html
#法二:修改fatab文件掛載
vim /etc/fstab
192.168.10.50:/opt/wwwroot1 /var/www/html nfs defaults,_netdev 0 0
#Real Server2掛載nfs
方法同Real Server1,將掛載目錄/opt/wwwroot1改成/opt/wwwroot2,其余一樣。
#安裝httpd
yum install httpd -y
#real server1創建測試網頁
echo "Server 192.168.10.51" > /var/www/html/index.html
#real server2創建測試網頁
echo "Server 192.168.10.52" > /var/www/html/index.html
#啟動httpd服務
systemctl start httpd.service
systemctl enable httpd.service
#關閉防火墻和安全性策略
systemctl stop firewalld.service
systemctl disable firewalld.service
setenforce 0
#測試網頁打開是否正常
firefox http://127.0.0.1/
(3) 配置Director server服務器
#安裝ipvsadm管理工具
yum install ipvsadm -y
#加載LVS內核模塊
modprobe ip_vs
#查看ip_vs版本信息
cat /proc/net/ip_vs
#開啟路由轉發
#法一:編輯sysctl.conf文件,永久路由轉發
vim /etc/sysctl.conf
net.ipv4.ip_forward=1
sysctl -p
#法二:直接編輯,臨時路由轉發
echo "1" > /proc/sys/net/ipv4/ip_forward
#配置SNAT轉發規則,設置nat防火墻
iptables -F -t nat #清空nat防火墻
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o ens37 -j SNAT --to-source 12.0.0.1
#Director 上編輯 nat 實現負載分配腳本
# 設置 ipvsadm
vim nat.sh
#!/bin/bash
ipvsadm-save > /etc/sysconfig/ipvsadm #保存策略
service ipvsadm start
ipvsadm -C #清除內核虛擬服務器表中的所有記錄
ipvsadm -A -t 12.0.0.1:80 -s rr #創建虛擬服務器
ipvsadm -a -t 12.0.0.1:80 -r 192.168.10.51:80 -m
ipvsadm -a -t 12.0.0.1:80 -r 192.168.10.52:80 -m
ipvsadm
ipvsadm管理工具的選項用法:
- -A: 表示添加虛擬服務器
- -t: 用來指定VIP地址及TCP端口
- -s: 用來指定負載均衡調度算法
- -a: 表示添加真實服務器
- -r: 用來指定RIP地址及TCP端口
- -m: 表示使用NAT群集模式
- -g: 表示使用DR群集模式
- -i: 表示使用TUN群集模式
- -w: 用來設置權重
#保存nat腳本後直接運行
chmod +x nat.sh
./nat.sh
#查看ipvsadm設置的規則
ipvsadm -ln
3.測試LVS群集
用Windows客戶端直接訪問http://12.0.0.1, 將能夠看到由真實服務器提供的網頁內容。
第一次訪問:
Real Server連接次數查看:
刷新一次:
Real Server連接次數查看:
八、實現LVS的DR模式
1.實驗環境
四臺機器:
Director節點: (ens33 192.168.10.53 vip ens33:0 192.168.10.80)
Real server1: (ens33 192.168.10.51 vip lo:0 192.168.10.80)
Real server2: (ens33 192.168.10.52 vip lo:0 192.168.10.80)
NFS Server: 192.168.10.50
2.安裝和配置
(1) 配置NFS server服務器
步驟如上
(2) 配置兩個real server服務器
#配置虛擬IP地址
cd /etc/sysconfig/network-scripts/
cp ifcfg-lo ifcfg-lo:0
vim ifcfg-lo:0
DEVICE=lo:0
IPADDR=192.168.10.80
NETMASK=255.255.255.255 #子網掩碼必須全為1
ONBOOT=yes
ifup lo:0
#安裝nfs客戶端
yum install nfs-utils -y
service rpcbind start
service nfs restart
#查看nfs掛載
showmount -e 192.168.10.50
#掛載nfs
#Real Server1掛載nfs
#法一:直接掛載
mount.nfs 192.168.10.50:/opt/wwwroot1 /var/www/html
#法二:修改fatab文件掛載
vim /etc/fstab
192.168.10.50:/opt/wwwroot1 /var/www/html nfs defaults,_netdev 0 0
#Real Server2掛載nfs
方法同Real Server1,將掛載目錄/opt/wwwroot1改成/opt/wwwroot2,其余一樣。
#安裝httpd
yum install httpd -y
#real server1創建測試網頁
echo "Server 192.168.10.51" > /var/www/html/index.html
#real server2創建測試網頁
echo "Server 192.168.10.52" > /var/www/html/index.html
#啟動httpd服務
systemctl start httpd.service
systemctl enable httpd.service
#關閉防火墻和安全性策略
systemctl stop firewalld.service
systemctl disable firewalld.service
setenforce 0
#在兩臺real server上配置啟動腳本
vim /etc/init.d/rs.sh
#!/bin/bash
VIP=192.168.10.80
case "$1" in
start)
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)
ifconfig lo:0 down
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 Stopd"
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac
exit 0
#保存後直接運行腳本
chmod +x rs.sh
service rs.sh start
先在本機上自測一下訪問網頁:
(2) 配置Director server服務器
#配置虛擬IP地址
cd /etc/sysconfig/network-scripts/
cp ifcfg-ens33 ifcfg-ens33:0
vim ifcfg-ens33:0
DEVICE=ens33:0
ONBOOT=yes
IPADDR=192.168.10.80
NETMASK=255.255.255.0
ifup ens33:0
#安裝ipvsadm
yum install ipvsadm -y
vim /etc/sysctl.conf
#開啟路由功能
net.ipv4.ip_forward=1
#調整/proc響應參數,關閉Linux內核重定向參數響應
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
sysctl -p
配置啟動腳本
vim /etc/init.d/dr.sh
#!/bin/bash
GW=192.168.10.1
VIP=192.168.10.80
RIP1=192.168.10.51
RIP2=192.168.10.52
case "$1" in
start)
/sbin/ipvsadm --save > /etc/sysconfig/ipvsadm
systemctl start ipvsadm
/sbin/ifconfig ens33:0 $VIP broadcast $VIP netmask 255.255.255.255 broadcast $VIP up
/sbin/route add -host $VIP dev ens33:0
/sbin/ipvsadm -A -t $VIP:80 -s rr
/sbin/ipvsadm -a -t $VIP:80 -r $RIP1:80 -g
/sbin/ipvsadm -a -t $VIP:80 -r $RIP2:80 -g
echo "ipvsadm starting --------------------[ok]"
;;
stop)
/sbin/ipvsadm -C
systemctl stop ipvsadm
ifconfig ens33:0 down
route del $VIP
echo "ipvsamd stoped----------------------[ok]"
;;
status)
if [ ! -e /var/lock/subsys/ipvsadm ];then
echo "ipvsadm stoped---------------"
exit 1
else
echo "ipvsamd Runing ---------[ok]"
fi
;;
*)
echo "Usage: $0 {start|stop|status}"
exit 1
esac
exit 0
chmod +x /etc/init.d/dr.sh
service dr.sh start
#關閉防火墻和安全策略
systemctl stop firewalld.service
systemctl disable firewalld.service
setenforce 0
3.測試LVS群集
用Windows客戶端直接訪問 http://192.168.10.80/, 將能夠看到由真實服務器提供的網頁內容。
第一次訪問:
Real Server連接次數查看:
刷新一次:
Real Server連接次數查看:
九、LVS結合keepalive
LVS可以實現負載均衡,但是不能夠故障切換和健康檢查,也就是當一個rs服務器出現故障時,LVS仍然會把請求轉發給故障的rs服務器,這樣就會導致請求無效。keepalive軟件可以解決 LVS 單點故障的問題,能同時實現 LVS 的高可用性。這裏以LVS-DR模式為例。
1.實驗環境
五臺機器:
- Keepalived1 + lvs1(Director1):192.168.10.53 (主)
- Keepalived2 + lvs2(Director2):192.168.10.54 (從)
- Real server1:192.168.10.51
- Real server2:192.168.10.52
- NFS Server: 192.168.10.55
- VIP: 192.168.10.80
2.安裝配置
在實現LVS的DR模式前提下,在兩個Director Server 節點服務器部署keepalived服務。
#安裝keepalive軟件
yum install keepalived -y
主keepalived節點配置(lvs1)
#主節點( MASTER )配置文件
vim /etc/keepalived/keepalived.conf
global_defs {
... #省略部分
smtp_server 127.0.0.1 #指向本地
router_id LVS_01 #指定名稱,備份服務器不同名稱
... #省略部分
}
vrrp_instance VI_1 { #定義VRRP熱備實例
state MASTER #MASTER表示主調度器
interface ens33 #承載VIP地址的物理接口
virtual_router_id 51 #虛擬路由器的ID號,每個熱備組保持一致
priority 100 #主調度器優先級
advert_int 1 #通告間隔秒數
authentication { #認證信息
auth_type PASS #認證類型
auth_pass 1111 #字碼密串
}
virtual_ipaddress { #指定群集VIP地址,也就是漂移地址
192.168.10.80
}
}
virtual_server 192.168.10.80 80 { #虛擬服務器VIP地址
delay_loop 6 #健康檢查的間隔時間
lb_algo rr #輪詢rr的調度算法
lb_kind DR #直接路由工作模式
persistence_timeout 0 #連接保持時間
protocol TCP #應用服務采用的是TCP協議
real_server 192.168.10.51 80 {
#第一個web節點的服務器地址、端口
weight 1
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.10.52 80 {
#第二個web節點的服務器地址、端口
router_id LVS_01 weight 1
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
從keepalived節點配置(lvs2)
拷貝主節點的配置文件keepalived.conf,然後修改如下內容:
router_id LV -> router_id LVS_02 #從調度器名稱
state MASTER -> state BACKUP #從調度器
priority 100 -> priority 90 #從調度器優先級
啟動keepalive
#先主後從分別啟動keepalive
systemctl start keepalived.service
systemctl status keepalived.service
3.測試 keepalived 的HA特性
(1)虛擬IP地址漂移
首先在master(lvs1)上執行命令 ip addr ,可以看到vip在master節點上的;
這時如果在master上執行 systemctl stop keepalived.service命令,這時vip已經不在master上,在slave節點上執行 ip addr 命令可以看到 vip 已經正確漂到slave節點。這時客戶端去訪問http://192.168.10.80 訪問依然正常。
systemctl stop keepalived.service #在lvs1主調度器上停止keepalived服務
(2)連通性
在客戶機執行“ping 192.168.10.80 -t”,能夠正常ping通。
禁用master(lvs1)的ens33網卡,發現還是能正常ping通的。
(3)web訪問測試
禁用master(lvs1)的ens33網卡,再次訪問上述web服務,網頁文檔顯示正常。
使用LVS負載均衡搭建web群集的原理及安裝配置詳解