LVS
定義
Linux Virtual Server
即Linux虛擬服務器,是由章文嵩博士主導的開源負載均衡項目,目前LVS已經被集成到Linux內核模塊中
該項目在Linux內核中實現了基於IP的數據請求負載均衡調度方案
終端互聯網用戶從外部訪問公司的外部負載均衡服務器,把終端用戶的Web請求會發送給LVS調度器
調度器根據自己預設的算法決定將該請求發送給後端的某臺Web服務器
比如,輪詢算法可以將外部的請求平均分發給後端的所有服務器,終端用戶訪問LVS調度器雖然會被轉發到後端真實的服務器
但如果真實服務器連接的是相同的存儲,提供的服務也是相同的服務,最終用戶不管是訪問哪臺真實服務器
得到的服務內容都是一樣的,整個集羣對用戶而言都是透明的
最後根據LVS工作模式的不同,真實服務器會選擇不同的方式將用戶需要的數據發送到終端用戶
LVS
工作模式
1、
NAT
模式轉換一個ip地址,效率低
2、
TUN
模式ip隧道
3、
DR
模式調度器跟真正的服務器在同一網段,強行修改mac地址,並不改變ip地址
4、
FullNAT
模式訪問來源ip跟訪問目的ip,效率低,麻煩,需要編輯內核
LVS
的優點
1、高併發連接
LVS基於內核網絡層面工作,有超強的承載能力和併發處理能力,單臺LVS負載均衡器,可支持上萬併發連接
2、穩定性強
是工作在網絡4層之上僅作分發之用,這個特點也決定了它在負載均衡軟件裏的性能最強,穩定性最好,對內存和cpu資源消耗極低
3、成本低廉
硬件負載均衡器少則十幾萬,多則幾十萬上百萬,LVS只需一臺服務器和就能免費部署使用,性價比極高
4、配置簡單
LVS配置非常簡單,僅需幾行命令即可完成配置,也可寫成腳本進行管理
5、支持多種算法
支持多種論調算法,可根據業務場景靈活調配進行使用
6、支持多種工作模型
可根據業務場景,使用不同的工作模式來解決生產環境請求處理問題
7、應用範圍廣
LVS工作在4層,所以它幾乎可以對所有應用做負載均衡,包括HTTP、數據庫、DNS、FTP服務等
lvs
的缺點
工作在4層,不支持7層規則修改,機制過於龐大,不適合小規模應用
LVS
常見的四種算法
rr
輪詢算法,它將請求依次分配給不同的節點,各個節點均攤分配
這種算法簡單,但只適合各個節點處理性能差不多的情況
wrr
加權輪訓調度,它將依據不同節點的權值分配任務
權值較高的節點將優先獲得任務,並且分配到的連接數將比權值低的節點更多
相同權值的節點得到相同數目的連接數
lc
最小連接數調度,IPVS表存儲了所有活動的連接
LVS服務器會比較將連接請求發送到當前連接最少的節點
wlc
加權最小連接數調度,在節點性能差異較大的時候,可以爲節點自動調整權重
權重較高的節點承擔更大比例的連接
NAT
模式
因爲請求與應答都要經過LVS服務器,所以訪問量過大LVS會形成瓶頸,一般要求10-20臺節點
注:(節點指後面的真實web服務器)
每臺節點服務器的網關地址必須是LVS服務器的內網地址
NAT模式支持對IP地址和端口進行轉換
即用戶請求的端口和真實服務器的端口可以不一致
NAT
的特性
1、節點應該使用私有地址
2、節點的網關的必須指向LVS
3、節點IP和lvs服務器IP必須在同一網段內
4、請求和響應的報文都得經過LVS服務器;在高負載場景中,LVS服務器很可能成爲系統性能瓶頸
搭建環境
lVS(server1): 192.168.1.1/24 192.168.1.100/24
修改server1的ip地址,並且添加虛擬ip地址
server2: 192.168.1.2/24
gateway: 192.168.1.1/24
修改server2的ip地址,並且網關設定爲server1的ip地址
server3: 192.168.1.3/24
gateway: 192.168.1.1/24
修改server3的ip地址,並且網關設定爲server1的ip地址
systemctl stop firewalld
關閉 firewall
setenforce 0
關閉 SELinux
server1
modprobe ip_vs
加載 ip_vs 模塊
yum install -y ipvsadm
安裝 ipvsadm
vim /etc/sysconfig/ipvsadm-config
修改LVS服務的配置文件:no->yes
重啓服務的時候保存策略
systemctl start ipvsadm
首次開啓會報錯,無法開啓服務
cat /var/log/messages
在日誌裏面查看服務啓動錯誤的原因
touch /etc/sysconfig/ipvsadm
建立編寫策略的文件
systemctl start ipvsadm
再次開啓服務,正常
systemctl enable ipvsadm
開啓自啓
設置NAT模式的訪問策略
ipvsadm -A -t 192.168.1.100:80 -s rr
添加vip
-A
:添加虛擬服務器
-t
:指定vip及tcp端口
-s
:指定算法
rr
:輪詢
ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.2:80 -m -w 1
ipvsadm -a -t 1192.168.1.100:80 -r 192.168.1.3:80 -m -w 1
-a
:添加節點
-t
:指定vip和端口
-r
:指定節點ip及端口
-m
:表示使用NAT模式
-w
:設置權重
ipvsadm -ln
查看當前節點信息
systemctl restart ipvsadm
重啓服務
server2
yum install -y http
安裝 http
systemctl start httpd
開啓
systemctl enable httpd
開機自啓
vim /var/www/html/index.html
建立測試頁面
server2.example.com
測試頁面內容
server3
yum install -y http
安裝 http
systemctl start httpd
開啓
systemctl enable httpd
開機自啓
vim /var/www/html/index.html
建立測試頁面
server3.example.com
測試頁面內容
測試
curl 192.168.1.100
訪問192.168.1.100可以看到 server2 與 server3 輪流響應請求
TUN
模式
TUN模式簡稱隧道模式,隧道模式就是修改請求報文的首部IP,再加一層IP報頭
優點:DS和RS不需要在同一網段,可以實現不同網絡之間的訪問
數據包從客戶端發往DS服務器,DS服務器會根據調度策略確定要把請求給哪臺RS,會在數據包外面再加一層IP報頭
此時源ip從CIP變爲了vip
目的ip從VIP變爲了rip,數據包的請求來源就是ds調度器
請求的目的地是rs,rs在接收到數據包之後,請求包的來源本來是cip
但是加了一層數據包之後變爲了vip,而rs服務器上也有ip
所以rs會把ip包的報頭拆開,拆開發現請求的數據包訪問的還是自己的ip
這時rs就會回覆客戶端的請求(跟DR模式類似,只不過多加了一層ip報頭,封裝ip守護)
搭建環境
lVS(server1): 192.168.1.1/24
修改server1的ip地址
server2: 192.168.1.2/24
修改server2的ip地址
server3: 192.168.1.3/24
修改server3的ip地址
systemctl stop firewalld
關閉 firewall
setenforce 0
關閉 SELinux
server1
lsmod
查看模塊(虛擬機上沒有虛擬模塊),準備加入隧道模塊
lsmod | grep kvm
在虛擬機上查看沒有虛擬模塊,在真機上查看有虛擬機模塊
modprobe ipip
加入隧道模塊
ip a
多了一塊網卡 tunl0
ip addr add 192.168.1.100/24 dev tunl0
放到隧道網卡上面
ip a
查看網卡的狀態是down
ip link set up tunl0
激活網卡
設置TUN模式的訪問策略
ipvsadm -A -t 192.168.1.100:80 -s rr
ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.2:80 -i -w 1
ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.3:80 -i -w 1
systemctl restart ipvsadm
重啓服務使設置生效
cat /etc/sysonfig/ipvsadm
查看策略文件
server2
modprobe ipip
添加隧道模塊
ip addr add 192.168.1.100/24 dev tunl0
添加入口ip
ip link set up tunl0
激活網卡
修改反向過濾規則,防止丟包
sysctl -a | grep rp_filter
查看過濾表將所有的過濾規則都關閉
sysctl -w (規則)=0
sysctl -p
使設置生效
sysctl -a | grep rp_filter
再次查看
server3
modprobe ipip
添加隧道模塊
ip addr add 192.168.1.100/24 dev tunl0
添加入口ip
ip link set up tunl0
激活網卡
修改反向過濾規則,防止丟包
sysctl -a | grep rp_filter
查看過濾表將所有的過濾規則都關閉
sysctl -w (規則)=0
sysctl -p
使設置生效
sysctl -a | grep rp_filter
再次查看
測試
curl 192.168.1.100
訪問192.168.1.100可以看到 server2 與 server3 輪流響應請求
DR
模式
客戶端向目標vip發出請求 -> LVS接收 -> LVS根據負載均衡算法選擇一臺活躍的的節點,將此節點的ip所在網卡的mac地址作爲目標mac地址,發送到局域網 -> 節點在局域網中收到這個幀,拆開後發現目標ip(VIP)與本地匹配,於是處理這個報文 -> 隨後重新封裝報文,發送到局域網 -> 此時ip包的目標ip是客戶端,源ip是自己的vip地址
工作原理
1、通過在調度器LB上修改數據包的目的MAC地址實現轉發
注意源地址仍然是CIP,目的地址仍然是VIP地址
2、請求的報文經過調度器,而RS響應處理後的報文無需經過調度器LB,因此併發訪問量大時使用效率很高(和NAT模式比)
3、因爲DR模式是通過MAC地址改寫機制實現轉發,因此所有RS節點和調度器LB只能在一個局域網裏面
4、RS主機需要綁定VIP地址在LO接口上,並且需要配置ARP抑制
5、RS節點的默認網關不需要配置成LB,而是直接配置爲上級路由的網關,能讓RS直接出網就可以
6、由於DR模式的調度器僅做MAC地址的改寫,所以調度器LB就不能改寫目標端口,那麼RS服務器就得使用和VIP相同的端口提供服務
搭建環境
lVS(server1): 192.168.1.1/24 192.168.1.100/24
修改server1的ip地址,並且添加虛擬ip地址
server2: 192.168.1.2/24 192.168.1.100/32
修改server2的ip地址,並且添加虛擬ip地址
server3: 192.168.1.3/24 192.168.1.100/32
修改server3的ip地址,並且添加虛擬ip地址
systemctl stop firewalld
關閉 firewall
setenforce 0
關閉 SELinux
server1
yum install -y ipvsadm
安裝 ipvsadm
vim /etc/sysconfig/ipvsadm-config
修改LVS服務的配置文件:no->yes
重啓服務的時候保存策略
systemctl start ipvsadm
首次開啓會報錯,無法開啓服務
cat /var/log/messages
在日誌裏面查看服務啓動錯誤的原因
touch /etc/sysconfig/ipvsadm
建立編寫策略的文件
systemctl start ipvsadm
再次開啓服務,正常
systemctl enable ipvsadm
開啓自啓
設置DR模式的訪問策略
ipvsadm -A -t 192.168.1.100:80 -s rr
添加vip
-A
:添加虛擬服務器
-t
:指定vip及tcp端口
-s
:指定算法
rr
:輪詢
ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.2:80 -g -w 1
ipvsadm -a -t 1192.168.1.100:80 -r 192.168.1.3:80 -g -w 1
-a
:添加節點
-t
:指定vip和端口
-r
:指定節點ip及端口
-m
:表示使用NAT模式
-w
:設置權重
ipvsadm -ln
查看當前節點信息
systemctl restart ipvsadm
重啓服務
server2
yum install -y http
安裝 http
systemctl start httpd
開啓
systemctl enable httpd
開機自啓
vim /var/www/html/index.html
建立測試頁面
server2.example.com
測試頁面內容
yum install -y arptables
安裝 arptables
arptables -nL
查看策略
設置arptables的訪問策略
arptables -A INPUT -d 192.168.1.100 -j DROP
192.168.1.100來源輸入全部丟棄
arptables -A OUTPUT -s 192.168.1.100 -j mangle --mangle-ip-s 192.168.1.2
192.168.1.100輸出轉化爲192.168.1.2
cat /etc/sysconfig/arptables
查看規則
arptables-save > /etc/sysconfig/arptables
保存策略
cat /etc/sysconfig/arptables
再次查看,策略已保存
systemctl restart arptables
重啓服務
server3
yum install -y http
安裝 http
systemctl start httpd
開啓
systemctl enable httpd
開機自啓
vim /var/www/html/index.html
建立測試頁面
server3.example.com
測試頁面內容
yum install -y arptables
安裝 arptables
arptables -nL
查看策略
設置arptables的訪問策略
arptables -A INPUT -d 192.168.1.100 -j DROP
192.168.1.100來源輸入全部丟棄
arptables -A OUTPUT -s 192.168.1.100 -j mangle --mangle-ip-s 192.168.1.3
192.168.1.100輸出轉化爲192.168.1.3
cat /etc/sysconfig/arptables
查看規則
arptables-save > /etc/sysconfig/arptables
保存策略
cat /etc/sysconfig/arptables
再次查看,策略已保存
systemctl restart arptables
重啓服務
測試
curl 192.168.1.100
訪問192.168.1.100可以看到 server2 與 server3 輪流響應請求
如果輪詢未能正常響應,使用命令 arp -d 192.168.1.100 清除緩存
arp -an | grep ip
查看緩存是否存在
再次curl 192.168.1.100即可正常