pacemaker:心臟起搏器,是一個集羣資源管理器。它實現最大可用性羣集服務的節點和資源級別故障檢測和恢復使用首選集羣基礎設施提供的消息和成員能力。
pacemaker是個資源管理器,不提供心跳信息。
heartbeat3.0拆分後的組成部分:
heartbeat:將原來的消息通信層獨立爲heartbeat項目,新的heartbeat只負責維護集羣各節點的信息以及他們之前通信。
cluster-glue:相當於一箇中間層,它用來將heartbeat和pacemaker關聯起來,主要包含2個部分,即LRM和STONITH。
resource-agent:用來控制服務啓停,監控服務器狀態的腳本集合
pacemaker:也就是cluster resource manager(CRM),用來管理整個HA的控制中心,客戶端通過pacemaker來配置管理監控整個集羣。
pacemaker特點
主機和應用程序級別的故障檢測和恢復
幾乎支持任何冗餘配置
同時支持多種集羣配置模式
配置策略處理法定人數損失
支持應用啓動/關機順序
支持多種模式的應用程序
可以測試任何故障或集羣的羣集狀態
pacemaker內部結構
羣集組件說明
stonithd:心跳系統
lrmd:本地資源管理守護進程。它提供了一個通用的接口支持的資源類型,直接調用資源代理。
pengine:策略引擎。
cib:羣集信息庫。
crmd:羣集資源管理守護進程。主要消息代理的PEnine和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中,使他們可以更容易地監測資源失敗或宕機。
實驗操作centos6.X
拓撲圖
1、安裝配置
yum install corosync pacemaker -y
cd /etc/corosync/
cp corosync.conf.example corosync.conf
2、修改配置文件
vim corosync.conf
compatibility: whitetank
totem { #指定心跳信息傳遞的參數
version: 2
secauth: off #是否開啓安全認證
threads: 0 #開啓線程的個數
interface {
ringnumber: 0 #標識一個通信接口
bindnetaddr: 10.10.0.0 #指定心跳報文傳輸的網段
mcastaddr: 226.94.1.1 #指定心跳報文發送的組播地址
mcastport: 5405 #指定端口
ttl: 1 #生命週期,跨3層的話需要加大一點,不然對方接收不到,最大255
}
}
logging {
fileline: off
to_stderr: no #是否發送標準錯誤輸出
to_logfile: yes #是否記錄到日誌文件中
to_syslog: no #是否記錄到syslog,二者選其一即可
logfile: /var/log/cluster/corosync.log #日誌文件的路徑
debug: off #是否開啓調試信息
timestamp: on #日誌中是否協商時間戳
logger_subsys {
subsys: AMF #是否記錄AMF
debug: off #是否開啓AMF的調試信息
}
}
amf {
mode: disabled #AMF的狀態
}
service { #corosync啓動時也將pacemaker啓動
ver: 0
name: pacemaker
}
aisexec { #指定ais的用戶和組的身份
user: root
group: root
}
3、生成密鑰
corosync-keygen
ll /etc/corosync/ #保證authkey的權限爲400
4、拷貝到node2
scp -p authkey corosync.conf node2:/etc/corosync/
5、自從RH6之後就不再提供pacemaker的命令行工具,我們需要單獨安裝crmsh,它依賴pssh,另外可以使用pcs代替crmsh,下面會單獨講pcs使用。
rpm -ivh crmsh-2.1-1.6.i686.rpm pssh-2.3.1-4.1.i686.rpm
6、兩個節點都需要啓動corosync
service corosync start
7、查看corosync引擎是否正常啓動
grep -e "Corosync Cluster Engine" -e "configuration file" /var/log/cluster/corosync.log
#查看初始化成員節點通知是否正常發出
grep TOTEM /var/log/cluster/corosync.log
#查看pacemaker是否正常啓動
grep pcmk_startup /var/log/cluster/corosync.log
#檢查啓動過程中是否有錯誤產生
grep ERROR: /var/log/cluster/corosync.log
#在node2上啓動服務並查看日誌信息
ssh node2 'service corosync start'
8、crm_mon #查看集羣狀態
crm status #查看集羣狀態
9、接下來要給兩個節點定一下資源配置,所有的操作都是在crm命令下進行的。
#crm
crm(live)
# 進入crm模式並且按兩下Tab鍵補全
?
cd
configure
exit
history
options ra site up
bye cib end help node quit resource status
crm(live)
# help 查看每個命令的意思
This is crm shell, a Pacemaker
command
line interface.
Available commands:
cib manage shadow CIBs
resource resources management
configure CRM cluster configuration
node nodes management
options user preferences
history
CRM cluster
history
site Geo-cluster support
ra resource agents information center
status show cluster status
help,? show help (help topics
for
list of topics)
end,
cd
,up go back one level
quit,bye,
exit
exit
the program
crm(live)
# configure
crm(live)configure
#
? colocation
exit
load op_defaults refresh save user
bye commit fencing_topology location order rename schema verify
cd
default-timeouts filter master primitive role show xml
cib delete graph modgroup property rsc_defaults simulate
cibstatus edit group monitor ptest rsc_template template
clone end help ms quit rsc_ticket up
collocation erase
history
node ra rsctest upgrade
crm(live)configure
# order help 還可以用這種方式查看命令使用格式
usage: order <
id
> {kind|<score>}: <rsc>[:<action>] <rsc>[:<action>] ...
[symmetrical=<
10、定義全局配置並提交
crm(live)
#configure property stonith-enabled=false 禁止stonith設備正常情況下不應該禁止但是我們這裏不考慮stonith設備
crm(live)
#configure property no-quorum-policy=ignore 忽略法定投票因爲節點就兩個不可能超過半數票
crm(live)
# configure 必須在configure目錄下執行
crm(live)configure
# verify
crm(live)configure
# commit
INFO: apparently there is nothing to commit
INFO: try changing something first
資源類型:
添加資源之前必須要知道當前集羣所支持的RA類型,corosync支持heartbeatLSB和ocf等類型的資源代理。目前較爲常用的類型爲LSB和OCF兩類,STONITH類專爲stonith設備而用。
查看當前集羣所支持的RA類型列表
crm(live)
# ra 在資源列表目錄下
crm(live)ra
# classes 查看資源的類型
lsb
ocf / heartbeat pacemaker
service
stonith
查看OCF類型下的資源代理
crm(live)ra
# list ocf
CTDB ClusterMon Dummy Filesystem HealthCPU HealthSMART IPaddr IPaddr2 IPsrcaddr LVM MailTo
Route SendArp Squid Stateful SysInfo SystemHealth VirtualDomain Xinetd apache conntrackd controld
dhcpd ethmonitor exportfs mysql mysql-proxy named nfsserver nginx pgsql
ping
pingd
postfix remote rsyncd rsyslog slapd
symlink
tomcat
crm(live)ra
# list ocf heartbeat
CTDB Dummy Filesystem IPaddr IPaddr2 IPsrcaddr LVM MailTo Route SendArp Squid
VirtualDomain Xinetd apache conntrackd dhcpd ethmonitor exportfs mysql mysql-proxy named nfsserver
nginx pgsql postfix rsyncd rsyslog slapd
symlink
tomcat
11、爲集羣添加資源
IP資源名:node1,IP類型:ocfheartbeat:IPaddr IP:10.10.0.11,啓動監控程序,檢測到失敗後的方式爲重啓服務。
crm(live)
# configure
crm(live)configure
# primitive vip ocf:heartbeat:IPaddr params ip=10.10.0.11 op monitor interval=30s timeout=20s on-fail=restart
crm(live)configure
# verify #校驗
crm(live)configure
# commit
12、定義本地資源httpd服務
crm(live)configure
#
primitive httpd lsb:httpd
13、爲了避免資源分裂,可以把IP和服務加入到一個組內
crm(live)configure
#
group webgroup vip httpd
14、查看IP是否生效
ifconfig
用瀏覽器查看服務是否正常
15、停掉node1,看是否node2能夠正常提供服務,這是實現高可用最重要的一步。
crm(live)
# node standby 讓當前節點自動成爲備用節點
crm(live)
# status
16、資源粘性
我們有時候需要在資源因爲節點故障轉移到其它節點後,即便原來的節點恢復正常也禁止資源再次流轉回來。這可以通過定義資源的黏性(stickiness)來實現。在創建資源時或在創建資源後,都可以指定指定資源黏性
資源黏性值範圍及其作用:
等於0:這是默認選項。資源放置在系統中的最適合位置,這意味着當負載能力“較好”或較差的節點變得可用時才轉移資源。此選項的作用基本等同於自動故障回覆,只是資源可能會轉移到非之前活動的節點上;
大於0:資源更願意留在當前位置,但是如果有更合適的節點可用時會移動。值越高表示資源越願意留在當前位置;
小於0:資源更願意移離當前位置。絕對值越高表示資源越願意離開當前位置;
INFINITY:如果不是因節點不適合運行資源(節點關機、節點待機、達到migration-threshold 或配置更改)而強制資源轉移,資源總是留在當前位置。此選項的作用幾乎等同於完全禁用自動故障回覆;
-INFINITY:資源總是移離當前位置;
手動設置資源的默認黏性值:
# crm configure rsc_defaults resource-stickiness=100
資源約束
資源vip和httpd有可能會分別運行於兩個節點上,這對於通過此IP提供Web服務的應用來說是不成立的,即兩者資源必須同時運行在某節點上,由此可見,即便集羣擁有所有必需資源,但它可能還無法進行正確處理。資源約束則用以指定在哪些羣集節點上運行資源,以何種順序裝載資源,以及特定資源依賴於哪些其它資源。pacemaker共給我們提供了三種資源約束方法:
1)Resource Location(資源位置):定義資源可以、不可以或儘可能在哪些節點上運行;
2)Resource Collocation(資源排列):用以定義集羣資源可以或不可以在某個節點上同時運行;
3)Resource Order(資源順序):順序約束定義集羣資源在節點上啓動的順序;
定義約束時,還需要指定分數。各種分數是集羣工作方式的重要組成部分。其實,從遷移資源到決定在已降級集羣中停止哪些資源的整個過程是通過以某種方式修改分數來實現的。分數按每個資源來計算,資源分數爲負的任何節點都無法運行該資源。在計算出資源分數後,集羣選擇分數最高的節點。INFINITY(無窮大) 目前定義爲 1,000,000。加減無窮大遵循以下3個基本規則:
1)任何值 + 無窮大 = 無窮大
2)任何值 - 無窮大 = -無窮大
3)無窮大 - 無窮大 = -無窮大
定義資源約束時,也可以指定每個約束的分數。分數表示指派給此資源約束的值。分數較高的約束先應用,分數較低的約束後應用。通過使用不同的分數爲既定資源創建更多位置約束,可以指定資源要故障轉移至的目標節點的順序。
對於前述的vip和httpd可能會運行於不同節點的問題,我們還可以通過以下方法來解決:
# crm configure colocation httpd-with-vip INFINITY: httpd vip
我們還可以設置資源啓動順序,vip首先運行,再運行httpd
# crm configure order httpd-after-vip mandatory: vip httpd
此外,某些時候我們可能希望在正常時服務總能在某個性能較強的節點上運行,這可以通過位置約束來實現:
# crm configure location httpd-on-node1 httpd rule 200: #uname eq node1.test.com
這條命令實現了將httpd約束在node1上,且指定其分數爲200;
增加nfs資源
1、配置NFS服務器
mkdir -pv /web
vim /etc/exports
/web/ 10.10.0.0/12(ro,aysnc)
echo '<h1>cluster nfs server</h1>' > /web/index.html
service rpcbind start
service nfs start
showmount -e 10.10.21.221
2、節點掛載測試
mount -t nfs 10.10.21.221:/web /mnt
ll /mnt
total 4
-rw-r--r-- 1 root root 28 Jan 29 17:14 index.html
mount
umount /mnt
3、配置vip、httpd、nfs
crm(live)configure# primitive vip ocf:heartbeat:IPaddr params ip=10.10.0.221 nic=eth0:0 cidr_netmask=12 op monitor interval=15m timeout=30s on-fail=restart
crm(live)configure# verify
crm(live)configure# commit
crm(live)configure# primitive httpd lsb:httpd
crm(live)configure# verify
crm(live)configure# commit
crm(live)configure# primitive nfs ocf:heartbeat:Filesystem params device=10.10.0.221:/web directory=/var/www/html fstype=nfs op monitor timeout=20s
property default-action-timeout=60
crm(live)configure# verify
crm(live)configure# commit
WARNING: nfs: default timeout 20s for start is smaller than the advised 60
WARNING: nfs: default timeout 20s for stop is smaller than the advised 60
出現WARNING的時候,運行下面這條命令
crm(live)configure# property default-action-timeout=60
crm(live)configure# show
node node1.test.com \
attributes standby=off
node node2.test.com \
attributes standby=off
primitive httpd lsb:httpd
primitive nfs Filesystem \
params device="10.10.0.221:/web" directory="/var/www/html" fstype=nfs
primitive vip IPaddr \
params ip=10.10.0.221 nic="eth0:0" cidr_netmask=12 \
op monitor interval=15m timeout=30s on-fail=restart
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 \
last-lrm-refresh=1422524733 \
default-action-timeout=60
4、定義組資源
這三個資源不在同一節點上。可以定義一個組來使資源在同一節點上。
crm(live)configure# group webservie vip nfs httpd
crm(live)configure# verify
crm(live)configure# commit
配置順序約束
crm(live)configure# order vip_then_nfs_then_httpd inf: vip nfs httpd
crm(live)configure# verify
crm(live)configure# commit
#表示啓動順序依次是vip、nfs、httpd
5、定義網絡ping node監控
(1).配置ping node主資源
crm(live)configure# primitive pnode ocf:pacemaker:ping params host_list=10.10.0.1 multiplier=100 op monitor interval=10s timeout=60s
crm(live)configure# verify
crm(live)configure# commit
#host_list:是網關或者可以ping通的其他節點,可以使用多個。
#multiplier:表示如果集羣中的節點可以ping通,那麼節點的分數就會乘以這個參數指定值來進行累加。比如node1,ping通一次就是1*100,2 次就是2*100,依次類推
(2).配置pnode的克隆資源
crm(live)configure# clone cl_pnode pnode
crm(live)configure# verify
crm(live)configure# commit
(3).配置ping node失敗的時候,資源的故障轉移
crm(live)configure# location nfs_on_ping webservie rule -inf: not_defined pingd or pingd number:lte 0
crm(live)configure# verify
crm(live)configure# commit
#表示如果由ping node得出的分數小於等於0 或者某個節點沒有定義域ping node 相關的屬性的話,那麼就進行資源的轉移。