Interesting things
安裝LVS-DR環(huán)境
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/目錄下,創(chuàng)建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地址的廣播地址是它本身讽膏,子網(wǎng)掩碼是255.255.255.255.
ifconfig eth0:0 192.168.12.100 broadcast 192.168.12.100 netmask 255.255.255.255 up
image.png
- 添加路由規(guī)則紧帕。
route add -host 192.168.12.100 dev eth0:0
image.png
- 啟動系統(tǒng)的包轉(zhuǎn)發(fā)功能。參數(shù)值為1時啟用ip轉(zhuǎn)發(fā)桅打,為0時禁止ip轉(zhuǎn)發(fā)是嗜。
echo "1" > /proc/sys/net/ipv4/ip_forward
- 清除原有轉(zhuǎn)發(fā)規(guī)則。
ipvsadm --clear
- 添加虛擬ip規(guī)則, -s -rr 表示輪詢策略挺尾,80表示負載轉(zhuǎn)發(fā)的端口是80鹅搪,-A表示添加一個新的集群服務,-t表示tcp協(xié)議遭铺。
ipvsadm -A -t 192.168.12.100:80 -s rr
- 在虛擬ip中添加服務規(guī)則丽柿,在新加虛擬ip記錄中添加兩條新的Real Server記錄, -g 表示指定LVS的工作模式為直接路由模式魂挂。lvs進行負載轉(zhuǎn)發(fā)需要保證lvs負載的端口要和nginx服務的端口保持一致甫题,這里都是80。-a表示添加一個新的realserver規(guī)則涂召。
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模式下坠非,用戶的訪問請求到達真實服務器后,是直接返回給用戶的果正,而不再經(jīng)過前端的Director Server炎码。因此,就需要在每個Real Server節(jié)點上增加虛擬vip地址秋泳,這樣數(shù)據(jù)才能直接返回給用戶潦闲。
接著我們就需要在Real Server上進行配置。(192.168.12.2迫皱、192.168.12.3)
- 老操作歉闰,在回環(huán)設備上綁定虛擬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
- 關(guān)閉arp解析。
arp_ignore:定義接收到arp請求時的響應級別
0 - 只要本地配置有相應的地址卓起,就給予響應和敬。
1 - 哪個接口上接受arp請求,就從哪個端口響應既绩。DR模式使用
arp_announce:定義將自己地址向外通告時的通告級別
0 - 將本地任何接口上的任何地址向外通告概龄。
1 - 試圖僅向目標網(wǎng)絡通告與其網(wǎng)絡匹配的地址还惠。
2 - 僅向與本地接口上地址匹配的網(wǎng)絡進行通告饲握。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持久連接模式衰粹,保證每次客戶端發(fā)送請求都需要向服務端簡歷連接,這樣做是為了測試效果更加明顯笆怠,每次刷新界面都要經(jīng)過lvs負載轉(zhuǎn)發(fā)铝耻。
2.lvs進行負載轉(zhuǎn)發(fā)需要保證lvs負載端口要和nginx服務的端口保持一致,這里是80
3.在nginx中keepalive_timeout的默認值是75s蹬刷,默認使用http持久連接模式瓢捉,可使客戶端到服務器端的連接持續(xù)有效,當出現(xiàn)對服務器的后繼請求時办成,可避免建立或重新建立連接泡态。生產(chǎn)環(huán)境建議keepalive_timeout不要設置為0
修改192.168.12.2和192.168.12.3下/usr/local/nginx/html/目錄中index.html的內(nèi)容,使其個性化迂卢。
-
第一次請求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下創(chuàng)建lvsdr,內(nèi)容如下:
#!/bin/sh
# 定義虛擬ip
VIP=192.168.12.100
# 定義realserver,并已空格分開碎绎,根據(jù)需求修改
RIPS="192.168.12.2 192.168.12.3"
# 定義提供服務的端口
SERVICE=80
# 調(diào)用init.d腳本的標準庫
. /etc/rc.d/init.d/functions
case $1 in
start)
echo "Start LVS of DR Mode"
# 開啟ip轉(zhuǎn)發(fā)
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規(guī)則
ipvsadm -C
# 添加一條虛擬服務器記錄
# -p指定一定的時間內(nèi)將相同的客戶端分配到同一臺后端服務器
# 用于解決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
- 修改腳本權(quán)限蜂莉。
chmod +x /etc/init.d/lvsdr
啟動: service lvsdr start
停止: service lvsdr stop
在RealServer上進行配置
- 在/etc/init.d/下創(chuàng)建lvsdr,內(nèi)容如下:
#!/bin/sh
VIP=192.168.12.100
. /etc/rc.d/init.d/functions
case $1 in
start)
echo "lo:0 port starting"
# 為了相應lvs調(diào)度器轉(zhuǎn)發(fā)過來的包,需在本地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
- 修改腳本權(quán)限混卵。
chmod +x /etc/init.d/lvsdr
啟動: service lvsdr start
停止: service lvsdr stop
Summary
明天擼LVS四層+Nginx七層負載均衡映穗!