LVS-NAThtml
1、架構平臺環境linux
系統平臺:CentOS 6.5 64bit vmw10.0 lvs01(RS),lvs02(RS),lvs03(Director) 相關服務和專用名詞定義 Director:負責調度集羣的主機;也簡稱爲調度器、分發器 VIP:Virtual IP 向外提供服務的IP;一般此IP綁定域名 DIP:與內部主機RIP通訊的IP,在Director主機上 RIP:RealServer IP;內部真正提供服務的主機 CIP:客戶端IP
2、LVS-NAT架構算法
3、LVS-NAT模型實現負載均衡的工做方式bash
NAT模型其實就是經過網絡地址轉換來實現負載均衡的,它的工做方式幾乎跟DNAT如出一轍的,目前的DNAT只能轉發到一個目標地址,早期的DNAT是能夠將請求轉發到多個目標的,在LVS出現以後就將此功能從DNAT中去掉了,下面來講說NAT模型的工做方式或者說NAT模型是怎麼實現負載均衡的,根據上圖,
1.用戶請求VIP(也能夠說是CIP請求VIP)
2,Director Server 收到用戶的請求後,發現源地址爲CIP請求的目標地址爲VIP,那麼Director Server會認爲用戶請求的是一個集羣服務,那麼Director Server 會根據此前設定好的調度算法將用戶請求負載給某臺Real Server ;假如說此時Director Server 根據調度算法的結果會將請求分攤到RealServer1上去,那麼Director Server 會將用戶的請求報文中的目標地址,從原來的VIP改成RealServer1的IP,而後再轉發給RealServer1
3,此時RealServer1收到一個源地址爲CIP目標地址爲本身的請求,那麼RealServer1處理好請求後會將一個源地址爲本身目標地址爲CIP的數據包經過Director Server 發出去,
4.當Driector Server收到一個源地址爲RealServer1 的IP 目標地址爲CIP的數據包,此時Driector Server 會將源地址修改成VIP,而後再將數據包發送給用戶。服務器
4、LVS-NAT的性能瓶頸網絡
在LVS/NAT的集羣系統中,請求和響應的數據報文都須要經過負載調度器(Director),當真實服務器(RealServer)的數目在10臺和20臺之間時,負載調度器(Director)將成爲整個集羣系統的新瓶頸。大多數Internet服務都有這樣的特色:請求報文較短而響應報文每每包含大量的數據。若是能將請求和響應分開處理,即在負載調度器(Director)中只負責調度請求而響應直接(RealServer)返回給客戶,將極大地提升整個集羣系統的吞吐量。架構
5、部署環境負載均衡
一、準備工做框架
(1)關閉全部測試主機的iptables和selinux服務 setenforce 0 service iptables stop && chkconfig iptables off (2)HA中全部節點儘量保證時間是一致的,方法是時間同步+任務計劃同步時間; 注意:對於LB來講時間的影響不是很大,可是對於HP來講各節點之間的時間誤差不該該超出一秒鐘: ntpdate -u asia.pool.ntp.org
二、拓撲圖地址規劃curl
LVS Director 機器: 公網地址:vip 主機名:lvs03 網卡:eth0 vip地址:10.19.166.169 網絡鏈接方式:vmw-bridge 私網地址:dip dip地址:10.0.0.1/24 網絡鏈接方式:vmw-(not use[VMnet3]) RealServer機器: 私網地址:rip1 主機名:lvs01 rip地址:10.0.0.8/24 網絡鏈接方式:vmw-(not use[VMnet3]) 私網地址:rip2 主機名:lvs01 rip地址:10.0.0.9/24 網絡鏈接方式:vmw-(not use[VMnet3])
三、RealServer上部署httpd服務並測試
安裝Apache httpd 建立測試頁面,並啓動httpd服務 # yum install httpd -y # /etc/init.d/httpd start [root@lvs01]# echo "<h1>Node1.ssc.com</h1>" > /var/www/html/index.html [root@lvs02]# echo "<h1>Node2</h1>" > /var/www/html/index.html 測試httpd服務器是否能正常打開頁面 [root@lvs01]# curl http://10.0.0.8[root@lvs02]# curl http://10.0.0.9
四、在Director上部署ipvs服務並測試
(1)肯定本機ip_vs模塊是否加載,也就是是否支持lvs,2.4.2後都支持了;而後安裝ipvsadm 用戶操做命令 [root@lvs03 ~]# grep -i "ip_vs" /boot/config-2.6.32-431.el6.x86_64 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 #IPVS支持哪些集羣服務 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_PROTO_SCTP=y CONFIG_IP_VS_RR=m #IPVS支持的十種調度算法 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 #支持代理FTP協議的 CONFIG_IP_VS_PE_SIP=m (2)安裝 ipvsadm [root@lvs03 ~]# yum install ipvsadm -y (3)添加集羣服務 [root@lvs03 ~]# ipvsadm -A -t 10.19.166.169:80 -s rr #定義一個集羣服務 [root@lvs03 ~]# ipvsadm -a -t 10.19.166.169:80 -r 10.0.0.8 -m #添加RealServer並指派調度 [root@lvs03 ~]# ipvsadm -a -t 10.19.166.169:80 -r 10.0.0.9 -m #添加RealServer並指派調度 [root@lvs03 ~]# ipvsadm -L -n #查看IPVS定義的規則列表 IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 10.19.166.169:80 rr -> 10.0.0.8:80 Masq 2 0 0 -> 10.0.0.9:80 Masq 1 0 0 [root@lvs03 ~]# cat /proc/sys/net/ipv4/ip_forward #查看Linux是否開啓路由轉發功能 0 [root@lvs03 ~]# echo 1 > /proc/sys/net/ipv4/ip_forward #啓動Linux的路由轉發功能 [root@lvs03 ~]# cat /proc/sys/net/ipv4/ip_forward 1
(4)測試訪問http頁面
(5)永久保存LVS規則並恢復 第一種方法: [root@lvs03 ~]# service ipvsadm save ipvsadm: Saving IPVS table to /etc/sysconfig/ipvsadm: [肯定] 第二種方法: [root@lvs03 ~]# ipvsadm -S > /etc/sysconfig/ipvsadm.s1 模擬清空ipvsadm規則來恢復 [root@lvs03 ~]# ipvsadm -C [root@lvs03 ~]# ipvsadm -L -n IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn [root@lvs03 ~]# ipvsadm -R < /etc/sysconfig/ipvsadm.s1 [root@lvs03 ~]# ipvsadm -L -n IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 10.19.166.169:80 wrr -> 10.0.0.8:80 Masq 3 0 0 -> 10.0.0.9:80 Masq 1 0 0
ipvsadm用法
其實LVS的自己跟iptables很類似,並且連命令的使用格式都很類似,其實LVS是根據iptables的框架開發的,那麼LVS的自己分紅了兩個部分,第一部分是工做在內核空間的一個IPVS的模塊,其實LVS的功能都是IPVS模塊實現的,,第二部分是工做在用戶空間的一個用來定義集羣服務的一個工具ipvsadm, 這個工具的主要做用是將管理員定義的集羣服務列表傳送給工做在內核空間中的IPVS模塊,下面來簡單的介紹下ipvsadm命令的用法
ipvsadm組件定義規則的格式: 1.定義集羣服務格式: (1).添加集羣服務: ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] -A: 表示添加一個新的集羣服務 -E: 編輯一個集羣服務 -t: 表示tcp協議 -u: 表示udp協議 -f: 表示firewall-Mark,防火牆標記 service-address: 集羣服務的IP地址,即VIP -s 指定調度算法 -p 持久鏈接時長,如#ipvsadm -Lcn ,查看持久鏈接狀態 -M 定義掩碼 ipvsadm -D -t|u|f service-address 刪除一個集羣服務 ipvsadm -C 清空全部的規則 ipvsadm -R 從新載入規則 ipvsadm -S [-n] 保存規則 2.向集羣服務添加RealServer規則: (1).添加RealServer規則 ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight] -a 添加一個新的realserver規則 -e 編輯realserver規則 -t tcp協議 -u udp協議 -f firewall-Mark,防火牆標記 service-address realserver的IP地址 -g 表示定義爲LVS-DR模型 -i 表示定義爲LVS-TUN模型 -m 表示定義爲LVS-NAT模型 -w 定義權重,後面跟具體的權值 ipvsadm -d -t|u|f service-address -r server-address --刪除一個realserver ipvsadm -L|l [options] --查看定義的規則 如:#ipvsadm -L -n ipvsadm -Z [-t|u|f service-address] --清空計數器
lvs的10種調度算法
LVS Scheduling Method LVS的調度方法: 1.Fixed Scheduling Method 靜態調服方法 (1).RR 輪詢 (2).WRR 加權輪詢 (3).DH 目標地址hash (4).SH 源地址hash 2.Dynamic Scheduling Method 動態調服方法 (1).LC 最少鏈接 (2).WLC 加權最少鏈接 (3).SED 最少指望延遲 (4).NQ 從不排隊調度方法 (5).LBLC 基於本地的最少鏈接 (6).LBLCR 帶複製的基於本地的最少鏈接
###########################################################
Real Server httpd 安裝腳本
#!/bin/bash #install httpd #2015/03/23 i='httpd' if [ `rpm -qa | grep $i | wc -l` -eq 0 ] then echo "$i is not installed" sleep 2 echo "### yum httpd ###" sleep 2 echo `yum install -y httpd` else echo "i was installed" fi sleep 2 echo `/etc/init.d/httpd start` sleep 3 echo "### insert RS1 ###" echo `cat /etc/sysconfig/network` > /var/www/html/index.html sleep 3 echo `curl http://localhost`
###########################################################
Director 安裝腳本
#!/bin/bash # Director install # 2015/03/23 vip=10.19.166.169 dip=10.0.0.1 rip1=10.0.0.8 rip2=10.0.0.9 case "$1" in start) echo `ifconfig eth1 $dip/24 up` echo "ipvsadm install" sleep 3 echo `yum install ipvsadm -y` sleep 4 echo `echo 1 > /proc/sys/net/ipv4/ip_forward` sleep 1 echo `ipvsadm -A -t $vip:80 -s wrr` echo `ipvsadm -a -t $vip:80 -r $rip1 -m` echo `ipvsadm -a -t $vip:80 -r $rip2 -m` ;; stop) echo `echo 0 > /proc/sys/net/ipv4/ip_forward` sleep 1 echo `ipvsadm -C` sleep 1 echo `ifconfig eth1 down` ;; status) if [ `ipvsadm -L -n | wc -l` -eq 6 ];then echo "ipvsadm is running...." else echo "ipvsadm is stopped...." fi ;; * ) echo "Usage: $0 {start|stop}" ;; esac