高可用叢集有多種解決方案,例如keepalived程式可實作,還有就是ais家族中實作高可用叢集多多種方式;較早出現的heartbeat,OpenAIS僅作為參考性模型,後來紅帽在OpenAIS基礎上研發的CMAN,
還有OpenAIS參考性中,實作獨立出來成為的項目corosync都可用于高可用叢集;但是,這些應用程式都是源于最早的heartbeat程式開發出來的。
OpenAIS家族中對于高可用叢集在實作時的方式,都遵循一樣的工作模式;都是通過叢集方式來提高系統可用性,那麼就是通過提供備援主機節點,來完成系統可用性提升;
要實作高可用叢集服務,就得把所有提供服務的節點納入到叢集中來,由叢集統一負責管理,指派資源歸哪個節點運作,并且還要檢查各節點的健康狀态,出現掉線,要把服務遷移到其它節點上運作,以實作服務不掉線,實作該服務的高可用的目的。
但是,要實作這一目的是非常複雜的,需要經過多個層級的控制;例如,每個節點也可以通過單點傳播、多點傳播、廣播方式向同一叢集中的其它節點通告自己的心跳資訊以及其它與目前叢集相關的事務類資訊;這個層次隻負責叢集事務的傳遞,它叫做Messaging Layer消息層。這個消息層主要作用有兩點:通過配置的接口和位址以及方式,來完成叢集心跳及事務資訊傳遞。
任何一個應用程式(服務)要想能夠自己工作成高可用模型,将自己在messaging layer基礎之上,運作為高可用;也就是說必須能與消息層通信。
有些程式能直接消息層通信,但有些應用程式不能,為了讓各應用程式能與消息層通信,就設計出一個通用中間層代為自己實作與消息層通信,這就意味着要接受管理。是以不能與消息層直接通信的程式,想以高可用的方式運作時托管在這個中間層上;由中間層代為管理,它們就是高可用的了;而這個中間層稱為叢集資料總管CRM。
CRM為了便于實作對每個節點的控制,需要一個LRM本地資料總管,來負責具體某個節點上的服務管理,比如監控服務,啟動服務,停止服務等操作;但是,真正完成監控、啟動、停止操作的不是靠crm、lrm來完成的。
我們都知道在linux系統上,正常啟動一個服務,例如在centos 7啟動web服務上是使用systemctl start httpd.service,才能啟動,在centos 6上使用service httpd start;使用的風格不同,centos 7使用systemd,而centos6使用sysv風格。是以,高可用叢集,把各種啟動服務的腳本稱作RA資源代理。高可用叢集實際上最終是通過調用這個服務程式資源代理來啟動服務的。
messaging layer、CRM、RA這三個層次就是ais家族來實作叢集功能的三個基本層次;
總結:
messaging layer主要作用:通過配置的接口和位址以及方式,來完成叢集心跳及事務資訊傳遞;
CRM作用:為非ha-aware(不能直接與消息層通信)程式提供中間層,因為非ha-aware程式不能調用messaging layer,而CRM可以調用了messaging layer,同時有可以向上提供一個托管接口,讓任何非ha-aware應用程式,想以ha的方式運作時托管在這個中間層上;
而RA的主要作用:主要實作具體的資源管理操作功能。
這三層是概念性的模型,每一層都有其具體實作:
Messaging Layer:3種方案
heartbeat程式、corosync、cman;
CRM:3種方案
haresource、crm、pacemaker;
RA:資源代理當然就是有具體服務的程式包本身提供的了。
messing layer和CRM的組合方式:
heartbeat v1(haresource):自己就是獨立而完整的;
heartbeat v2(crm):自己就是獨立而完整的;
corosync + pacemaker(手動結合):其中corosync有2個版本;
corosync v1 + pacemaker(plugin):沒有獨立投票系統,pacemaker作為插件運作的;
corosync v2 + pacemaker(standalone service):corosync的v2版有完整的投票系統;
cman + rgmanager(RHCS):紅帽自己研發的程式。
corosync v1 + cman + pacemaker:把corosync當做cman的插件來運作,反之也行,因為corosync隻提供messaging layer與pacemaker結合工作,cman提供投票系統但其它功能太差。
想要深入了解學習corosync或ais家族的高可用解決方案裡的概念,去檢視suse官方高可用叢集的官方文檔即可。
quorum機制的概念,這對于多數的分布式系統都通用;主要用于解決發生網絡分區導緻腦裂;
有兩種政策,符合法定票數和不符合法定票數;其中當不符合法定票數政策中,為避免資源争用,使用4種機制,stop:停止所有資源;預設;ignore:忽略法定票數與否,都繼續工作;suicide:自殺;freeze:當機;資源仍在運作,但是不接收新請求。
為了確定自殺成功,使用fencing機制,有了兩種方案:啟用stonith機制;光纖交換機。
注意:高可用叢集中兩節點叢集或偶數節點發生腦裂必須做出決策,這是特殊情況。
叢集資訊及心跳資訊的傳遞方式:單點傳播、廣播、多點傳播。
叢集資源管理:術語DC,叢集的統一排程者;PE,政策引擎。
資源粘性:就是定義資源運作于目前節點的傾向性;預設為0;
資源的傾向性:也稱資源的限制關系,資源對節點的傾向性、資源彼此間排列性、資源啟動順序。
資源的類型:4種類型
primitive:表示資源能且隻能運作在一個節點上;是基本資源或主資源,是最常見的資源類型,僅能運作一份,僅能運作于一個節點;
group:組資源,将組成一個HA Service所需要的所有資源組織在一起;
clone:克隆資源,同一資源可以出現多份副本,可以運作多個節點;
multi-state(master/slave):多狀态資源,是特殊克隆的資源,副本間存在主從關系;
RA:資源代理,5種
LSB:Linux标準庫,位于/etc/rc.d/init.d/*,至少支援start,stop,restart,status,reload,force-reload;注意:不能開機自動運作;
OCF:open Cluster framework,此種腳本比LSB腳本更靈活,/usr/lib/ocf/resource.d/provider/,類似于LSB腳本,但要求支援start,stop,status,monitor,meta-data;
STONITH:實作管理調用stonith裝置的功能;
systemd:用unit file檔案實作,/usr/lib/systemd/system/;注意:必須設定為enable狀态;否則無法讓crm代理管理;
service:調用使用者自定義腳本;
示範:配置一個基于nfs的高可用mariadb服務:
實體機為win7,虛拟機使用centos7系統
時間伺服器:172.18.0.1
nfs伺服器:172.18.11.113
mariadb有兩節點:
node1:172.18.11.111,主機名:node1.stu11.com
node2:172.18.11.112,主機名:node2.stu11.com
在兩節點上執行如下操作:
第一步:時間同步
]# ntpdate 172.18.0.1 向時間伺服器同步時間
]# crontab -e 定義時間同步周期任務
*/5 * * * * /usr/sbin/ntpdate 172.18.0.1 &> /dev/null
第二步:能夠基于主機名互相解析,并且解析主機名要與使用的主機名一緻
]# vim /etc/hosts
172.18.11.111 node1.stu11.com node1
172.18.11.112 node2.stu11.com node2
確定使用的名稱和解析的名稱必須一緻;解析的名稱設定為什麼,使用是hostname指令看到的必須一樣;否則,高可用叢集不可用。
第三步:永久生效,設定主機名:
]#hostnamectl set-hostname node1.stu11.com
]#hostnamectl set-hostname node2.stu11.com
兩節點,安裝mariadb, pacemaker
]# yum -y install mariadb-server
]# systemctl enable mariadb.service
]# yum -y install pacemaker
]# systemctl start corosync.service pacemaker.service
配置nfs伺服器:
]# yum -y install nfs-utils
]# vim /etc/exports
/mysql 172.18.11.0/24(rw,no_root_squash)
在兩節點建立資料庫存儲路徑:
]# mkdir /mysql
]# chown mysql.mysql /mysql
測試在兩節點挂載是否成功:
]# showmount -e 172.18.11.113
]# mount -t nfs 172.18.11.113:/mysql /mysql
]# mount
]# vim /etc/my.cnf
datadir=/mysql
skip_name_resolve=on
innodb_file_per_table=on
]# crm ra
<a href="http://s3.51cto.com/wyfs02/M00/82/21/wKioL1dMNSDhVYgWAAA6L1eGPSg298.png" target="_blank"></a>
確定資源代理已經存在;
檢視叢集狀态:
<a href="http://s3.51cto.com/wyfs02/M00/82/21/wKioL1dMNA_jGetxAAA7Pv4cjfE644.png" target="_blank"></a>
定義叢集資源:
<a href="http://s5.51cto.com/wyfs02/M02/82/21/wKioL1dMM9bzSig0AABEAz5tVzc957.png" target="_blank"></a>
<a href="http://s5.51cto.com/wyfs02/M02/82/21/wKioL1dMNFzSMvnhAABOV2oAwGo468.png" target="_blank"></a>
綁定資源在一起:
<a href="http://s3.51cto.com/wyfs02/M00/82/22/wKiom1dMNBnx9WFFAAAZdnwq1Gc779.png" target="_blank"></a>
<a href="http://s3.51cto.com/wyfs02/M00/82/21/wKioL1dMNKGTj8oiAABJ5C12DIA742.png" target="_blank"></a>
手動使node1下線,檢視資源是否遷移
]# crm node standby
<a href="http://s2.51cto.com/wyfs02/M02/82/21/wKioL1dMNPniXNXuAABWr7tSU7I744.png" target="_blank"></a>
以上示範,實作了基于nfs的mariadb的高可用
本文轉自 crystaleone 51CTO部落格,原文連結:http://blog.51cto.com/linsj/1784597,如需轉載請自行聯系原作者