標籤:blank 開源軟體 balance target display
常用的負載平衡開源軟體有: nginx、lvs、keepalived
商業的硬體負載裝置: F5、Netscale
1. LB、LVS介紹LB叢集是load balance 叢集的簡寫,翻譯成中文就是負載平衡叢集
650) this.width=650;" title="1x4e5ueewzrd" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="1x4e5ueewzrd" src="http://s3.51cto.com/wyfs02/M01/72/98/wKioL1XoOk2ByQIzAABfIDWRSkk341.jpg" "244" height="159" />
LVS是一個實現負載平衡叢集的開源軟體項目
LVS架構從邏輯上可分為調度層(Director)、server叢集層(Real server)和共用儲存層
LVS可分為三種工作模式: ( dr模式參考這篇文章 http://os.51cto.com/art/201105/264303.htm 這篇介紹的還是挺詳細的: http://www.it165.net/admin/html/201401/2248.html )
NAT(調度器將請求的目標ip即vip地址改為Real server的ip, 返回的資料包也經過調度器,調度器再把源地址修改為vip)
650) this.width=650;" title="aga011e901u" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="aga011e901u" src="http://s3.51cto.com/wyfs02/M02/72/98/wKioL1XoOk7SJpTGAABLpWEn1vI798.jpg" "244" height="193" />
TUN(調度器將請求來的資料包封裝加密通過ip隧道轉寄到後端的real server上,而real server會直接把資料返回給用戶端,而不再經過調度器)
DR(調度器將請求來的資料包的目標mac地址改為real server的mac地址,返回的時候也不經過調度器,直接返回給用戶端)
650) this.width=650;" title="w7v860vq8h6" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="w7v860vq8h6" src="http://s3.51cto.com/wyfs02/M00/72/98/wKioL1XoOk6Ae1XvAABNKugxjoM976.jpg" "244" height="193" />三種IP:DIP(driector ip), VIP(virtual ip), RIP(Real IP). 其中DIP, RIP 為同一個網段,並且為私網IP, vip為對外提供服務的ip,Director, Real server上都設定vip
LVS的調度演算法:輪叫調度(Round Robin)(簡稱rr) ,加權輪叫(Weighted Round Robin)(簡稱wrr),最少連結(least connection)(LC),加權最少連結(Weighted Least Connections)(WLC) 等等 (其他演算法,參考 http://www.aminglinux.com/bbs/thread-7407-1-1.html)
2. LVS/NAT 配置
三台伺服器一台作為director, 兩台作為real server
Director 有一個外網ip (192.168.31.166) 和一個內網ip(192.168.21.166), 兩個real server上只有內網ip(192.168.21.100)和(192.168.21.101) 並且需要把兩個real server的內網網關設定為director的內網ip(192.168.21.166)
兩個real server 上都安裝httpd: yum install -y nginx
Director上安裝ipvsadm yum install -y ipvsadm
Direcotr 上 vim /usr/local/sbin/lvs_nat.sh //增加:
#! /bin/bash
# director 伺服器上開啟路由轉寄功能:
echo 1 > /proc/sys/net/ipv4/ip_forward
# 關閉icmp的重新導向
echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/eth0/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/eth1/send_redirects
# director 設定nat防火牆
iptables -t nat -F
iptables -t nat -X
iptables -t nat -A POSTROUTING -s 192.168.21.0/24 -j MASQUERADE
# director設定ipvsadm
IPVSADM=‘/sbin/ipvsadm‘
$IPVSADM -C
$IPVSADM -A -t 192.168.31.166:80 -s lc -p 300
$IPVSADM -a -t 192.168.31.166:80 -r 192.168.21.100:80 -m -w 1
$IPVSADM -a -t 192.168.31.166:80 -r 192.168.21.101:80 -m -w 1
直接運行這個指令碼就可以完成lvs/nat的配置了:
/bin/bash /usr/local/sbin/lvs_nat.sh
通過瀏覽器測試兩台機器上的web內容,為了區分開,我們可以把nginx的預設頁修改一下:
rs1上: echo "rs1rs1" >/usr/share/nginx/html/index.html
rs2上: echo "rs2rs2" >/usr/share/nginx/html/index.html
3. LVS/DR 配置
三台機器:
director(eth0192.168.31.166, vip eth0:0: 192.168.31.110)
real server1(eth0 rip: 192.168. 31.100, vip lo:0: 192.168.31.110)
real server2(eth0 rip: 192.168.31.101, vip lo:0: 192.168.31.110)
Director 上 vim /usr/local/sbin/lvs_dr.sh //增加
#! /bin/bash
echo 1 > /proc/sys/net/ipv4/ip_forward
ipv=/sbin/ipvsadm
vip=192.168.31.110
rs1=192.168.31.100
rs2=192.168.31.101
ifconfig eth0:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip dev eth0:0
$ipv -C
$ipv -A -t $vip:80 -s rr
$ipv -a -t $vip:80 -r $rs1:80 -g -w 1
$ipv -a -t $vip:80 -r $rs2:80 -g -w 1
兩台rs上:vim /usr/local/sbin/lvs_dr_rs.sh
#! /bin/bash
vip=192.168.31.110
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip lo:0
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
關於arp_ignore和 arp_announce 參考:http://www.cnblogs.com/lgfeng/archive/2012/10/16/2726308.html
然後director上執行: bash /usr/local/sbin/lvs_dr.sh
兩台rs上執行: bash /usr/local/sbin/lvs_dr_rs.sh
Windows下瀏覽器測試訪問
4. LVS/DR + keepalived配置
注意:前面雖然我們已經配置過一些操作,但是下面我們使用keepaliave操作和之前的操作是有些衝突的,所以若是之前配置過DR,請首先做如下操作:dr上執行:
$ipv -C
ifconfig eth0:0 down
前面的lvs雖然已經配置成功也實現了負載平衡,但是我們測試的時候發現,當某台real server把httpd進程停掉,那麼director照樣會把請求轉寄過去,這樣就造成了某些請求不正常。所以需要有一種機制用來檢測real server的狀態,這就是keepalived。它的作用除了可以檢測rs狀態外,還可以檢測備用director的狀態,也就是說keepalived可以實現ha叢集的功能,當然了也需要一台備用director.
備用director也需要安裝一下keepalived軟體
yum install -y keepalived
安裝好後,編輯設定檔
vim /etc/keepalived/keepalived.conf //加入如下:
vrrp_instance VI_1 {
state MASTER #待命伺服器上為 BACKUP
interface eth0
virtual_router_id 51
priority 100 #待命伺服器上為90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.31.110
}
}
virtual_server 192.168.31.110 80 {
delay_loop 6 #(每隔10秒查詢realserver狀態)
lb_algo wlc #(lvs 演算法)
lb_kind DR #(Direct Route)
persistence_timeout 60 #(同一IP的串連60秒內被分配到同一台realserver)
protocol TCP #(用TCP協議檢查realserver狀態)
real_server 192.168.31.100 80 {
weight 100 #(權重)
TCP_CHECK {
connect_timeout 10 #(10秒無響應逾時)
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.31.101 80 {
weight 100
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
以上為主director的設定檔,從director的設定檔只需要修改
state MASTER -> state BACKUP
priority 100 -> priority 90
配置完keepalived後,需要開啟連接埠轉寄(主從都要做):
echo 1 > /proc/sys/net/ipv4/ip_forward
然後,兩個rs上執行 /usr/local/sbin/lvs_dr_rs.sh 指令碼
最後,兩個director上啟動keepalived服務(先主後從):
/etc/init.d/keepalived start
另外,需要注意的是,啟動keepalived服務會自動產生vip和ipvsadm規則,不需要再去執行上面提到的/usr/local/sbin/lvs_dr.sh 指令碼。
nginx ip_hash 實現長串連
- upstream test {
- ip_hash;
- server 192.168.31.100;
- server 192.168.31.101;
- }
- server {
- listen 80;
- server_name bbs.aaa.cn;
- location / {
- proxy_pass http://test/;
- proxy_set_header Host $host;
- proxy_set_header X-Real-IP $remote_addr;
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- }
- }
複製代碼
擴充學習:
haproxy+keepalived http://blog.csdn.net/xrt95050/article/details/40926255
nginx、lvs、haproxy比較 http://www.csdn.net/article/2014-07-24/2820837
keepalived中自訂指令碼 vrrp_script http://www.linuxidc.com/Linux/2012-08/69383.htm http://my.oschina.net/hncscwc/blog/158746
nginx代理 http://www.apelearn.com/bbs/thread-64-1-1.html
nginx長串連 http://www.apelearn.com/bbs/thread-6545-1-1.html
nginx演算法分析 http://blog.sina.com.cn/s/blog_72995dcc01016msi.html
lvs dr模式只使用一個公網ip的實現方法 http://storysky.blog.51cto.com/628458/338726
nginx負載平衡和lvs負載平衡的比較分析
http://www.sudone.com/nginx/nginx_vs_lvs.html
2015-06-05/2015-06-08LB負載平衡叢集