1.LVS(高負載)
LVS(Linux虛擬服務器)
Linux Virtual Server
LVS集羣採用IP負載均和技術和基於內容請求分發技術。調取器具備很好的吞吐率,將請求均衡的轉移到不一樣的服務器執行,且調度器自動屏蔽掉服務器的故障,從而將一組服務器構成一個高性能,高可用的虛擬服務器
原理詳解
http://junwang.blog.51cto.com/5050337/1439428/
1.查看內核是否支持ipvslinux
grep -i 'vs' /boot/config-3.17.4-301.fc21.i686+PAE grep -i 'vs' /boot/config-3.17.4-301.fc21.i686
2.安裝ipvsadm
yum install ipvsadm
3.ipvsadm命令
一、管理集羣服務
1.添加:-Aipvsadm -A|E -t|u|f service-address
-t:tcp協議集羣 -u:udp協議集羣 -f:防火牆標記集羣
2.修改:-E
3.刪除:-D ipvsadm -D -t|u|f service-address
二、管理集羣服務中的RealServer
1.添加:-aipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]
-r:RS的地址,NAT模型中,可用IP:PORT實現端口映射
-g:DR模型 -i:TUN模型 -m:NAT模型 -w:權重
2.修改:-e
3.刪除:-d ipvsadm -d -t|u|f service-address -r server-address
3.管理集羣服務的查看
1.ipvsadm -L|l [options]
options:-n:數字格式顯示
--stats 統計信息
--rate:統計速率
--timeout:顯示tcp、tcpinfo、udp的會話超時時長
-c:鏈接客戶端數量
4.狀況計數器:ipvsadm -Z [-t|u|f service-address]
5.狀況規則:ipvsadm –C
6.保存規則:
1.ipvsadm -S > /path/to/somefile
2.ipvsadm-save > /path/to/somefile
3.ipvsadm-restore < /path/to/somefile
4.lvs調度算法:
1. 固定調度
i. rr:輪詢
ii. wrr:加權輪詢
iii. sh:source hash,源地址hash(必定時間內,相同的源地址發往相同的主機)session affinity、 session sharing
iv. dh:對於同一個請求,發往同一個服務器(緩存服務器)
2. 動態調度(默認爲wlc)
i. lc(least-connection)最少鏈接
1) active*256+inactive 誰的小,挑選誰
ii. wlc:加權最少鏈接
1) (active*256+inactive)/weight 誰的小,挑選誰
iii. sed:最短時間望延遲
1) (active+1)*256/weight 誰的小,挑選誰
iv. nq:never queue(基於sed,不考慮incative)
v. lblc(locality-based least-connection)基於本地的最少鏈接
vi. lblcr:基於本地的帶複製功能的最少鏈接(緩存共享對象,兄弟服務器)
儘量調度到相同的服務器,只有新請求發送到最少的服務器,沒有的話會去查詢兄弟服務器
5.LVS之 DR模型
DR模型原理
當客戶端訪問集羣中的服務(例如web),源IP(定義爲A)和目標IP(定義爲B)如上圖所示,發送數據報文到調度器上
<1>客戶端發送報文必須到調度器上,不能到Rearserver上,否則沒法實現調度
實現原理:雖然RS上的lo口也配置VIP,可是卻沒法響應,經過以下配置在RS上實現web
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請求時的響應級別,默認0)
1) 0:只要本地配置有相應的地址,給予響應
2) 1:僅在請求的目標地址配置請求到達的接口上的時候,纔給於響應
arp_announce(將本身地址向外通告時的通告級別,默認0)
1) 0:將本地任何接口上的任何地址向外通告
2) 1:試圖僅向目標網絡通告語氣網絡匹配的地址
3) 2:僅向與本地接口上地址匹配的網絡進行通告
2.調度器收到報文後查詢ipvsadm規則,符合集羣服務後發送報文到RS上,源目IP地址不變,是經過修改MAC地址發送到RS上的,
<1>調度器規則算法
ipvsadm -A -t 192.168.11.100:80 -s wrr ipvsadm -a -t 192.168.11.100:80 -r 192.168.11.12 -g -w 2 ipvsadm -a -t 192.168.11.100:80 -r 192.168.11.13 -g -w 4
RS收到報文後,發現目標IP爲本身的VIP(lo:0上配置,不對外響應,只作回報的源IP),用本身的VIP做爲源地址發送報文
<1>如何實現發送報文時,源IP爲本身的lo:0上的VIP,默認linux報文從哪一個接口出源IP爲那個接口
實現原理:緩存
ifconfig lo:1 192.168.11.100 netmask 255.255.255.255 up (配置RS的VIP,不對外響應) route add -h 192.168.11.100 dev lo:0 (增長路由,報文目標IP爲192.168.11.100的接口爲lo:0,這樣回報也是經過lo:0回報,確保報文源IP爲VIP)
<2>確保調度器上的發包正確,增長以下配置bash
ifconfig eth:0 192.168.11.100 netmask 255.255.255.255 up (添加VIP地址) route add -h 192.168.11.100 dev eth:0
客戶端收到後源IP爲VIP,目的IP爲客戶端的IP,報文的封裝爲:RS經過本身的lo:0迴應報文,源IP則爲VIP,目標IP則爲客戶端IP
DR模型實現腳本
DR類型中,Director和RealServer的配置腳本示例:
服務器
Director腳本:網絡
#!/bin/bash # # LVS script for VS/DR # chkconfig: - 90 10 # . /etc/rc.d/init.d/functions # VIP=192.168.11.100 DIP=192.168.11.11 RIP1=192.168.11.12 RIP2=192.168.11.13 PORT=80 RSWEIGHT1=2 RSWEIGHT2=4 # 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 # Since this is the Director we must be able to forward packets echo 1 > /proc/sys/net/ipv4/ip_forward # Clear all iptables rules. /sbin/iptables -F # Reset iptables counters. /sbin/iptables -Z # Clear all ipvsadm rules/services. /sbin/ipvsadm -C # Add an IP virtual service for VIP 192.168.0.219 port 80 # In this recipe, we will use the round-robin scheduling method. # In production, however, you should use a weighted, dynamic scheduling method. /sbin/ipvsadm -A -t $VIP:80 -s wrr # Now direct packets for this VIP to # the real server IP (RIP) inside the cluster /sbin/ipvsadm -a -t $VIP:80 -r $RIP1 -g -w $RSWEIGHT1 /sbin/ipvsadm -a -t $VIP:80 -r $RIP2 -g -w $RSWEIGHT2 /bin/touch /var/lock/subsys/ipvsadm &> /dev/null ;; stop) # Stop forwarding packets echo 0 > /proc/sys/net/ipv4/ip_forward # Reset ipvsadm /sbin/ipvsadm -C # Bring down the VIP interface /sbin/ifconfig eth0:0 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 "ipvs is running ..." ipvsadm -L -n fi ;; *) echo "Usage: $0 {start|stop|status}" ;; esac
RealServer腳本:session
#!/bin/bash # # Script to start LVS DR real server. # chkconfig: - 90 10 # description: LVS DR real server # . /etc/rc.d/init.d/functions VIP=192.168.11.100 host=`/bin/hostname` case "$1" in start) # Start LVS-DR real server on this machine. /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:0 $VIP broadcast $VIP netmask 255.255.255.255 up /sbin/route add -host $VIP dev lo:0 ;; stop) # Stop LVS-DR real server loopback device(s). /sbin/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 ;; status) # Status of LVS-DR real server. islothere=`/sbin/ifconfig lo:0 | grep $VIP` isrothere=`netstat -rn | grep "lo:0" | grep $VIP` if [ ! "$islothere" -o ! "isrothere" ];then # Either the route or the lo:0 device # not found. echo "LVS-DR real server Stopped." else echo "LVS-DR real server Running." fi ;; *) # Invalid entry. echo "$0: Usage: $0 {start|status|stop}" exit 1 ;; esac