一、LVS 概述
LVS是Linux Virtual Server的縮寫,是一種基于Linux核心實作的高可用性、高性能的負載均衡技術。它可以将來自用戶端的請求分發到多台伺服器上,實作多台伺服器的負載均衡,提高整個系統的性能和可用性。
LVS技術主要包括以下幾個元件:
- LVS排程器:負責接收用戶端請求并将其分發到後端的真實伺服器上,根據不同的負載均衡算法進行分發。
- 真實伺服器:處理來自排程器的請求并傳回響應,提供實際的服務。
- Keepalived:LVS的高可用元件,用于監控LVS排程器的狀态并在發生故障時自動切換到備用排程器,以保證服務的高可用性。
- IPVS:核心中實作LVS技術的子產品,實作負載均衡算法和請求分發等功能。
LVS技術廣泛應用于網際網路服務、網絡遊戲、資料中心等領域,能夠提高系統的性能和可用性,降低系統的維護成本。
二、LVS 基本操作
1)基本指令操作
1、添加規則
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p timeout] [-M netmast] [--pepersistence_engine] [-b sched-flags]
2、删除規則
ipvsadm -D -t|u|f service-address
3、清空定義的所有内容
ipvsadm -C
4、重載
ipvsadm -R
6、儲存
ipvsadm -S [-n]
7、增、改RS規則
ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]
8、删除RS規則
ipvsadm -d -t|u|f service-address -r server-address
9、檢視規則清單
ipvsadm -Ln|l [options]
--numeric, -n: 以數字形式輸出位址和端口号
--exact: 擴充資訊,精确值
--stats: 統計資訊
--rate: 輸出速率資訊
10、清空計數器
ipvsadm -Z [-t|u|f service-address]
11、ipvs規則
/proc/net/ip_vs
12、ipvs連接配接
/proc/net/ip_vs_conn
2)儲存及重載規則
1、儲存
建議儲存至 /etc/sysconfig/ipvsadm
ipvsadm-save -n > /PATH/TO/IPVSADM_FILE
ipvsadm -Sn > /PATH/TO/IPVSADM_FILE
systemctl stop ipvsadm.service
2、重載
ipvsadm-restore < /PATH/TO/IPVSADM_FILE
ipvsadm -R < /PATH/TO/IPVSADM_FILE
systemctl restart ipvsadm.service
三、LVS 四種模式實戰操作講解
1)NAT 模式
1、設計要點
- RIP與DIP在同一IP網絡,RIP的網關要指向DIP
- 支援端口映射
- Director要打開核心轉發功能
2、配置
1、管理叢集服務:增,改,删
- 增、改
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p timeout]
- 删除:
ipvsadm -D -t|u|f service-address
- service-address:
-t|u|f:
-t:TCP協定的端口,VIP:TCP_PORT
-u:UDP協定的端口,VIP:UDP_PORT
-f:firewall MARK,标記,一個數字
[-s scheduler]:指定叢集的排程算法:預設為wlc
2、管理叢集上的RS:增、改、删
- 增、改:ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]
-
server-address:
rip[:port] 如省略port,不作端口映射
- 選項:lvs類型:
-g:gateway, dr類型,預設
-i:ipip, tun類型
-m:masquerade,nat類型
-w weight:權重
3、ipvs scheduler
-
ipvs scheduler:根據其排程是否考慮各RS目前的負載狀态
兩種:靜态方法和動态方法
- 靜态方法:僅根據算法本身進行排程
1、RR: roundrobin, 輪訓
2、WRR: Weighted RR, 權重輪訓
3、SH: Source Hashing, 實作session sticky, 源IP位址hash; 将來自同一個IP位址的請求始終發往第一次挑中的RS,進而實作會話綁定
4、DH: Destination Hashing; 目标位址哈希,将發往同一個目标位址的請求始終轉發至第一次挑中的RS, 典型使用場景是正向代理緩存場景中的負載均衡,如:帶寬營運商
4、實驗:實作NAT模式的LVS(必須原路傳回)
ip_forward=1
route add default gw 192.168.0.201
# -t:tcp, -s wrr:權重 輪訓
ipvsadm -A -t 172.20.0.200:80 -s wrr
# -m: NAT模式;預設:DR模式,不支援映射到不同端口;-w:權重,預設是1
ipvsadm -a -t 172.20.0.200:80 -r 192.168.30.17:8080 -m -w 3
ipvsadm -a -t 172.20.0.200:80 -r 192.168.30.27:8080 -m
2.router:路由器配置
ip_forward=1
route add default gw 192.168.0.200
2)DR 模式
1、DR模型中各主機上均需要配置VIP,解決位址沖突的方式有三種:
- 在前端網關做靜态綁定
- 在各RS使用arptables
- 在各RS修改核心參數,來限制arp響應和通告的級别
2、限制響應級别:arp_ignore
- 0:預設值,表示可使用本地任意接口上配置在任意位址響應
- 1:僅在請求目标IP配置在本地主機的接收到請求封包的接口上時,才給予響應
3、限制通告級别:arp_announce
- 0:預設值,把本機所有接口的所有資訊向每個接口的網絡進行通知
- 1:盡量避免将接口資訊向非直接連接配接網絡進行通知
- 2:必須避免将接口資訊向非網絡進行通告
4、實驗:實作DR模式的LVS(不原路傳回)
- 步驟一:準備3台虛拟機
- 步驟二:先配置3台虛拟機的網絡
eth0 配置在一個網段
DIP,RIP配置在一個網段
- 步驟三:配置lvs的VIP
ifconfig ens33:0 192.168.182.100/24
echo "1" > /proc/sys/net/ipv4/ip_forward
- 步驟四(RS):調整RS的響應,通告級别(每一台RS都配)
echo 1 > /proc/sys/net/ipv4/conf/ens33/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/ens33/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
- 步驟五:在RS上配置VIP
ifconfig lo:8 192.168.182.100 netmask 255.255.255.255
- 步驟六:啟動RS上的httpd服務
yum install httpd -y
cd /var/www/html
vi index.html
service httpd start
用戶端驗證:RIP:80能顯示
VIP:80不能顯示
- 步驟七:安裝 LVS---ipvsadm
yum install ipvsadm -y
# -t:tcp, -s rr:輪訓
ipvsadm -A -t 192.168.182.100:80 -s rr
# -m: NAT模式;預設:DR模式,不支援映射到不同端口;-w:權重,預設是1;-g:DR模型,-m:NET模型
ipvsadm -a -t 192.168.182.128:80 -r 192.168.182.129 -g
ipvsadm -a -t 192.168.182.128:80 -r 192.168.182.130 -g
ipvsadm -ln
# 浏覽器重新整理:通路vip
ipvsadm -lnc
netstat -natp
3)TUN模式
4)FULL-NAT模式
四、Keepalived + LVS 實戰操作
Keepalived 是一個用于 Linux 平台的高可用性軟體。它實作了虛拟路由器備援協定 (VRRP) 和健康檢查功能,可以用于確定在多台伺服器之間提供服務的高可用性。Keepalived 可以檢測伺服器的故障,并在主伺服器當機時,自動将備份伺服器提升為主伺服器,確定服務的持續性和可用性。
Keepalived 可以在主備伺服器之間動态配置設定虛拟 IP 位址,使用戶端能夠在主備伺服器之間無縫切換,提高服務的可用性。此外,Keepalived 還支援基于文本檔案的配置和基于 SNMP 的監控。它可以與常用的負載均衡器配合使用,如 HAProxy、Nginx 等。
總的來說,Keepalived 是一個功能強大的工具,可用于提供高可用性服務。它是一個免費的開源軟體,廣泛應用于企業和個人伺服器環境中。
架構圖如下:
1) keepalived 安裝以及基本操作
# 安裝
yum install keepalived -y
# 啟動
service keepalived start
# 配置檔案位置
/etc/keepalived/keepalived.conf
# 檢視日志
tail -f /var/log/message
2)具體配置步驟
- 【步驟一】至少準備四台虛拟機
- 【步驟二】調整RS的響應,通告級别(每一台RS都配)
echo 1 > /proc/sys/net/ipv4/conf/ens33/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/ens33/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
- 步驟三:在RS上配置VIP,切記(DR模式)不要忘了在RS配置VIP,要不然資料包會被丢棄
ifconfig lo:8 192.168.182.100 netmask 255.255.255.255
- 步驟四:在RS安裝啟動httpd服務
yum install httpd -y
cd /var/www/html
echo "from ooxxip" > index.html
service httpd start
- 步驟五:給兩台keepalived機子安裝keepalived(一主一備)
yum -y install keepalived
yum -y install ipvsadm
- 步驟六:配置keepalived配置檔案
主節點配置:
# /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected]
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
# vrrp_strict 如果還是通路不了VIP,可以把這行注釋掉
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
# 主
state MASTER
# 備
# state BACKUP
interface ens33
virtual_router_id 51
# 主
priority 100
# 備
# priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.182.100/32 dev ens33 label ens33:7
}
}
virtual_server 192.168.182.100 80 {
delay_loop 6
lb_algo rr
lb_kind DR nat_mask 255.255.255.0
persistence_timeout 0
protocol TCP
real_server 192.168.182.130 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.182.131 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
從節點配置:
# 複制一份修改好的配置到從主機,修改 1、state BACKUP,2、priority 50
cd /etc/keepalived/ && scp ./keepalived.conf [email protected]:`pwd`
# 啟動
/bin/systemctl start keepalived.service
# RS切記關閉防火牆,如果web也通路不了,lvs也可以關閉防火牆試試
systemctl stop firewalld
# 檢視是否配置了VIP
#檢視是否配置了規則
# 主未挂,備則會自動配置規則,但是不會配置VIP,保證隻有一個VIP對外提供服務
# 一旦主挂了,則備接管(測試,down掉主網卡:ifconfig ens33 down)
缺點:腦裂問題
【分析原因】:keepalived自身不是高可用,主程序可能會被殺死,但是程序殺死後,沒有回收VIP,導緻主keepalived無法廣播,備keepalived得不到主的廣播信号,導緻備也會配上VIP,使得主備都有VIP,最後CIP通路VIP的三次握手可能會被打散到主備keepalived上,無法建立連接配接,導緻無法通路。
【解決方案】:
- 寫一個自動腳本,定時巡檢主keepalived程序是否還存活,如果被殺死,則重新開機主keepalived服務
- 換用更進階的高可用技術(zookeeper),後續會有zookeeper相應的文章
最後附上keepalived配置檔案說明:
! Configuration File for keepalived
global_defs { #全局定義部分
notification_email { #設定報警郵件位址,可設定多個
[email protected] #接收通知的郵件位址
}
notification_email_from [email protected] #設定 發送郵件通知的位址
smtp_server smtp.163.com #設定 smtp server 位址,可是ip或域名.可選端口号 (預設25)
smtp_connect_timeout 30 #設定 連接配接 smtp server的逾時時間
router_id LVS_DEVEL #主機辨別,用于郵件通知
vrrp_skip_check_adv_addr
vrrp_strict #嚴格執行VRRP協定規範,此模式不支援節點單點傳播
vrrp_garp_interval 0
vrrp_gna_interval 0
script_user keepalived_script #指定運作腳本的使用者名群組。預設使用使用者的預設組。如未指定,預設為keepalived_script 使用者,如無此使用者,則使用root
enable_script_security #如過路徑為非root可寫,不要配置腳本為root使用者執行。
}
vrrp_script chk_nginx_service { #VRRP 腳本聲明
script "/etc/keepalived/chk_nginx.sh" #周期性執行的腳本
interval 3 #運作腳本的間隔時間,秒
weight -20 #權重,priority值減去此值要小于備服務的priority值
fall 3 #檢測幾次失敗才為失敗,整數
rise 2 #檢測幾次狀态為正常的,才确認正常,整數
user keepalived_script #執行腳本的使用者或組
}
vrrp_instance VI_1 { #vrrp 執行個體部分定義,VI_1自定義名稱
state MASTER #指定 keepalived 的角色,必須大寫 可選值:MASTER|BACKUP
interface ens33 #網卡設定,lvs需要綁定在網卡上,realserver綁定在回環口。差別:lvs對通路為外,realserver為内不易暴露本機資訊
virtual_router_id 51 #虛拟路由辨別,是一個數字,同一個vrrp 執行個體使用唯一的辨別,MASTER和BACKUP 的 同一個 vrrp_instance 下 這個辨別必須保持一緻
priority 100 #定義優先級,數字越大,優先級越高。
advert_int 1 #設定 MASTER 與 BACKUP 負載均衡之間同步檢查的時間間隔,機關為秒,兩個節點設定必須一樣
authentication { #設定驗證類型和密碼,兩個節點必須一緻
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { #設定虛拟IP位址,可以設定多個虛拟IP位址,每行一個
192.168.119.130
}
track_script { #腳本監控狀态
chk_nginx_service #可權重重,但會覆寫聲明的腳本權重值。chk_nginx_service weight -20
}
notify_master "/etc/keepalived/start_haproxy.sh start" #目前節點成為master時,通知腳本執行任務
notify_backup "/etc/keepalived/start_haproxy.sh stop" #目前節點成為backup時,通知腳本執行任務
notify_fault "/etc/keepalived/start_haproxy.sh stop" #當目前節點出現故障,執行的任務;
}
virtual_server 192.168.119.130 80 { #定義RealServer對應的VIP及服務端口,IP和端口之間用空格隔開
delay_loop 6 #每隔6秒查詢realserver狀态
lb_algo rr #後端調試算法(load balancing algorithm)
lb_kind DR #LVS排程類型NAT/DR/TUN
#persistence_timeout 60 同一IP的連接配接60秒内被配置設定到同一台realserver
protocol TCP #用TCP協定檢查realserver狀态
real_server 192.168.119.120 80 {
weight 1 #權重,最大越高,lvs就越優先通路
TCP_CHECK { #keepalived的健康檢查方式HTTP_GET | SSL_GET | TCP_CHECK | SMTP_CHECK | MISC
connect_timeout 10 #10秒無響應逾時
retry 3 #重連次數3次
delay_before_retry 3 #重連間隔時間
connect_port 80 #健康檢查realserver的端口
}
}
real_server 192.168.119.121 80 {
weight 1 #權重,最大越高,lvs就越優先通路
TCP_CHECK { #keepalived的健康檢查方式HTTP_GET | SSL_GET | TCP_CHECK | SMTP_CHECK | MISC
connect_timeout 10 #10秒無響應逾時
retry 3 #重連次數3次
delay_before_retry 3 #重連間隔時間
connect_port 80 #健康檢查realserver的端口
}
}
}
vrrp_instance VI_2 { #vrrp 執行個體部分定義,VI_1自定義名稱
state BACKUP #指定 keepalived 的角色,必須大寫 可選值:MASTER|BACKUP 分别表示(主|備)
interface ens33 #網卡設定,綁定vip的子接口,lvs需要綁定在網卡上,realserver綁定在回環口。差別:lvs對通路為外,realserver為内不易暴露本機資訊
virtual_router_id 52 #虛拟路由辨別,是一個數字,同一個vrrp 執行個體使用唯一的辨別,MASTER和BACKUP 的 同一個 vrrp_instance 下 這個辨別必須保持一緻
priority 90 #定義優先級,數字越大,優先級越高。
advert_int 1 #設定 MASTER 與 BACKUP 負載均衡之間同步檢查的時間間隔,機關為秒,兩個節點設定必須一樣
authentication { #設定驗證類型和密碼,兩個節點必須一緻
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { #設定虛拟IP位址,可以設定多個虛拟IP位址,每行一個
192.168.119.131
}
}
virtual_server 192.168.119.131 80 { #定義RealServer對應的VIP及服務端口,IP和端口之間用空格隔開
delay_loop 6 #每隔6秒查詢realserver狀态
lb_algo rr #後端調試算法(load balancing algorithm)
lb_kind DR #LVS排程類型NAT/DR/TUN
#persistence_timeout 60 #同一IP的連接配接60秒内被配置設定到同一台realserver
protocol TCP #用TCP協定檢查realserver狀态
real_server 192.168.119.120 80 {
weight 1 #權重,最大越高,lvs就越優先通路
TCP_CHECK { #keepalived的健康檢查方式HTTP_GET | SSL_GET | TCP_CHECK | SMTP_CHECK | MISC
connect_timeout 10 #10秒無響應逾時
retry 3 #重連次數3次
delay_before_retry 3 #重連間隔時間
connect_port 80 #健康檢查realserver的端口
}
}
real_server 192.168.119.121 80 {
weight 1 #權重,最大越高,lvs就越優先通路
TCP_CHECK { #keepalived的健康檢查方式HTTP_GET | SSL_GET | TCP_CHECK | SMTP_CHECK | MISC
connect_timeout 10 #10秒無響應逾時
retry 3 #重連次數3次
delay_before_retry 3 #重連間隔時間
connect_port 80 #健康檢查realserver的端口
}
}
}
LVS + Keepalived 介紹和實戰操作示範就先到這裡了,有任何疑問歡迎給我留言,也可關注我的公衆号【大資料與雲原生技術分享】,後續會持續更新相關技術文章~。