MARK target 可用於給特定的報文打標記 --set-mark value 其中:value 爲十六進制數字 藉助於防火牆標記來分類報文,然後基於標記定義集羣服務;可將多個不一樣的應用使用同一個集羣服務進行調度
實現方法:html
在VS主機打標記: iptables -t mangle -A PREROUTING -d $vip -p $proto –m multiport --dports $port1,$port2,… -j MARK --set-mark NUMBER 在VS主機基於標記定義集羣服務: ipvsadm -A -f 標記符 [options]
# iptables -t mangle -A PREROUTING -d 172.18.50.100 -p tcp –m multiport --dports 80,443 -j MARK --set-mark 10 # ipvsadm -A -f 10 -s wrr # ipvsadm -a -f 10 -r 192.168.1.100 -g # ipvsadm -a -f 10 -r 192.168.1.101 -g
實現不管使用任何調度算法,在一段時間內(默認360s),可以實現未來自同一個地址的請求始終發往同一個RS,從面實現session綁定mysql
PPC: 每端口持久。每一個端口對應定義爲一個集羣服務,每集羣服務單獨調度 # ipvsadm -E -t 192.168.7.250:80 -s rr -p 60 PFWMC: 每防火牆標記持久。基於防火牆標記定義集羣服務;可實現將多個端口上的應用統一調度,即所謂的port Affinity # ipvsadm -A -f 10 -s wrr -p PCC: 每客戶端持久。基於0端口(表示全部服務)定義集羣服務,即將客戶端對全部應用的請求都調度至後端主機,必須定義爲持久模式 # ipvsadm -E -t 192.168.7.250:0 -s rr -p 60
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]算法
# ipvsadm -E -t 192.168.7.250:80 -s rr -p 60 # ipvsadm -ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 192.168.7.250:80 rr persistent 60 -> 192.168.7.201:80 Route 1 0 0 -> 192.168.7.203:80 Route 1 1 0
在客戶端上60秒以內都會調度到同一RS上sql
# for ((i=1;i<=10;i++));do curl 192.168.7.250;done RS2 RS2 RS2 RS2 RS2 RS2 RS2 RS2 RS2 RS2
http://horms.net/projects/ldirectord/vim
用於監視和管理負載平衡虛擬服務器LVS集羣中的RealServer服務器。後端
ldirectord經過按期請求一個已知的URL並檢查響應是否包含預期的響應來監視RealServer服務器的健康情況。若是RealServer發生故障,則將此RS刪除,一旦它恢復正常,它將被從新激活。服務器
下載頁面:session
OBS Repositories: http://download.opensuse.org/repositories/network:/ha-clustering:/Stable/ ldirectord-3.9.6-0rc1.1.2.x86_64.rpm
安裝curl
# yum install ldirectord-3.9.6-0rc1.1.2.x86_64.rpm 有依賴包須要安裝,請掛載相應源 # rpm -ql ldirectord
/etc/ha.d/ldirectord.cf 主配置文件 /usr/share/doc/ldirectord-3.9.6/ldirectord.cf 配置模版 /usr/lib/systemd/system/ldirectord.service 服務 /usr/sbin/ldirectord 主程序 /var/log/ldirectord.log 日誌 /var/run/ldirectord.ldirectord.pid pid 文件
相關文件tcp
checktimeout=3 #檢查超時(秒) checkinterval=1 #檢查間隔(秒) autoreloa"d=yes logfile=「"/var/log/ldirectord.log" #日誌文件 quiescent=no #down時yes權重爲0,no爲刪除 virtual=5 #指定VS的FWM或IP:port real=172.16.0.7:80 gate 2 real=172.16.0.8:80 gate 1 fallback=127.0.0.1:80 gate #sorry server,集羣不可用時,指向一臺備用服務器 service=http scheduler=wrr checktype=negotiate checkport=80 request="index.html" receive=「Test Ldirectord"
配置
# cp /usr/share/doc/ldirectord-3.9.6/ldirectord.cf /etc/ha.d/ # vim /etc/ha.d/ldirectord.cf checktimeout=3 checkinterval=1 fallback=www.baidu.com:80 autoreload=yes logfile="/var/log/ldirectord.log" quiescent=no # Sample for an http virtual service virtual=192.168.7.250:80 > VIP地址 real=192.168.7.201:80 gate 1 > RealServer,gate表示DR模型,後面爲權重 real=192.168.7.203:80 gate 1 service=http > 集羣類型 scheduler=wrr > 調度算法 #persistent=600 > 持久鏈接 #netmask=255.255.255.255 protocol=tcp > 協議,fwm(防火牆標記),udp, checktype=negotiate > 健康度檢查方法,ping, checkport=80 request="index.html" > 檢測的頁面文件 receive="RS" > 檢查的頁面字符
啓動ldirectord
會自動建立集羣規則,先把以前的規則清空 # ipvsadm -C # systemctl start ldirectord.service # ipvsadm -ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 192.168.7.250:80 wrr -> 192.168.7.201:80 Route 1 0 0 -> 192.168.7.203:80 Route 1 0 0
模擬RealServer故障
# vim /var/www/html/index.html R2 LVS很快就把故障節點刪除了 # ipvsadm -ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 192.168.7.250:80 wrr -> 192.168.7.201:80 Route 1 0 2 修復後會自動加入集羣 # ipvsadm -ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 192.168.7.250:80 wrr -> 192.168.7.201:80 Route 1 0 26 -> 192.168.7.203:80 Route 1 0 4
檢測Mysql的範例
#Sample configuration for a MySQL virtual service. #virtual = 192.168.10.74:3306 # real=sql01->sql03:3306 gate 10 # fallback=127.0.0.1:3306 # service=mysql # scheduler=wrr # #persistent=600 # #netmask=255.255.255.255 # protocol=tcp # checktype=negotiate # login="readuser" # passwd="genericpassword" # database="portal" # request="SELECT * FROM link"