集羣概述php
LVS負載平衡集羣及調試算法
LVS集羣配置css
一組相互獨立的、經過高速網絡互聯的計算機構成一個組,並以單一系統的模式加以管理
將不少服務器集中起來一塊兒進行同一種服務,在客戶端看來就象是隻有一個服務器
能夠在付出較低成本的狀況下得到在性能、可靠性、靈活性方面的相對較高的收益
任務調試則是集羣系統中的核心技術html
集羣目地
提升性能
如計算密集型應用。天氣預報、核試驗模擬
下降成本
價格相對較高,但百萬美圓級的超級計算機相比,仍是很是便宜的
提升可擴展性
只要增長集羣節點便可
加強可靠性
多個節點完成相同功能,避免單點失敗前端
集羣分類
高性能計算集羣HPC
經過以集羣開發的並行應用程序,解決複雜的科學問題
負載均衡(LB)集羣
客戶端訪問負載能夠在計算機集羣中儘量平均地分攤處理
高可用(HA)集羣
當集羣中的一個系統發生故障時,集羣軟件迅速作出反應,將該系統的任務分配到集羣中其它正在工做的系統上執行mysql
LVS負載均衡集羣及調試算法nginx
LVS負載均衡集羣
Linux虛擬服務器(LVS)由章文嵩在國防科技大學就讀博士間建立
利用LVS能夠實現高可用的、可伸縮的WEB、MAIL、CACHE和Media等網絡服務
最終目標是利用Linux操做系統和LVS集羣軟件實現一個高可用、高性能、低成本的服務器應用集羣算法
LVS集羣組成
前端:負載均衡層
由一臺或多臺負載調試器構成
中間:服務器羣組層
由一組實際運行應用服務的服務器組成
底端:數據共享存儲層
提供共享存儲空間的存儲區域sql
LVS術語
Director Server:調試服務器,將負載分發到Real Server的服務器
Real Server:真實服務器,真正提供應用服務的服務器
VIP:虛擬IP地址,公佈給用戶訪問的IP地址
RIP:真實IP地址,集羣節點上使用的IP地址
DIP:Director連到Real Server的IP地址bash
LVS負載均衡方式
VS/NAT:經過網絡地址轉換實現的虛擬服務器
Director將用戶請求報文的目的地址改爲待定的Real Server地址後,轉發給Real Server
大併發訪問時,調試器的性能成爲瓶頸
優勢:節省IP 缺點:轉發效率低服務器
VS/DR:直接使用路由技術實現虛擬服務器
經過改寫請求報文的MAC地址,將請求發至Real Server,Real Server直接響應客戶端
VS/TUN:經過隧道方式實現虛擬服務器
Director採用隧道技術將請求發至Real Server後,Real Server直接響應客戶端
負載均衡調試算法
Director Server根據各臺服務器的負載狀況,經過調試算法動態選擇一臺Real Server
LVS目前實現了10種調試算法
經常使用調試算法有4種
1.
輪詢(Round Robin) 加權輪詢(Weighted Round Robin) 最少鏈接(Least Connections) 加權最少鏈接(Weighted Least Connections)
一、輪詢(Round Robin)——rr
將客戶端請求平均分發到Real Server
二、加權輪詢(Weighted Round Robin)——wrr
根據Real Server的性能設置權重,再進行輪詢調度
三、最少鏈接(Least Connections)——lc
動態地將網絡請求調試到已創建的鏈接數最好少的服務器上、
四、加權最少鏈接(Weighted Least Connections)——wlc
根據Real Server的性能設置權重,再將網絡請求調度到已創建的鏈接數最好少的服務器上
五、基於局部性的最好少連接(Locality-Based Least Connections)——lblc
根據請求的目標IP地址找出該目標IP地址最好近使用的服務器,若該服務器是可用的且沒有超載,將請求發送到該服務器;若服務器不存在,或者該服務器超載且有服務器處於一半的工做負載,則用"最少連接"的原則遷出一個可用的服務器,將請求發送到該服務器
六、帶複製的基於局部性最好少連接(Locality-Based Least Connections with Replication)——lblcr
維護從一個目標IP地址到一臺服務器的映射
根據請求的目標IP地址找出該目標IP地址對應的服務器組,按"最小鏈接"原則從服務器組中遷出一臺服務器,若服務器沒有超載,將請求發送到該服務器;若服務器超載,則按"最小鏈接"原則從這個集羣中選出一臺服務器,將該服務器加入到服務器組中,將請求發送到該服務器
當該服務器組有一段時間沒有被修改, 將最儘快的服務從服務器組中刪除,以下降複製的程序。
七、目標地址散列(Destination Hashing)——dh
根據請求的目標IP地址,做爲散列鍵(Hash Key)從靜態分配的散列表找出對應的服務器,若該服務器是可用的且未超載,將請求發送到該服務器,不然返回空
八、源地址散列(Source Hashing)——sh
根據請求的源IP地址,做爲散列鍵(Hash Key)從靜態分配的散列表找出對應的服務器,若該服務器是可用的且未超載,將請求發送到該服務器,不然返回空
九、最短的指望的延遲(Shortest Expected Delay Scheduling SED)——sed
基於WLC算法
A、B、C三臺機器分別權重一、二、3,鏈接數也分別是一、二、3.若是使用WLC算法的話一個新請求進入時它可能會分給ABC中的的任意一個
使用sed算法後會進行這樣一個運算:A(1+1)/1,B(1+2)/2,C(1+3)/3
根據運算結果,把鏈接交給C
十、最好少隊列調度(Never Queue Scheduling NQ)——nq
若是有臺Real Server的鏈接數爲0就直接分配過去,無需SED運算
LVS集羣配置
IPVS
LVS的IP負載均衡技術是經過IPVS模塊實現的
IPVS是LVS集羣的核心軟件
已成爲Linux組成部分
# grep -i 'ipvs' /boot/config-2.6.32-358.el6.x86_64
IPVS安裝
注意:默認光盤的yum install ipvsadm沒法安裝
在光盤下的LoadBalancer
rpm –ivh ipvsadm-xxx
ipvsadm -v
ipvsadm用法
建立虛擬服務器
-A 添加虛擬服務器
-t 設置羣集地址(VIP,Virtual IP)
-s 指定負載調度算法
#ipvsadm –A –T 192.168.100.100:80 –s rr
添加、刪除服務器節點
-a 添加真實服務器
-d 刪除真實服務器
-r 指定真實服務器(Real Server)的地址
-m 使用NAT模式;-g、-i分別對應DR、TUN模式
-w 爲節點服務器設置權重,默認爲1
#ipvsadm –a –t 192.168.100.100:80 –r 192.168.1.1:80 –m
#ipvsadm –d –r 192.168.1.1:80 –t 192.168.100.100:80
查看IPVS
ipvsadm -Ln
NET操做步驟
Real server:配置WEB服務器
Director Server
安裝並啓用ipvsadm
建立虛擬服務器
向虛擬服務器中加入節點
Client:鏈接虛擬服務器測試
Director server配置
打開ip_forward
#sed -i '/ip_forward/s/0/1/' /etc/sysctl.conf
#stsctk –p
啓動ipvsadm
#service ipvsadm start
Client端驗證
#ab –c 10 –n 1000 http://192.168.100.100/index.html
在Director上查看鏈接數
#ipvsadm –L –n
配置LVS-DR集羣
Real Server
配置WEB服務器
配置輔助IP地址
調整內核參數
Director Server
在上安裝並啓用ipvsadm
配置輔助IP地址
建立虛擬服務器
向虛擬服務器中加入節點
Client鏈接虛擬服務器測試
配置輔助IP地址
ifconfig lo:0 192.168.100.100 netmask 255.255.255.255 broadcast 192.168.100.100
調整內核參數
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
實驗
配置LVS-NAT(打開ip_forward,配置ipvsadm)
lvs(eth0:192.168.10.100 eth1:192.168.100.99)
yum install ipvsadm -y(下面加-m是NAT模式不加轉爲爲DR路由模式)
若要永久修改serivce ipvsadm save便可
開啓IP路由轉發功能
sed -i '/net.ipv4.ip_forward/ s/\(.*= \).*/\11/' /etc/sysctl.conf
sed -i '/ip_forward/s/0/1/' sysctl.conf
WEB1(須要設置網關 eth0:192.168.100.100)
yum install httpd php-mysql php -y
/etc/init.d/httpd start
chkconfig httpd on
WEB2(須要設置網關 eth0:192.168.100.200)
yum install httpd php-mysql php -y
/etc/init.d/httpd start
chkconfig httpd on
MYSQL(eth0:192.168.100.250)
yum install mysql-server -y
mysql>grant all on *.* to 'root'@'192.168.100.100' IDENTIFIED BY '1';
mysql>grant all on *.* to 'root'@'192.168.100.200' IDENTIFIED BY '1'
client(客戶機)————策略是輪詢
若更改LVS高度算法爲wrr————加權輪詢
編寫腳原本監控(自動添加,自動刪除WEB主機)
#!/bin/bash
VIP=192.168.10.100
RIP1=192.168.100.100
RIP2=192.168.100.200
while [ 1 ]
do
for IP in $RIP1 $RIP2
do
WebStatus=$(nmap -n -sT $IP -p 80 |grep open)
IPVSIP=$(ipvsadm -Ln |grep $IP)
if [ -z "$WebStatus" ];then
if [ -n "$IPVSIP" ];then
ipvsadm -d -t ${VIP}:80 -r $IP
fi
else
if [ -z "$IPVSIP" ];then
if [ "$IP"=="$RIP1" ];then
ipvsadm -at ${VIP}:80 -r $IP -m -w 1
else
ipvsadm -at ${VIP}:80 -r $IP -m -w 2
fi
fi
fi
done
sleep 2
done
測試
watch -n 1 ipvsadm -Ln
實驗
配置LVS-DR(realserver修改lo:0、修改內核參數;directory修改eth0:0;配置ipvsadm)
[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
IPADDR=192.168.100.254
NETMASK=255.255.255.0
[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0:0
DEVICE=eth0:0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
IPADDR=192.168.100.253
NETMASK=255.255.255.0
WEB1
[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
IPADDR=192.168.100.100
NETMASK=255.255.255.0
GATEWAY=192.168.100.254
[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-lo:0
DEVICE=lo:0
IPADDR=192.168.100.253
NETMASK=255.255.255.255
# If you're having problems with gated making 127.0.0.0/8 a martian,
# you can change this to something else (255.255.255.255, for example)
BROADCAST=192.168.100.253
ONBOOT=yes
NAME=loopback
echo "net.ipv4.conf.all.arp_announce = 2" >> /etc/sysctl.conf echo "net.ipv4.conf.lo.arp_announce = 2" >> /etc/sysctl.conf echo "net.ipv4.conf.all.arp_ignore = 1" >> /etc/sysctl.conf echo "net.ipv4.conf.lo.arp_ignore = 1" >> /etc/sysctl.conf
WEB2
[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
IPADDR=192.168.100.200
NETMASK=255.255.255.0
GATEWAY=192.168.100.254
[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-lo:0
DEVICE=lo:0
IPADDR=192.168.100.253
NETMASK=255.255.255.255
# If you're having problems with gated making 127.0.0.0/8 a martian,
# you can change this to something else (255.255.255.255, for example)
BROADCAST=192.168.100.253
ONBOOT=yes
NAME=loopback
echo "net.ipv4.conf.all.arp_announce = 2" >> /etc/sysctl.conf echo "net.ipv4.conf.lo.arp_announce = 2" >> /etc/sysctl.conf echo "net.ipv4.conf.all.arp_ignore = 1" >> /etc/sysctl.conf echo "net.ipv4.conf.lo.arp_ignore = 1" >> /etc/sysctl.conf
測試
yum install httpd-tools
發送1000鏈接請求,每次併發10個鏈接
ab -n 1000 -c 10 http://192.168.100.253/
自動監控腳本
#!/bin/bash
VIP=192.168.100.253
RIP1=192.168.100.100
RIP2=192.168.100.200
while [ 1 ]
do
for IP in $RIP1 $RIP2
do
WebStatus=$(nmap -n -sT $IP -p 80 |grep open)
IPVSIP=$(ipvsadm -Ln |grep $IP)
if [ -z "$WebStatus" ];then
if [ -n "$IPVSIP" ];then
ipvsadm -d -t ${VIP}:80 -r $IP
fi
else
if [ -z "$IPVSIP" ];then
if [ "$IP"=="$RIP1" ];then
ipvsadm -at ${VIP}:80 -r $IP
else
ipvsadm -at ${VIP}:80 -r $IP -g -w 2
fi
fi
fi
done
sleep 2
done
。