lvs :
ipvs scheduler:
根據其調度時是否考慮各RS當前的負載狀態,可分為靜態方法和動態方法兩種:
1、靜態方法:僅根據算法本身進行調度;
-
RR:roundrobin,輪詢;
-
WRR:Weighted RR,加權輪詢;
-
SH:Source Hashing,實現session sticy,源IP地址hash;將來自于同一個IP地址的請求始終發往第一次挑中的RS,從而實現會話綁定;
-
DH:Destination Hashing;目標地址哈希,將發往同一個目標地址的請求始終轉發至第一次挑中的RS;
2、動態方法:主要根據每RS當前的負載狀態及調度算法進行調度;
Overhead= LC:least connections Overhead=activeconns*256+inactiveconns WLC:Weighted LC Overhead=(activeconns*256+inactiveconns)/weight SED:Shortest Expection Delay Overhead=(activeconns+1)*256/weight NQ:Never Queue LBLC:Locality-Based LC,動態的DH算法; LBLCR:LBLC with Replication,帶復制功能的LBLC;
ipvsadm/ipvs:
ipvs:
查看系統是不是已經編譯了ipvs
~]# grep -i -C 10 "ipvs" /boot/config-3.10.0-327.el7.x86_64
支持的協議工作在傳輸層:TCP, UDP, AH, ESP, AH_ESP, SCTP;
定義ipvs集群:
-
定義集群服務
定義哪一類請求(協議)是屬于負載均衡集群,要根據協議的目標IP和端口, 來判定集群類型!
-
添加服務上的RS
ipvsadm命令:
1.管理集群服務:增、改、刪;
-
增A、改E:
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]
-
刪:-D
ipvsadm -D -t|u|f service-address service-address:定義的集群服務本身的地址。 -t|u|f: -t: TCP協議的端口,VIP:TCP_PORT -u: TCP協議的端口,VIP:UDP_PORT -f:firewall MARK,定義在PREROUTING,是一個數字,用來打標記;以便于定義多個端口的服務為一個集群! [-s scheduler]:指定集群的調度算法,默認為wlc;
2.管理集群上的RS:增、改、刪;
-
增a、改e:
ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]
-
刪:
ipvsadm -d -t|u|f service-address -r server-address server-address: Rserver rip[:port] 選項: lvs類型: -g: gateway, dr類型 -i: ipip, tun類型 -m: masquerade, nat類型 -w weight:權重;
3.清空定義的所有內容:
ipvsadm -C
這就能清空所有的集群服務!
4.查看:
ipvsadm -L|l [options] --numeric, -n:顯示端口不要去解析 --exact:顯示精確值,不要做單位換算 --connection, -c:顯示每一個主機上當前連接的數量 --stats:統計數據 --rate :output of rate information
5.保存和重載:
ipvsadm -S == ipvsadm-save ipvsadm -R == ipvsadm-restore
實例1.lvs-net模式實驗
1.實驗前提
(1)調度器:centos6.8,雙網卡 eth0 10.1.6.68;eth1為vmnet1模式 192.168.0.1;安裝ipvsadm打開核心轉發功能
~]# echo 1 > /proc/sys/net/ipv4/ip_forward
ifconfig eth1 192.168.22.1/24 up
(2)RealServer:均為centos7.2安裝好相應的服務網卡為vmnet1模式ip 192.168.22.11 ip 192.168.22.22
添加默認路由
route add default gw 192.168.22.1
2、測試
RealServer開通web服務并添加測試頁面
用10.1.6.68主機測試發現正常
3.添加集群服務
4.測試
5.換個算法再測試一下
–
負載均衡集群的設計要點:
(1) 是否需要會話保持; (2) 是否需要共享存儲; 共享存儲:NAS, SAN, DS(分布式存儲) 數據同步: 課外作業:rsync+inotify實現數據同步
lvs-nat:
設計要點: (1) RIP與DIP在同一IP網絡, RIP的網關要指向DIP; (2) 支持端口映射; 實踐作業(博客):負載均衡一個php應用; 測試:(1) 是否需要會話保持;(2) 是否需要共享存儲;
lvs-dr:
這種模型就是負載均衡器接收到報文時在報文的首部添加一層MAC地址,再通過交換機(這里只能是交換機)轉發到后端主機,后端主機接收到報文拆解后發現目標地址是lo上的地址就經lo進入input鏈進行響應,響應的結果就又從lo接口出去,這樣就保證了源ip為請求ip,發送到路由器到客戶端。這里可以不經過交換機。
dr模型中,各主機上均需要配置VIP,解決地址沖突的方式有三種:
-
(1) 在前端網關做靜態綁定;
-
(2) 在各RS使用arptables;
-
(3) 在各RS修改內核參數,來限制arp響應和通告的級別;
限制響應級別:arp_ignore0:默認值,表示可使用本地任意接口上配置的任意地址進行響應; 1: 僅在請求的目標IP配置在本地主機的接收到請求報文接口上時,才給予響應;
限制通告級別:arp_announce
0:默認值,把本機上的所有接口的所有信息向每個接口上的網絡進行通告; 1:盡量避免向非直接連接網絡進行通告; 2:必須避免向非本網絡通告;
RS的預配置腳本:個Rs均適用
#!/bin/bash # vip=10.1.0.5 mask='255.255.255.255' case $1 in start) echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce ifconfig lo:0 $vip netmask $mask broadcast $vip up route add -host $vip dev lo:0 ;; stop) ifconfig lo:0 down echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce ;; *) echo "Usage $(basename $0) start|stop" exit 1 ;; esac
測試web
-
V server配置
–
-
客戶端測試
測試mysql
VS的配置腳本:
#!/bin/bash # vip='10.1.0.5' iface='eno16777736:0' mask='255.255.255.255' port='80' rs1='10.1.0.7' rs2='10.1.0.8' scheduler='wrr' type='-g' case $1 in start) ifconfig $iface $vip netmask $mask broadcast $vip up iptables -F ipvsadm -A -t ${vip}:${port} -s $scheduler ipvsadm -a -t ${vip}:${port} -r ${rs1} $type -w 1 ipvsadm -a -t ${vip}:${port} -r ${rs2} $type -w 1 ;; stop) ipvsadm -C ifconfig $iface down ;; *) echo "Usage $(basename $0) start|stop" exit 1 ;; esac 課外擴展作業:vip與dip/rip不在同一網段的實驗環境設計及配置實現; 博客作業:lvs的詳細應用 講清楚類型、調度方法;并且給出nat和dr類型的設計拓撲及具體實現;
FWM:FireWall Mark
借助于防火墻標記來分類報文,而后基于標記定義集群服務;可將多個不同的應用使用同一個集群服務進行調度;
打標記方法(在Director主機):
# iptables -t mangle -A PREROUTING -d $vip -p $proto --dport $port -j MARK --set-mark NUMBER 基于標記定義集群服務: # ipvsadm -A -f NUMBER [options]
環境為之前環境
不過這樣兩個集群是分離的
定義為同一個集群,利用iptables
我們一般建議http和https兩個集群綁定在一塊
lvs persistence:持久連接
持久連接模板:實現無論使用任何算法,在一段時間內,實現將來自同一個地址的請求始終發往同一個RS;
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] port Affinity: 每端口持久:每集群服務單獨定義,并定義其持久性; 每防火墻標記持久:基于防火墻標記定義持久的集群服務;可實現將多個端口上的應用統一調度,即所謂的port Affinity; 每客戶端持久:基于0端口定義集群服務,即將客戶端對所有應用的請求統統調度至后端主機,而且可使用持久連接進行綁定;這種0端口只能適用于持久連接 -p。
保存及重載規則:
因為在此服務在centos中有系統啟動腳本用rpm -ql 就能看到 /usr/lib/systemd/system/ipvsadm.service
,要是啟動不了可能是沒有/etc/sysconfig/ipvsadm文件 touch一下就好了
保存:建議保存至/etc/sysconfig/ipvsadm
ipvsadm-save > /PATH/TO/IPVSADM_FILE ipvsadm -S > /PATH/TO/IPVSADM_FILE systemctl stop ipvsadm.service 重載: ipvsadm-restore < /PATH/FROM/IPVSADM_FILE ipvsadm -R < /PATH/FROM/IPVSADM_FILE systemctl restart ipvsadm.service
考慮:
(1) Director不可用,整個系統將不可用;SPoF 解決方案:高可用 keepalived :在用到ipvs時用這個 heartbeat/corosync (2) 某RS不可用時,Director依然會調度請求至此RS; 解決方案:對各RS的健康狀態做檢查,失敗時禁用,成功時啟用; keepalived heartbeat/corosync, ldirectord 檢測方式: (a) 網絡層檢測;意味著ping通 (b) 傳輸層檢測,端口探測;掃描端口。 (c) 應用層檢測,請求某關鍵資源; ok --> failure failure --> ok
原創文章,作者:qzx,如若轉載,請注明出處:http://www.www58058.com/56332