一、概述:
1.1 什么是AIS和OpenAIS?
AIS是應用接口規范,是用來定義應用程序接口(API)的開放性規范的集合,這些應用程序作為中間件為應用服務提供一種開放、高移植性的程序接口。是在實現高可用應用過程中是亟需的。服務可用性論壇(SA Forum)是一個開放性論壇,它開發并發布這些免費規范。使用AIS規范的應用程序接口(API),可以減少應用程序的復雜性和縮短應用程序的開發時間,這些規范的主要目的就是為了提高中間組件可移植性和應用程序的高可用性。
OpenAIS是基于SA Forum 標準的集群框架的應用程序接口規范。OpenAIS提供一種集群模式,這個模式包括集群框架,集群成員管理,通信方式,集群監測等,能夠為集群軟件或工具提供滿足 AIS標準的集群接口,但是它沒有集群資源管理功能,不能獨立形成一個集群。
1.2 corosync簡介
corosync最初只是用來演示OpenAIS集群框架接口規范的一個應用,可以說corosync是OpenAIS的一部分,但后面的發展明顯超越了官方最初的設想,越來越多的廠商嘗試使用corosync作為集群解決方案。如Redhat的RHCS集群套件就是基于corosync實現。
corosync只提供了 Cluster Messaging Layer(集群信息層)負責集群信息以及心跳信息傳遞),并沒有資源管理功能,資源管理還得依賴于上層的crm(Cluster resource Manager,集群資源管理器),對服務或者資源進行管理.而corosync與pacemaker 是最佳組合.corosync 將底層的集群信息統一管理,并提供API 上上一層的pacemaker 實現資源,服務等統一調度,進行資源/服務管理.
1.3 corosync+pacemaker HA 高可用集群架構說明
1.3.1 架構示意圖:

高可用集群可分為三個層次結構,分別由紅色部分的Messaging與Membership層,藍色部分的Cluster Resource Manager(CRM)層,綠色部分的Local Resource Manager(LRM)與Resource Agent(RA)組成,下面我們就來具體說明(如上圖),
1.位于最底層的是信息和成員關系層(Messaging and Membership),Messaging主要用于節點之間傳遞心跳信息,也稱為心跳層。節點之間傳遞心跳信息可以通過廣播,組播,單播等方式。成員關系(Membership)層,這層最重要的作用是主節點(DC)通過Cluster Consensus Menbership Service(CCM或者CCS)這種服務由Messaging層提供的信息,來產生一個完整的成員關系。這層主要實現承上啟下的作用,承上,將下層產生的信息生產成員關系圖傳遞給上層以通知各個節點的工作狀態;啟下,將上層對于隔離某一設備予以具體實施。
(該層即時使用corosync實現)
2.集群資源管理層(Cluster Resource Manager),真正實現集群服務的層。在該層中每個節點都運行一個集群資源管理器(CRM,cluster Resource Manager),它能為實現高可用提供核心組件,包括資源定義,屬性等。在每一個節點上CRM都維護有一個CIB(集群信息庫 XML文檔)和LRM(本地資源管理器)組件。對于CIB,只有工作在DC(主節點)上的文檔是可以修改的,其他CIB都是復制DC上的那個文檔而來的。對于LRM,是執行CRM傳遞過來的在本地執行某個資源的執行和停止的具體執行人。當某個節點發生故障之后,是由DC通過PE(策略引擎)和TE(實施引擎)來決定是否搶奪資源。
3.資源代理層(Resource Agents),集群資源代理(能夠管理本節點上的屬于集群資源的某一資源的啟動,停止和狀態信息的腳本),資源代理分為:LSB(/etc/init.d/*),OCF(比LSB更專業,更加通用),Legacy heartbeat(v1版本的資源管理)。
1.4 Cluster Messaging Layer核心組件說明
1.4.1 核心組件示意圖:

1.4.2 核心組件說明:
1.ccm組件(Cluster Consensus Menbership Service):作用,承上啟下,監聽底層接受的心跳信息,當監聽不到心跳信息的時候就重新計算整個集群的票數和收斂狀態信息,并將結果轉遞給上層,讓上層做出決定采取怎樣的措施,ccm還能夠生成一個各節點狀態的拓撲結構概覽圖,以本節點做為視角,保證該節點在特殊情況下能夠采取對應的動作。
2.crmd組件(Cluster Resource Manager,集群資源管理器,也就是pacemaker):實現資源的分配,資源分配的每個動作都要通過crm來實現,是核心組建,每個節點上的crm都維護一個cib用來定義資源特定的屬性,哪些資源定義在同一個節點上。
3.cib組件(集群信息基庫,Cluster Infonation Base):是XML格式的配置文件,在內存中的一個XML格式的集群資源的配置文件,主要保存在文件中,工作的時候常駐在內存中并且需要通知給其它節點,只有DC上的cib才能進行修改,其他節點上的cib都是拷貝DC上。配置cib文件的方法有,基于命令行配置和基于前臺的圖形界面配置。
4.lrmd組件(Local Resource Manager,本地資源管理器):用來獲取本地某個資源的狀態,并且實現本地資源的管理,如當檢測到對方沒有心跳信息時,來啟動本地的服務進程等。
5.pengine組件:
PE(Policy Engine):策略引擎,來定義資源轉移的一整套轉移方式,但只是做策略者,并不親自來參加資源轉移的過程,而是讓TE來執行自己的策略。
STONITH(Shoot The Other Node in the Head,”爆頭“), 這種方式直接操作電源開關,當一個節點發生故障時,另 一個節點如果能偵測到,就會通過網絡發出命令,控制故障節點的電源開關,通過暫時斷電,而又上電的方式使故障節點被重啟動, 這種方式需要硬件支持。
TE(Transition Engine): 就是來執行PE做出的策略的并且只有DC上才運行PE和TE。
6.stonithd組件
STONITH應用案例(主從服務器),主服務器在某一端時間由于服務繁忙,沒時間響應心跳信息,如果這個時候備用服務器一下子把服務資源搶過去,但是這個時候主服務器還沒有宕掉,這樣就會導致資源搶占,就這樣用戶在主從服務器上都能訪問,如果僅僅是讀操作還沒事,要是有寫的操作,那就會導致文件系統崩潰,這樣一切都玩了,所以在資源搶占的時候,可以采用一定的隔離方法來實現,就是備用服務器搶占資源的時候,直接把主服務器給STONITH,就是我們常說的”爆頭 ”。
STONITH有硬件級別如power switch(電源交換機); 軟件級別的如 xen/kvm…等,但是不靠譜
1.4 CRM中的幾個基本概念
1.4.1 資源粘性:
資源粘性表示資源是否傾向于留在當前節點,如果為正整數,表示傾向,負數則會離開,-inf表示正無窮,inf表示正無窮。
(注意: 當正無窮與負無窮相遇做選擇時,結果為選擇負無窮)
資源粘滯性相當于其他高可用集群解決方案中的權重,可在服務器宕機時候選擇備用服務器替代成為主服務器; 也可以用于定義資源/服務 跟隨指定
的資源或者服務一起啟動/停止等功用.
1.4.2 資源類型:
- primitive(native):基本資源,原始資源
- group:資源組
- clone:克隆資源(可同時運行在多個節點上),要先定義為primitive后才能進行clone。主要包含STONITH和集群文件系統(cluster filesystem)
- master/slave:主從資源,如drdb(下文詳細講解)
1.4.3 RA(Resource Agents)類型:
- Lsb:linux表中庫,一般位于/etc/rc.d/init.d/目錄下的支持start|stop|status等參數的服務腳本都是lsb
- ocf:Open cluster Framework,開放集群架構
- heartbeat:heartbaet V1版本
- stonith:專為配置stonith設備而用
1.5 集群類型和模型
- corosync+pacemaker可實現多種集群模型,包括 Active/Active, Active/Passive, N+1, N+M, N-to-1 and N-to-N。
-
Active/Passive 冗余:
-
N to N 冗余(多個節點多個服務):
corosync的程序環境:
配置文件:/etc/corosync/corosync.conf
密鑰文件:/etc/corosync/authkey
Unit File:corosync.service
配置文件格式:
totem { }:
interface { }:
totem協議:節點間的通信協議,主要定義通信方式、通信協議版本、加密算法等 ;
interface{}:定義集群心跳信息傳遞的接口,可以有多組;
Within the interface sub-directive of totem there are four parameters which are required. There is one parameter which is optional.
ringnumber: When using the redundant ring protocol, each interface should specify separate ring numbers to uniquely identify to the membership protocol which interface to use for which redundant ring. The ringnumber must start at 0.
bindnetaddr:should be an IP address configured on the system, or a network address.
mcastaddr: This is the multicast address used by corosync executive.
mcastport:This specifies the UDP port number.
ttl:This specifies the Time To Live (TTL).
version:This specifies the version of the configuration file. 目前取值僅有2一項可用;
crypto_hash:This specifies which HMAC authentication should be used to authenticate all messages. Valid values are none (no authentication), md5, sha1, sha256, sha384 and sha512.
crypto_cipher:This specifies which cipher should be used to encrypt all messages. Valid values are none (no encryption), aes256, aes192, aes128 and 3des. Enabling crypto_cipher, requires also enabling of crypto_hash.
配置示例:
totem {
version: 2
crypto_cipher: aes256
crypto_hash: sha1
interface {
ringnumber: 0
bindnetaddr: 10.1.0.0
mcastaddr: 239.255.100.1
mcastport: 5405
ttl: 1
}
}
logging {
fileline: off
to_stderr: no
to_logfile: yes
logfile: /var/log/cluster/corosync.log
to_syslog: no
debug: off
timestamp: on
logger_subsys {
subsys: QUORUM
debug: off
}
}
quorum {
provider: corosync_votequorum
}
nodelist {
node {
ring0_addr: node1.magedu.com
nodeid: 1
}
node {
ring0_addr: node2.magedu.com
nodeid: 2
}
}
生成authkey:
corosync-keygen
啟動服務:systemctl start corosync.service
驗正服務啟動:
(1) 查看日志;
(2) corosync-cmapctl | grep members
(3) corosync-cfgtool:管理工具;
-s:顯示當前節點各ring相關的信息;
-R:控制所有節點重載配置;
pacemaker:
程序環境:
配置文件:/etc/sysconfig/pacemaker
主程序:/usr/sbin/pacemakerd
Unit File:pacemaker.service
啟動服務:
systemctl start pacemaker.service
監控服務啟動是否正常:
# crm_mon
配置接口(crmsh/pcs)
crmsh:
運行方式:
交互式方式:
crm(live)#
命令方式:
crm COMMAND
獲取幫助:ls, help
help [KEYWORD]
COMMAND:
cd Navigate the level structure
help Show help (help topics for list of topics)
ls List levels and commands
quit Exit the interactive shell
report Create cluster status report
status Cluster status
up Go back to previous level
cib/ CIB shadow management
cibstatus/ CIB status management and editing
cluster/ Cluster setup and management
configure/ CIB configuration
assist/ Configuration assistant
history/ Cluster history
ra/ Resource Agents (RA) lists and documentation
template/ Edit and import a configuration from a template
corosync/ Corosync management
node/ Nodes management
options/ User preferences
resource/ Resource management
script/ Cluster script management
site/ Site support
#注意結尾有 “/”的,代表有子命令
configure命令:
Finally, there are the cluster properties, resource meta attributes defaults, and operations defaults. All are just a set of attributes. These attributes are managed by the following commands:
– property
– rsc_defaults
– op_defaults
Commands for resources are:
– primitive
– monitor
– group
– clone
– ms/master (master-slave)
There are three types of constraints:
– location
– colocation
– order
設置集群的全局屬性:property
stonith-enabled=true|false
定義一個primitive資源的方法:
primitive <rsc> {[<class>:[<provider>:]]<type>} [params attr_list] [op op_type [<attribute>=<value>…] …]
op_type :: start | stop | monitor
定義一個組資源的方法:
group <name> <rsc> [<rsc>…]
<rsc>:資源的ID,字符串;
[<class>:[<provider>:]]<type>
定義資源監控:
(1) monitor <rsc>[:<role>] <interval>[:<timeout>]
(2) primitive <rsc> {[<class>:[<provider>:]]<type>} [params attr_list] [op monitor interval=# timeout=#]
ra:
Commands:
cd Navigate the level structure
classes List classes and providers
help Show help (help topics for list of topics)
info Show meta data for a RA
list List RA for a class (and provider)
ls List levels and commands
providers Show providers for a RA and a class
quit Exit the interactive shell
up Go back to previous level
常用命令:
classes:類別列表
list CLASSES [PROVIDER]:列出指定類型(及提供者)之下的所有可用RA;
info [<class>:[<provider>]:]]<type>:顯示指定的RA的詳細文檔;
資源約束關系的定義:
.資源約束
資源約束則用以指定在哪些群集節點上運行資源,以何種順序裝載資源,以及特定資源依賴于哪些其它資源。
-
Resource Location(資源位置):定義資源可以、不可以或盡可能在哪些節點上運行;
-
Resource Collocation(資源排列):排列約束用以定義集群資源可以或不可以在某個節點上同時運行;
-
Resource Order(資源順序):順序約束定義集群資源在節點上啟動的順序;
定義約束時,還需要指定值。資源安按值管理是集群工作方式的重要組成部分。從遷移資源到決定在已降級集群中停止哪些資源的整個過程是通過以某種方式改變資源值來實現的。值按每個資源來計算,資源值為負的任何節點都無法運行該資源。在計算出資源值后,集群選擇值最高的節點。
有兩個特殊值:inf(正無窮,表示只要有可能就要)、-inf(負無窮,表示只要有可能就不要)
定義資源約束時,也可以指定每個約束的值。值較高的約束先應用,值較低的約束后應用。通過使用不同的值為既定資源創建更多位置約束,可指定資源故障轉移至的目標節點的順序。
資源粘性stickiness: 表示資源是否傾向于留在當前節點
>0: 傾向于留在當前節點
<0: 傾向于離開此節點
=0: 由HA來決定去留
INFINITY: 正無窮大
-INFINITY: 負無窮大
3.4.3 資源約束
- 由此可見,即便集群擁有所有必需資源,但它可能還無法進行正確處理。資源約束則用以指定在哪些群集節點上運行資源,以何種順序裝載資源,以及特定資源依賴于哪些其它資源。pacemaker共給我們提供了三種資源約束方法:
1)Resource Location(資源位置):定義資源可以、不可以或盡可能在哪些節點上運行;
2)Resource Collocation(資源排列):排列約束用以定義集群資源可以或不可以在某個節點上同時運行;
3)Resource Order(資源順序):順序約束定義集群資源在節點上啟動的順序;
- 定義約束時,還需要指定分數。各種分數是集群工作方式的重要組成部分。其實,從遷移資源到決定在已降級集群中停止哪些資源的整個過程是通過以某種方式修改分數來實現的。分數按每個資源來計算,資源分數為負的任何節點都無法運行該資源。在計算出資源分數后,集群選擇分數最高的節點。INFINITY(無窮大)目前定義為 1,000,000。加減無窮大遵循以下3個基本規則:
1)任何值 + 無窮大 = 無窮大
2)任何值 – 無窮大 = -無窮大
3)無窮大 – 無窮大 = -無窮大
1)Resource Location(資源位置):定義資源可以、不可以或盡可能在哪些節點上運行;
2)Resource Collocation(資源排列):排列約束用以定義集群資源可以或不可以在某個節點上同時運行;
3)Resource Order(資源順序):順序約束定義集群資源在節點上啟動的順序;
1)任何值 + 無窮大 = 無窮大
2)任何值 – 無窮大 = -無窮大
3)無窮大 – 無窮大 = -無窮大
定義資源約束時,也可以指定每個約束的分數。分數表示指派給此資源約束的值。分數較高的約束先應用,分數較低的約束后應用。通過使用不同的分數為既定資源創建更多位置約束,可以指定資源要故障轉移至的目標節點的順序
位置約束:
location <id> rsc <score>: <node>
<score>:
#, -#
inf, -inf
#正無窮inf: 只要對應節點Online,無一定運行在此節點上
property default-resource-stickiness=#

排列約束:
colocation <id> <score>: <rsc> <with-rsc>
#定義資源與資源之間的依賴關系
順序約束:
order <id> [{kind|<score>}:] first then [symmetrical=<bool>]
定義服務/資源的啟動|關閉順序
高可用ipvs,可借助于ldirectord實現;
博客作業:corosync, pacemaker,nfs高可用mariadb;
pcs:node1, node2, node3






















































三、在CentOS 7.x上配置基于corosync的httpd-Web高可用
3.1前提:
1) 本配置共有三個測試節點,分別node1.com 和 node2.com, node4.com
對應的IP地址分別為10.1.249.284和10.1.252.218, 10.1.249.70;
2)集群服務為httpd服務;
3)提供web服務的地址為10.1.48.1,即vip;
4)系統為CentOS 7.1 x86_64
5) 各節點名稱必須與實際使用的名稱一致
當上一次遷移,在對應節點出錯時,錯誤信息會一直存在,此時可以手動清除:
清理: 使用 resource> clearup source_name (剛執行遷移并且出錯的資源名字)
3.2準備工作
大致流程:
安裝corosync , pacemaker , crmsh(需要安裝包手動安裝,并且依賴另外兩個rpm 包,需要一同安裝)
配置corosync, 并使其正常啟動
啟動pacemaker
使用crm命令進入pacemaker-crmsh 交互式命令行管理接口
查看集群基本信息,并確保每個節點已經在線
進入configure 模式, 查看各節點status, show(配置), 測試standy 以及online狀態切換
進入ra模式,定義資源resource , 資源為ip等
測試資源在各節點上的切換
3.2.1 為了配置一臺Linux主機成為HA的節點,通常需要做出如下的準備工作:
1) 所有節點的主機名稱和對應的IP地址解析服務可以正常工作,且每個節點的主機名稱需要跟”uname -n“命令的結果保持一致;因此,需要保證兩個節點上的/etc/hosts文件均為下面的內容:
10.1.249.284 node1.com node1
10.1.252.218 node2.com node2
10.1.249.70 node4.com node4
ansible all -m shell -a ‘echo -e “10.1.249.284 node1.com node1\n10.1.252.218 node2.com node2\n10.1.249.70 node4.com node4\n” >> /etc/hosts’
為了使得重新啟動系統后仍能保持如上的主機名稱,還分別需要在各節點執行類似如下的命令:
Node1:
# hostnamectl set-hostname node1.com
# hostname node1.com
Node2:
# hostnamectl set-hostname node2.com
# hostname node2.com
Node4:
# hostnamectl set-hostname node4.com
# hostname node4.com
2)若需要各節點基于密鑰進行ssh通信,這可以通過類似如下的命令實現:
Node1:
# ssh-keygen -t rsa -P ”
# ssh-copy-id -i ~/.ssh/id_rsa.pub root@node2.com
Node2:
# ssh-keygen -t rsa -P ”
# ssh-copy-id -i ~/.ssh/id_rsa.pub root@node1.magedu.com
也可以使用ansible 批量對指定主機傳輸公鑰:
(需要先將主機寫入/etc/ansible/hosts中)
ssh-keygen -t rsa -P ”
ansible all -m authorized_key –a “user=root key='{{ lookup(‘file’, ‘/root/.ssh/id_rsa.pub’) }}’
path=/root/.ssh/authorized_keys manage_dir=no” –ask-pass -c paramiko
#注意: 密鑰文件權限必須為600或者400
3) 多節點時間同步
#在集群系統中,各節點必須進行時間同步,否則會出錯
同步命令:
ntpdate time_server_ip
ansible all -m shell -a “ntpdate 10.1.0.1”
1) 本配置共有三個測試節點,分別node1.com 和 node2.com, node4.com
對應的IP地址分別為10.1.249.284和10.1.252.218, 10.1.249.70;
2)集群服務為httpd服務;
3)提供web服務的地址為10.1.48.1,即vip;
4)系統為CentOS 7.1 x86_64
5) 各節點名稱必須與實際使用的名稱一致


1) 所有節點的主機名稱和對應的IP地址解析服務可以正常工作,且每個節點的主機名稱需要跟”uname -n“命令的結果保持一致;因此,需要保證兩個節點上的/etc/hosts文件均為下面的內容:
10.1.249.284 node1.com node1
10.1.252.218 node2.com node2
10.1.249.70 node4.com node4
為了使得重新啟動系統后仍能保持如上的主機名稱,還分別需要在各節點執行類似如下的命令:
Node1:
# hostnamectl set-hostname node1.com
# hostname node1.com
Node2:
# hostnamectl set-hostname node2.com
# hostname node2.com
Node4:
# hostnamectl set-hostname node4.com
# hostname node4.com
2)若需要各節點基于密鑰進行ssh通信,這可以通過類似如下的命令實現:
Node1:
# ssh-keygen -t rsa -P ”
# ssh-copy-id -i ~/.ssh/id_rsa.pub root@node2.com
Node2:
# ssh-keygen -t rsa -P ”
# ssh-copy-id -i ~/.ssh/id_rsa.pub root@node1.magedu.com
也可以使用ansible 批量對指定主機傳輸公鑰:
(需要先將主機寫入/etc/ansible/hosts中)
ssh-keygen -t rsa -P ”
ansible all -m authorized_key –a “user=root key='{{ lookup(‘file’, ‘/root/.ssh/id_rsa.pub’) }}’
path=/root/.ssh/authorized_keys manage_dir=no” –ask-pass -c paramiko
#注意: 密鑰文件權限必須為600或者400
3) 多節點時間同步
#在集群系統中,各節點必須進行時間同步,否則會出錯
同步命令:
ntpdate time_server_ip
ansible all -m shell -a “ntpdate 10.1.0.1”
4)安裝:各節點安裝相關的程序包,corosync/pacemaker httpd 等
ansible all -m shell -a “yum install corosync pacemaker httpd -y”
ansible all -m shell -a “systemctl disable httpd“


原創文章,作者:ldt195175108,如若轉載,請注明出處:http://www.www58058.com/60910