Interesting things
安裝LVS-DR環境
vip:192.168.12.100
lvs-director:192.168.12.4
nginx1:192.168.12.2
nginx2:192.168.12.3
What did you do today
- 安裝lvs的管理工具ipvsadm.
yum install ipvsadm
- 校驗是否安裝成功
ipvsadm -h
image.png
在192.168.12.2和192.168.12.3上安裝nginx,此處略。可以查看我FastDFS系列博客。
進入/usr/local/nginx/conf/目錄下,創建nginx-lvs.conf
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
}
在Director Server進行配置(192.16812.4)
- 在eth0上綁定虛擬ip,此處在eth0設備上綁定了一個虛擬設備eth0:0,同時設置了一個虛擬ip是192.168.12.100,然后指定廣播地址也為192.168.12.100,需要特別注意的是,虛擬ip地址的廣播地址是它本身,子網掩碼是255.255.255.255.
ifconfig eth0:0 192.168.12.100 broadcast 192.168.12.100 netmask 255.255.255.255 up
image.png
- 添加路由規則。
route add -host 192.168.12.100 dev eth0:0
image.png
- 啟動系統的包轉發功能。參數值為1時啟用ip轉發,為0時禁止ip轉發。
echo "1" > /proc/sys/net/ipv4/ip_forward
- 清除原有轉發規則。
ipvsadm --clear
- 添加虛擬ip規則, -s -rr 表示輪詢策略,80表示負載轉發的端口是80,-A表示添加一個新的集群服務,-t表示tcp協議。
ipvsadm -A -t 192.168.12.100:80 -s rr
- 在虛擬ip中添加服務規則,在新加虛擬ip記錄中添加兩條新的Real Server記錄, -g 表示指定LVS的工作模式為直接路由模式。lvs進行負載轉發需要保證lvs負載的端口要和nginx服務的端口保持一致,這里都是80。-a表示添加一個新的realserver規則。
ipvsadm -a -t 192.168.12.100:80 -r 192.168.12.2:80 -g
ipvsadm -a -t 192.168.12.100:80 -r 192.168.12.3:80 -g
- 重啟lvs
ipvsadm
image.png
在LVS的DR和TUN模式下,用戶的訪問請求到達真實服務器后,是直接返回給用戶的,而不再經過前端的Director Server。因此,就需要在每個Real Server節點上增加虛擬vip地址,這樣數據才能直接返回給用戶。
接著我們就需要在Real Server上進行配置。(192.168.12.2、192.168.12.3)
- 老操作,在回環設備上綁定虛擬ip地址192.168.12.4
ifconfig lo:0 192.168.12.100 broadcast 192.168.12.100 netmask 255.255.255.255 up
/sbin/route add-host 192.168.12.100 dev lo:0
image.png
- 關閉arp解析。
arp_ignore:定義接收到arp請求時的響應級別
0 - 只要本地配置有相應的地址,就給予響應。
1 - 哪個接口上接受arp請求,就從哪個端口響應。DR模式使用
arp_announce:定義將自己地址向外通告時的通告級別
0 - 將本地任何接口上的任何地址向外通告。
1 - 試圖僅向目標網絡通告與其網絡匹配的地址。
2 - 僅向與本地接口上地址匹配的網絡進行通告。DR模式使用
sysctl -p使修改生效!
echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
sysctl -p
- 在Director Server(192.168.12.2、192.168.12.3) 和 Real Server(192.168.12.4)的防火墻添加端口80策略。
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
image.png
注意事項:
- 測試時需要在nginx的http中設置keepalive_timeout 0; 取消使用http持久連接模式,保證每次客戶端發送請求都需要向服務端簡歷連接,這樣做是為了測試效果更加明顯,每次刷新界面都要經過lvs負載轉發。
2.lvs進行負載轉發需要保證lvs負載端口要和nginx服務的端口保持一致,這里是80
3.在nginx中keepalive_timeout的默認值是75s,默認使用http持久連接模式,可使客戶端到服務器端的連接持續有效,當出現對服務器的后繼請求時,可避免建立或重新建立連接。生產環境建議keepalive_timeout不要設置為0
修改192.168.12.2和192.168.12.3下/usr/local/nginx/html/目錄中index.html的內容,使其個性化。
-
第一次請求192.168.12.100
image.png -
第二次請求192.168.12.100
image.png -
假設我停到nginx1
image.png -
我們再次訪問192.168.12.100,還是可以的!因為lvs采用輪詢策略,如果其中一個nginx請求不可達,那么久請求另一個nginx!
image.png 為了方便配置啟動lvs,我們可以將Director Server 和 RealServer配置過程封裝到Shell腳本中。
在Director Server進行配置
- 在/etc/init.d下創建lvsdr,內容如下:
#!/bin/sh
# 定義虛擬ip
VIP=192.168.12.100
# 定義realserver,并已空格分開,根據需求修改
RIPS="192.168.12.2 192.168.12.3"
# 定義提供服務的端口
SERVICE=80
# 調用init.d腳本的標準庫
. /etc/rc.d/init.d/functions
case $1 in
start)
echo "Start LVS of DR Mode"
# 開啟ip轉發
echo "1" > /proc/sys/net/ipv4/ip_forward
# 綁定虛擬ip
ifconfig eth0:0 $VIP broadcast $VIP netmask 255.255.255.255 up
route add -host $VIP dev eth0:0
# 清除lvs規則
ipvsadm -C
# 添加一條虛擬服務器記錄
# -p指定一定的時間內將相同的客戶端分配到同一臺后端服務器
# 用于解決session的問題,測試時或有別的解決方案時建議去掉
ipvsadm -A -t $VIP:$SERVICE -s rr
# 添加真實服務器記錄
for RIP in $RIPS
do
echo $RIP:$SERVICE;
ipvsadm -a -t $VIP:$SERVICE -r $RIP:$SERVICE -g
done
# 設置tcp tcpfin udp的超時連接值
ipvsadm --set 30 120 300
ipvsadm
;;
stop)
echo "Stop LVS DR"
ifconfig eth0:0 down
ipvsadm -C
;;
*)
echo "Usage:$0 {start | stop}"
exit 1
esac
- 修改腳本權限。
chmod +x /etc/init.d/lvsdr
啟動: service lvsdr start
停止: service lvsdr stop
在RealServer上進行配置
- 在/etc/init.d/下創建lvsdr,內容如下:
#!/bin/sh
VIP=192.168.12.100
. /etc/rc.d/init.d/functions
case $1 in
start)
echo "lo:0 port starting"
# 為了相應lvs調度器轉發過來的包,需在本地lo接口上綁定vip
ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
# 限制arp請求
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
;;
stop)
echo "lo:0 port closing"
ifconfig lo:0 down
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 "Usage: $0 {start | stop}"
exit 1
esac
- 修改腳本權限。
chmod +x /etc/init.d/lvsdr
啟動: service lvsdr start
停止: service lvsdr stop
Summary
明天擼LVS四層+Nginx七層負載均衡!