Linux_ClusterOverviewLBIntroductionLVS的調度方法:10種ipvsadm查看lvs狀態VS/NATARP問題LVS my testing持久鏈接HA概述Cluster 選項順序約束屬性排列約束CRMRARHEL OR CentOS高可用集羣解決方案資源爭用安裝配置高可用集羣heartbeatHA集羣的工做模型:資源粘性與約束資源釋放資源類型Heartbeat V2資源腳本:安裝配置HeartbeatAnsible安裝配置YAMLCorosync && PacemakerBackground配置實例Crmsh監測資源功能配置資源粘性定義資源約束部署corosync && pacemaker 案例PCSDFS機率分佈式事務的模型和規範分佈式應用分佈式存儲MogileFS特性安裝配置mogilefs應用示例存儲DRBDDRBD ProtocolBrain Split配置DRBDDRBD&&Pacemakermysql+drbd+corosyncDRBD 工做在雙主模型結合RHCS時資源定義示例多節點同時啓動一個IPISCSI配置iscsitgtadmiSCSI配置示例分享ISCSI步驟刪除ISCSI設備tgtd configurationISCSI配置CHAP用戶認證RHCS and CongaHA解決方案(終極)部署RHCS的方法RHCS基於命令行的實現GFS集羣文件系統集羣邏輯卷lvm2-clusterDevice Mapper 簡析DM與MDDMSetupKeepAlivedKeepAlived配置Keepalived功能補充組播IP地址特殊網卡類型配置故障切換域html
註冊用戶>在線數>併發數前端
擴展類型: Scale up: 向上擴展 Scale out: 向外擴展 HA: 服務可用性 平均無端障時間/(平均無端障時間+平均修復時間) 將調度與生產分離 RAS 一、負載均衡集羣(LB):load balance 擴展容量,伸縮性 tcp: lvs,haproxy 應用層:nginx, haproxy, ats 緩存:varnish,squid 二、高可用集羣(HA):High Availiablity 實現服務可用性 heartbeat, corosync, keepalived iscsi, gfs2, drbdnode
分佈式圖片存儲:MogileFS NoSQL: MongoDB 三、高性能集羣 HP:High Performance Hadoop 向量機 並行處理集羣python
硬件解決方案: F5 公司產品 BIG-IP 思傑Ctrix Netscaler A10 A10 Array Redwaremysql
Linux: LVS Linux Virtual Server 章文嵩,國人研發 IPVS:框架,須要依賴於規則完成轉發.不屬於netfilter的INPUT鏈linux
libnet下載地址: http://search.cpan.org/dist/libnet/ ipvsadm下載地址: http://www.linuxvirtualserver.org/software/ipvs.html#kernel-2.6ios
從Linux內核版本2.6起,ip_vs code已經被整合進了內核中,所以,只要在編譯內核的時候選擇了ipvs的功能,您的Linux即能支持LVS。Linux 2.4.23之後的內核版本也整合了ip_vs code,但若是是更舊的內核版本,您得本身手動將ip_vs code整合進內核原碼中,並從新編譯內核方可以使用lvs。 ipvsadmin/ipvs = LVSnginx
關於ipvsadm:git
ipvsadm是運行於用戶空間、用來與ipvs交互的命令行工具,它的做用表如今: 一、定義在Director上進行dispatching的服務(service),以及哪此服務器(server)用來提供此服務; 二、爲每臺同時提供某一種服務的服務器定義其權重(即概據服務器性能肯定的其承擔負載的能力) 注:權重用整數來表示,有時候也能夠將其設置爲atomic_t;其有效表示值範圍爲24bit整數空間,即(2^24-1);github
所以,ipvsadm命令的主要做用表如今如下方面: 一、添加服務(經過設定其權重>0); 二、關閉服務(經過設定其權重>0);此應用場景中,已經鏈接的用戶將能夠繼續使用此服務,直到其退出或超時;新的鏈接請求將被拒絕; 三、保存ipvs設置,經過使用「ipvsadm-sav > ipvsadm.sav」命令實現; 四、恢復ipvs設置,經過使用「ipvsadm-sav < ipvsadm.sav」命令實現; 五、顯示ip_vs的版本號,下面的命令顯示ipvs的hash表的大小爲4k;
// ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
六、顯示ipvsadm的版本號 ipvsadm --version ipvsadm v1.24 2003/06/07 (compiled with popt and IPVS v1.2.0)
ipvsadm使用中應注意的問題
默認狀況下,ipvsadm在輸出主機信息時使用其主機名而非IP地址,所以,Director須要使用名稱解析服務。若是沒有設置名稱解析服務、服務不可用或設置錯誤,ipvsadm將會一直等到名稱解析超時後才返回。固然,ipvsadm須要解析的名稱僅限於RealServer,考慮到DNS提供名稱解析服務效率不高的狀況,建議將全部RealServer的名稱解析經過/etc/hosts文件來實現LVS根據套接字進行轉發,因此一般稱LVS爲四層交換或者四層路由
CIP --- VIP --- DIP --- RIP
LVS類型:
LVS的NAT特徵:
一、RS應該使用私有地址 二、 RS的網關必須指向DIP 三、 RIP和DIP必須在同一網段內 四、 請求和響應的報文都得通過Director,在高負載運行場景中,Director極可能成爲系統性能瓶頸 五、支持端口映射: 六、RS能夠使用任意支持集羣服務的OS
LVS DR類型:
一、讓前端路由將請求發往VIP時,只能是Director上的VIP: 解決方案: 一、靜態地址綁定 未必有路由器的配置權限; Director調用時靜態地址綁定將難以適用; 二、arptables 三、修改Linux參數,將RS上的VIP配置在lo接口的別名,限制Linux僅對對應接口的APR請求作相應;
LVS DR類型的特性: 一、RS能夠使用私有地址,但也能夠使用公網地址,此時能夠直接經過互聯網連入RS以實現配置、監控等; 二、RS的網關必定不能指向DIP; 三、RS跟Directory要在同一物理網絡內(不能由路由器分割); 四、請求報文通過Directory,但響應報文必定不通過Directory; 五、不支持端口映射; 六、RS能夠使用大多數的操做系統;
LVS TUN類型:IP隧道
一、RIP,DIP,VIP都得是公網地址; 二、RS的網關不會指向也不可能指向RIP; 三、請求報文通過Directory,但響應報文必定不通過Director; 四、不支持端口映射; 五、RS的OS必須得支持隧道功能;
Schedule method:調度算法 靜態方法:僅根據算法自己進行調度
rr: Round Robin wrr: Weighted RR sh: source hashing dh: destination hashing
動態方法:根據算法及RS當前的負載情況
lc: Least Connection Overhead=Active*256+Inactive 結果中,最小者勝出; wlc: Weighted LC Overhead=(Active*256+Inactive)/weight sed: Shortest Expect Delay Overhead=(Active+1)*256/weight nq: Nerver Queue lblc: Locality-based Least Connection dh+lc lblcr: Replicated and Locality-based Least Connection
Session持久機制:
一、session綁定:始終將同一個請求者的鏈接定向至同一個RS(第一次請求時仍由調度方法選擇);沒有容錯能力,有損均衡效果; 二、session複製:在RS之間同步session,所以,每一個RS持集羣中全部的session;對於大規模集羣環境不適用; 三、session服務器:利用單獨部署的服務器來統一管理session;
調度算法解析
一、輪詢(round robin, rr),加權輪詢(Weighted round robin, wrr)――新的鏈接請求被輪流分配至各RealServer;算法的優勢是其簡潔性,它無需記錄當前全部鏈接的狀態,因此它是一種無狀態調度。輪叫調度算法假設全部服務器處理性能均相同,無論服務器的當前鏈接數和響應速度。該算法相對簡單,不適用於服務器組中處理性能不一的狀況,並且當請求服務時間變化比較大時,輪叫調度算法容易致使服務器間的負載不平衡。 二、最少鏈接(least connected, lc), 加權最少鏈接(weighted least connection, wlc)――新的鏈接請求將被分配至當前鏈接數最少的RealServer;最小鏈接調度是一種動態調度算法,它經過服務器當前所活躍的鏈接數來估計服務器的負載狀況。調度器須要記錄各個服務器已創建鏈接的數目,當一個請求被調度到某臺服務器,其鏈接數加1;當鏈接停止或超時,其鏈接數減一。 三、基於局部性的最少連接調度(Locality-Based Least Connections Scheduling,lblc)――針對請求報文的目標IP地址的負載均衡調度,目前主要用於Cache集羣系統,由於在Cache集羣中客戶請求報文的目標IP地址是變化的。這裏假設任何後端服務器均可以處理任一請求,算法的設計目標是在服務器的負載基本平衡狀況下,將相同目標IP地址的請求調度到同一臺服務器,來提升各臺服務器的訪問局部性和主存Cache命中率,從而整個集羣系統的處理能力。LBLC調度算法先根據請求的目標IP地址找出該目標IP地址最近使用的服務器,若該服務器是可用的且沒有超載,將請求發送到該服務器;若服務器不存在,或者該服務器超載且有服務器處於其一半的工做負載,則用「最少連接」的原則選出一個可用的服務器,將請求發送到該服務器。 四、帶複製的基於局部性最少連接調度(Locality-Based Least Connections with Replication Scheduling,lblcr)――也是針對目標IP地址的負載均衡,目前主要用於Cache集羣系統。它與LBLC算法的不一樣之處是它要維護從一個目標IP地址到一組服務器的映射,而 LBLC算法維護從一個目標IP地址到一臺服務器的映射。對於一個「熱門」站點的服務請求,一臺Cache 服務器可能會忙不過來處理這些請求。這時,LBLC調度算法會從全部的Cache服務器中按「最小鏈接」原則選出一臺Cache服務器,映射該「熱門」站點到這臺Cache服務器,很快這臺Cache服務器也會超載,就會重複上述過程選出新的Cache服務器。這樣,可能會致使該「熱門」站點的映像會出如今全部的Cache服務器上,下降了Cache服務器的使用效率。LBLCR調度算法將「熱門」站點映射到一組Cache服務器(服務器集合),當該「熱門」站點的請求負載增長時,會增長集合裏的Cache服務器,來處理不斷增加的負載;當該「熱門」站點的請求負載下降時,會減小集合裏的Cache服務器數目。這樣,該「熱門」站點的映像不太可能出如今全部的Cache服務器上,從而提供Cache集羣系統的使用效率。LBLCR算法先根據請求的目標IP地址找出該目標IP地址對應的服務器組;按「最小鏈接」原則從該服務器組中選出一臺服務器,若服務器沒有超載,將請求發送到該服務器;若服務器超載;則按「最小鏈接」原則從整個集羣中選出一臺服務器,將該服務器加入到服務器組中,將請求發送到該服務器。同時,當該服務器組有一段時間沒有被修改,將最忙的服務器從服務器組中刪除,以下降複製的程度。 五、目標地址散列調度(Destination Hashing,dh)算法也是針對目標IP地址的負載均衡,但它是一種靜態映射算法,經過一個散列(Hash)函數將一個目標IP地址映射到一臺服務器。目標地址散列調度算法先根據請求的目標IP地址,做爲散列鍵(Hash Key)從靜態分配的散列表找出對應的服務器,若該服務器是可用的且未超載,將請求發送到該服務器,不然返回空。 六、源地址散列調度(Source Hashing,sh)算法正好與目標地址散列調度算法相反,它根據請求的源IP地址,做爲散列鍵(Hash Key)從靜態分配的散列表找出對應的服務器,若該服務器是可用的且未超載,將請求發送到該服務器,不然返回空。它採用的散列函數與目標地址散列調度算法的相同。除了將請求的目標IP地址換成請求的源IP地址外,它的算法流程與目標地址散列調度算法的基本類似。在實際應用中,源地址散列調度和目標地址散列調度能夠結合使用在防火牆集羣中,它們能夠保證整個系統的惟一出入口。
LVS追蹤標記fwmark:
若是LVS放置於多防火牆的網絡中,而且每一個防火牆都用到了狀態追蹤的機制,那麼在迴應一個針對於LVS的鏈接請求時必須通過此請求鏈接進來時的防火牆,不然,這個響應的數據包將會被丟棄。 LVS-fullnat: Director將CIP|VIP 轉變爲DIP|RIP Session持久機制: 一、Session綁定:始終將同一個請求者的鏈接定向至同一個RS(第一次請求時仍由調度方法選擇),沒有容錯能力,有損均衡效果(反均衡); 二、Session複製:在RS之間同步session,所以每一個RS持集羣中全部的session,對於大規模集羣環境並不適用; 三、Session服務器:利用單獨部署的服務器來統一管理Session。此共享的Session服務器要實現高可用;
LVS的集羣服務:根據請求目標套接字(包括端口的協議類型tcp,udp)來實現轉發
查看內核中的關於ipvs的編譯
grep -i -E 'ipvs|ip_vs' /boot/config-2.6.32-573.el6.x86_64
ipvsadm ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] ipvsadm -D -t|u|f service-address ipvsadm -C ipvsadm -R ipvsadm -S [-n] ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight] [-x upper] [-y lower] ipvsadm -d -t|u|f service-address -r server-address ipvsadm -L|l [options] ipvsadm -Z [-t|u|f service-address]
集羣服務相關選項
-A: 添加一個集羣服務 -t: tcp -u: udp -f: firewall mark, 一般用於將兩個或以上的服務綁定爲一個服務進行處理時使用; service-address: -t IP:port -u IP:port -f firewall_mark -s 調度方法,默認爲wlc -p timeout: persistent connection -E: 修改定義過的集羣服務 -D -t|u|f service-address:刪除指定的集羣服務
RS相關選項
-a: 向指定的Cluster中添加RS -t|-u|-f service-address: 指明將RS添加至哪一個Cluster Server中 -r: 指定RS,能夠包含{IP:port},只有支持端口映射的LVS類型才容許此處使用跟集羣服務中不一樣的端口 LVS類型: -g:Gateway---> DR -i:IPIP ---> TUN -m:masquerade --->NAT 指定RS權重: -w: weight 指定服務器可接受的鏈接數 -x: upper -y: lower -e:修改指定RS屬性 -d -u|u|f service-address -r service-address:從指定的集羣服務中刪除某RS
其餘參數
-C:清除全部集羣服務 -S: ipvsadm-save 保存規則(使用輸出重定向) -R: ipvsadm-restore 載入指定的規則(使用輸入重定向) —L: 查看ipvs規則 -n:不使用反向解析 -c:顯示RS活動鏈接數和非活動鏈接數 --stats: 顯示統計數據 --rate: 報文傳輸數據 --timeouts: 顯示ipvs限定的tcp,tcpfin,udp的超時時長 --exact: 對輸出結果不作換算而顯示精確值 -Z: 計數器清零
查看LVS上當前的全部鏈接
ipvsadm -Lcn 或者 cat /proc/net/ip_vs_conn
查看虛擬服務和RealServer上當前的鏈接數,數據包數和本身數的統計值,則能夠使用:
ipvsadm -l --stats
查看包傳遞速率的近似精確值,能夠使用:
ipvsadm -l --rate
LVS-NAT基於cisco的LocalDirector。VS/NAT不須要在RealServer上作任何設置,其只要能提供一個tcp/ip的協議棧便可,甚至其不管基於什麼OS。基於VS/NAT,全部的入站數據包均由Director進行目標地址轉換後轉發至內部的RealServer,RealServer響應的數據包再由Director轉換源地址後發回客戶端。 VS/NAT模式不能與netfilter兼容,所以,不能將VS/NAT模式的Director運行在netfilter的保護範圍之中。如今已經有補丁能夠解決此問題,但還沒有被整合進ip_vs code。
____________ | | | client | |____________| CIP=192.168.0.253 (eth0) | | VIP=192.168.0.220 (eth0) ____________ | | | director | |____________| DIP=192.168.10.10 (eth1) | (switch)------------------------ | | RIP=192.168.10.2 (eth0) RIP=192.168.10.3 (eth0) _____________ _____________ | | | | | realserver1 | | realserver2 | |_____________| |_____________|
設置VS/NAT模式的LVS(以Web服務爲例)
Director:
創建服務
ipvsadm -A -t VIP:PORT -s rr ipvsadm -A -t 192.168.0.220:80 -s rr
設置轉發
ipvsadm -a -t VIP:PORT -r RIP_N:PORT -m -w N ipvsadm -a -t 192.168.0.220:80 -r 192.168.10.2 -m -w 1 ipvsadm -a -t 192.168.0.220:80 -r 192.168.10.3 -m -w 1
打開路由轉發功能
echo 1 > /proc/sys/net/ipv4/ip_forward
服務控制腳本
#!/bin/bash # # chkconfig: - 88 12 # description: LVS script for VS/NAT # . /etc/rc.d/init.d/functions # VIP=192.168.0.219 DIP=192.168.10.10 RIP1=192.168.10.11 RIP2=192.168.10.12 # case "$1" in start) /sbin/ifconfig eth0:1 $VIP netmask 255.255.255.0 up # 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 rr # Now direct packets for this VIP to # the real server IP (RIP) inside the cluster /sbin/ipvsadm -a -t $VIP:80 -r $RIP1 -m /sbin/ipvsadm -a -t $VIP:80 -r $RIP2 -m /bin/touch /var/lock/subsys/ipvsadm.lock ;; stop) # Stop forwarding packets echo 0 > /proc/sys/net/ipv4/ip_forward # Reset ipvsadm /sbin/ipvsadm -C # Bring down the VIP interface ifconfig eth0:1 down rm -rf /var/lock/subsys/ipvsadm.lock ;; status) [ -e /var/lock/subsys/ipvsadm.lock ] && echo "ipvs is running..." || echo "ipvsadm is stopped..." ;; *) echo "Usage: $0 {start|stop}" ;; esac
__________ | | | client | |________| | (router) | | | __________ | DIP | | |------| director | | VIP |__________| | | | ------------------------------------ | | | | | | RIP1, VIP RIP2, VIP RIP3, VIP ______________ ______________ ______________ | | | | | | | realserver1 | | realserver2 | | realserver3 | |______________| |______________| |______________|
在如上圖的VS/DR或VS/TUN應用的一種模型中(全部機器都在同一個物理網絡),全部機器(包括Director和RealServer)都使用了一個額外的IP地址,即VIP。當一個客戶端向VIP發出一個鏈接請求時,此請求必需要鏈接至Director的VIP,而不能是RealServer的。由於,LVS的主要目標就是要Director負責調度這些鏈接請求至RealServer的。 所以,在Client發出至VIP的鏈接請求後,只能由Director將其MAC地址響應給客戶端(也多是直接與Director鏈接的路由設備),而Director則會相應的更新其ipvsadm table以追蹤此鏈接,然後將其轉發至後端的RealServer之一。 若是Client在請求創建至VIP的鏈接時由某RealServer響應了其請求,則Client會在其MAC table中創建起一個VIP至RealServer的對就關係,並以致進行後面的通訊。此時,在Client看來只有一個RealServer而沒法意識到其它服務器的存在。 爲了解決此問題,能夠經過在路由器上設置其轉發規則來實現。固然,若是沒有權限訪問路由器並作出相應的設置,則只能經過傳統的本地方式來解決此問題了。這些方法包括: 一、禁止RealServer響應對VIP的ARP請求; 二、在RealServer上隱藏VIP,以使得它們沒法獲知網絡上的ARP請求; 三、基於「透明代理(Transparent Proxy)」或者「fwmark (firewall mark)」; 四、禁止ARP請求發往RealServers;
傳統認爲,解決ARP問題能夠基於網絡接口,也能夠基於主機來實現。Linux採用了基於主機的方式,由於其能夠在大多場景中工做良好,但LVS卻並不屬於這些場景之一,所以,過去實現此功能至關麻煩。如今能夠經過設置arp_ignore和arp_announce,這變得相對簡單的多了。 Linux 2.2和2.4(2.4.26以前的版本)的內核解決「ARP問題」的方法各不相同,且比較麻煩。幸運的是,2.4.26和2.6的內核中引入了兩個新的調整ARP棧的標誌(device flags):arp_announce和arp_ignore。基於此,在DR/TUN的環境中,全部IPVS相關的設定都可使用arp_announce=2和arp_ignore=1/2/3來解決「ARP問題」了。 arp_annouce:Define different restriction levels for announcing the local source IP address from IP packets in ARP requests sent on interface;
0 - (default) Use any local address, configured on any interface. 1 - Try to avoid local addresses that are not in the target's subnet for this interface. 2 - Always use the best local address for this target.
arp_ignore: Define different modes for sending replies in response to received ARP requests that resolve local target IP address.
0 - (default): reply for any local target IP address, configured on any interface. 1 - reply only if the target IP address is local address configured on the incoming interface. 2 - reply only if the target IP address is local address configured on the incoming interface and both with the sender's IP address are part from same subnet on this interface. 3 - do not reply for local address configured with scope host, only resolutions for golbal and link addresses are replied. 4-7 - reserved 8 - do not reply for all local addresses
在RealServers上,VIP配置在本地迴環接口lo上。若是迴應給Client的數據包路由到了eth0接口上,則arp通告或請應該經過eth0實現,所以,須要在sysctl.conf文件中定義以下配置:
//vim /etc/sysctl.conf net.ipv4.conf.eth0.arp_ignore = 1 net.ipv4.conf.eth0.arp_announce = 2 net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2
以上選項須要在啓用VIP以前進行,不然,則須要在Drector上清空arp表才能正常使用LVS。
到達Director的數據包首先會通過PREROUTING,然後通過路由發現其目標地址爲本地某接口的地址,所以,接着就會將數據包發往INPUT(LOCAL_IN HOOK)。此時,正在運行內核中的ipvs(始終監控着LOCAL_IN HOOK)進程會發現此數據包請求的是一個集羣服務,由於其目標地址是VIP。因而,此數據包的原本到達本機(Director)目標行程被改變爲經由POSTROUTING HOOK發往RealServer。這種改變數據包正常行程的過程是根據IPVS表(由管理員經過ipvsadm定義)來實現的。
若是有多臺Realserver,在某些應用場景中,Director還須要基於「鏈接追蹤」實現將由同一個客戶機的請求始終發往其第一次被分配至的Realserver,以保證其請求的完整性等。其鏈接追蹤的功能由Hash table實現。Hash table的大小等屬性可經過下面的命令查看: // ipvsadm -lcn
爲了保證其時效性,Hash table中「鏈接追蹤」信息被定義了「生存時間」。LVS爲記錄「鏈接超時」定義了三個計時器:
一、空閒TCP會話; 二、客戶端正常斷開鏈接後的TCP會話; 三、無鏈接的UDP數據包(記錄其兩次發送數據包的時間間隔);
上面三個計時器的默認值能夠由相似下面的命令修改,其後面的值依次對應於上述的三個計時器: // ipvsadm --set 28800 30 600
數據包在由Direcotr發往Realserver時,只有目標MAC地址發生了改變(變成了Realserver的MAC地址)。Realserver在接收到數據包後會根據本地路由表將數據包路由至本地迴環設備,接着,監聽於本地迴環設備VIP上的服務則對進來的數據庫進行相應的處理,然後將處理結果迴應至RIP,但數據包的原地址依然是VIP。
準備工做
關閉iptables的規則
iptables -F; iptables -t filter;service iptables save
開啓IP Forward
vi /etc/systl.conf #change net.ipv4.ip_forward = 0 to net.ipv4.ip_forward = 1
DR模式RS修改網卡對APR行爲的參數
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/lo/arp_announce echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
arp_announce級別:
0:默認值,無論哪塊網卡接收到了ARP請求,只要發現本機有這個MAC都給與響應 1:儘可能避免響應ARP請求中MAC不是本網卡的,一個主機有多塊網卡,其中一塊網卡接收到了ARP請求,發現所請求的MAC是本機另外一塊網卡的,這個時候接收到ARP請求的這塊網卡就儘可能避免響應 2:老是使用最合適的網卡來響應,一個主機有多塊網卡,其中一塊網卡接收到了ARP請求,發現所請求的MAC是本機另外一塊網卡的,這個時候接收到ARP請求的這塊網卡就必定不響應,只有發現請求的MAC是本身的纔給與響應(只通告同一網絡中的請求)
arp_ignore級別:
0:默認值,無論哪塊網卡接收到了ARP請求,只要發現本機有這個MAC都給與響應 1:老是使用最合適的網卡來響應,一個主機有多塊網卡,其中一塊網卡接收到了ARP請求,發現所請求的MAC是本機另外一塊網卡的,這個時候接收到ARP請求的這塊網卡就必定不響應,只有發現請求的MAC是本身的纔給與響應
修改Director:
iptables -t filter -F ifconfig eth0:0 VIP up route add -host VIP dev eth0:0
RS指定VIP到網卡lo:0
ifconfig lo:0 VIP netmask 255.255.255.255 broadcast VIP route add -host VIP dev lo:0 (使得包進入eth0之後必須通過lo網卡)
配置director
ipvsadm -A -t IP:PORT -s SCHEDULER ipvsadm -a -t IP:PORT -r RS1 -g -w WEIGHT
不管基於什麼樣的算法,只要指望源於同一個客戶端的請求都由同一臺Realserver響應時,就須要用到持久鏈接。好比,某一用戶連續打開了三個telnet鏈接請求時,根據RR算法,其請求極可能會被分配至不一樣的Realserver,這一般不符合使用要求。 -p N 指定持久鏈接時間,默認爲300s 每次默認延長2min LVS持久鏈接類型
1 . 持久客戶端鏈接(PCC):未來自同一個客戶端發往VIP的全部請求統統定向至同一個RS
ipvsadm -A -t VIP:0 -s rr -p 600 ipvsadm -a -t VIP:0 -r RS1 -g ipvsadm -a -t VIP:0 -r RS2 -g
2 . 持久端口鏈接(PPC):未來自於一個客戶端發往某VIP的某端口的全部請求統統定向至同一個RS
ipvsadm -A -t VIP:80 -s rr -p 120 ipvsadm -a -t VIP:80 -r RS1 -g ipvsadm -a -t VIP:80 -r RS2 -g
3 . 持久防火牆標記鏈接(PFMC):端口綁定,port affinity.可以實現基於防火牆標記,將兩個或以上的端口綁定爲同一個服務
iptables -t mangle -A PREROUTING -d VIP -p tcp --dport 443 -j MARK --set-mark 10 iptables -t mangle -A PREROUTING -d VIP -p tcp --dport 80 -j MARK --set-mark 10 防火牆標記要指定0~99的整數 ipvsadm -A -f 10 -s rr ipvsadm -a -f 10 -r RS1 -g ipvsadm -a -f 10 -r RS1 -g
查看持久鏈接
ipvsadm -L -n --persistent-conn cat /proc/net/ip_vs cat /proc/net/ip_vs_conn
ipvs集羣兩個問題:
後端RSs的健康狀態檢測如何實現
腳本監測
#!/bin/bash VIP=10.10.10.100 PORT=80 CS=${VIP}:${PORT} CS1='-f 10' RS1=192.168.48.135 RS2=192.168.48.136 RS1_STATE=1 RS2_STATE=1 checkRS(){ curl -s http://${1}/.health.html|grep 'ok' &>/dev/null RetVal=$? if [ $RetVal -ne 0 ] && ipvsadm -L -n|grep "$1" &>/dev/null;then ipvsadm -d ${CS1} -r $1 fi if [ $RetVal -eq 0 ] && ! ipvsadm -L -n|grep "$1" &>/dev/null;then ipvsadm -a ${CS1} -r $1 -g fi } while true;do checkRS $RS1 checkRS $RS2 sleep 3 done 一、某RS故障時,要監測至少三次才讓其下線;而從新上線時,只須要檢測一次 二、如何讓腳本有更好的適應性;
keepalived, ldirectord
Director自身的可用性如何獲得保證
Director sysV配置文件
#!/bin/bash # # LVS script for VS/DR # . /etc/rc.d/init.d/functions # VIP=192.168.0.210 RIP1=192.168.0.221 RIP2=192.168.0.222 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 # 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 wlc # 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 1 /sbin/ipvsadm -a -t $VIP:80 -r $RIP2 -g -w 2 /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: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 "ipvs is running ..." ipvsadm -L -n fi ;; *) echo "Usage: $0 {start|stop|status}" ;; esac
RealServer sysV配置文件
#!/bin/bash # # Script to start LVS DR real server. # description: LVS DR real server # . /etc/rc.d/init.d/functions VIP=192.168.0.219 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
什麼是高可用 經常使用的HA: heartbeat ha_resources crm pacemaker corosync(openais) cman rgmanager keepalived: ipvs() MTBF = mean time between failures MTTR = mean time to repair
A= MTBF/(MTBF+MTTR)
Hardware Failure Causes:
Option | Default | Description |
---|---|---|
batch-limit | 30 | The number of jobs that the TE is allowed to execute in parallel. |
no-quorum-policy | stop | What to do when the cluster does not have quorum: 1. Ignore 2. Freeze 3 . Stop 4. suicde |
Symmetric-cluster | Ture | Call all resources run on any node by default |
stonith-enabled | Ture | If enable stonith function |
cluster-delay | 60s | Round trip delay over the ne |
stonith-action | reboot | Action to send to STONITH device |
Field | Description |
---|---|
id | A unique name for constraint |
first | 在then的資源前開啓 |
then | 在first以後啓動的資源 |
score | 資源得分 |
symmetrical | 啓動次序與關閉次序reverse |
Field | Description |
---|---|
id | A unique name for the constraint |
rsc | The colocation source. If the constraint cannot be satisfied, the cluster may decide not to allow the resource to run at it |
with-rsc | The colocation target. From 'rsc to 'with-rsc' |
score | 資源得分 |
Primitive Resource
Field | Description |
---|---|
id | The resouce name |
class | Heartbeat; lsb; ocf; stonith |
type | RA名字 eg: IPaddr or FIlesystem |
provider | ocf:heartbeat 給不一樣的vendor提供相同的RA |
資源屬性
Field | Default | Description |
---|---|---|
priority | 0 | 若是全部資源沒法都啓動,則根據優先級來啓動資源 |
target-role | Started | 集羣中保持資源的狀態 1. Started 2. Stopped 3. Master |
is-managed | TRUE | 集羣是否容許管理資源 |
resource-stickiness | Inherited | rsc_defaults section中能夠設置資源粘性 |
migration-threshold | 0(disabled) | 遷移失敗嘗試門限 |
failure-timeout | 0(disabled) | 發生錯誤的超時時間 |
資源操做(Resource Operations)
Field | Description |
---|---|
Interval | 執行時間間隔 |
timeout | 超時間隔 |
requires | 資源知足條件才能運行 1. nothing 2. quorum 3. fencing |
on-fail | 資源發生錯誤時 1. ignore 2. block 3. stop 4. fence 5. standby default is fence |
Linux HA Cluster: ha_aware: 非ha_aware: 三個層次:
DC: Designated Coordinator CRM: Cluster Resources Manager LRM: Local Resources Manager CIB: Cluster Information Base (XML 文件) PE: Policy Engine 高可用集羣中,任何資源都不該該自行啓用,而是由CRM管理啓動與否 RA:resource agent {start|stop|restart|status} status: running: 運行 stopped: 中止 failover: 失效轉移,故障轉移 failback: 失效轉回,故障轉回 Messaging Layer: 信息層 heartbeat v1,v2,v3 OpenAIS: 定義開放的HA組織架構 corosync: 底層心跳信息傳遞的層次 cman: cluster manager 集羣管理器
heartbeat v1: haresources (配置接口:配置文件,文件名也叫做haresources) heartbeat v2: crm(各節點均運行進程crmd,客戶端crm(shell),heartbeat-GUI) heartbeat v3: heartbeat + pacemaker+ cluster-glue: pacemaker: 配置接口: CLI: crm(SuSE開發), pcs(紅帽) GUI: hawk, LCMC, pacemaker-mgmt cman + rgmanager: resource group manager: Failover Domain 配置接口:clusteradmin cmanadmin RHCS: Redhat Cluster Suite 配置接口:Conga(徹底生命命令週期的配置接口) RHEL 6.5 use CMAN+PaceMaker+Corosync. To config CMAN use ccs, and use ricci for replicate settings of file cluster.conf to all nodes; and use pcs to config resource on pacemaker RHEL 7 uses PaceMaker+Corosync with pcs config cluster and resource, and pcsd to replicate setting nodes. Conga:集羣的全生命週期管理工具。依賴ricci+luci
RA類型: 一、heartbeat legacy: heartbeat的傳統類型 二、LSB: /etc/rc.d/init.d/* Linux standard base 三、OCF: Open Cluster Framework 開放集羣框架 provider:pacemaker linbit 四、STONITH: shoot the other node in the head keepalived: vrrp keepalived + ipvs keepalived + haproxy
RHEL5: 自帶: RHCS(cman + rgmanager) 選用第三方:corosync + pacemaker, heartbeat v1/v2, keepalived RHEL6: 自帶:RHCS(cman + rgmanager) corosync + rgmanager cman + pacemaker heartbeat v3 + pacemaker keepalived 應用方式: 作前端負載均衡器的高可用:keepalived 作大規模的高用集羣:corosync(cman) + pacemaker gracious ARP: 欺騙式的ARP,經過廣播報文自問自答通知廣播域中的主機更新arp表
votes; total; qurom(知足合法人數) 資源隔離: 節點級別: STONITH eg. 電源交換機,經過網線鏈接控制服務器重啓.不少專業的服務器都有控制芯片能夠控制服務器關機重啓 HA節點數:大於2,且總數爲奇數。放置Brain-split 若兩節點的HA場景,應設置gw做爲ping node(仲裁設備), 使兩者ping gw node來斷定。多個ping節點稱爲ping group 紅帽使用共享存儲的方式來做爲仲裁設備(仲裁盤) qdisk
一、節點名稱:集羣每一個節點的名稱都得可以互相解析 hosts中主機名的正反解析結果必須跟「uname -n"的結果保持一致 二、時間必須同步 使用網絡時間服務器同步時間 三、各節點間能基於ssh密鑰認證(最好) 多節點集羣,自動化運維工具 ansible fabric puppet 安裝heartbeat v1
yum install perl-TimeDate PyXML libnet libtool-ltdl-devel net-snmp-libs rpm -ivh heartbeat-2.1.4-12.el6.x86_64.rpm heartbeat-pils-2.1.4-12.el6.x86_64.rpm heartbeat-stonith-2.1.4-12.el6.x86_64.rpm
HMAC:使用消息認證碼進行消息傳遞 crc md5 sha1
heartbeat: 監聽在udp的694端口 配置樣本在/usr/share/doc/heartbeat-xx-xx/ha.cf
cp /usr/share/doc/heartbeat-xx-xx/ha.cf authkeys haresources /etc/ha.d/
/usr/share/heartbeat/
存有一些有用的腳本
產生隨機密碼並配置authkeys
openssl rand -hex 8 in authkeys: auth 2 2 sha1 df67e71df88aa222 chmod 600 /etc/ha.d/authkeys
ha.cf配置文件
logfile /var/log/ha-log keepalive 1000ms deadtime 8 warntime 4 initdead 60 udpport 694 mcast eth0 225.0.100.1 694 1 0 auto_failback on node mysql.example.com node mysql2.example.com ping 192.168.48.130 compression bz2 compression_threshold 2
haresource定義資源,會首先查看/etc/ha.d/resource.d/若是沒有找到會其次查找/etc/rc.d/init.d/
mysql.example.com 192.168.48.135/24/eth0 Filesystem::192.168.48.133:/www/htdocs::/var/www/html::nfs httpd
發佈配置到從節點
/usr/lib64/heartbeat/ha_propagate
配置共享存儲 nfs
配置/etc/exports /www/htdocs 192.168.48.0/24(rw) /mydata 192.168.48.0/24(rw,no_root_squash) ##no_root_squash 不壓縮root權限,使得root有寫權限 安裝nfs yum install portmap nfs-utils 開啓nfs服務 service rpcbind start service nfs start 查看nfs共享 showmount -e Server_IP exportfs
從新分享nfs服務資源
exportfs -rav
Fencing:
外部fence設備
內部fence設備
IBM RSAII
HP iLO
A/P:主備模型,two nodes N-M: N > M,N各節點,M個服務:活動節點爲N,備用N-M個 N-N: N各節點N各服務 A/A: 雙主模型,各自運行不一樣的服務,互爲彼此冗餘 資源轉移的方式: rgmanager: failover domain 故障轉移域,priority
資源黏性:若是全部節點的位置約束都同樣,若黏性爲正值則更傾向於留在當前節點,若是黏性爲負值,則更傾向於離開 資源約束(3種類型): 一、位置約束:資源更傾向於哪一個節點上; inf: 無窮大 n: 數值傾向性 -n: 離開傾向性 -inf: 負無窮 二、 排列約束:資源運行於同一節點的傾向性 inf: 相濡以沫 -inf: 相忘於江湖 三、 順序約束:明肯定義資源的啓動次序及關閉次序,通常而言先啓動的後關閉 案例:如何讓web service中的三個資源:vip、httpd及filessystem運行於同一節點上? 一、排列約束: 二、資源組(resource group)
若是節點再也不是集羣節點成員時,如何處理運行在當前節點的資源? stopped:將節點停掉 ignore:忽略當前節點是否爲節點成員 freeze:已經鏈接進來的請求將繼續處理,可是新的請求不予以處理 suicide:將節點kill掉 一個資源剛配置完成時,是否啓動? target-role: 目標角色來指定是否啓動
一、primitive, native: 主資源,只能運行於一個節點 二、resource group: 組資源 三、clone: 克隆資源: 總克隆數:每一個節點罪過可運行的克隆數 四、master/slave: 主從資源
運行於備用主機上的Heartbeat能夠經過以太網鏈接檢測主服務器的運行狀態,一旦其沒法檢測到主服務器的「心跳」則自動接管主服務器的資源。一般狀況下,主、備服務器間的心跳鏈接是一個獨立的物理鏈接,這個鏈接能夠是串行線纜、一個由「交叉線」實現的以太網鏈接。Heartbeat甚至可同時經過多個物理鏈接檢測主服務器的工做狀態,而其只要能經過其中一個鏈接收到主服務器處於活動狀態的信息,就會認爲主服務器處於正常狀態。從實踐經驗的角度來講,建議爲Heartbeat配置多條獨立的物理鏈接,以免Heartbeat通訊線路自己存在單點故障。
一、串行電纜:被認爲是比以太網鏈接安全性稍好些的鏈接方式,由於hacker沒法經過串行鏈接運行諸如telnet、ssh或rsh類的程序,從而能夠下降其經過已劫持的服務器再次侵入備份服務器的概率。但串行線纜受限於可用長度,所以主、備服務器的距離必須很是短。 二、以太網鏈接:使用此方式能夠消除串行線纜的在長度方面限制,而且能夠經過此鏈接在主備服務器間同步文件系統,從而減小了從正常通訊鏈接帶寬的佔用。
基於冗餘的角度考慮,應該在主、備服務器使用兩個物理鏈接傳輸heartbeat的控制信息;這樣能夠避免在一個網絡或線纜故障時致使兩個節點同時認爲自已經是惟一處於活動狀態的服務器從而出現爭用資源的狀況,這種爭用資源的場景便是所謂的「腦裂」(split-brain)或「partitioned cluster」。在兩個節點共享同一個物理設備資源的狀況下,腦裂會產生至關可怕的後果。 爲了不出現腦裂,可採用下面的預防措施: 一、如前所述,在主、備節點間創建一個冗餘的、可靠的物理鏈接來同時傳送控制信息; 二、一旦發生腦裂時,藉助額外設備強制性地關閉其中一個節點;
第二種方式便是俗稱的「將其它節點‘爆頭’(shoot the other node in the head)」,簡稱爲STONITH。基於可以經過軟件指令關閉某節點特殊的硬件設備,Heartbeat便可實現可配置的Stonith。但當主、備服務器是基於WAN進行通訊時,則很難避免「腦裂」情景的出現。所以,當構建異地「容災」的應用時,應儘可能避免主、備節點共享物理資源。
Heartbeat的控制信息: 「心跳」信息: (也稱爲狀態信息)僅150 bytes大小的廣播、組播或多播數據包。可爲以每一個節點配置其向其它節點通報「心跳」信息的頻率,以及其它節點上的heartbeat進程爲了確認主節點出節點出現了運行等錯誤以前的等待時間。
集羣變更事務(transition)信息:ip-request和ip-request-rest是相對較常見的兩種集羣變更信息,它們在節點間須要進行資源遷移時爲不一樣節點上heartbeat進程間會話傳遞信息。好比,當修復了主節點而且使其從新「上線」後,主節點會使用ip-request要求備用節點釋放其此前從因主節點故障而從主節點那裏接管的資源。此時,備用節點則關閉服務並使用ip-request-resp通知主節點其已經再也不佔用此前接管的資源。主接點收到ip-request-resp後就會從新啓動服務。
重傳請求:在某集羣節點發現其從其它節點接收到的heartbeat控制信息「失序」(heartbeat進程使用序列號來確保數據包在傳輸過程當中沒有被丟棄或出現錯誤)時,會要求對方從新傳送此控制信息。 Heartbeat通常每一秒發送一次重傳請求,以免洪泛。
上面三種控制信息均基於UDP協議進行傳送,能夠在/etc/ha.d/ha.cf中指定其使用的UDP端口或者多播地址(使用以太網鏈接的狀況下)。
此外,除了使用「序列號/確認」機制來確保控制信息的可靠傳輸外,Heartbeat還會使用MD5或SHA1爲每一個數據包進行簽名以確保傳輸中的控制信息的安全性。
資源腳本(resource scripts)即Heartbeat控制下的腳本。這些腳本能夠添加或移除IP別名(IP alias)或從屬IP地址(secondary IP address),或者包含了能夠啓動/中止服務能力以外數據包的處理功能等。一般,Heartbeat會到/etc/init.d/或/etc/ha.d/resource.d/目錄中讀取腳本文件。Heartbeat須要一直明確瞭解「資源」歸哪一個節點擁有或由哪一個節點提供。在編寫一個腳原本啓動或中止某個資源時,必定在要腳本中明確判斷出相關服務是否由當前系統所提供。
Heartbeat的配置文件: /etc/ha.d/ha.cf 定義位於不一樣節點上的heartbeat進程間如何進行通訊; /etc/ha.d/haresources 定義對某個資源來講哪一個服務器是主節點,以及哪一個節點應該擁有客戶端訪問資源時的目標IP地址。 /etc/ha.d/authkeys 定義Heartbeat包在通訊過程當中如何進行加密。
當ha.cf或authkeys文件發生改變時,須要從新加載它們就能夠使用之生效;而若是haresource文件發生了改變,則只能重啓heartbeat服務方可以使之生效。
Heartbeat當前也不監控其所控制的資源的狀態,好比它們是否正在運行,是否運行良好以及是否可供客戶端訪問等。要想監控這些資源,冉要使用額外的Mon軟件包來實現。
haresources配置文件介紹: 主從節點上的/etc/ra.d/raresource文件必須徹底相同。文件每行一般包含如下組成部分: 一、服務器名字:指正常狀況下資源運行的那個節點(即主節點),後跟一個空格或tab;這裏指定的名字必須跟某個節點上的命令"uname -n"的返回值相同; 二、IP別名(即額外的IP地址,可選):在啓動資源以前添加至系統的附加IP地址,後跟空格或tab;IP地址後面一般會跟一個子網掩碼和廣播地址,彼此間用「/」隔開; 三、資源腳本:即用來啓動或中止資源的腳本,位於/etc/init.d/或/etc/ha.d/resourcd.d目錄中;若是須要傳遞參數給資源腳本,腳本和參數之間須要用兩個冒號分隔,多個參數時彼此間也須要用兩個冒號分隔;若是有多個資源腳本,彼此間也須要使用空格隔開;
格式:
primary-server [IPaddress[/mask/interface/broadcast]] resource1[::arg1::arg2] resource2[::arg1::arg2] eg. primary-server 221.67.132.195 sendmail httpd
yum install cp /usr/share/doc/heartbeat-2*/authkeys, ha.cf, haresources ( echo -ne "auth 1\n1 sha1 "; \ dd if=/dev/urandom bs=512 count=1 | openssl md5 ) \ > /etc/ha.d/authkeys chmod 0600 /etc/ha.d/authkeys /usr/lib/heartbeat/ha_propagate
HA的LVS集羣有兩臺Director,在啓動時,主節點佔有集羣負載均衡資源(VIP和LVS的轉發及高度規則),備用節點監聽主節點的「心跳」信息並在主節點出現異常時進行「故障轉移」而取得資源使用權,這包括以下步驟:
一、添加VIP至其網絡接口; 二、廣播GARP信息,通知網絡內的其它主機目前本Director其佔有VIP; 三、建立IPVS表以實現入站請求鏈接的負載均衡; 四、Stonith;
棄用resource腳本,改用ldirecotord來控制LVS: ldirectord用來實現LVS負載均衡資源的在主、備節點間的故障轉移。在首次啓動時,ldirectord能夠自動建立IPVS表。此外,它還能夠監控各Realserver的運行狀態,一旦發現某Realserver運行異常時,還能夠將其從IPVS表中移除。 ldirectord進程經過向Realserver的RIP發送資源訪問請求並經過由Realserver返回的響應信息來肯定Realserver的運行狀態。在Director上,每個VIP須要一個單獨的ldirector進程。若是Realserver不能正常響應Directord上ldirectord的請求,ldirectord進程將經過ipvsadm命令將此Realserver從IPVS表中移除。而一旦Realserver再次上線,ldirectord會使用正確的ipvsadm命令將其信息從新添加至IPVS表中。 例如,爲了監控一組提供web服務的Realserver,ldirectord進程使用HTTP協議請求訪問每臺Realserver上的某個特定網頁。ldirectord進程根據本身的配置文件中事先定義了的Realserver的正常響應結果來判斷當前的返回結果是否正常。好比,在每臺web服務器的網站目錄中存放一個頁面".ldirector.html",其內容爲"GOOD",ldirectord進程每隔一段時間就訪問一次此網頁,並根據獲取到的響應信息來判斷Realserver的運行狀態是否正常。若是其返回的信息不是"GOOD",則代表服務不正常。 ldirectord須要從/etc/ha.d/目錄中讀取配置文件,文件名能夠任意,但建議最好見名知義。 實現過程:
建立/etc/ha.d/ldirectord-192.168.0.219.cf,添加以下內容: // Global Directives checktimeout=20
// ldirectord等待Realserver健康檢查完成的時間,單位爲秒; // 任何緣由的檢查錯誤或超過此時間限制,ldirector將會將此Realserver從IPVS表中移除; checkinterval=5 // 每次檢查的時間間隔,即檢查的頻率; autoreload=yes // 此項用來定義ldirectord是否認期每隔一段時間檢查此配置文件是否發生改變並自動從新加載此文件; logfile="/var/log/ldirectord.log" // 定義日誌文件存放位置; quiescent=yes // 當某臺Realserver出現異常,此項可將其設置爲靜默狀態(即其權重爲「0」)從而再也不響應客戶端的訪問請求;
// For an http virtual service virtual=192.168.0.219:80 // 此項用來定義LVS服務及其使用的VIP和PORT
real=192.168.0.221:80 gate 100 # 定義Realserver,語法:real=RIP:port gate|masq|ipip [weight] real=192.168.0.223:80 gate 300 fallback=127.0.0.1:80 gate # 當IPVS表沒有任何可用的Realserver時,此「地址:端口」做爲最後響應的服務; # 通常指向127.0.0.1,並能夠經過一個包含錯誤信息的頁面通知用戶服務發生了異常; service=http # 定義基於什麼服務來測試Realserver; request=".ldirectord.html" receive="GOOD" scheduler=wlc #persistent=600 #netmask=255.255.255.255 protocol=tcp # 定義此虛擬服務用到的協議; checktype=negotiate # ldirectord進程用於監控Realserver的方法;{negotiate|connect|A number|off} checkport=80
在/etc/hd.d/haresources中添加相似以下行:
node1.example.com 192.168.0.219 ldirectord::ldirectord-192.168.0.219.cf
使用/usr/lib64/heartbeat/haresource2cib.py
文件來轉換haresource文件格式到cib的形式(xml) 開啓crm功能
crm respawn/crm on #ha.cf文件
安裝heartbeat-gui
yum install pygtk2-libglade 開啓X11須要安裝 yum install xorg-x11-xauth
防止xmanager顯示亂碼,須要安裝xorg庫
yum install xorg-x11-font*
CRM用於實現管理來接受用戶的鏈接命令並實現當前集羣配置的API服務接口就是mgmtd,因而咱們將得到一些CRM命令
查看集羣狀態
crm_mon
with quorum:知足法定票數
without quorum: 不知足法定票數
防止active/standby模型中有節點離線致使without quorum的場景出現,能夠作以下配置
crm configure property no-quorum-policy=ignore
實驗:
web server: VIP 192.168.48.140 httpd nfs: /www/htdocs, /var/www/html
ipvs: director vip ipvsadm
heartbeat爲director專門提供了組件ldirectord
安裝Idirectord
yum install heartbeat-ldirectord-2.1.4-12.el6.x86_64.rpm cp /usr/share/doc/heartbeat-ldirectord-2.1.4/ldirectord.cf /etc/ha.d/
配置HA服務
服務組成:vip, service, store
服務內的素有資源應該同時運行同一個節點:
資源組
排列約束
Ansible is a radically simple configuration-management, application deployment, task-execution, and multinode orchestration engine. OS Provisioning PXE, cobbler OS config cfengine, puppet, saltstack, chef Deployment func(SSL) Fabric(ssh) ansible YAML: Yet another Markable Language
編譯安裝
yum -y install python-jinja2 PyYAML python-paramiko python-babel python-crypto tar xf ansible-1.5.4.tar.gz cd ansible-1.5.4 python setup.py build python setup.py install mkdir /etc/ansible cp -r examples/* /etc/ansible
rpm安裝
由於ansible是基於ssh的集羣配置,首先要對全部主機進行ssh-key交換
ssh-keygen -t rsa -P '' ssh-copy-id -i .ssh/id_rsa.pub root@mysql
執行ansible
syntax: ansible <host-pattern> [-f forks] [-m module_name] [-a args] eg. ansible all -m ping 默認模塊是command,命令模塊 ansible all -a 'date'
查看ansible全部支持模塊
ansible-doc -l
查看指定模塊能夠使用的參數
ansible-doc -s [module_name] eg. ansible-doc -s COPY ansible webservers -m copy -a "src=~/shell_script/showsum.sh dest=/tmp/"
定義crontab任務
ansible webservers -m cron -a 'name="custom job" minute=*/3 hour=* day=* month=* weekday=* job="/usr/sbin/utpdate 192.168.48.130"'
執行yum安裝
ansible all -m yum -a "state=present name=corosync"
使用shell解析
ansible all -m shell -a "date;echo hello"
執行service腳本
ansible all -m service -a 'state=started name=httpd enabled=yes'
YAML是一個可讀性高的用來表達資料序列的格式。YAML參考了其餘多種語言,包括:XML、C語言、Python、Perl以及電子郵件格式RFC2822等。Clark Evans在2001年在首次發表了這種語言,另外Ingy döt Net與Oren Ben-Kiki也是這語言的共同設計者。
特色:
語法:
YAML的語法和其餘高階語言相似,而且能夠簡單表達清單、散列表、標量等數據結構。其結構(Structure)經過空格來展現,序列(Sequence)裏的項用"-"來表明,Map裏的鍵值對用":"分隔。下面是一個示例
更多語法參考規範http://www.yaml.org
name: John Smith age: 41 gender: Male spouse: name: Jane Smith age: 37 gender: Female children: - name: Jimmy Smith age: 17 gender: Male - name: Jenny Smith age 13 gender: Female
YAML文件擴展名一般爲.yaml
playbook 示例
- hosts: webnodes vars: http_port: 80 max_clients: 256 remote_user: root tasks: - name: ensure apache is at the latest version yum: name=httpd state=latest - name: ensure apache is running service: name=httpd state=started handlers: - name: restart apache service: name=httpd state=restarted
Tasks,任務列表和action
定義task的時候能夠使用「action: module options" 或者 」modules: options"的格式,推薦使用後者以實現向後兼容。
name: make sure apache is running service: name=httpd state=running
在衆多模塊中,只有command和shell模塊僅須要給定一個列表而無需使用「key=value」格式,例如:
tasks: - name: disable selinux command: /sbin/setenforce 0
若是命令或腳本的退出碼不爲零,能夠使用以下方式替代:
tasks: - name: run this command and ignore the result shell: /usr/bin/somecommand || /bin/true
或者使用ignore_errors來忽略錯誤信息:
tasks: - name: run this command and ignore the result shell: /usr/bin/somecommand ignore_errors: True
Handler:
用於當關注的資源發生變化時採起必定的操做。
「notify」這個action可用於在每一個play的最後被觸發,這樣能夠避免屢次有改變發生時每次都執行指定的操做,取而代之,僅在全部的變化發生完成後一次性地執行指定操做。在notify中列出的操做稱爲handler,也即notify中調用handler中定義的操做。
- name: template configuration file template: src=template.j2 dest=/etc/foo.conf notify: - restart memcached - restart apache
handler是task列表,這些task與前述的task並無本質上的不一樣。
handlers: - name: restart memcached service: name=memcached state=restarted - name: restart apache service: name=apache state=restarted
配置示例
- hosts: all remote_user: root tasks: - name: ensure apache latest version yum: state=latest name=httpd - name: apache configure file copy: src=/etc/ansible/httpd.conf dest=/etc/httpd/conf/httpd.conf force=yes notify: - restart httpd handlers: - name: restart httpd service: name=httpd state=restarted
Heartbeat的任務清單
- hosts: hbhosts remote_user: root tasks: - name: ensure heartbeat latest version yum: name=heartbeat state=present - name: authkeys configure file copy: src=/root/hb_conf/authkeys dest=/etc/ha.d/authkeys - name: authkeys modes 600 file: path=/etc/ha.d/authkeys mode=600 notify: - restart heartbeat - name: ha.cf configure file copy: src=/root/hb_conf/ha.cf dest=/etc/ha.d/ha.cf notify: - restart heartbeat handlers: - name: restart heartbeat service: name=heartbeat state=restarted
AIS: 應用接口規範,定義應用接口(API) AIS 就是一個通用的應用程序編程接口,OpenAIS是AIS的子項目,標準的集羣框架的應用程序接口規範,而corosync是OpenAIS是具體實現 Pacemaker是從heartbeatv3分離出來的子項目, 單獨做爲做爲資源管理器。 Pacemaker 接口工具:
CLI: crmsh pcs (pcs+pcsd) GUI: haw LCMC pyGUI Conga
RHCS: cman, rgmanager, conga corosync目前維護兩個版本。1版本和2版本。 1版本自己不提供投票功能votes 2版本以後提供了votequorum子系統,具有了votes能力 cman+rgmanager, cman+pacemaker, corosync+pacemaker 趨勢是使用pacemaker做爲資源管理器,底層使用cman仍是corosync可根據需求來提供
前提: 1)本配置共有兩個測試節點,分別node1.example.com和node2.example.com,相的IP地址分別爲192.168.48.137和192.168.48.138; 2)集羣服務爲apache的httpd服務; 3)提供web服務的地址爲192.168.48.141,即vip; 4)系統爲CentOS 6.4 64bits
配置主機名稱
#node1 sed -i 's@\(HOSTNAME=\).*@\1node1.example.com@g' /etc/sysconfig/network hostname node1.example.com #node2 sed -i 's@\(HOSTNAME=\).*@\1node2.example.com@g' /etc/sysconfig/network hostname node2.example.com
配置corosync
安裝corosync和pacemaker
yum install corosync pacemaker
編輯corosync.conf 添加以下內容: note: version 0是以插件的形式啓動pacemaker,centos6.7中這種形式就有很大的問題,因此我使用version 1,以後再單獨啓動pacemaker服務
service { ver: 1 name: pacemaker } aisexec { user: root group: root }
bindnetaddr後面的IP地址是網卡所在的網絡地址 mcastaddr: 定義組播IP
安裝crmsh
因爲RHEL6之後就已經不提供crmsh,須要尋找其餘途徑來進行安裝
wget http://download.opensuse.org/repositories/network:/ha-clustering:/Stable/CentOS_CentOS-6/noarch/crmsh-2.2.1-1.2.noarch.rpm wget http://download.opensuse.org/repositories/network:/ha-clustering:/Stable/CentOS_CentOS-6/x86_64/pssh-2.3.1-4.2.x86_64.rpm wget http://download.opensuse.org/repositories/network:/ha-clustering:/Stable/CentOS_CentOS-6/noarch/crmsh-scripts-2.2.1-1.2.noarch.rpm wget http://download.opensuse.org/repositories/network:/ha-clustering:/Stable/CentOS_CentOS-6/noarch/python-parallax-1.0.1-14.1.noarch.rpm rpm -ivh crmsh-scripts-2.2.1-1.2.noarch.rpm rpm -ivh python-parallax-1.0.1-14.1.noarch.rpm rpm -Uvh crmsh-2.2.1-1.2.noarch.rpm
the other way...
cd /etc/yum.repos.d/ wget http://download.opensuse.org/repositories/network:/ha-clustering:/Stable/CentOS_CentOS-6/network:ha-clustering:Stable.repo yum -y install crmsh yum -y install pssh
產生authkey
corosync-keygen 自動在/etc/corosync/下生成
開啓corosync服務
servcie corosync start
查看corosync引擎是否正常啓動
grep -e "Corosync Cluster Engine" -e "configuration file" /var/log/cluster/corosync.log
查看初始化成員通知是否正常發出:
grep TOTEM /var/log/cluster/corosync.log
檢查啓動過程當中是否有錯誤產生。下面的錯誤信息表示packmaker不久以後將再也不做爲corosync的插件運行,所以,建議使用cman做爲集羣基礎架構服務;此處可安全忽略。
查看ERROR
grep ERROR: /var/log/cluster/corosync.log | grep -v unpack_resources
查看pacemaker是否正常啓動
grep pcmk_startup /var/log/cluster/corosync.log
查看集羣狀態
crm status
配置全局屬性來禁用stonith
corosync默認開啓了stonith,可是測試環境集羣沒有響應的stonith設備,所以此默認配置目前尚不可用。
crm configure property stonith-enabled=false
property 保存全局屬性
配置模式
crm configure //查看配置信息 crm confiugre show //查看詳細cib資源配置 crm configure show xml //驗證配置語法 crm configure verify //提交配置 commit //直接修改配置文件 edit
pacemaker命令行管理查詢
若是開啓了stonith信息,則能夠看到相關報錯
crm_verify -L -V
查看RA,定義資源
查看可支持的RA類型
crm ra classes
查看某種類別下的全部資源代理列表
crm ra list lsb crm ra list ocf heartbeat crm ra list ocf pacemaker crm ra list stonith
查看資源參數
crm ra info [class:[provider:]] resource_agent crm ra meta ocf:heartbeat:IPaddr #帶星號表示必須配置的參數,[]表示可選參數 crm ra info ocf:heartbeat:Filesystem
定義RA
定義WebIP
Syntax: primitive <rsc> [<class>:[<provider>:]]<type> [params attr_list] [operations id_spec] [op op_type [<attribute>=<value>...] ...] op_type :: start | stop | monitor eg. crm configure primitive webip ocf:heartbeat:IPaddr params ip=192.168.48.140 eg. primitive apcfence stonith:apcsmart \ params ttydev=/dev/ttyS0 hostlist="node1 node2" \ op start timeout=60s \ op monitor interval=30m timeout=60s
定義WebServer
crm configure primitive webserver lsb:httpd
定義WebService Group
crm configure group webservice webip webserver
Node Active/Standby
crm node standby node1.example.com crm node online node1.example.com
中止/開啓資源
crm resource stop webservice crm resource status webservice
刪除資源
crm configure delete webservice
定義排列約束
syntax: colocation <id> <score>: <rsc>[:<role>] <with-rsc>[:<role>] eg: crm configure colocation webserver_with_webip inf: webserver webip
定義順序約束
syntax: order <id> [{kind|<score>}:] first then [symmetrical=<bool>] order <id> [{kind|<score>}:] resource_sets [symmetrical=<bool>] kind類型:Mandatory | Optional | Serialize eg: crm configure order webip_before_webserver Mandatory: webip webserver
定義位置約束
Syntax: location <id> <rsc> [<attributes>] {<node_pref>|<rules>} crm configure location webserver_on_node1 webserver 200: node1.example.com
Note: 若是有多個服務且有順序約束,則傾向性是各個resource之和 Note: 默認狀況下pacemaker不會對資源進行監控,好比程序異常關閉(kill), 在crm監控中的狀態仍然是active。CRM只會監測節點狀態 若是資源異常關閉,應當清理資源信息,以防止其後續出問題
crm resource cleanup [RA_name]
Syntax: monitor <rsc>[:<role>] <interval>[:<timeout>] eg: crm configure monitor webserver 10s:5s
也能夠在定義資源的時候直接定義monitor
primitive vip ocf:heartbeat:IPaddr params ip=192.168.48.141 op monitor interval=30s timeout=20s op start timeout=20s
若是primary的server 從down的狀態返回到正常狀態,有可能會產生服務從secondary的轉移到primary.資源的這種在節點上每一次的來回流動都會形成那段時間內其沒法被訪問。因此,咱們有時候須要在資源由於節點故障轉移到其它節點後,即使原來的節點恢復正常也禁止資源再次流轉回來。這能夠經過定義資源的黏性(stickiness)來實現。在建立資源時或在建立資源後,均可以指定指定資源黏性
資源黏性值範圍及其做用: 0:這是默認選項。資源放置在系統中的最適合位置。這意味着當負載能力「較好」或較差的節點變得可用時才轉移資源。此選項的做用基本等同於自動故障回覆,只是資源可能會轉移到非以前活動的節點上; 大於0:資源更願意留在當前位置,可是若是有更合適的節點可用時會移動。值越高表示資源越願意留在當前位置; 小於0:資源更願意移離當前位置。絕對值越高表示資源越願意離開當前位置; INFINITY:若是不是因節點不適合運行資源(節點關機、節點待機、達到migration-threshold 或配置更改)而強制資源轉移,資源老是留在當前位置。此選項的做用幾乎等同於徹底禁用自動故障回覆; -INFINITY:資源老是移離當前位置
crm configure rsc_defaults resource-stickiness=100
資源約束則用以指定在哪些羣集節點上運行資源,以何種順序裝載資源,以及特定資源依賴於哪些其它資源。pacemaker共給咱們提供了三種資源約束方法: 1)Resource Location(資源位置):定義資源能夠、不能夠或儘量在哪些節點上運行; 2)Resource Collocation(資源排列):排列約束用以定義集羣資源能夠或不能夠在某個節點上同時運行; 3)Resource Order(資源順序):順序約束定義集羣資源在節點上啓動的順序;
1)任何值 + 無窮大 = 無窮大 2)任何值 - 無窮大 = -無窮大 3)無窮大 - 無窮大 = -無窮大 定義約束時,還須要指定分數。各類分數是集羣工做方式的重要組成部分。其實,從遷移資源到決定在已降級集羣中中止哪些資源的整個過程是經過以某種方式修改分數來實現的。分數按每一個資源來計算,資源分數爲負的任何節點都沒法運行該資源。在計算出資源分數後,集羣選擇分數最高的節點。INFINITY(無窮大)目前定義爲 1,000,000。加減無窮大遵循如下3個基本規則:
定義資源約束時,也能夠指定每一個約束的分數。分數表示指派給此資源約束的值。分數較高的約束先應用,分數較低的約束後應用。經過使用不一樣的分數爲既定資源建立更多位置約束,能夠指定資源要故障轉移至的目標節點的順序。
colocation This constraint expresses the placement relation between two or more resources. If there are more than two resources, then the constraint is called a resource set. Collocation resource sets have an extra attribute to allow for sets of resources which don’t depend on each other in terms of state. The shell syntax for such sets is to put resources in parentheses.
Usage: colocation <id> <score>: <rsc>[:<role>] <rsc>[:<role>] ... Example: colocation dummy_and_apache -inf: apache dummy colocation c1 inf: A ( B C )
order
This constraint expresses the order of actions on two resources or more resources. If there are more than two resources, then the constraint is called a resource set. Ordered resource sets have an extra attribute to allow for sets of resources whose actions may run in parallel. The shell syntax for such sets is to put resources in parentheses.
Usage: order <id> score-type: <rsc>[:<action>] <rsc>[:<action>] ... [symmetrical=<bool>] score-type :: advisory | mandatory | <score> Example: order c_apache_1 mandatory: apache:start ip_1 order o1 inf: A ( B C )
配置副本
xxxxxxxxxx
node node1.example.com \
attributes standby=off
node node2.example.com
primitive vip IPaddr \
params ip=192.168.48.141 \
op monitor interval=30s timeout=20s \
op start timeout=20s interval=0
primitive webip IPaddr \
params ip=192.168.48.140
primitive webserver lsb:httpd \
op monitor interval=20s timeout=15s
order webip_before_webserver Mandatory: webip webserver
location webip_on_node2 webip 200: node2.example.com
colocation webserver_with_webip inf: webserver webip
property cib-bootstrap-options: \
dc-version=1.1.11-97629de \
cluster-infrastructure="classic openais (with plugin)" \
expected-quorum-votes=2 \
stonith-enabled=false \
no-quorum-policy=ignore
rsc_defaults rsc-options: \
resource-stickiness=100
使用ansible劇本安裝,定義HA節點爲hanodes
- hosts: hanodes #HA group remote_user: root vars: #define varibles crmsh: crmsh-1.2.6-4.el6.x86_64.rpm pssh: pssh-2.3.1-2.el6.x86_64.rpm tasks: - name: corosync installing yum: name=corosync state=present - name: pacemaker installing yum: name=pacemaker state=present - name: crmsh rpm packages copy: src=/ansible/corosync/packages/{{ crmsh }} dest=/tmp/{{ crmsh }} #定義變量,並用雙括號擴上,括號兩邊要留空格 - name: pssh rpm packages copy: src=/ansible/corosync/packages/{{ pssh }} dest=/tmp/{{ pssh }} - name: crmsh installing command: yum -y install /tmp/{{ crmsh }} /tmp/{{ pssh }} - name: authkey configure file copy: src=/ansible/corosync/conf/authkey dest=/etc/corosync/authkey - name: authkey mode 400 file: path=/etc/corosync/authkey mode=400 notify: - restart corosync - name: corosync.conf configure file copy: src=/ansible/corosync/conf/corosync.conf dest=/etc/corosync/corosync.conf tags: #打標籤,能夠使用直接調用標籤來使用 - conf notify: - restart corosync - name: ensure the corosync service startup on boot service: name=corosync state=started enabled=yes handlers: - name: restart corosync service: name=corosync state=restarted
執行劇本
ansible-playbook corsync.yaml
定義資源組及其約束
primitive webip ocf:heartbeat:IPaddr params ip=192.168.48.140 op monitor interval=30s timeout=20s on-fail=restart primitive webstore ocf:heartbeat:Filesystem params device="192.168.48.133:/www/htdocs" directory="/var/www/html" fstype="nfs" op monitor interval=20s timeout=40s op start timeout=60s op stop timeout=60s on-fail=restart primitive webserver lsb:httpd op monitor interval=30s timeout=20s on-fail=restart group webservice webip webstore webserver order webip_webstore_webserver mandatory: webip webstore webserver
查看集羣狀態
pcs status property pcs property set [--force] <property>=[<value>] unset <property> list|show [property] [--all | --defaults] eg: pcs property list --all
查看當前的配置信息
pcs cluster cib pcs config
修改stonith-enabled
pcs property set stonith-enabled=false
修改不具有法定票數的規則
pcs property set no-quorum-policy=ignore
修改默認粘性
pcs resource defaults resource-stickness=100
顯示RA類別
pcs resource standards
顯示OCF的providers
pcs resource providers
顯示某類別下的全部RA
pcs resource agents [stantard[:provider]] pcs resource agents ocf:heartbeat
查看某個resource的屬性信息
pcs resource describe <class:provider:type|type> pcs resource describe ocf:heartbeat:IPaddr
查看資源
pcs resource show
定義資源
定義webip
pcs resource create webip ocf:heartbeat:IPaddr ip=192.168.48.140 op monitor interval=30s timeout=20s
定義webstore
pcs resource create webstore ocf:heartbeat:Filesystem device="192.168.48.130:/www/htdocs" directory="/var/www/html" fstype="nfs" op monitor interval=30s timeout=20s op start timeout=60s op stop timeout=60s
定義webserver
pcs resource create webserver lsb:httpd op monitor interval=30s timeout=20s on-fail=restart
定義組
pcs resource group add webservice webip webstore webserver
Standby Active node
pcs cluster standby node1.example.com
查看約束
pcs constraint list --full
順序約束
pcs constraint order set webip webstore webserver
位置約束
pcs constraint location add webservice_on_node1 webservice node1.example.com 500
排列約束
pcs constraint colocation set webip webstore webservice
刪除資源
pcs resource delete webservice
資源遷移
pcs resource move webip
數據採集, 數據存儲, 數據搜索, 數據共享, 數據傳輸, 數據分析, 數據可視化 縱向擴展受陣列空間限制, 橫向擴展受交換設備限制 節點受文件系統限制 多線程與進程的執行模式 互不通訊的多線程模式 基於共享容器協同的多線程模式 經過事件協同的多線程模型 A: 1-->2-->3 B: 1-->2-->3 輸入設備的變化 控制器的變化: 透明代理 旁路代理 名稱服務 規則服務器 運算器的變化: 存儲器的變化: 代理模型 名稱服務 規則服務器 Master 分佈式系統的難點: 缺少全局時鐘 面對故障的獨立性 處理單點故障 冗餘 下降單點故障的影響範圍 事物的挑戰 ACID 2PC(兩段式提交), 最終一致, BASE法則, CAP理論, Paxos算法
分佈式文件系統設計目標
Scalable: Looking at storage and serving infrastructures Reliable: Looking at redundancy, failure rates, on the fly changes Cheap: Looking at upfront costs, TCO and lifetimes
X/Open: XA DTP: Distributed Transaction Process Reference Module 定義了三個組件: AP: Application Program, 應用程序 RM: Resource Manager, 資源管理器 TM: Transaction Manager, 事務管理器 事務管理器註冊管理資源管理器 兩段式提交
CAP理論
C: Consistency A: Availability P: Tolerance of network Partition
三者不可能同時達成 關注一致性, 就須要處理由於系統不可用而致使的寫操做失敗的狀況 關注可用性, 就應該知道系統的read操做可能不能精確的讀取到write操做寫入的最新值 CA: 傳統關係型數據庫 AP: key-value數據庫
BASE
BA: Basically Available, 基本可用 S: Soft state, 軟狀態, 接受一段時間內的狀態不一樣步 E: Eventually consistent: 最終一致性 強一致性: ACID在單機場景能夠使用數據庫事務來保證, 在分佈式事務中很難實現 弱一致性: 延遲一致性,
Paxos協議
做者花了十年時間...拜占庭將軍問題: 通訊條件不安全 比2PC提交更輕量級的分佈式協調方式
集羣內數據一致性算法實施過程案例:
Quorum, Vector Clock Quorum: N: 數據複製的節點量 R: 成功讀操做所依賴的最少節點數 W: 成功寫操做因此來的最少節點數 W+R >N: 強一致性
分佈式計算: MapReduce: 分佈式運算框架 開源實現: MapReduce(Java實現) 分佈式存儲: GFS, Google File System 元數據放在服務器的內存中, 適合存儲少許大文件的數據, 不適合海量小數據 開源實現: HDFS(Java實現) KV BigTable: 利用GFS的存儲機制, 實現了列式數據庫, 底層是GFS. NoSQL的表現之一 HBase: 開源組織clone HADOOP: MapReduce + GFS (山寨的google產品, 基於google提供的論文)
分佈式存儲和分佈式文件系統區別 分佈式存儲不可mount, 基於API進行存儲 文件系統可mount, 基於VFS接口, 直接讀寫數據 適合存儲少許大文件: GFS HDFS TFS: 在名稱節點上將元數據存儲於關係型數據庫中, 文件數量再也不受限於名稱節點的內存空間, 能夠存儲海量小文件 Lustre: 企業級應用, 很是重量級 GlusterFS: 適合存儲PB級別企業數據 MooseFS: 基於FUSE的方式, 能夠實現掛載, 輕量級的分佈式存儲文件系統 MogileFS: 使用Perl語言開發. 很是適合存儲海量小圖片, 元數據存儲在MySQL中. 早期沒有FUSE接口. 能夠基於插件實現掛載, 豆瓣, 一號店,大衆點評 FastDFS: MogileFS C語言實現的clone版
應用層: 無單點: (tracker, mogstore, database(MySQL)) 自動文件複製: 複製的最小單位不是文件, 而是class 傳輸中立, 無特殊協議: 能夠經過NFS或HTTP進行通訊 簡單的命名空間: 沒有文件目錄, 經過域(domain)來區分存儲來源 不共享任何數據 Tracker: 負責存儲元數據, MogilFS的核心, 是一個調度器: 服務進程爲mogilefsd; 職責: 刪除, 複製, 監控, 查詢等. 查詢基於HTTP. 工做在旁路模型 Database: mogstored: 數據存儲的位置, 一般是一個HTT(WebDAV)服務器, 用來數據的建立, 刪除, 獲取 fid: fileID, 一般爲文件名. /a/b/filename.000000.fid(value) /a/a/1.jpg 鍵
CPAN
Perl 綜合典藏網. Perl編譯安裝:
1 . make Makefile.PL 2 . make 3 . make test 4 . make install
準備
yum -y install make gcc unzip perl-DBD-MySQL perl perl-CPAN perl-YAML perl-Time-HiRes
cpan App::cpanminus MogileFS::Server MogileFS::Utils IO::AIO IO::WrapTie Danga::Socket
初始化數據庫
受權訪問
GRANT ALL ON mogilefs.* TO 'moguser'@'HOSTNAME' IDENTIFIED BY 'mogpass'
建立數據庫
mogdbsetup --dbhost=localhost --dbport=3306 --dbname=mogilefs --type=MySQL --dbrootuser=ro ot --dbrootpass=nsadm --dbuser=moguser --dbpass=mogpass
建立目錄
mkdir /var/run/mogilefsd/ chown -R mogilefs.mogilefs /var/run.mogilefsd
安裝mogstored
- hosts: rhcs remote_user: root tasks: - name: copy the mogiles rpm copy: src=/etc/ansible/mogileFS/ dest=~/mogileFS/ force=yes - name: install the packages shell: chdir=~/mogileFS yum install -y * - name: create mkdir /dfs/mogdata shell: mkdir /dfs/mogdata -pv - name: change right shell: chown -R mogilefs.mogilefs /dfs/mogdata - name: change mogestored.conf shell: sed -i 's@docroot = \/var\/mogdata@docroot=/dfs/mogdata/@' /etc/mogilefs/mogstored.c onf - name: yum install perl-IO-AIO yum: state=present name=perl-IO-AIO - name: start mogstored service service: state=started name=mogstored enabled=yes
mogadm --trackers=192.168.48.131:7001 check
查看主機
mogadm --trackers=192.168.48.131:7001 host list
添加主機
mogadm --trackers=192.168.48.131:7001 host add node2 --ip=192.168.48.132 --status=alive
查看設備
mogadm --trackers=192.168.48.131:7001 device list
添加設備
mogadm --trackers=192.168.48.131:7001 device add node2 001
查看domain
mogadm --trackers=192.168.48.131:7001 domain list
上傳文件
mogupload --trackers=192.168.48.131:7001 --domain=files -key="/fstab.html" --file="/etc/fstab"
查看文件內容
moglistkeys --trackers=192.168.48.131:7001 --domain=files
查看文件的訪問路徑
mogfileinfo --trackers=192.168.48.131:7001 --domain=files --key='/fstab.html'
手動使某host下線
mogadm --trackers=192.168.48.131:7001 host mark node3 down
http://grid.net.ru/nginx/mogilefs.en.html
node1: reverse proxy node2-node4: mogileFS mysql: mysqlserver
安裝nginx
./configure \ --prefix=/usr \ --sbin-path=/usr/sbin/nginx \ --conf-path=/etc/nginx/nginx.conf \ --error-log-path=/var/log/nginx/error.log \ --http-log-path=/var/log/nginx/access.log \ --pid-path=/var/run/nginx/nginx.pid \ --lock-path=/var/lock/nginx.lock \ --user=nginx \ --group=nginx \ --with-http_ssl_module \ --with-http_flv_module \ --with-http_stub_status_module \ --with-http_gzip_static_module \ --http-client-body-temp-path=/var/tmp/nginx/client/ \ --http-proxy-temp-path=/var/tmp/nginx/proxy/ \ --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \ --http-uwsgi-temp-path=/var/tmp/nginx/uwgi \ --http-scgi-temp-path=/var/tmp/nginx/scgi \ --with-pcre \ --with-debug \ --add-module=../nginx_mogilefs_module-1.0.4
nginx.conf
upstream mogcluster { server 192.168.48.132:7001; server 192.168.48.138:7001; server 192.168.48.137:7001; } server .... location /images/ { mogilefs_tracker mogcluster; mogilefs_domain images; mogilefs_noverify on; mogilefs_methods GET PUT DELETE; # mogilefs_class default class0 class1 class2 class3 mogilefs_pass { proxy_pass $mogilefs_path; proxy_hide_header Content-Type; proxy_buffering off; } }
mogilefs會使用uri的basename來進行key值匹配. 若是想以路徑爲匹配條件則能夠使用括號擴起匹配的內容(分組匹配) 而後在mogilefs_pass $1
中引用便可
mogstats
mogstats --config=/etc/mogilefs/mogilefsd.conf
存儲類型
DAS: 直接附加存儲 Direct Attached Storage.
直連主機的總線上來的設備
硬盤接口:
Device Interface | Rate |
---|---|
IDE(ATA) | 133MB/s |
SATA | SATA2: 300MB/s SATA3: 600MB/s |
SAS | 6Gbps |
SCSI | 640MB/s |
USB | USB3.0 480MB/s |
HBA: 主機適配器,Adapter NAS:Network Attached Storage 文件服務器:文件系統級別 文件共享服務器,共享級別爲file,而非filesystem 對於本機而言,直接附加存儲看起來是塊設備文件,可是NAS自己就是文件系統,訪問接口是文件API SAN: Storage Area Network 存儲區域網絡 把SCSI協議藉助於其餘網絡協議實現傳送 窄總線SCSI設備有一個控制器能夠連7塊硬盤。 最後一個塊硬盤要使用終結器終結 8,7 通常第七個做爲終結器 寬總線SCSI設備 16,7 通常也是第七個做爲終結器 管理的總線稱爲 initiator, 目標的存儲設備爲Target 藉助Internet傳輸SCSI傳輸機制
Target並不是須要是SCSI設備。可是對於主機而言,SAN設備是塊設備
Distributed Replicated Block Device 這種解決方案可以讓自己不具有複製能力的數據直接在內核級別就可以完成數據的傳輸複製,再也不依賴於應用程序自身就可以完成 2.6.33以後就被收納進入內核的源代碼樹,drbd是內核的一種功能 Disk Scheduler: 磁盤調度器:將多個寫操做合併成一塊兒處理,並重新排序。能夠減小磁盤中的磁頭移動,提升操做效率
Buffer Cache ----> DRBD ----> Disk Scheduler
支持三種模式
異步
數據只須要發送給本地TCP/IP協議棧併發送給本地的發送隊列中則返回
半同步 數據已經發送到對方的TCP/IP協議棧並返回
同步 必需要將數據寫入磁盤並返回
DRBD用戶空間管理工具 drbdadm /etc/drbd.conf /etc/drbd.d/ drbdsetup drbdmeta
DRBD Resources
resource name: 能夠使用除空白字符外的任意ASCII表中的字符
只有在使用drbdadm工具時纔會讀取配置文件,對多個資源的公共配置,能夠提取出來只配置一次,一般保存在common中。此外,還有global配置,一般跟資源自己沒有關係。 Resource Role: Primary: 主節點,可讀寫 Secondary: 從節點,不能掛載 Promote能夠提高爲主 DRBD通常只能用於一主一從的場景,若是使用一主多從須要使用drbd代理,原理很是複雜。 DRBD使用雙主模型,只能夠使用GFS2和OCFS2文件系統
A: Asynchronous replication protocol B: Memory Synchronous (semi-synchronous) replication C: Synchronous replication protol
Split brain notification and automatic revovery
In my lab cases
# on standby drbdadm secondary mystore drbdadm --discard-my-data connect mystore # on active drbdadm connect mydrbd
drbd的主配置文件爲/etc/drbd.conf;爲了管理的便捷性,目前一般會將些配置文件分紅多個部分,且都保存至/etc/drbd.d/目錄中,主配置文件中僅使用"include"指令將這些配置文件片段整合起來。一般,/etc/drbd.d目錄中的配置文件爲global_common.conf和全部以.res結尾的文件。其中global_common.conf中主要定義global段和common段,而每個.res的文件用於定義一個資源。
在配置文件中,global段僅能出現一次,且若是全部的配置信息都保存至同一個配置文件中而不分開爲多個文件的話,global段必須位於配置文件的最開始處。目前global段中能夠定義的參數僅有minor-count, dialog-refresh, disable-ip-verification和usage-count。
common段則用於定義被每個資源默認繼承的參數,能夠在資源定義中使用的參數均可以在common段中定義。實際應用中,common段並不是必須,但建議將多個資源共享的參數定義爲common段中的參數以下降配置文件的複雜度。
resource段則用於定義drbd資源,每一個資源一般定義在一個單獨的位於/etc/drbd.d目錄中的以.res結尾的文件中。資源在定義時必須爲其命名,名字能夠由非空白的ASCII字符組成。每個資源段的定義中至少要包含兩個host子段,以定義此資源關聯至的節點,其它參數都可以從common段或drbd的默認中進行繼承而無須定義。
drbd的組成部分:用戶空間工具,內核模塊(2.6.33及之後版本的內核) 用戶空間工具:跟內核版本關係鬆散,只要能適用於Centos 6及對應硬件平臺的就ok 內核模塊:必須與當前內核版本嚴格對應 note: 用戶空間工具與drbd內核中使用的模塊的版本要保持一致
DRBD版本
drbd共有兩部分組成:內核模塊和用戶空間的管理工具。其中drbd內核模塊代碼已經整合進Linux內核2.6.33之後的版本中,所以,若是您的內核版本高於此版本的話,你只須要安裝管理工具便可;不然,您須要同時安裝內核模塊和管理工具兩個軟件包,而且此二者的版本號必定要保持對應。
目前支持的主要三個版本8.0, 8.2, 8.3
目前適用CentOS 5的drbd版本主要有8.0、8.二、8.3三個版本,其對應的rpm包的名字分別爲drbd, drbd82和drbd83,對應的內核模塊的名字分別爲kmod-drbd, kmod-drbd82和kmod-drbd83。而適用於CentOS 6的版本爲8.4,其對應的rpm包爲drbd和drbd-kmdl,但在實際選用時,要切記兩點:drbd和drbd-kmdl的版本要對應;另外一個是drbd-kmdl的版本要與當前系統的內容版本相對應。各版本的功能和配置等略有差別;咱們實驗所用的平臺爲x8664且系統爲CentOS 6.5,所以須要同時安裝內核模塊和管理工具。咱們這裏選用最新的8.4的版本(drbd-8.4.3-33.el6.x8664.rpm和drbd-kmdl-2.6.32-431.el6-8.4.3-33.el6.x86_64.rpm),下載地址爲ftp://rpmfind.net/linux/atrpms/
配置
global { usage-count no; # minor-count dialog-refresh disable-ip-verification } common { protocol C; handlers { pri-on-incon-degr "/usr/lib/drbd/notify-pri-on-incon-degr.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f"; pri-lost-after-sb "/usr/lib/drbd/notify-pri-lost-after-sb.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f"; local-io-error "/usr/lib/drbd/notify-io-error.sh; /usr/lib/drbd/notify-emergency-shutdown.sh; echo o > /proc/sysrq-trigger ; halt -f"; # fence-peer "/usr/lib/drbd/crm-fence-peer.sh"; # split-brain "/usr/lib/drbd/notify-split-brain.sh root"; # out-of-sync "/usr/lib/drbd/notify-out-of-sync.sh root"; # before-resync-target "/usr/lib/drbd/snapshot-resync-target-lvm.sh -p 15 -- -c 16k"; # after-resync-target /usr/lib/drbd/unsnapshot-resync-target-lvm.sh; } startup { wfc-timeout 120; degr-wfc-timeout 120; } disk { on-io-error detach; #fencing resource-only; } net { cram-hmac-alg "sha1"; shared-secret "mydrbdlab"; } syncer { rate 1000M; } }
若是drbd變成單個,則稱爲降級的drbd 定義一個資源/etc/drbd.d/web.res, drbd 偵聽在7789端口
resource web { on node3.example.com { device /dev/drbd0; disk /dev/sdb1; address 192.168.48.131:7789; meta-disk internal; } on node4.example.com { device /dev/drbd0; disk /dev/sdb1; address 192.168.48.132:7789; meta-disk internal; } }
複製配置到從節點
初始化資源
drbdadm create-md web
查看drbd狀態
drbd-overview cat /proc/drbd
定義主從節點
drbdadm primary --force [resource] 降級 drbadm secondary [resource]
DRBD自身不會作角色切換,在手動作角色切換時要對原主節點作降級,再對從節點升級。從節點甚至不容許掛載drbd磁盤
建立drbd 資源
crm configure primitive mysqlstore ocf:linbit:drbd params drbd_resource=mystore op monitor role=Master interval=3os timeout=20s op monitor role=Slave interval=60s timeout=20s op start timeout=240s op stop timeout=100s
製做主從資源模式
crm configure ms ms_mysqlstore mysqlstore meta master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify="True"
約束fs與主節點在一塊兒
crm configure colocation mysqlfs_with_ms_myslstore_master inf: mysqlfs ms_mysqlstore:Master
順序約束master與掛載順序
order mysqlfs_after_ms_mysqlstore_master mandatory: ms_mysqlstore:promotemysqlfs:start
node node1.example.com \ attributes standby="off" node node2.example.com \ attributes standby="off" primitive myip ocf:heartbeat:IPaddr \ params ip="172.16.100.101" \ op monitor interval="20" timeout="20" on-fail="restart" primitive myserver lsb:mysqld \ op monitor interval="20" timeout="20" on-fail="restart" primitive mysql_drbd ocf:linbit:drbd \ params drbd_resource="mydata" \ op monitor role="Master" interval="10" timeout="20" \ op monitor role="Slave" interval="20" timeout="20" \ op start timeout="240" interval="0" \ op stop timeout="100" interval="0" primitive mystore ocf:heartbeat:Filesystem \ params device="/dev/drbd0" directory="/mydata" fstype="ext4" \ op monitor interval="40" timeout="40" \ op start timeout="60" interval="0" \ op stop timeout="60" interval="0" ms ms_mysql_drbd mysql_drbd \ meta master-max="1" master-node-max="1" clone-max="2" clone-node-max="1" notify="true" colocation myip_with_myserver inf: myip myserver colocation myserver_with_mystore inf: myserver mystore colocation mystore_with_ms_mysql_drbd_master inf: mystore ms_mysql_drbd:Master order ms_mysql_drbd_before_mystore inf: ms_mysql_drbd:promote mystore:start order myip_before_myserver inf: myip myserver order mystore_before_myserver inf: mystore:start myserver:start property $id="cib-bootstrap-options" \ dc-version="1.1.8-7.el6-394e906" \ cluster-infrastructure="classic openais (with plugin)" \ expected-quorum-votes="2" \ stonith-enabled="false" \ last-lrm-refresh="1379316850" \ no-quorum-policy="ignore"
resource <resource> { startup { become-primary-on both; ... } net { allow-two-primaries yes; after-sb-0pri discard-zero-changes; after-sb-1pri discard-secondary; after-sb-2pri disconnect; ... } ... }
同時,包括雙主drbd模型中的任何集羣文件系統都須要fencing功能,且要求其不只要在資源級別實現,也要在節點級別實現STONITH功能
disk { fencing resource-and-stonith; } handlers { outdate-peer "/sbin/make-sure-the-other-node-is-confirmed-dead.sh" }
<rm> <resources /> <service autostart="1" name="mysql"> <drbd name="drbd-mysql" resource="mydrbd"> <fs device="/dev/drbd0" mountpoint="/var/lib/mysql" fstype="ext3" name="mydrbd" options="noatime"/> </drbd> <ip address="172.16.100.8" monitor_link="1"/> <mysql config_file="/etc/my.cnf" listen_address="172.16.100.8" name="mysqld"/> </service> </rm>
node node1.example.com \ attributes standby="off" node node2.example.com node node3.example.com \ attributes standby="off" primitive DLM ocf:pacemaker:controld \ params daemon="/usr/sbin/dlm_controld" \ op start interval="0" timeout="90" \ op stop interval="0" timeout="100" primitive clusterip ocf:heartbeat:IPaddr2 \ params ip="172.16.200.7" cidr_netmask="32" clusterip_hash="sourceip" clone WebIP clusterip \ meta globally-unique="true" clone-max="3" clone-node-max="3" target-role="Stopped" clone dlm_clone DLM \ meta clone-max="3" clone-node-max="1" target-role="Started" property $id="cib-bootstrap-options" \ dc-version="1.1.7-6.el6-148fccfd5985c5590cc601123c6c16e966b85d14" \ cluster-infrastructure="openais" \ expected-quorum-votes="3" \ stonith-enabled="false" \ last-lrm-refresh="1354024090" primitive mysql_drbd ocf:linbit:drbd params drbd_resource="mydata" op monitor role=Master interval=10 timeout=20 op monitor role=Slave interval=20 timeout=20 op start timeout=240 op stop timeout=100
外頻:CPU與內存協調的內存功率 PCI-e就是直接鏈接在北橋的擴展插槽接口 ISA bus:十六位總線,低速總線 SCSI控制器能夠替代CPU工做,下降CPU的使用率 SCSI 工做模型 Initiator:
Target: LUN: Logical Unit Number 邏輯單元號,最多32個 CHAP:Challenge handshake authentication Protocol 並行接口: IDE,SCSI 串行: SATA, SAS, USB
Target管理工具
tgtadm
ISCSI配置工具
iSCSI Server:scsi-target-utils iSCSI Initiator: iscsi-initiator-utils
tgtadm經常使用於管理三類對象: target:建立、查看、刪除 lun: 建立、查看、刪除 認證:用戶建立、綁定、解綁定、刪除、查看 經常使用選項
-L --lld <driver> <drvier> iscsi -m --mode <mode> <mode>: target, logicalunit等 -o --op <operation> <operation>: new,show,delete,bind,unbind -t --tid<id>: 指定target的ID (iscsi一般0使用自己) -T --targetname<targetname>: 指定target的名稱 target的命名機制:爲了保證全局以惟一,命名要遵循iqn規範 iqn: iqn.yyyy-mm.reverse_domain.STRING[:substring] eg. iqn.2016-05.com.example.node3:webserver -l --lun<lun>: 指定LUN的號碼 -b --backing-store<path>:關聯到某指定LUN上的後端存儲設備,能夠是分區,也能夠是磁盤。建議使用後者 -I --initiator-address<address>: 指定受權訪問某target的IP地址來源
tgtadm --lld [driver] --op [operation] --mode [mode] [OPTION]...
(1)、添加一個新的 target 且其ID爲 [id], 名字爲 [name]. --lld [driver] --op new --mode target --tid=[id] --targetname [name]
(2)、顯示全部或某個特定的target: --lld [driver] --op show --mode target [--tid=[id]]
(3)、向某ID爲[id]的設備上添加一個新的LUN,其號碼爲[lun],且此設備提供給initiator使用。[path]是某「塊設備」的路徑,此塊設備也能夠是raid或lvm設備。lun0已經被系統預留。 --lld [driver] --op new --mode=logicalunit --tid=[id] --lun=[lun] --backing-store [path]
(4)、刪除ID爲[id]的target: --lld [driver] --op delete --mode target --tid=[id]
(5)、刪除target [id]中的LUN [lun]: -lld [driver] --op delete --mode=logicalunit --tid=[id] --lun=[lun]
(6)、定義某target的基於主機的訪問控制列表,其中,[address]表示容許訪問此target的initiator客戶端的列表: --lld [driver] --op bind --mode=target --tid=[id] --initiator-address=[address]
(7)、解除target [id]的訪問控制列表中[address]的訪問控制權限: --lld [driver] --op unbind --mode=target --tid=[id] --initiator-address=[address]
(1)建立一個target: tgtadm --lld iscsi --op new --mode target --tid 1 -T iqn.2013-05.com.magedu:tsan.disk1
(2)顯示全部: tgtadm --lld iscsi --op show --mode target
(3)顯示剛建立的target: tgtadm --lld iscsi --op show --mode target --tid 1
(4)建立LUN,號碼爲1: tgtadm --lld iscsi --op new --mode logicalunit --tid 1 --lun 1 -b /dev/sda5
(5)開放給192.168.0.0/24網絡中的主機訪問: tgtadm --lld iscsi --op bind --mode target --tid 1 -I 172.16.0.0/16
其中的-I至關於--initiator-address
(6)Create a new account: tgtadm --lld iscsi --op new --mode account --user christina --password 123456
tgtadm --lld iscsi --op show --mode account
Assign this account to a target:
tgtadm --lld iscsi --op bind --mode account --tid 1 --user christina
tgtadm --lld iscsi --op show --mode target
(7)Set up an outgoing account. First, you need to create a new account like the previous example
tgtadm --lld iscsi --op new --mode account --user clyde --password 123456
tgtadm --lld iscsi --op show --mode account
tgtadm --lld iscsi --op bind --mode account --tid 1 --user clyde --outgoing
tgtadm --lld iscsi --op show --mode target
Server端
service tgtd start
一、建立target
tgtadm -L iscsi -o new -m target -t 1 -T iqn.2016-05.com.example.node3:1
二、指定LUN到target
tgtadm -L iscsi -o new -m logicalunit -t 1 -l 1 -b /dev/sdb2 tgtadm -L iscsi -o new -m logicalunit -t 1 -l 2 -b /dev/sdb5
三、建立LUN與target Binding關係
tgtadm -L iscsi -o bind -t 1 -I 192.168.48.0/24 -m target
Client端
一、建立initiatorname和別名
echo "InitiatorName=`iscsi-iname -p iqn.2016-05.com.example`" > /etc/iscsi/initiatorname.iscsi echo "InitiatorAlias=initiator1" >> /etc/iscsi/initiatorname.iscsi
二、啓動客戶端iscsi服務,下次開機時能夠自動發現iscsi target
service iscsi start; service iscsid start
iscsiadm工具
iscsiadm是個模式化的工具,其模式可經過-m或--mode選項指定,常見的模式有discovery、node、fw、session、host、iface幾個,若是沒有額外指定其它選項,則discovery和node會顯示其相關的全部記錄;session用於顯示全部的活動會話和鏈接,fw顯示全部的啓動固件值,host顯示全部的iSCSI主機,iface顯示/var/lib/iscsi/ifaces目錄中的全部ifaces設定
iscsiadm -m discovery [ -d debug_level ] [ -P printlevel ] [ -I iface -t type -p ip:port [ -l ] ] iscsiadm -m node [ -d debug_level ] [ -P printlevel ] [ -L all,manual,automatic ] [ -U all,manual,automatic ] [ [ -T tar-getname -p ip:port -I iface ] [ -l | -u | -R | -s] ] [ [ -o operation ] -d, --debug=debug_level 顯示debug信息,級別爲0-8; -l, --login -t, --type=type 這裏能夠使用的類型爲sendtargets(可簡寫爲st)、slp、fw和 isns,此選項僅用於discovery模式,且目前僅支持st、fw和isns;其中st表示容許每一個iSCSI target發送一個可用target列表給initiator; -p, --portal=ip[:port] 指定target服務的IP和端口; -m, --mode op 可用的mode有discovery, node, fw, host iface 和 session -T, --targetname=targetname 用於指定target的名字 -u, --logout -o, --op=OPEARTION:指定針對discoverydb數據庫的操做,其僅能爲new、delete、update、show和nonpersistent其中之一; -I, --interface=[iface]:指定執行操做的iSCSI接口,這些接口定義在/var/lib/iscsi/ifaces中;
一、Discovery ISCSI設備
iscsiadm -m discovery -t st -p 192.168.48.131:3260
二、登陸ISCSI設備
iscsiadm -m node -T iqn.2016-05.com.example.node3:1 -p 192.168.48.131:3260 -l
登出ISCSI設備
iscsiadm -m node -T iqn.2016-06.com.example.node3:1 -p 192.168.48.131:3260 -u
登錄過的信息都會保存在/var/lib/iscsi/send_targets/下 ISCSI鏈接時,本地接口等信息會保存在/var/lib/iscsi/ifaces/目錄下 /var/lib/iscsi/nodes/下保存着能夠自動登陸的設備信息
刪除iSCSI設備及元數據
iscsiadm -m node -T iqn.2016-06.com.example.node3:1 -p 192.168.48.131:3260 -o delete
在服務器端解綁定
tgtadm -L iscsi -o unbind -m target -t 1 -I 192.168.48.0/24
刪除LUN
tgtadm -L iscsi -o delete -m logicalunit -t 1 -l 2
刪除Target
tgtadm -L iscsi -o delete -m target -t 1
在/etc/tgt/targets.conf
default-driver iscsi <target iqn.2016-05.com.example.node3:1> backing-store /dev/sdb5 incominguser iscsiuser mypass outgoinguser myuser mypass initiator-address 192.168.0.0/24 </target>
三、分區格式化並建立文件系統.. 四、開機掛載 若是出現了沒法掛載的狀況,則
dmsetup status dmsetup remove_all
Note: 使用共享存儲上的掛載必定不要同時掛載和使用
一、在target端建立帳號esunyig,併爲其授予訪問某tid的權限
tgtadm -L iscsi -o new -m account --user esunyig --password 123456
二、將用戶與某target綁定
tgtadm -L iscsi -o bind -m account --tid 1 --user esunyig
三、修改initiator端的主配置文件/etc/iscsi/iscsid.conf
node.session.auth.authmethod = CHAP node.session.auth.username = esunyig node.session.auth.password = 123456
四、若是initiator端已經登陸過此target,此時還須要先註銷登陸後重啓iscsid服務,並在刪除此前生成的database後從新發現target並登陸
若是要在企業中自建一個共享存儲,能夠有以下選擇
Openfiler WebGUI FreeNas: NAS4free freebsd
Nexenstor: solaris ZFS Windows, iSCSI(target, initiator) RHCS: Redhat Cluster Suite lvs, piraha(爲lvs提供高可用功能) cman+rgmanager DLM: distributed lock manager 分佈式鎖管理器 GFS: Global File System (redhat) Google FIle System: GFS(google),分佈式文件系統 TFS: Taobao File System Tencent File System OCFS2: oracle Filesystem
HA方案 Heartbeat v1 + haresources Heartbeat v2 + crm Heartbeat v3 + cluster-glue + pacemaker Corosync + pacemaker Corosync + cman + rgmanager Corosync + cman + pacemaker
紅帽管理方案: conga: luci + ricci luci: work station ricii: cluster nodes
RHCS的核心組件爲cman和rgmanager,其中cman爲基於openais的「集羣基礎架構層」,rgmanager爲資源管理器。RHCS的集羣中資源的配置須要修改其主配置文件/etc/cluster/cluster.xml實現,這對於不少用戶來講是比較有挑戰性的,所以,RHEL提供了system-config-cluster這個GUI工具,其僅安裝在集羣中的某一節點上便可,而cman和rgmanager須要分別安裝在集羣中的每一個節點上。這裏選擇將此三個rpm包分別安裝在了集羣中的每一個節點上,這能夠在跳板機上執行以下命令實現 conga:部署、資源管理等功能 手動安裝:corosync + cman + rgmanager GFS通常集羣文件系統通常不能多於16個 分佈式存儲:名稱節點可以將用戶數據分割成多個塊,然後分散存儲在多個數據節點上
集羣文件系統:
GFS2 OCFS2
分佈式文件系統: GFS (google filesystem) HDFS (hadoop) (單個大文件) TFS (Taobao) MooseFS MogileFS (適用於存儲海量小文件) 沒法掛載,有API GlusterFS Swift (Openstack) ceph 對於數據庫而言,存儲從內容上分類有兩類,一類是關係型數據庫中的表內容,一部分是圖片,數據之類的文件
Conga: 管理主機:能夠非爲集羣中的節點,luci 集羣節點:安裝ricci 兩節點集羣:qdisk(仲裁磁盤)
一、配置hosts主機解析
ansible rhcs -m shell -a 'rm /etc/hosts' ansible rhcs -m shell -a 'echo "127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4" /etc/hosts' ansible rhcs -m shell -a 'echo "::1 localhost localhost.localdomain localhost6 localhost6.localdomain6" >>/etc/hosts' ansible rhcs -m shell -a 'echo "192.168.48.131 node1.exmaple.com node1" >>/etc/hosts' ansible rhcs -m shell -a 'echo "192.168.48.132 node2.exmaple.com node2" >>/etc/hosts' ansible rhcs -m shell -a 'echo "192.168.48.137 node3.exmaple.com node3" >>/etc/hosts' ansible rhcs -m shell -a 'echo "192.168.48.138 node4.exmaple.com node4" >>/etc/hosts'
二、安裝ricci在客戶機上 note: 在安裝rhcs時,要禁用epel源
ansible rhcs -m yum -a "name=ricci state=present disablerepo=epel"
啓動服務
ansible rhcs -m service -a "name=ricci state=started enabled=yes"
ricci偵聽在111端口上 給cluster集羣中的ricci用戶添加密碼
ansible rhcs -m shell -a "echo nsadm|passwd --stdin ricci"
三、在本機上安裝lucci 一樣也要禁用epel源
yum -y install luci --disablerepo=epel service luci start
luci偵聽在8084端口上
查看cluster狀態
clustat
使用clusvcadm轉移資源
clusvcadm -r webservice -m node3.example.com
使用cman_tool管理集羣
查看集羣狀態
cman_tool status
查看集羣服務
cman_tool services
查看集羣節點
cman_tool nodes
/etc/cluster/cluster.conf
<?xml version="1.0"?> <cluster config_version="5" name="my_cluster"> <clusternodes> <clusternode name="node1.example.com" nodeid="1"/> <clusternode name="node2.example.com" nodeid="2"/> <clusternode name="node3.example.com" nodeid="3"/> </clusternodes> <rm> <failoverdomains> <failoverdomain name="webdomain" nofailback="1" ordered="1"> <failoverdomainnode name="node1.example.com" priority="1"/> <failoverdomainnode name="node2.example.com" priority="2"/> <failoverdomainnode name="node3.example.com" priority="3"/> </failoverdomain> </failoverdomains> <resources> <ip address="192.168.48.140/24" sleeptime="10"/> </resources> <service domain="webdomain" name="webservice" recovery="relocate"> <ip ref="192.168.48.140/24"/> <script file="/etc/init.d/httpd" name="webserver"/> </service> </rm> </cluster>
rhcs跟NetworkManager服務衝突,確保NetworkManager處於關閉狀態 配置過程:找集羣中某一個節點
準備環境
ansible rhcs -m yum -a "name=corosync state=present" ansible rhcs -m yum -a "name=cman state=present" ansible rhcs -m yum -a "name=rgmanager state=present" ansible rhcs -m service -a "name=corosync state=started enabled=yes" ansible rhcs -m service -a "name=cman state=started enabled=yes" ###個人環境能夠簡化。。 ansible rhcs -m copy -a "src=/etc/ansible/cluster.conf dest=/etc/cluster/cluster.conf"
一、建立集羣配置文件的框架
ccs_tool create mycluster
二、定義集羣節點
ccs_tool addnode node1.example.com -n 1 -v 1 ccs_tool addnode node2.example.com -n 2 -v 1 ccs_tool addnode node3.example.com -n 3 -v 1
生成cluster.conf文件
<?xml version="1.0"?> <cluster name="mycluster" config_version="4"> <clusternodes> <clusternode name="node1.example.com" votes="1" nodeid="1"/><clusternode name="node2.example. com" votes="1" nodeid="2"/><clusternode name="node3.example.com" votes="1" nodeid="3"/></cluste rnodes> <fencedevices> </fencedevices> <rm> <failoverdomains/> <resources/> </rm> </cluster>
ansible rhcs -m copy -a "src=/etc/ansible/cluster.conf dest=/etc/cluster/cluster.conf" ansible rhcs -m service -a "name=cman state=started enabled=yes"
建立fence設備
一個RHCS集羣至少須要一個fence設備,正常環境中,能夠選擇將其配置到集羣中來。這裏爲演示環境,沒有可用的fence設備,所以,選擇使用「manual fence」,即手動fence。建立fence設備也須要使用ccs_tool命令進行,其須要在集羣中的某節點上執行,並且須要與前面建立集羣配置文件時所執行的命令在同一個節點上進行。
查看fence代理的名稱,能夠經過查看cman安裝生成文件來實現。
rpm -ql cman | grep /sbin/fence
這裏爲tcluster添加名爲meatware的fence設備,其fence代理爲fence-manual
ccs_tool addfence meatware fence-manaualxxxxxxxxxx
接着能夠使用ccs_tool lsfence查看fence設備
ccs_tool lsfence
RHCS集羣須要配置好各節點及相關的fence設備後才能啓動,所以,這裏須要事先將各節點添加進集羣配置文件。每一個節點在添加進集羣時,須要至少爲其配置node id(每一個節點的id必須唯一)及相關的fence設備兩個屬性。ccs_tool的addnode子命令能夠完成節點添加。例如將前面規劃的三個集羣節點添加至集羣中,能夠使用以下命令實現。
ccs_tool addnode -n 1 -f meatware node1.magedu.com ccs_tool addnode -n 2 -f meatware node2.magedu.com ccs_tool addnode -n 3 -f meatware node3.magedu.com
GFS 文件系統是Linux操做系統上惟一針對企業應用的Native64位集羣文件系統,支持x8六、AMD64/EM64T和Itanium等處理器平臺。它仍是Linux系統上擴展能力最強的企業集羣文件系統,支持多達300個結點。
因爲多個集羣節點同時訪問/讀寫同一分區/數據,就必順經過一個或多個管理服務器來保證數據的一致性,在GFS中,管理服務器叫DLM(distributed lock manager),經過DLM 能夠與每一個集羣節點心跳通信,以確保數據完整性,及節點健康性,一旦發現某個節點通信有問題,它會把該節點從集羣中隔離出來,直到該節點從新恢復,才能再加入集羣節點中。考慮到DLM服務器的高可用性,GFS 能夠經過設置多個DLM的備份,一旦主DLM發生故障,備份的DLM就能夠接管做爲主DLM來管理整個GFS。因此從節點到DLM,均可以實現HA的功能,就不存在單點故障的問題,能夠確保GFS 最高程度的高可用性。GFS文件系統支持三種鎖管理機制DLM、GULM、nolock。DLM是默認最優的鎖管理器。
1)DLM 鎖管理器
DLM(Distributed Lock Manager)是最優的鎖管理器,它避免了GULM 鎖管理方式中必須提供GULM 鎖管理服務器的缺點,再也不須要設定鎖管理服務器,而是採用對等的鎖管理方式,大大提供處理性能,DLM 避免了當單個節點失敗須要整個恢復的性能瓶頸,DLM 的請求是本地的,不須要網絡請求,當即生效,通鎖分層機制,DLM 實現多個鎖空間,並行鎖模式。
2)GULM 鎖管理器
GULM 是GFS6.1 之前的鎖管理器,它必需要設置一個鎖管理服務器,是一種client/Server 的鎖管理方式,顯示易見,全部的鎖請求必需要與鎖管理服務器通信。並且當節點增大的必定數量的時候,可能會出現磁盤的交換,下降了整個GFS 系統的性能。
3)nolock鎖管理器
nolock實際並非一個集羣管理鎖機制,它只能用於單個節點的GFS 系統。通常用來測試和實驗用。GFS 6.1與GFS 6.0對比GFS 6.1是一個成熟的、高可擴展的、高性能的集羣文件系統,支持分佈式鎖管理,成熟的LVM2卷管理系統,並且與Red Hat Enterprise Linux緊密集成的系統。GFS 6.1與GFS 6.0相比尤爲在性能上獲得很大提高,包括快速的磁盤掃描、避免Kernel Panic,而且與Red Hat Cluster Suite 緊密結合,並且其DLM的鎖管理技術已經被Linux Kernel社區接納。
GFS能夠在同一時間內多臺服務器同時訪問共享磁盤上的同一個磁盤分區,甚至同一個文件。GFS 不只提供了HA 功能,還同時容許多臺服務器同時訪問同一個磁盤分區和文件
一、配置共享存儲iscsi設備
yum -y install scsi-target-utils
配置/etc/tgt/targets.conf
default-driver iscsi <target iqn.2016-05.com.example.testsan:1> backing-store /dev/sda5 backing-store /dev/sda6 initiator-address 192.168.48.0/24 </target>
二、配置iscsi客戶端
ansible rhcs -m yum -a "name=iscsi-initiator-utils state=present"
echo InitiatorName=`iscsi-iname -p iqn.2016-05.com.example` >/etc/iscsi/initiator rname.iscsi
三、登陸iscsi設備
ansible rhcs -m shell -a 'iscsiadm -m node -T iqn.2016-05.com.example.testsan:1 -p 192.168 .48.138:3260 -l'
四、安裝gfs
ansible rhcs -m yum -a "name=gfs2-utils state=present"
GFS文件系統
Syntax: mkfs.gfs2 [options] <device> [ block-count ] Options: -b <bytes> Filesystem block size -c <MB> Size of quota change file -D Enable debugging code -h Print this help, then exit -J <MB> Size of journals -j <num> Number of journals 若是指定的日誌區域不夠用,能夠使用gfs2_jadd天假新的日誌區域 -K Don't try to discard unused blocks -O Don't ask for confirmation -p <name> Name of the locking protocol lock_dlm -q Don't print anything -r <MB> Resource Group Size -t <name> Name of the lock table clustername:fname -u <MB> Size of unlinked file -V Print program version information, then exit
-b BlockSize:指定文件系統塊大小,最小爲512,默認爲4096; -J MegaBytes:指定gfs2日誌區域大小,默認爲128MB,最小值爲8MB; -j Number:指定建立gfs2文件系統時所建立的日誌區域個數,通常須要爲每一個掛載的客戶端指定一個日誌區域; -p LockProtoName:所使用的鎖協議名稱,一般爲lock_dlm或lock_nolock之一; -t LockTableName:鎖表名稱,通常來講一個集羣文件系統需一個鎖表名以便讓集羣節點在施加文件鎖時得悉其所關聯到的集羣文件系統,鎖表名稱爲clustername:fsname,其中的clustername必須跟集羣配置文件中的集羣名稱保持一致,所以,也僅有此集羣內的節點可訪問此集羣文件系統;此外,同一個集羣內,每一個文件系統的名稱必須唯一;
gfs2,日誌文件系統 配置示例
mkfs.gfs2 -j 3 -t mycluster:webstore -p lock_dlm /dev/sdb1
集羣文件系統中沒有lost+found 集羣文件系統經過集羣文件系統鎖dlm來實現文件的實時顯示修改
gfs2_tool工具
凍結/解凍某文件系統 gfs2_tool freeze /mnt gfs2_tool unfreeze /mnt 獲取參數 gfs2_tool gettune /mnt 設置參數 gfs2_tool settune /mnt log_flush_secs 120 查看文件系統日誌區域 gfs2_tool journals /mnt
讓gfs文件系統在開機後自動啓動
須要啓動gfs2的服務,fstab的配置以下
/dev/sdb1 /gfs gfs2 defaults 0 0
安裝集羣邏輯卷
ansible rhcs -m yum -a "name=lvm2-cluster state=present"
修改集羣邏輯卷鎖類型
ansible rhcs -m shell -a 'sed -i "s@^\([[:space:]]*locking_type\).*@\1 = 3@g" /etc/lvm/lvm.conf' 也能夠 ansible rhcs -m shell -a 'lvmconf --enable-cluster' # Type of locking to use. Defaults to local file-based locking (1). # Turn locking off by setting to 0 (dangerous: risks metadata corruption # if LVM2 commands get run concurrently). # Type 2 uses the external shared library locking_library. # Type 3 uses built-in clustered locking. # Type 4 uses read-only locking which forbids any operations that might # change metadata. # Type 5 offers dummy locking for tools that do not need any locks.
啓動llvm2服務
ansible rhcs -m service -a "name=clvmd state=started enabled=yes"
在任意cluster節點中建立邏輯卷並建立集羣邏輯卷文件系統
mkfs.gfs2 -p lock_dlm -j 3 -t mycluster:clvm /dev/cluster_vg/cluster_lv
擴展lvm2邏輯卷大小
lvextend -L +2G /dev/cluster_vg/cluster_lv gfs2_grow /dev/cluster_vg/cluster_lv
擴展:如何實現雙主模型的drbd
gfs_lvm只能在cman管理下使用。RHEL6 下corosync並不支持corosync
Device Mapper(DM)是Linux 2.6全面引入的塊設備新構架,經過DM能夠靈活地管理系統中全部的真實或虛擬的塊設備。
DM以塊設備的形式註冊到Linux內核中,凡是掛載(或者說「映射」)於DM結構下的塊設備,無論他們是如何組織,如何通信,在Linux看來都是一個完整的DM塊設備。所以DM讓不一樣組織形式的塊設備或者塊設備集羣在Linux內核面前有一個完整統一的DM表示。
在Linux內核代碼中(本文以2.6.33內核代碼爲參照),DM指的是整個Device Mapper的設計框架。MD(Mapped Device)是框架所虛擬出來的各類設備。簡而言之DM就是不一樣種類的MD通過特定的關係鏈接到塊設備管理器上的大構架。
DM的內核代碼集中在drivers/md目錄中。DM構架相關的代碼在dm.c和dm-io.c文件中,各類抽象的MD虛擬設備代碼分散在同目錄的其餘文件中,除了dm-ioctl.c是dm設置接口設備。
dmsetup能夠用來組裝,解散,監視咱們本身的虛擬存儲結構。 dmsetup的子命令中,create、load、reload子命令都帶有 --table
參數 table字串有以下形式:<start><lenght><type><arguments>
在DM架構中MD只是一個對外的統一接口,不一樣target driver的對外接口能夠都是同樣的,所以無需爲不一樣的虛擬方式編寫不一樣的MD,只須要提供不一樣的target driver便可 mapped-driver簡稱爲md,target device簡稱爲target。target driver簡稱爲driver Target類型: linear; mirror;snapshot;multipath
dmsetup ls dmsetup info dmsetup status dmsetup deps dmsetup table
建立一個linear設備
起始扇區 扇區個數 線性映射 目標設備 目標設備上的起始扇區 0 1025 linear /dev/sdb2 0
查看IO讀寫狀態
iostat
DFS: Distributed Filesystem CFS: Cluster Filesystem; GFS2 cLVM: lvm2-cluster keepalived核心: vrrp的實現 virtual server vrrp_script vrrp: virtual redundancy routing protocal 數字越大,優先級越高 http://www.keepalived.org
vrrp虛擬mac地址 00-00-5E-00-01-{VRID} LAN客戶端斷定哪一個路由器應該爲其到達目標主機的下一跳網關的方式有動態及靜態決策兩種方式,其中,常見的動態路由發現方式有以下幾種: 一、Proxy ARP —— 客戶端使用ARP協議獲取其想要到達的目標,然後,由某路由以其MAC地址響應此ARP請求; 二、Routing Protocol —— 客戶端監聽動態路由更新(如經過RIP或OSPF協議)並以之重建本身的路由表; 三、ICMP IRDP (Router Discovery Protocol) 客戶端 —— 客戶端主機運行一個ICMP路由發現客戶端程序;
動態路由發現協議的不足之處在於它會致使在客戶端引發必定的配置和處理方面的開銷,而且,若是路由器故障,切換至其它路由器的過程會比較慢。解決此類問題的一個方案是爲客戶端靜態配置默認路由設備,這大大簡化了客戶端的處理過程,但也會帶來單點故障類的問題。默認網關故障時,LAN客戶端僅能實現本地通訊。 VRRP能夠經過在一組路由器(一個VRRP組)之間共享一個虛擬IP(VIP)解決靜態配置的問題,此時僅須要客戶端以VIP做爲其默認網關便可。
VRRP是一個「選舉」協議,它可以動態地將一個虛擬路由器的責任指定至同一個VRRP組中的其它路由器上,從而消除了靜態路由配置的單點故障。
VRRP的優點: 冗餘:能夠使用多個路由器設備做爲LAN客戶端的默認網關,大大下降了默認網關成爲單點故障的可能性; 負載共享:容許來自LAN客戶端的流量由多個路由器設備所共享; 多VRRP組:在一個路由器物理接口上可配置多達255個VRRP組; 多IP地址:基於接口別名在同一個物理接口上配置多個IP地址,從而支持在同一個物理接口上接入多個子網; 搶佔:在master故障時容許優先級更高的backup成爲master; 通告協議:使用IANA所指定的組播地址224.0.0.18進行VRRP通告; VRRP追蹤:基於接口狀態來改變其VRRP優先級來肯定最佳的VRRP路由器成爲master;
IP地址擁有者(IP Address Owner):若是一個VRRP設備將虛擬路由器IP地址做爲真實的接口地址,則該設備被稱爲IP地址擁有者。若是IP地址擁有者是可用的,一般它將成爲Master。
Global Configuration Global definitions Static routes
VRRPD Configuration VRRP Synchronization Group String, name of group of IPs that failover together VRRP instance(s) Describes the moveable IP for each instance of a group in vrrp_sync_group
LVS Configuration Virtual Server Group Vritual Server virtual_ipaddrss:
<IPADDR>/<MASK> brd <IPADDR> DEV <STRING> scope <SCOPE> label <LABEL>
virtual_routes:
#src <IPADDR> [to] <IPADDR>/<MASK> via|gw <IPADDR> [or <IPADDR>] dev <STRING> scope <SCOPE> tab
man keepalived.conf 查看配置 配置script監測腳本
vrrp_script chk_maintenance { script "[[ -e /etc/keepalived/down ]] && exit 1 || exit 0" interval 1 weight -2 } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.48.150 } track_script { chk_maintenance } }
1 . 如何在狀態轉換時進行通知? notify_master "/path/script.sh" notify_backup notify_fault
MASTER: #!/bin/bash vip=192.168.48.150 thisip=`ifconfig eth0|awk '/inet addr:/{print $2}|awk -F: '{print $2}'` contact='root@localhost' notify(){ mailbody="vrrp transaction, $vip floated to $thisip." subject="$thisip is to be $vip master" echo $mailbody|mail -s $subject $contact } notify $1
vrrp_sync_group{} vrrp_instance{}
2 . 如何配置ipvs?
vritual server realserver health check 配置內容 virtual_server IP port virtual_server fwmak int virtual_server group string lb_algo rr|wrr|lc|wlc|blc|sh|dh lb_kind NAT|DR|TUN persistence_timeout protocol TCP sorry_server
real_server <IPADDR> <PORT> { weight <INT> notify_up <STRING>|<QUOTED-STRING> notify_down <STRING>|<QUOTED-STRING> #HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK }
virtual_server 192.168.48.150 80 { # delay_loop 6 lb_algo rr lb_kind DR nat_mask 255.255.255.0 persistence_timeout 0 protocol TCP real_server 192.168.48.137 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 192.168.48.138 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }
TCP_CHECK
{ connect_port <PORT> bindto <IPADDR> connect_timeout <INT> }
HTTP_GET|SSL_GET
{ url{ path <STRING> digest <STRING> ##get from genhash eg. genhash -s 192.168.48.137 -p 80 --url "/" status_code <INT> } connect_port <PORT> bindto <IPADDR> connect_timeout <INT> nb_get_retry <INT> delay_before_retry <INT> }
3 . 如何對某特定服務實現高可用 對nginx實現高可用
vrrp_scrip chk_nginx{ script "killall -0 nginx &>/dev/null" interval 1 fall 2 rise 2 weight -5 } 對nginx進行腳本測試
4 . 如何實現基於多虛擬路由的master/master模型 設置多路虛擬路由, 並將各自fallback節點指向彼此便可
組播IP地址用於標識一個IP組播組。IANA(internet assigned number authority)把D類地址空間分配給IP組播,其範圍是從224.0.0.0到239.255.255.255。 XXXX XXXXXXXX XXXXXXXX XXXXXXXX組播組能夠是永久的也能夠是臨時的。組播組地址中,有一部分由官方分配的,稱爲永久組播組。永久組播組保持不變的是它的ip地址,組中的成員構成能夠發生變化。永久組播組中成員的數量均可以是任意的,甚至能夠爲零。那些沒有保留下來供永久組播組使用的ip組播地址,能夠被臨時組播組利用。
224.0.0.0~224.0.0.255爲預留的組播地址(永久組地址),地址224.0.0.0保留不作分配,其它地址供路由協議使用。 224.0.1.0~238.255.255.255爲用戶可用的組播地址(臨時組地址),全網範圍內有效。 239.0.0.0~239.255.255.255爲本地管理組播地址,僅在特定的本地範圍內有效。經常使用的預留組播地址列表以下: 224.0.0.0 基準地址(保留) 224.0.0.1 全部主機的地址 224.0.0.2 全部組播路由器的地址 224.0.0.3 不分配 224.0.0.4 dvmrp(Distance Vector Multicast Routing Protocol,距離矢量組播路由協議)路由器 224.0.0.5 ospf(Open Shortest Path First,開放最短路徑優先)路由器 224.0.0.6 ospf dr(Designated Router,指定路由器) 224.0.0.7 st (Shared Tree,共享樹)路由器 224.0.0.8 st主機 224.0.0.9 rip-2路由器 224.0.0.10 Eigrp(Enhanced Interior Gateway Routing Protocol,加強網關內部路由線路協議)路由器 224.0.0.11 活動代理 224.0.0.12 dhcp服務器/中繼代理 224.0.0.13 全部pim (Protocol Independent Multicast,協議無關組播)路由器 224.0.0.14 rsvp (Resource Reservation Protocol,資源預留協議)封裝 224.0.0.15 全部cbt 路由器 224.0.0.16 指定sbm(Subnetwork Bandwidth Management,子網帶寬管理) 224.0.0.17 全部sbms 224.0.0.18 vrrp(Virtual Router Redundancy Protocol,虛擬路由器冗餘協議) 239.255.255.255 SSDP協議使用
故障切換域是一個命名的集羣節點子集,它可在節點失敗事件中運行集羣服務。故障切換域有如下特徵: 無限制 — 容許您爲在子集指定首選成員子集,但分配給這個域名的集羣服務可在任意可用成員中運行。 限制 — 容許您限制可運行具體集羣服務的成員。若是在限制故障切換域中沒有可用成員,則沒法啓動集羣服務(手動或者使用集羣軟件均不可行)。 無序 — 當將一個集羣服務分配給一個無序故障切換域時,則可從可用故障切換域成員中隨機選擇運行集羣服務的成員,沒有優先順序。 有序的 — 可以讓您在故障切換域的成員間指定順序。該列表頂端的成員是首選成員,接下來是列表中的第二個成員,依此類推。 故障恢復 — 容許您指定在故障切換域中的服務是否應該恢復到節點失敗前最初運行的節點。配置這個特性在做爲有序故障切換域一部分節點重複失敗的環境中頗有幫助。在那種狀況下,若是某個節點是故障切換域中的首選節點,在可能在首選節點和其它節點間重複切換和恢復某個服務,從而不會對性能產生嚴重影響。