Cluster原理
集羣的總類:
1.負載均衡集羣(LB:Load Banlancing):實現將一個訪問量或者任務量特別大的應用,給他
平均分配到不同的服務器上面,以提供高容量、大併發。
2.高可用集羣(HA:High Avalibility):將多臺計算機組合起來,避免一個服務因某臺機器
出現故障,而導致服務中斷的,在於保障服務的可持續性。
3.高性能集羣(HP:High Performance)又叫科學運算集羣:解決複雜的計算,組合起來的集羣,一般要很大量
的計算機組成。suse用的比較多
集羣分別代表的軟件
LB:負載均衡集羣(LB:Load Banlancing)
lvs(Linux Virtual Serverlinux虛擬服務器):提供更高的吞吐率、提供冗餘、更靈活的實用性
lvs:ipvsadm(工作在用戶空間)/(ipvs工作在內核空間)和iptables/netfilter類似
lvs的四個ip地址
1)Virtual IP address(VIP):面向用戶提供服務的地址
2)Real IP address(RIP):real server的ip地址
3)Director's IP address(DIP):director與real server連接的ip地址,DIP是配置在director上面
4)Client computer's IP address(CIP): 客戶端地址
拓撲圖: (ip4)web server1
[LVS] /
user(ip1)----(ip2)director(ip3)
\
(ip5)web server2
ip1表示CIP,ip2表示VIP,ip3表示DIP,ip4和ip5表示RIP
lvs的三個種類(或者三個模型)
1)NAT:Network address translation網絡地址轉換(LVS-NAT)--->目標地址轉換
如何實現:
CIP-->VIP DIP-->RIP
Client------------->Director------------->Cluster node(server)
<------------- <-------------
CIP<--VIP DIP<--VIP
NAT模型一般承受5-6臺server node
拓撲圖:
(ip4)web server1
[LVS] /
user(ip1)----(ip2)director(ip3)
\
(ip5)web server2
請求的過程:user[S(CIP)D(VIP)]------>director[S(CIP)D(RIP)]----->web
涉及到目標地址轉換(DNAT)
回覆的過程:web----->director[S(RIP)D(CIP)]----->user[S(VIP)D(CIP)]
涉及到源地址轉換(SNAT)
web server 的網關是指向director的DIP。
NAT模型的要求:集羣節點必須在同一個網段當中,即DIP與RIP在同一個網段;RIP通常使用私有IP
地址,僅用於和DIP地址進行通信;director將處理在客戶端與server之間的所有通信;server
必須把DIP設置爲默認的網關;director可以實現端口映射,即VIP的端口和RIP的端口可以不一
樣;server可以使用任意的操作系統;director所能支持的server的數量不多;
2)Direct routing:直接路由(LVS-DR)使用最多的模型,用於生產環境中
DR模式可以承受上百臺server
拓撲圖:
web server1
(RIP)-----> 虛擬一個VIP
/
user(CIP)------router--------switch----(VIP/DIP)director
\
(RIP)----> 虛擬一個VIP
web server2
請求的過程:user[S(CIP)D(VIP)]------>director[S(CIP)D(VIP)]----->web
回覆的過程web------->user[S(VIP)D(CIP)]
DR模型中web server和director都有兩個IP,server是RIP和VIP,每個server的VIP都一樣,但是RIP
不一樣。
DR模型的要求:server必須和director在同一個物理網絡上;RIP可以使用公網地址,使用公網地址的好處
如果director出現故障,可以用dns的A記錄來指向server的RIP;director僅處理髮來的請求,響應的請求
將不在通過director;通常server的網關一定不能指向director;director不能做端口映射,server可以
使用任意的操作系統;director能支持大量的server;
3)IP tunneling:IP隧道(LVS-TUN)
拓撲圖:
(RIP)web server1
/
user(CIP)------router--------network cloud----(VIP/DIP)director
\
(RIP)web server2
請求的過程:user[S(CIP)D(VIP)]------>director[S(DIP)D(RIP)]----->web
把源[S(CIP)D(VIP)]進行了封裝成DIP
回覆的過程:web[S(VIP)D(CIP)]----->user
把從director接受到的包解分裝,發現源是director的VIP,目的是
user的CIP
TUN模型的要求:server和director在不同的網絡上;RIP必須是公網IP地址;director只
需要處理傳來的請求,同時響應的數據包一定不能經過director;director不能做端口映射;
只有支持IP隧道的操作系統才能是server
director的調度server的方法:
1)靜態調度方法:fixed Scheduling Methods指director在選舉server的時候不會考慮這個server當前
的連接的活動狀態。
代表算法
RR(Round-robin)輪叫算法
WRR(Weighted round-robin)加權輪叫算法--->適合server的硬件不同和性能不同
DH(Destination hashing)目標地址哈希算法---->將同一個ip地址的請求發給同一個server,應 用的server爲sqiud server 緩存服務器
SH(Source hashing)源地址哈希算法---->適合公司很多員工,然後自己上網的外接口有兩個
2)動態調度方法:dynamic scheduling methods指director每選舉server的時候會判斷這個server當前連接
狀態是不是很多,如果很多則排除在外,然後選擇那些連接狀態比較少的,如果連接狀態都一樣多,那就選擇排在最上面的。
TCP連接 活動狀態的標識是established並且有數據傳輸,非活動狀態的標識是非established狀態的連接,連接還沒有斷開,但是已經不在傳輸數據了。還有一種就是根本沒有連接
代表算法
LC(Least-connection)最少連接數---->每當一個新的請求連接進來,director會查看每個 server上當前處於活動狀態的個數和處於非活動狀態的個數,計算方法 overhaed(當前的負載個數)=10(處於活動狀態的個數)*256+10000(非活 動狀態),首先那個server的overhead個數少就選那個server,如果 server的overhead相同,那就選擇排列在server列表的最上方的一個server。
WLC(Weight Least-connection)是最優算法,也是默認的算法,計算方法overhead/weight(權重)
SED(Shortst Expected Delay)最少期望延遲---->是WLC的改進算法,在算overhaed值的時候不考 慮非活動狀態的值,計算方法overhaed=(n+1)*256/weight,n表示 活動的個數,weight表示權重。
NQ(Never Queue)從不排隊---->對SED的算法的改進,先不管overhaed是多少,只要有server的連 接狀態爲0,則會給你一個連接個數。
LBLC(Locality-Based Least-Connection)基於本地的最少連接,是DH算法的動態調度。
LBLCR(Locality-Based Least-Connection with Replication Scheduing)帶複製的基於本地的最 少連接,時候director後面接cache服務器的,在接後面的server
LVS的實驗:NAT模式
拓撲圖:
(ip4)web server1
[LVS] / \
user(ip1)----(ip2)director(ip3) ====nfs(來共享文件)
\ /
(ip5)web server2
ip地址規劃
保證web server的數據一致---->1.rsync實現文件級別的同步,效率不高
2.drbd基於主機的磁盤鏡像,高可用集羣中用到
3.share storage共享存儲 a.DAS直接附加存儲 b.NAS(nfs、 samba)文件服務 c.SAN存儲區域網絡,本身具有冗餘
1.看內核是否支持ipvs
grep -i 'ip_vs' /boot/config-2.6.32-71.el6.i686
CONFIG_IP_VS=m
CONFIG_IP_VS_IPV6=y
# CONFIG_IP_VS_DEBUG is not set
CONFIG_IP_VS_TAB_BITS=12
CONFIG_IP_VS_PROTO_TCP=y
CONFIG_IP_VS_PROTO_UDP=y
CONFIG_IP_VS_PROTO_AH_ESP=y
CONFIG_IP_VS_PROTO_ESP=y
CONFIG_IP_VS_PROTO_AH=y
CONFIG_IP_VS_RR=m
CONFIG_IP_VS_WRR=m
CONFIG_IP_VS_LC=m
CONFIG_IP_VS_WLC=m
CONFIG_IP_VS_LBLC=m
CONFIG_IP_VS_LBLCR=m
CONFIG_IP_VS_DH=m
CONFIG_IP_VS_SH=m
CONFIG_IP_VS_SED=m
CONFIG_IP_VS_NQ=m
CONFIG_IP_VS_FTP=m
2.拓撲規劃ip
Client:
ip1(CIP)=192.168.1.1
Director:
ip2(VIP)=192.168.1.10 gw=192.168.1.1
ip3(DIP)=192.168.14.50
Web server1:
ip4(RIP)=192.168.14.51 gw=192.168.14.50
Web Server2:
ip5(RIP)=192.168.14.52 gw=192.168.14.50
3.Diretor的配置:
ifconfig eth0 192.168.1.10/24
ifconfig eth1 192.168.14.50
route add default gw 192.168.1.1
iptables -F
a)yum -y install ipvsadm
b)man ipvsadm
ipvsadm -D -t|u|f service-address 刪除集羣服務
ipvsadm -C 清空集羣服務的
ipvsadm -R
ipvsadm -S [-n] 顯示統計數據的
ipvsadm -d -t|u|f service-address -r server-address 從集羣服務裏面刪除real server的
ipvsadm -L|l [options] 顯示狀態表或者查看
ipvsadm -Z [-t|u|f service-address] 清空計數器的
ipvsadm --set tcp tcpfin udp 設置超時時間
ipvsadm --start-daemon state [--mcast-interface interface]
[--syncid syncid]
ipvsadm --stop-daemon state
ipvsadm -h 幫助
1.定義一個集羣服務:
ipvsadm -A|E -t|u|f service-address [-s scheduler]
[-p [timeout]] [-O] [-M netmask] 定義集羣服務
解釋:-A|E -A表示add,E表示修改
-t|u|f t(後面可接端口號)表示tcp協議,u(後面可接端口號)表示udp協議,f表示firewall-mark
service-address服務地址即director (VIP)
-s指明調度方法(默認是WLC)
eg:ipvsadm -A -t 192.168.1.112:80 -s rr
2.向此集羣服務器添加RealServer
ipvsadm -a|e -t|u|f service-address -r server-address
[-g|i|m] [-w weight] [-x upper] [-y lower] 向集羣服務添加real server的
解釋:-a|e -A表示add,E表示修改
-t|u|f t(後面可接端口號)表示tcp協議,u(後面可接端口號)表示udp協議,f表示firewall-mark
service-address服務地址 director
-r 指明real server的地址 server-address
[-g|i|m] g表示直接路由模型 i隧道模型 m表示nat模型 默認是-g DR模型
-w 表示權重 可以省略,省略表示1,選擇這個之前你的算法可以支持權重
-x 連接的個數的上限
-y 連接的個數的下限
eg:ipvsadm -a -t 192.168.1.112:80 -r 192.168.14.51 -m -w 1
ipvsadm -a -t 192.168.1.112:80 -r 192.168.14.52 -m -w 2
c)設置轉發
sysctl -w net.ipv4.ip_forward=1
or
sed -i '/net.ipv4.ip_forward/s/0/1/' /etc/sysctl.conf
sysctl -p
4.Web Server1的配置:
ifconfig eth0 192.168.14.51/24
route add default gw 192.168.14.50
a)yum -y install httpd
b)sed -i '$a ServerName 192.168.14.51:80' /etc/httpd/conf/httpd.conf
c)echo "this is web1 server" >> /var/www/html/index.html
d)service httpd restart
5.Web Server 的配置
ifconfig eth0 192.168.14.52/24
route add default gw 192.168.14.50
a)yum -y install httpd
b)sed -i '$a ServerName 192.168.14.52:80' /etc/httpd/conf/httpd.conf
c)echo "this is web2 server" >> /var/www/html/index.html
d)service httpd restart
LVS:DR模型
拓撲圖:
web server1
(RIP)-----> 虛擬一個VIP
/
user(CIP)------router--------switch----(VIP/DIP)director
\
(RIP)----> 虛擬一個VIP
web server2
1.規劃ip
Client:
CIP=172.16.1.1
director:
VIP=172.16.1.100---->eth0:1(虛擬的ip)
DIP=172.16.1.200--->eth0
web server1:
VIP=172.16.1.100(指向director的VIP) ---> lo:1 (虛擬的ip) gw可以不配置 配置一定不能指向director的DIP上面
RIP=172.16.1.10---->eth0
web server2:
VIP=172.16.1.100---> lo:1 (虛擬的ip) gw可以不配置 配置一定不能指向director的DIP上面
RIP=172.16.1.20---->eth0
director的配置:
ifconfig eth0 172.16.1.200/24
ifconfig eth0:1 172.16.1.100 broadcast 172.16.1.100 netmask 255.255.255.255 up
route add -host 172.16.1.100 dev eth0:1
yum -y install ipvsadm
ipvsadm -A -t 172.16.1.100:80 -s wlc
ipvsadm -a -t 172.16.1.100:80 -r 172.16.1.10 -w 2 -g
ipvsadm -a -t 172.16.1.100:80 -r 172.16.1.20 -w 2 -g
web server1的配置:
ifconfig eth0 172.16.1.10/24
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
ifconfig lo:1 172.16.1.100 broadcast 172.16.1.100 netmask 255.255.255.255 up
route add -host 172.16.1.100 dev lo:1
yum -y install httpd
sed -i '$a ServerName 172.16.1.10:80' /etc/httpd/conf/httpd.conf
echo "this is web1 server" >> /var/www/html/index.html
service httpd restart
web server2的配置:
ifconfig eth0 172.16.1.20/24
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
ifconfig lo:1 172.16.1.100 broadcast 172.16.1.100 netmask 255.255.255.255 up
route add -host 172.16.1.100 dev lo:1
yum -y install httpd
sed -i '$a ServerName 172.16.1.20:80' /etc/httpd/conf/httpd.conf
echo "this is web2 server" >> /var/www/html/index.html
service httpd restart
DR模型的腳本
Real(web) server script
vim /etc/init.d/real
##################
#!/bin/bash
#script to start lvs-dr web server
. /etc/rc.d/init.d/functions
read -p "please input a ip for set up real server VIP:" VIP
case "$1" in
start)
/sbin/ifconfig lo down
/sbin/ifconfig lo up
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
/sbin/ifconfig lo:1 $VIP broadcast $VIP netmask 255.255.255.255 up
/sbin/route add -host $VIP dev lo:1
;;
stop)
/sbin/ifconfig lo:1 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
;;
status)
islothere=`/sbin/ifconfig lo:1 | grep $VIP`
isrothere=`netstat -rn | grep "lo:1" | grep $VIP`
if [ ! "islothere" -o ! "isrothere" ];then
echo "LVS-DR real server Stopped."
else
echo "LVS-DR real server Running."
fi
;;
*)
echo " Usage: $0 (start|status|stop)"
exit 1
;;
esac
###########保存退出 +x
service real start|stop|status
director script
vim /etc/init.d/ipvs
######
#!/bin/bash
#script to start lvs-dr director server
. /etc/rc.d/init.d/functions
VIP=
RIP1=
RIP2=
PORT=80
case "$1" in
start)
/sbin/ifconfig eth0:1 $VIP broadcast $VIP netmask 255.255.255.255 up
/sbin/route add -host $VIP dev eth0:1
echo 1 > /proc/sys/net/ipv4/ip_forward
/sbin/iptables -F
/sbin/ipvsadm -C
ipvsadm -A -t $VIP:$PORT -s wlc
ipvsadm -a -t $VIP:$PORT -r $RIP1 -w 2 -g
ipvsadm -a -t $VIP:$PORT -r $RIP2 -w 2 -g
/bin/touch /var/lock/subsys/ipvsadm &> /dev/null
;;
stop)
echo 0 > /proc/sys/net/ipv4/ip_forward
/sbin/ipvsadm -C
/sbin/ifconfig eth0:1 down
/sbin/route del $VIP
/bin/rm -f /var/lock/subsys/ipvsadm
echo "ipvs is stopped...."
;;
status)
if [ ! -e /var/lock/subsys/ipvsadm ];then
echo "ipvsadm is stopped..."
else
echo "ipvsadm is running..."
ipvsadm -L -n
fi
;;
*)
echo "$0: Usage: $0 (start|status|stop)"
exit 1
;;
esac
######保存退出 +x
service ipvs start|stop|status