一、概述:
1.1 AIS和OpenAIS簡介
AIS應用接口規范,是用來定義應用程序接口(API)的開放性規范的集合,這些應用程序作為中間件為應用服務提供一種開放、高移植性的程序接口。是在實現高可用應用過程中是亟需的。服務可用性論壇(SA Forum)是一個開放性論壇,它開發並發布這些免費規范。使用AIS規范的應用程序接口(API),可以減少應用程序的復雜性和縮短應用程序的開發時間,這些規范的主要目的就是為了提高中間組件可移植性和應用程序的高可用性。
OpenAIS是基於SA Forum 標准的集群框架的應用程序接口規范。OpenAIS提供一種集群模式,這個模式包括集群框架,集群成員管理,通信方式,集群監測等,能夠為集群軟件或工具提供滿足 AIS標准的集群接口,但是它沒有集群資源管理功能,不能獨立形成一個集群。
1.2 corosync簡介
Corosync是OpenAIS發展到Wilson版本后衍生出來的開放性集群引擎工程,corosync最初只是用來演示OpenAIS集群框架接口規范的一個應用,可以說corosync是OpenAIS的一部分,但后面的發展明顯超越了官方最初的設想,越來越多的廠商嘗試使用corosync作為集群解決方案。如RedHat的RHCS集群套件就是基於corosync實現。
corosync只提供了message layer,而沒有直接提供CRM,一般使用Pacemaker進行資源管理。
1.3 pacemaker簡介
pacemaker就是Heartbeat 到了V3版本后拆分出來的資源管理器(CRM),用來管理整個HA的控制中心,要想使用pacemaker配置的話需要安裝一個pacemaker的接口,它的這個程序的接口叫crmshell,它在新版本的 pacemaker已經被獨立出來了,不再是pacemaker的組成部分。
(1)pacemaker 內部結構
(2)群集組件說明:
stonithd:心跳系統。
lrmd:本地資源管理守護進程。它提供了一個通用的接口支持的資源類型。直接調用資源代理(腳本)。
pengine:政策引擎。根據當前狀態和配置集群計算的下一個狀態。產生一個過渡圖,包含行動和依賴關系的列表。
CIB:群集信息庫。包含所有群集選項,節點,資源,他們彼此之間的關系和現狀的定義。同步更新到所有群集節點。
CRMD:集群資源管理守護進程。主要是消息代理的PEngine和LRM,還選舉一個領導者(DC)統籌活動(包括啟動/停止資源)的集群。
OpenAIS:OpenAIS的消息和成員層。
Heartbeat:心跳消息層,OpenAIS的一種替代。
CCM:共識群集成員,心跳成員層。
功能概述
CIB使用XML表示集群的集群中的所有資源的配置和當前狀態。CIB的內容會被自動在整個集群中同步,使用PEngine計算集群的理想狀態,生成指令列表,然后輸送到DC(指定協調員)。Pacemaker 集群中所有節點選舉的DC節點作為主決策節點。如果當選DC節點宕機,它會在所有的節點上, 迅速建立一個新的DC。DC將PEngine生成的策略,傳遞給其他節點上的LRMd(本地資源管理守護程序)或CRMD通過集群消息傳遞基礎結構。當集群中有節點宕機,PEngine重新計算的理想策略。在某些情況下,可能有必要關閉節點,以保護共享數據或完整的資源回收。為此,Pacemaker配備了stonithd設備。STONITH可以將其它節點“爆頭”,通常是實現與遠程電源開關。Pacemaker會將STONITH設備,配置為資源保存在CIB中,使他們可以更容易地監測資源失敗或宕機。
(3)CRM中的幾個基本概念:
資源粘性:資源粘性表示資源是否傾向於留在當前節點,如果為正整數,表示傾向,負數表示移離,-inf表示正無窮,inf表示正無窮。
資源黏性值范圍及其作用:
0:默認選項。資源放置在系統中的最適合位置。這意味着當負載能力“較好”或較差的節點變得可用時才轉移資源。
此選項的作用基本等同於自動故障回復,只是資源可能會轉移到非之前活動的節點上;
大於0:資源更願意留在當前位置,但是如果有更合適的節點可用時會移動。值越高表示資源越願意留在當前位置;
小於0:資源更願意移離當前位置。絕對值越高表示資源越願意離開當前位置;
INFINITY:如果不是因節點不適合運行資源(節點關機、節點待機、達到migration-threshold 或配置更改)而強制資源轉移,
資源總是留在當前位置。此選項的作用幾乎等同於完全禁用自動故障回復;
-INFINITY:資源總是移離當前位置;
資源類型:
primitive(native):基本資源,原始資源
group:資源組
clone:克隆資源(可同時運行在多個節點上),要先定義為primitive后才能進行clone。主要包含STONITH和集群文件系統(cluster filesystem)
master/slave:主從資源,如drdb(下文詳細講解)
RA類型:
Lsb:linux表中庫,一般位於/etc/rc.d/init.d/目錄下的支持start|stop|status等參數的服務腳本都是lsb
ocf:Open cluster Framework,開放集群架構
heartbeat:heartbaet V1版本
stonith:專為配置stonith設備而用
(4)pacemaker 支持集群
基於OpenAIS的集群
基於心跳信息的傳統集群架構
1.4Corosync+Pacemaker 支持集群
可實現多種集群模型,包括 Active/Active、 Active/Passive、 N+1、 N+M、N-to-1、 N-to-N and Split site
主從架構集群:
許多高可用性的情況下,使用Pacemaker和DRBD的雙節點主/從集群是一個符合成本效益的解決方案
多節點備份集群:
支持多少節點,Pacemaker可以顯着降低硬件成本通過允許幾個主/從群集要結合和共享一個公用備份節點
共享存儲集群(多個節點多個服務):
有共享存儲時,每個節點可能被用於故障轉移,Pacemaker甚至可以運行多個服務
站點集群:
Pacemaker 1.2 將包括增強簡化設立分站點集群
二、集群簡介
引自suse官方關於corosync的高可用集群的框架圖:
由此圖,我們可以看到,SUSE官方將集群的Architecture Layers分成四層。
- 第一層:Messaging/Infrastructure Layer提供了HeartBeat節點間傳遞心跳信息,即為心跳層。
- 第二層:Membership Layer層為集群事務決策層,決定了哪些節點作為集群節點,並傳遞給集群內所有節點,如果集群中成員擁有的法定票數不大於半數,該怎么作出決策等,通俗點講,就是投票系統,同時,還提供了構建成員關系的視圖。
- 第三層:Resource Allocation Layer為資源分配層,包含了CRM,CIB;CRM作為資源分配層的核心組件,包括了Local Resource Manager、Transition Engine、Policy Engine三大組件,這三大組件都是在CRM的基礎之上得以實現的,同時,每個節點的CRM還維持本節點的CIB。在CRM中選出一個節點作為DC(Designated Coordinator),DC負責維持主CIB,所以所有CIB的修改都由DC來實現,而后DC同步給其他節點,一個集群只有一個DC。CIB是一個在內存中xml格式書寫的保存着集群配置各條目的配置信息(集群狀態,各節點,各資源,約束關系),可以使用gui修改,也可以使用CRM_sh命令行修改。Transition Engine和Policy Engine,這兩個組件只有DC擁有,PE是當集群狀態改變時,根據配置文件中的約束信息,節點粘性計算要轉移到的節點一應狀態信息,並寫入CIB,TE根據PE作出的指示進行轉移資源等操作。DC將改變的狀態信息傳至各CRM,各節點的CRM將要作出的改變傳給LRM作出相應的更改,LRM有start|stop|monitor三種狀態信息,在接受CRM指令作出更改后,將狀態信息傳回CRM。
- 第四層:Resources Layer層,即資源代理層,負責根據LRM傳來的指令,找到對應的執行腳本執行,資源代理層有LSB格式,OCF格式的腳本,OCF相對於LSB,除了能接收更多參數外,還能提供監控功能。
三、環境介紹
3.1網絡拓撲
3.2環境說明
3.3 集群配置前提
(1)節點間時間必須同步,使用ntp協議實現;
(2)節點間需要通過主機名互相通信,必須解析主機至IP地址
(a)建議名稱解析功能使用hosts文件來實現
(b)通信中使用的名字與節點名字必須保持一致: "uname -n"命令,或“hostname"展示出的名字保持一致
(3)考慮仲裁設備是否會用到
3.4 前期環境准備:
(1) 各服務器關閉防火牆及清空防火牆策略
(2) 各服務器禁用SELinux,然后進行重啟操作
(3) 各服務器設置hosts文件來實現解析
[root@Node1 ~]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.10.7 Node1.contoso.com Node1 192.168.10.8 Node2.contoso.com Node2 192.168.10.9 Node3.contoso.com Node3 192.168.10.100 www.contoso.com
(4)Node1與Node2節點設置時間同步計划任務
[root@Node1 ~]# crontab -e //編輯crontab文件 [root@Node1 ~]# crontab -l //查看任務計划 #synchronization time //每隔五分鍾進行同步一次 */5 * * * * /usr/sbin/ntpdate 192.168.10.9 > /dev/null 2>&1
(5)時間同步
[root@Node3 ~]# ansible all -m command -a 'ntpdate 192.168.10.9' 192.168.10.7 | SUCCESS | rc=0 >> 31 Jan 22:25:31 ntpdate[1739]: adjust time server 192.168.10.9 offset 0.267077 sec 192.168.10.8 | SUCCESS | rc=0 >> 31 Jan 22:25:31 ntpdate[1748]: adjust time server 192.168.10.9 offset -0.162604 sec
四、集群軟件部署與配置
4.1安裝pacemaker與corosync
[root@Node1 ~]# yum -y install pacemaker Loaded plugins: fastestmirror, langpacks CentOS7.4 | 3.6 kB 00:00:00 (1/2): CentOS7.4/group_gz | 156 kB 00:00:00 (2/2): CentOS7.4/primary_db | 3.1 MB 00:00:01 Determining fastest mirrors Resolving Dependencies --> Running transaction check .........................省略部分......................... Installed: pacemaker.x86_64 0:1.1.16-12.el7 Dependency Installed: ****安裝所有依賴包***** cifs-utils.x86_64 0:6.2-10.el7 corosync.x86_64 0:2.4.0-9.el7 corosynclib.x86_64 0:2.4.0-9.el7 libqb.x86_64 0:1.0.1-5.el7 pacemaker-cli.x86_64 0:1.1.16-12.el7 pacemaker-cluster-libs.x86_64 0:1.1.16-12.el7 pacemaker-libs.x86_64 0:1.1.16-12.el7 perl-TimeDate.noarch 1:2.30-2.el7 resource-agents.x86_64 0:3.9.5-105.el7 Complete!
4.2配置文件修改
[root@Node1 ~]# cd /etc/corosync/
[root@Node1 corosync]# cp corosync.conf.example corosync.conf //將模板復制成一份,生成corosync.conf配置文件
[root@Node1 corosync]# grep -v "[[:space:]]*#" /etc/corosync/corosync.conf |grep -v "^[[:space:]]*$" //修改過的配置文件如下
totem { //節點間的通信協議,主要定義通信方式,通信協議版本,加密算法
version: 2 //協議版本
crypto_cipher: aes256 //加密密碼類型
crypto_hash: sha1 //加密為sha1
interface { //定義集群心跳信息及傳遞的接口中,可以有多組
ringnumber: 0 //環數量,如果一個主機有多塊網卡,避免心跳信息環發送
bindnetaddr: 192.168.10.0 //綁定的網段
(本機網段為192.168.10.0/24)
mcastaddr: 239.255.10.9 //組播地址
mcastport: 5405 //組播端口
ttl: 1 //數據包的ttl值,由於不跨三層設備,這里用默認的
1
}
}
logging { //跟日志相關配置
fileline: off //是否記錄fileline
to_stderr: no //表示是否需要發送到錯誤輸出
to_logfile: yes //是否記錄在日志文件中
logfile: /var/log/cluster/corosync.log //日志文件目錄
to_syslog: no //是否將日志發往系統日志
debug: off //是否輸出debug日志
timestamp: on //是否打開時間戳
logger_subsys {
subsys: QUORUM
debug: off
}
}
quorum { //投票系統
provider: corosync_votequorum //支持哪種投票方式
expected_votes:2 //總投票數
two_nodes: 1 //是否為2節點集群(兩節點特殊}
}
nodelist { //節點列表
node {
ring0_addr: Node1.contoso.com //節點名稱:主機名或IP
nodeid: 1 //節點編號
}
node {
ring0_addr: Node2.contoso.com
nodeid: 2
}
}
4.3生成生成密匙文件拷貝至另一節點
[root@Node1 corosync]# corosync-keygen //生成密鑰文件 Corosync Cluster Engine Authentication key generator. Gathering 1024 bits for key from /dev/random. Press keys on your keyboard to generate entropy. Press keys on your keyboard to generate entropy (bits = 920). Press keys on your keyboard to generate entropy (bits = 1000). Writing corosync key to /etc/corosync/authkey. [root@Node1 corosync]# ll authkey //查看文件權限為400 -r-------- 1 root root 128 Jan 31 16:21 authkey [root@Node1 corosync]# scp -p authkey corosync.conf node2:/etc/corosync/ //將兩個文件復制到另外一個節點 root@node2's password: authkey 100% 128 90.7KB/s 00:00 corosync.conf 100% 3090 4.0MB/s 00:00
4.4 各節點啟動服務,查看狀態是否正常
[root@Node1 corosync]# systemctl start corosync.service //啟動corosync服務 [root@Node1 corosync]# systemctl start pacemaker.service //啟動pacemaker服務 [root@Node1 corosync]# ss -unl //查看UDP端口是否處於監聽狀態 State Recv-Q Send-Q Local Address:Port Peer Address:Port UNCONN 0 0 *:5353 *:* UNCONN 0 0 192.168.10.7:5404 *:* UNCONN 0 0 239.255.10.9:5405 *:* UNCONN 0 0 192.168.10.7:5405 *:* UNCONN 0 0 192.168.122.1:53 *:* UNCONN 0 0 127.0.0.1:323 *:* UNCONN 0 0 *%virbr0:67 *:* UNCONN 0 0 *:49753 *:* UNCONN 0 0 ::1:323 :::*
4.5 檢查集群啟動狀態
(1)查看corosync引擎是否正常啟動
[root@Node1 ~]# grep -e "Corosync Cluster Engine" -e "configuration file" /var/log/cluster/corosync.log Feb 01 08:53:49 [41390] Node1.contoso.com cib: info: cib_file_write_with_digest: Reading cluster configuration file /var/lib/pacemaker/cib/cib.CIKPy4 (digest: /var/lib/pacemaker/cib/cib.UhBVLu) Feb 01 08:53:49 [41390] Node1.contoso.com cib: info: cib_file_write_with_digest: Reading cluster configuration file /var/lib/pacemaker/cib/cib.ThQ0B3 (digest: /var/lib/pacemaker/cib/cib.NhKZPt) [root@Node1 ~]#
(2)查看初始化成員節點通知是否正常發出
[root@Node2 ~]# grep TOTEM /var/log/cluster/corosync.log Feb 01 08:53:05 [49238] Node2.contoso.com corosync notice [TOTEM ] Initializing transport (UDP/IP Multicast). Feb 01 08:53:05 [49238] Node2.contoso.com corosync notice [TOTEM ] Initializing transmit/receive security (NSS) crypto: aes256 hash: sha1 Feb 01 08:53:05 [49238] Node2.contoso.com corosync notice [TOTEM ] The network interface [192.168.10.8] is now up. Feb 01 08:53:05 [49238] Node2.contoso.com corosync notice [TOTEM ] A new membership (192.168.10.8:4) was formed. Members joined: 2 Feb 01 08:53:05 [49238] Node2.contoso.com corosync notice [TOTEM ] A new membership (192.168.10.7:8) was formed. Members joined: 1
(3)查看初始化成員節點通知是否正常發出
[root@Node2 ~]# grep ERROR: /var/log/cluster/corosync.log
(4)檢查集群啟動狀態
[root@Node1 corosync]# corosync-cfgtool -s //檢查各節點通信狀態(顯示為no faults即為OK) Printing ring status. Local node ID 1 RING ID 0 id = 192.168.10.7 status = ring 0 active with no faults [root@Node2 ~]# corosync-cfgtool -s Printing ring status. Local node ID 2 RING ID 0 id = 192.168.10.8 status = ring 0 active with no faults
(5)檢查集群成員關系及Quorum API:
[root@Node2 ~]# corosync-cmapctl | grep members runtime.totem.pg.mrp.srp.members.1.config_version (u64) = 0 runtime.totem.pg.mrp.srp.members.1.ip (str) = r(0) ip(192.168.10.7) runtime.totem.pg.mrp.srp.members.1.join_count (u32) = 1 runtime.totem.pg.mrp.srp.members.1.status (str) = joined runtime.totem.pg.mrp.srp.members.2.config_version (u64) = 0 runtime.totem.pg.mrp.srp.members.2.ip (str) = r(0) ip(192.168.10.8) runtime.totem.pg.mrp.srp.members.2.join_count (u32) = 1 runtime.totem.pg.mrp.srp.members.2.status (str) = joined
(5)查看集群節點狀態及DC:
五、http軟件部署及NFS設置
(1)Node1與Node2節點安裝httpd軟件
[root@Node3 ~]#ansible Webservers -m yum -a 'name=httpd state=latest' [root@Node3 ~]#ansible Webservers -m service -a 'enabled=on name=httpd state=started'
(2)Node1與Node2節點的/var/www/html目錄下各生成index.html測試頁面
[root@Node1 ~]# echo "<h1>Test Page Node1.contoso.com </h1>" > /var/www/html/index.html //生成測試index測試頁面 [root@Node1 ~]# curl 192.168.10.7 //本地測試是否訪問正常 <h1>Test Page Node1.contoso.com </h1> [root@Node1 ~]# systemctl stop httpd.service //測試正常之后,把httpd服務進行停掉 [root@Node2 ~]# echo "<h1>Test Page Node2.contoso.com </h1>" > /var/www/html/index.html [root@Node2 ~]# [root@Node2 ~]# curl 192.168.10.8 <h1>Test Page Node2.contoso.com </h1> [root@Node2 ~]# systemctl stop httpd.service
(3)Node3節點安裝httpd、nfs軟件及設置
[root@Node3 ~]# yum install httpd -y //安裝httpd軟件,主要為了生成apache用戶,無需啟動 [root@Node3 ~]# mkdir /data/web/htdocs -pv //創建目錄 mkdir: created directory ‘/data’ mkdir: created directory ‘/data/web’ mkdir: created directory ‘/data/web/htdocs’ [root@Node3 ~]# echo "<h1>Content to NFS Server</h1>" > /data/web/htdocs/index.html //創建index.html文件 [root@Node3 ~]# setfacl -m u:apache:rwx /data/web/htdocs/ //設置htdocs目錄對apache用戶具有讀寫執行權限 [root@Node3 ~]# echo "/data/web/htdocs 192.168.10.0/24 (rw)" > /etc/exports //修改服務端配置文件 [root@Node3 ~]# systemctl start nfs-server.service //啟動nfs服務 [root@Node3 ~]# systemctl enable nfs-server.service [root@Node3 ~]# iptables -L //查看防火牆規則 Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination [root@Node3 ~]# getenforce Disabled
六、crmsh命令基本介紹
crmsh提供了一個命令行的交互接口來對Pacemaker集群進行管理,它具有更強大的管理功能,同樣也更加易用,在更多的集群上都得到了廣泛的應用,注:在crm管理接口所做的配置會同步到各個節點上;
pacemaker的配置接口有兩種,一是crmsh,另一個是pcs,主里以crmsh的使用為例。
crmsh依賴pssh這個包,所以兩個都需要分別在各個集群節點上進行安裝,這兩個包可以在這里進行下載http://crmsh.github.io/,下載完成之后進行安裝即可
crmsh的crm命令有兩種模式:一種是命令模式,當執行一個命令,crmsh會把執行得到的結果輸出到shell的標准輸出;另一種是交互式模式
(1)查看配置信息:
(2)crmsh之node子命令介紹 :
crm(live)# node crm(live)node# help attribute Manage attributes clearstate Clear node state //清理當前node的狀態信息 delete Delete node //刪除節點 fence Fence node maintenance Put node into maintenance mode online Set node online //將當前節點重新上線,standby轉為online ready Put node into ready mode server Show node hostname or server address show Show node //顯示當前所有節點 standby Put node into standby //將當前節點轉為備用 status Show nodes' status as XML status-attr Manage status attributes utilization Manage utilization attributes
(3)crmsh之configure子命令介紹 :
node define a cluster node //定義一個集群節點 primitive define a resource //定義資源 monitor add monitor operation to a primitive //對一個資源添加監控選項(如超時時間,啟動失敗后的操作) group define a group //定義一個組類型(包含一個或多個資源,這些資源可通過“組”這個資源統一進行調度) clone define a clone //定義一個克隆類型(可以在同一個集群內的多個節點運行多份克隆) ms define a master-slave resource //定義一個主從類型(集群內的節點只能有一個運行主資源,其它從的做備用) rsc_template define a resource template //定義一個資源模板 location a location preference //定義位置約束優先級(默認運行於那一個節點(如果位置約束的值相同,默認傾向性那一個高,就在那一個節點上運行)) colocation colocate resources //排列約束資源(多個資源在一起的可能性) order order resources //順序約束,定義資源在同一個節點上啟動時的先后順序 rsc_ticket resources ticket dependency property set a cluster property //設置集群屬性 rsc_defaults set resource defaults //設置資源默認屬性(粘性) fencing_topology node fencing order //隔離節點順序 role define role access rights //定義角色的訪問權限 user define user access rights //定義用用戶訪問權限 op_defaults set resource operations defaults //設置資源默認選項 schema set or display current CIB RNG schema show display CIB objects //顯示集群信息庫對 edit edit CIB objects //編輯集群信息庫對象(vim模式下編輯) filter filter CIB objects //過濾CIB對象 delete delete CIB objects //刪除CIB對象 default-timeouts set timeouts for operations to minimums from the meta-data rename rename a CIB object //重命名CIB對象 modgroup modify group //改變資源組 refresh refresh from CIB //重新讀取CIB信息 erase erase the CIB //清除CIB信息 ptest show cluster actions if changes were committed rsctest test resources as currently configured cib CIB shadow management cibstatus CIB status management and editing template edit and import a configuration from a template commit commit the changes to the CIB //將更改后的信息提交寫入CIB verify verify the CIB with crm_verify //CIB語法驗證 upgrade upgrade the CIB to version 1.0 save save the CIB to a file //將當前CIB導出到一個文件中(導出的文件存於切換crm 之前的目錄) load import the CIB from a file //從文件內容載入CIB
(4)crmsh之resource子命令:
crm(live)#resource crm(live)resource# help ban Ban a resource from a node //禁止資源在一個節點 cleanup Cleanup resource status //清理資源狀態 constraints Show constraints affecting a resource //顯示影響資源的約束 demote Demote a master-slave resource //降級主從資源 failcount Manage failcounts //管理員錯誤狀態統計數據 locate Show the location of resources //顯示資源的位置 maintenance Enable/disable per-resource maintenance mode //啟用/禁用每個資源維護模式 manage Put a resource into managed mode //資源定義為可被管理狀態 meta Manage a meta attribute //管理meta 屬性 move Move a resource to another node //將資源移動到另一個節點 operations Show active resource operations //顯示活動的資源的操作 param Manage a parameter of a resource //管理資源參數 promote Promote a master-slave resource refresh Refresh CIB from the LRM status reprobe Probe for resources not started by the CRM restart Restart resources //重啟一個資源 scores Display resource scores //查看資源 secret Manage sensitive parameters start Start resources //開啟一個資源 status Show status of resources //資源當前狀態 stop Stop resources //停止一個資源 trace Start RA unmanage Put a resource into unmanaged mode //資源定義為不可被管理狀態 untrace Stop RA tracing utilization Manage a utilization attribute
(5)crmsh之資源代理RA子命令:
crm(live)# ra crm(live)ra# help classes List classes and providers //列出資源代理類型 info Show meta data for a RA //顯示資源代理的幫助信息 list List RA for a class (and provider) //列出資源代理類型中所擁有的資源代理 providers Show providers for a RA and a class validate Validate parameters for RA
七、使用crmsh配置pacemaker
(1)基本配置
crm //切換至crm命令提示符
crm(live)# config //切換至配置模式
crm(live)configure#property stonith-enabled=false //測試環境沒有fence設備,故禁用stonith設備
crm(live)configure#property no-quorum-policy=ignore //忽略集群中當節點數小於等於quorum,節點數將無法運行,默認是stop
crm(live)configure#property default-resource-stickiness=INFINITY //資源粘性配置,主節點故障恢復后不切回資源
(2)配置web高可用集群
crm(live)configure# primitive webip ocf:heartbeat:IPaddr parms ip="192.168.10.100" nic="ens33" cidr_netmask="24" broadcast="192.168.10.255" //定義webip資源 crm(live)configure# primitive webserver systemd:httpd op start timeout=100s op stop timeout=100s //定義webserver資源 crm(live)configure# primitive webstore ocf:heartbeat:Filesystem params device="192.168.10.9:/data/web/htdocs" directory="/var/www/html" fstype="nfs" op start timeout=60s op stop timeout=60s //定義webstore資源
(3)crm status查看資源
高可用集群默認為資源平均分配,因此我們要通過組或者約束使資源在同一個節點
crm(live)configure# group webservice webstore webserver webip crm(live)configure# verify crm(live)configure# commit crm(live)configure# cd .. crm(live)# status Stack: corosync Current DC: Node1.contoso.com (version 1.1.16-12.el7-94ff4df) - partition with quorum Last updated: Thu Feb 1 14:14:14 2018 Last change: Thu Feb 1 14:11:57 2018 by root via cibadmin on Node1.contoso.com 2 nodes configured 3 resources configured Online: [ Node1.contoso.com Node2.contoso.com ] Full list of resources: Resource Group: webservice webstore (ocf::heartbeat:Filesystem): Started Node1.contoso.com webserver (systemd:httpd): Started Node1.contoso.com webip (ocf::heartbeat:IPaddr): Started Node1.contoso.com crm(live)#
(4)查看網站是正常(先做hosts解析記錄)
檢查NFS是否掛載成功
(5)把Node1設為standby模式
進入Node2節點查看IP地址與NFS是否轉移過來
查看網站是正常
(6)定義對資源監控monitor
因為corosync+pacemaker集群默認對節點高可用,但是對於節點上資源的運行狀態無法監控,因此,我們要配置集群對於資源的監控,在資源因意外情況下,無法提供服務時,對資源提供高可用。
[root@Node1 ~]# crm configure
crm(live)configure# monitor webip 30s:20s
crm(live)configure# monitor webserver 30s:100s
crm(live)configure# monitor webstore 60s:40s
crm(live)configure# verify
crm(live)configure# commit
此時資源運行於Node1節點,在Node1上手動結束httpd,測試監控,經過一小段時間后,httpd又自動啟來了!
(7)定義約束
資源約束則用以指定在哪些群集節點上運行資源,以何種順序裝載資源,以及特定資源依賴於哪些其它資源。
pacemaker共給我們提供了三種資源約束方法:
1)Resource Location(資源位置):定義資源可以、不可以或盡可能在哪些節點上運行;
2)Resource Collocation(資源排列):排列約束用以定義集群資源可以或不可以在某個節點上同時運行;
3)Resource Order(資源順序):順序約束定義集群資源在節點上啟動的順序;
定義約束時,還需要指定分數。各種分數是集群工作方式的重要組成部分。其實,從遷移資源到決定在已降級集群中停止哪些資源的整個過程是通過以某種方式修改分數來實現的。分數按每個資源來計算,資源分數為負的任何節點都無法運行該資源。在計算出資源分數后,集群選擇分數最高的節點。INFINITY(無窮大)目前定義為 1,000,000。加減無窮大遵循以下3個基本規則:
1)任何值 + 無窮大 = 無窮大
2)任何值 - 無窮大 = -無窮大
3)無窮大 - 無窮大 = -無窮大
定義資源約束時,也可以指定每個約束的分數。分數表示指派給此資源約束的值。分數較高的約束先應用,分數較低的約束后應用。通過使用不同的分數為既定資源創建更多位置約束,可以指定資源要故障轉移至的目標節點的順序
[root@Node1 ~]# crm configure crm(live)configure# delete webservice crm(live)configure# location webip_on_node1 webip inf: Node1.contoso.com //位置約束 crm(live)configure# colocation webip_with_webserver_with_webstore inf: webip webserver webstore //排列約束 crm(live)configure# order webstore_befroe_webserver_befroe_webip Mandatory: webstore webserver webip //順序約束 crm(live)configure# verify //檢查語法是否有錯誤 crm(live)configure# commit //提交配置 crm(live)configure# cd .. crm(live)# status Stack: corosync Current DC: Node1.contoso.com (version 1.1.16-12.el7-94ff4df) - partition with quorum Last updated: Fri Feb 2 11:35:58 2018 Last change: Fri Feb 2 11:35:53 2018 by root via cibadmin on Node1.contoso.com 2 nodes configured 3 resources configured Online: [ Node1.contoso.com Node2.contoso.com ] Full list of resources: webstore (ocf::heartbeat:Filesystem): Started Node1.contoso.com webserver (systemd:httpd): Started Node1.contoso.com webip (ocf::heartbeat:IPaddr): Started Node1.contoso.com crm(live)#
(8)查看當前配置信息
(9)將Node1節點設為standby,看資源是否轉移成功