文章目錄
四、LVS軟件包組成
- 程序包:ipvsadm(LVS管理工具)
- Unit File: ipvsadm.service
- 主程序:/usr/sbin/ipvsadm
- 規則保存工具:/usr/sbin/ipvsadm-save
- 規則重載工具:/usr/sbin/ipvsadm-restore
- 配置文件:/etc/sysconfig/ipvsadm-config
grep -i -C 10 “ipvs” /boot/config-VERSION-RELEASE.x86_64 #查看內核是否支持IPVS
LVS命令使用
- -A --add-service在服務器列表中新添加一條新的虛擬服務器記錄
- -t 表示爲tcp服務
- -u 表示爲udp服務
- -s --scheduler 使用的調度算法, rr | wrr | lc | wlc | lblb | lblcr | dh | sh | sed | nq 默認調度算法是 wlc
例:ipvsadm -A -t 192.168.64.7:80 -s wlc
- -a --add-server #在服務器表中添加一條新的真實主機記錄
- -t --tcp-service 說明虛擬服務器提供tcp服務
- -u --udp-service 說明虛擬服務器提供udp服務
- -r --real-server 真實服務器地址
- -m --masquerading 指定LVS工作模式爲NAT模式
- -w --weight 真實服務器的權值
- -g --gatewaying 指定LVS工作模式爲直接路由器模式(也是LVS默認的模式)
- -i --ip 指定LVS的工作模式爲隧道模式
- -p 會話保持時間,定義流量唄轉到同一個realserver的會話存留時間
ipvsadm -a -t 192.168.64.7:80 -r 192.168.64.107:80 -m -w 1
- -E –edit-service 編輯內核虛擬服務器表中的一條虛擬服務器記錄。
- -D –delete-service 刪除內核虛擬服務器表中的一條虛擬服務器記錄。
- -C –clear 清除內核虛擬服務器表中的所有記錄。
- -R –restore 恢復虛擬服務器規則
- -S –save 保存虛擬服務器規則,輸出爲-R 選項可讀的格式
- -e –edit-server 編輯一條虛擬服務器記錄中的某條真實服務器記錄
- -d –delete-server 刪除一條虛擬服務器記錄中的某條真實服務器記錄
-L|-l –list 顯示內核虛擬服務器表
- –numeric, -n:以數字形式輸出地址和端口號
- –exact:擴展信息,精確值
- –connection,-c:當前IPVS連接輸出
- –stats:統計信息
- –rate :輸出速率信息 參數也可以從/proc/net/ip_vs*映射文件中查看
-Z –zero 虛擬服務表計數器清零(清空當前的連接數量等)
五、部署實戰(NAT模式)
NAT模式
LVS+keepalived
5.1 NAT
準備三臺虛擬機
一臺做LVS調度器,兩臺做後端服務器,四臺最好,還有一臺可做客戶端
環境說明
HOST | OS | hostname | GATEWAY |
---|---|---|---|
192.168.217.136 | centos7 | LVS | 192.168.217.2 |
192.168.217.137 | centos7 | r1 | 192.168.217.136 |
192.168.217.138 | centos7 | r2 | 192.168.217.136 |
不懂???那就結束吧,
好吧,開始配置,
爲了好辨認
192.168.217.136 改名爲lvs這臺機子有兩個網卡,
192.168.217.137 改名爲r1
192.168.217.138 改名爲r2
5.1.1 LVS調度器
1.增加一塊外網網卡
2.配置/etc/sysconfig/network-scripts/ifcfg-
先查看網卡ip
這裏新添加的網卡名爲ens37
配置文件
[root@lvs ~]# ifconfig
[root@lvs ~]# cp /etc/sysconfig/network-scripts/ifcfg-ens33 /etc/sysconfig/network-scripts/ifcfg-ens37
[root@lvs ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens37
配置ip
重啓服務
[root@lvs ~]# systemctl restart network
[root@lvs ~]# ifconfig
3.安裝ipvsadm
yum安裝就很快
[root@lvs ~]# yum install -y ipvsadm
編譯安裝
wget …
tar xvf …
這裏沒有configure,自己解決吧、
make && make install
4.開啓路由轉發、關閉ICMP重定向、防火牆規則
[root@lvs ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
[root@lvs ~]# echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects
[root@lvs ~]# echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects
[root@lvs ~]# echo 0 > /proc/sys/net/ipv4/conf/eth0/send_redirects
[root@lvs ~]# echo 0 > /proc/sys/net/ipv4/conf/eth1/send_redirects
[root@lvs ~]# iptables -t nat -F
[root@lvs ~]# iptables -t nat -X
[root@lvs ~]# iptables -t nat -A POSTROUTING -s 192.168.56.0/24 -j MASQUERADE
5.配置ipvsadm
[root@lvs ~]# ipvsadm -C 清空
[root@lvs ~]# ipvsadm -A -t 192.168.124.29:80 -s rr
[root@lvs ~]# ipvsadm -a -t 192.168.124.29:80 -r 192.168.217.137:80 -m -w 1
[root@lvs ~]# ipvsadm -a -t 192.168.124.29:80 -r 192.168.217.138:80 -m -w 1
[root@lvs ~]# ipvsadm -L -n
查看
參數說明:
-A:表示增加一個虛擬服務
-a:表示增加一個real server
-t:表示TCP服務
-r:指定real server的ip地址
-s:指定調度算法
-m:選擇NAT方式調度(-i tun模式、-g dr模式)
-w:指定權重
5.1.2 r1操作
1.下載httpd
[root@r1 ~]# yum install -y httpd
[root@r1 ~]# systemctl start httpd
2.創建index.html文件
[root@r1 ~]# vim /var/www/html/index.html
寫入
3.修改/etc/sysconfig/network-scripts/ifcfg-ens33中的網關
[root@r1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
修改如下
r2同理
到這基本上就完成配置了。
5.1.3 測試
在lvs上操作或者在客戶端
[root@lvs ~]# curl 192.168.124.29
[root@lvs ~]# curl 192.168.124.29
[root@lvs ~]# watch -n 1 ipvsadm -L -n #動態查看訪問記錄
測試結果
動態查看訪問記錄
5.2DR
環境就不說了,開始配置吧
5.2.1 LVS調度器
1.清空ipvsadm規則
[root@lvs ~]# ipvsadm -C
2.關掉ens37
[root@lvs ~]# ifdown ens37
[root@lvs ~]# ifconfig
3.配置VIP 192.168.217.200
[root@lvs ~]# ifconfig ens33:1 192.168.217.200/24 up
[root@lvs ~]# ifconfig ens33:1
4.配置ipvsadm
[root@lvs ~]# ipvsadm -A -t 192.168.217.200:80 -s rr
[root@lvs ~]# ipvsadm -a -t 192.168.217.200:80 -r 192.168.217.137 -g -w 1
[root@lvs ~]# ipvsadm -a -t 192.168.217.200:80 -r 192.168.217.138 -g -w 1
[root@lvs ~]# ipvsadm -ln
5.2.2 r1操作
1.修改/etc/sysconfig/network-scripts/ifcfg-ens33
[root@r1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
將網關改回來GATEWAY=192.168.217.2
[root@r1 ~]# systemctl restart network
2.在RS節點上的lo(網卡的迴環接口)接口上配置vip(192.168.217.200)
[root@r1 ~]# ifconfig lo:1 192.168.217.200/32 up
[root@r1 ~]# ifconfig lo:1
3.在RS節點上抑制ARP響應 (RS1和RS2上分別執行)
[root@r1 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@r1 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@r1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@r1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
r2操作同理
5.2.3 測試
[root@localhost ~]# curl 192.168.217.200
<h>hello 192.168.217.137</h>
[root@localhost ~]# curl 192.168.217.200
<h>hello 192.168.217.138</h>
[root@localhost ~]# curl 192.168.217.200
<h>hello 192.168.217.137</h>
[root@localhost ~]# curl 192.168.217.200
<h>hello 192.168.217.138</h>
在現實的應用中,LVS得到了大量的部署,請參考 http://www.linuxvirtualserver.org/deployment.html
5.3 lvs+DR+keepalive
5.3.1 配置
(1)在realserver上部署Nginx並配置主頁
[root@rs1 ~]# yum install -y nginx
[root@rs2 ~]# yum install -y nginx
[root@rs1 ~]# echo "welcome to use RS1 192.168.217.137" > /usr/share/nginx/html/index.html
[root@rs2 ~]# echo "<h1>welcome to use RS2 192.168.217.138</h1>" > /usr/share/nginx/html/index.html
[root@rs1 ~]# curl 192.168.217.137
<h1>welcome to use RS1 192.168.217.137</h1>
[root@rs2 ~]# curl 192.168.217.138
<h1>welcome to use RS2 192.168.217.138</h1>
(2)在rs1和rs2上編輯realserver腳本並執行,此處貼rs1腳本詳情
[root@rs1 ~]# vim /etc/init.d/realserver
#!/bin/bash
SNS_VIP=192.168.217.200
/etc/init.d/functions
case "$1" in
start)
ifconfig lo:1 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP
/sbin/route add -host $SNS_VIP dev lo:1
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:1 down
route del $SNS_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
[root@rs1 ~]# chmod +x /etc/init.d/realserver
[root@rs1 ~]# /etc/init.d/realserver start
RealServer Start OK
5.3.2 配置主負載均衡器
(1)lvs和lvsbackup上安裝Keepalived
[root@lvs ~]# yum install -y keepalived
[root@lvsbackup ~]# yum install -y keepalived
(2)編輯lb01和lb02上的keepalived.conf配置文件
[root@lvs ~]# cp /etc/keepalived/keepalived.conf{,.bak} #備份源文件
[root@lvs ~]# > /etc/keepalived/keepalived.conf #清空源文件
[root@lvs ~]# vim /etc/keepalived/keepalived.conf #編輯keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
[email protected]
}
notification_email_from [email protected]
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id lvs
}
vrrp_instance VI_1 {
state MASTER #指定Keepalived的角色,MASTER爲主,BACKUP爲備
interface ens33
virtual_router_id 55 #虛擬路由id號,主備需要一直
priority 150 #優先級,數值越大,優先級越高
advert_int 1 #檢測間隔,默認爲1s
authentication {
auth_type PASS #認證類型
auth_pass 1111 #認證密碼
}
virtual_ipaddress {
192.168.217.200/24 #設置DR的虛擬ip,可以多設,一行一個
}
}
virtual_server 192.168.217.200 80 { #定義LVS對外提供服務的VIP爲192.168.217.200和port爲80
delay_loop 6 #設置健康檢查時間,單位爲秒
lb_algo wrr #設置負載均衡調度算法爲wrr
lb_kind DR #設置LVS實現負載均衡機制爲DR模式
nat_mask 255.255.255.0
persistence_timeout 20 #會話保持超時配置
protocol TCP #使用TCP協議檢查realserver的狀態
real_server 192.168.217.137 80 { #配置真實服務器節點和端口
weight 100 #權重
TCP_CHECK {
connect_timeout 10 #連接超時,單位爲秒
nb_get_retry 3 #重試連接次數
connect_port 80 #連接端口
}
}
real_server 192.168.217.138 80 {
weight 100
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
connect_port 80
}
}
}
從負載均衡服務器與主負載服務器大致相同,只是在keepalived的配置文件中需要改以下兩處:
(1)將state由MASTER改爲BACKUP
(2)將priority由150改爲120
(3)將router_id由lvs改爲lvsbackup
配置完成後,啓動Keepalived
[root@lvs ~]# systemctl start keepalived
[root@lvsbackup ~]# systemctl start keepalived
[root@lvs ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.217.200:80 wrr persistent 20
-> 192.168.217.137:80 Route 100 0 0
-> 192.168.217.138:80 Route 100 0 0
[root@lvsbackup ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.217.200:80 wrr persistent 20
-> 192.168.217.137:80 Route 100 0 0
-> 192.168.217.138:80 Route 100 0 0
[root@lvs ~]# ip addr |grep 192.168.217.200 #查看lb01上是否存在VIP
inet 192.168.217.200/24 scope global secondary ens33
[root@lvsbackup ~]# ip addr |grep 192.168.217.200 #查看lb02上是否存在VIP,如果有說明存在腦裂
5.3.3 驗證測試訪問http://http://192.168.217.200
(1)指定請求的均衡轉發:因爲兩個Web服務器的權重都一樣,所以會依次轉發給兩個Web服務器
(2)Web服務器發生故障時
模擬停止192.168.217.138,暫停其Nginx服務,再進行訪192.168.217.200,可以看到只會從137上獲取頁面
[root@r2 ~]# /etc/init.d/nginx stop
Stopping nginx: [ OK ]
從負載均衡器的狀態監控上,也可以看到192.168.217.138這臺服務器已經從集羣中剔除,當故障修復後,再查看調度器狀態信息,可以看到rs2已經重新加入集羣當中
[root@lvs ~]# ipvsadm -L -n #lb01上查看調度信息,可以看到rs2已經從集羣中剔除
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.217.200:80 wrr persistent 20
-> 192.168.217.137:80 Route 100 1 0
[root@r2 ~]# /etc/init.d/nginx start #重啓rs2上的nginx服務
Starting nginx: [ OK ]
[root@lvs ~]# ipvsadm -L -n #可以看到rs2又重新加入到集羣當中提供服務
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.217.200:80 wrr persistent 20
-> 192.168.217.137:80 Route 100 1 0
-> 192.168.217.138:80 Route 100 1 0
(3)主負載均衡服務器發生故障時,備機立即充當主機角色提供請求轉發服務
模擬停止lb01上的keepalived服務,可以看到lb01上的vip漂移到了lb02上,但繼續訪問vip卻不受影響。當主負載均衡器(lb01)服務恢復時,vip又會重新漂移到主負載均衡器上(lb01)
[root@lvs ~]# ip addr |grep 192.168.217.200
inet 192.168.217.200/24 scope global secondary ens33
[root@lvs ~]# systemctl stop keepalived
[root@lvs ~]# ip addr |grep 192.168.217.200
[root@lvsbackup ~]# ip addr |grep 192.168.217.200
inet 192.168.217.200/24 scope global secondary ens33
此時依然正常運行