簡介
說到高可用,我們可能會用heartbeat和keepalived,也可能會用corosync+pacemaker,但他們之間有什麼差別呢?我們在此主要談下heartbeat和corosync+pacemaker之間的淵源。
Heartbeat到了v3版本後,拆分為多個子項目,其中pacemaker就是拆分出來的資料總管。Heartbeat 3.0拆分之後的組成部分:為:
1.Heartbeat:将原來的消息通信層獨立為heartbeat項目,新的heartbeat隻負責維護叢集各節點的資訊以及它們之前通信,被稱為基礎元件;(注意與corosync差別)
2.cluster-glue相當于一個中間層,可以将heartbeat和crm(pacemaker)聯系起來,主要包含2個部分,LRM和STONITH;
3.Resource Agent:用來控制服務啟停,監控服務狀态的腳本集合,這些腳本将被LRM調用進而實作各種資源啟動、停止、監控等等。
4.Pacemaker也就是Cluster Resource Manager (簡稱CRM),用來管理整個HA的控制中心,用戶端通過pacemaker來配置管理監控整個叢集。它不能提供底層心跳資訊傳遞的功能,它要想與對方節點通信需要借助底層(新拆分的heartbeat或corosync)的心跳傳遞服務,将資訊通告給對方。
另,pacemaker管理資源的工具由指令行界面的crmsh、pcs和圖形化界面pygui、hawk等進行管理,我們使用pcs鍊進行資源管理。
通過以上,我們了解了pacemaker的由來,下面我們再來看下叢集底層新拆分的heartbeat和corosync之間的差別:
1.配置檔案的版本管理:Heartbeat隻能為所有的資源配置一個主服務,而corosync則允許為不同的資源組配置不同的主服務
2.管理資源的靈活性:在corosync中,其會自行處理配置檔案的同步問題,heartbeat則無此功能
3.分組管理:Heartbeat隻支援2個節點,而corosync則支援多個節點的叢集,支援把資源進行分組,按照組進行資源的管理,設定主服務,自行進行啟停
4.配置複雜度:Heartbeat非常容易進行配置,第一次配置可能隻需要幾分鐘,而Corosync由于有一定的複雜度則需要一點耐心
是以,一般來說都是選擇corosync來進行心跳的檢測,搭配pacemaker的資源管理系統來建構高可用的系統,下面我們就來介紹下corosync+pacemaker建構高可用系統。
環境說明
IP | hostname | 系統 | VIP |
---|---|---|---|
10.10.10.60 | pcmk-1 | Centos7.2 | 10.10.10.62 |
10.10.10.61 | pcmk-2 | Centos7.2 | 10.10.10.62 |
注:為友善測試,兩台伺服器上都關閉防火牆及selinux
安裝配置
1.配置雙機信任
#配置雙機信任
#pcmk-1
ssh-keygen -t rsa
scp /root/.ssh/id_rsa.pub [email protected]:/root/.ssh/authorized_keys
#pcmk-2
ssh-keygen -t rsa
scp /root/.ssh/id_rsa.pub [email protected]:/root/.ssh/authorized_keys
2.安裝叢集元件
#pcmk-1,pcmk-2
yum install -y pacemaker pcs psmisc policycoreutils-python
安裝完畢後,會生成一個hacluster使用者,供叢集使用。
3.啟動pcs并設為開機啟動
pcs是pacemaker的指令行管理工具,用來管理同步各個節點的corosync的配置檔案
#pcmk-1,pcmk-2
systemctl start pcsd.service
systemctl enable pcsd.service
ln -s '/usr/lib/systemd/system/pcsd.service' '/etc/systemd/system/multi-user.target.wants/pcsd.service'
4.為hacluster設定密碼
安裝元件生成的hacluster使用者,用來本地啟動pcs程序,是以我們需要設定密碼,每個節點的密碼相同。
#pcmk-1,pcmk-2
passwd hacluster
Changing password for user hacluster.
New password:
Retype new password:
Sorry, passwords do not match.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
5.驗證節點(在其中一個節點即可)
#pcmk-1或pcmk-2
[[email protected]1 ~]# pcs cluster auth pcmk-1 pcmk-2
Username: hacluster
Password:
pcmk-2: Authorized
pcmk-1: Authorized
6.生成corosync配置檔案(在其中一個節點即可)
#pcmk-1或pcmk-2
[[email protected]1 ~]# pcs cluster setup --name mycluster pcmk-1 pcmk-2
Shutting down pacemaker/corosync services...
Redirecting to /bin/systemctl stop pacemaker.service
Redirecting to /bin/systemctl stop corosync.service
Killing any remaining services...
Removing all cluster configuration files...
pcmk-1: Succeeded
pcmk-2: Succeeded
Synchronizing pcsd certificates on nodes pcmk-1, pcmk-2...
pcmk-2: Success
pcmk-1: Success
Restaring pcsd on the nodes in order to reload the certificates...
pcmk-2: Success
pcmk-1: Success
以上建立一個名為mycluster叢集,生成并同步corosync配置檔案,生成的檔案為/etc/corosync/corosync.conf
注意:若在另一個節點生成需要重新驗證節點。
7.啟動叢集并設為自啟動(在其中一個節點即可)
#all參數會使每個節點都啟動,若沒有all則隻在本地生效
[root@pcmk-1 ~]# pcs cluster start --all
pcmk-1: Starting Cluster...
pcmk-2: Starting Cluster...
[root@pcmk-1 ~]# pcs cluster enable --all
pcmk-1: Cluster Enabled
pcmk-2: Cluster Enabled
8.檢視叢集狀态
[[email protected]1 ~]# pcs cluster status
Cluster Status:
Last updated: Fri Jan 15 10:05:43 2016 Last change: Fri Jan 15 09:56:15 2016 by hacluster via crmd on pcmk-2
Stack: corosync
Current DC: pcmk-2 (version 1.1.13-10.el7-44eb2dd) - partition with quorum
2 nodes and 0 resources configured
Online: [ pcmk-1 pcmk-2 ]
PCSD Status:
pcmk-1: Online
pcmk-2: Online
其中Online表示pcmk-1,pcmk-2節點的兩個主機存活,pcsd status表示兩個節點上的pcsd程序存活。
9.檢視corosync相關狀态
[[email protected]1 ~]# corosync-cfgtool -s
Printing ring status.
Local node ID 1
RING ID 0
id = 10.10.10.60
status = ring 0 active with no faults
#檢驗corosync成員
[[email protected]1 ~]# 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(10.10.10.60)
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(10.10.10.61)
runtime.totem.pg.mrp.srp.members.2.join_count (u32) = 1
runtime.totem.pg.mrp.srp.members.2.status (str) = joined
#檢查corosync狀态
[[email protected]1 ~]# pcs status corosync
Membership information
----------------------
Nodeid Votes Name
1 1 pcmk-1 (local)
2 1 pcmk-2
10.檢視pacemaker程序
[[email protected] ~]# ps axf |grep pacemaker
22445 pts/0 S+ 0:00 \_ grep --color=auto pacemaker
22105 ? Ss 0:00 /usr/sbin/pacemakerd -f
22106 ? Ss 0:00 \_ /usr/libexec/pacemaker/cib
22107 ? Ss 0:00 \_ /usr/libexec/pacemaker/stonithd
22108 ? Ss 0:00 \_ /usr/libexec/pacemaker/lrmd
22109 ? Ss 0:00 \_ /usr/libexec/pacemaker/attrd
22110 ? Ss 0:00 \_ /usr/libexec/pacemaker/pengine
22111 ? Ss 0:00 \_ /usr/libexec/pacemaker/crmd
11.檢視整個叢集所有元件的狀态
[[email protected]1 ~]# pcs status
Cluster name: mycluster
WARNING: no stonith devices and stonith-enabled is not false
Last updated: Fri Jan 15 10:10:59 2016 Last change: Fri Jan 15 09:56:15 2016 by hacluster via crmd on pcmk-2
Stack: corosync
Current DC: pcmk-2 (version 1.1.13-10.el7-44eb2dd) - partition with quorum
2 nodes and 0 resources configured
Online: [ pcmk-1 pcmk-2 ]
Full list of resources:
PCSD Status:
pcmk-1: Online
pcmk-2: Online
Daemon Status:
corosync: active/enabled
pacemaker: active/enabled
pcsd: active/enabled
12.檢查配置檔案是否正确
[[email protected]1 ~]# crm_verify -L -V
error: unpack_resources: Resource start-up disabled since no STONITH resources have been defined
error: unpack_resources: Either configure some or disable STONITH with the stonith-enabled option
error: unpack_resources: NOTE: Clusters with shared data need STONITH to ensure data integrity
Errors found during check: config not valid
為保證資料安全性,pacemaker預設啟動stonith,但是我們沒有配置stonith,是以報錯。我們先暫時禁用stonith,等會再配置stonith
#禁用stonith,再次檢查配置檔案正常
[root@pcmk-1 ~]# pcs property set stonith-enabled=false
[root@pcmk-1 ~]# crm_verify -L
13.添加虛拟ip資源–vip(漂移ip)
[root@pcmk-1 heartbeat]# pcs resource create ClusterIP ocf:heartbeat:IPaddr2 ip=10.10.10.62 cidr_netmask=32 op monitor interval=30s
在這裡我們以10.10.10.62作為浮動IP,名字為ClusterIP 并且告訴叢集每30秒檢查它一次。
其中ocf: heartbeat:IPaddr2。這告訴Pacemaker三件事情,第一個部分ocf,指明了這個資源采用的标準(類型)以及在哪能找到它。第二個部分标明這個資源腳本的在ocf中的名字空間,在這個例子中是heartbeat。最後一個部分指明了資源腳本的名稱。
#運作下面的指令來獲得可用的資源
[root@pcmk-1 resource.d]# pcs resource standards
ocf
lsb
service
systemd
stonith
#運作下面的指令來獲得可用的ocf資源提供者
[root@pcmk-1 ~]# pcs resource providers
heartbeat
openstack
pacemaker
#如果你想看特定一個ocf資源提供者的所有可用資源代理
[root@pcmk-1 resource.d]# pcs resource agents ocf:heartbeat
CTDB
Delay
Dummy
Filesystem
IPaddr
IPaddr2
IPsrcaddr
LVM
MailTo
........
14.檢視IP資源狀态
[[email protected]1 heartbeat]# pcs status
Cluster name: mycluster
Last updated: Fri Jan 15 10:38:04 2016 Last change: Fri Jan 15 10:37:58 2016 by root via cibadmin on pcmk-1
Stack: corosync
Current DC: pcmk-2 (version 1.1.13-10.el7-44eb2dd) - partition with quorum
2 nodes and 1 resource configured
Online: [ pcmk-1 pcmk-2 ]
Full list of resources:
ClusterIP (ocf::heartbeat:IPaddr2): Started pcmk-1
PCSD Status:
pcmk-1: Online
pcmk-2: Online
Daemon Status:
corosync: active/enabled
pacemaker: active/enabled
pcsd: active/enabled
ok,我們的IP資源已經可用,我們可以通過VIP進行通路某些應用了。
下面我們來模拟下故障遷移。
故障遷移
1.停掉pcmk-1節點
[[email protected]1 heartbeat]# pcs cluster stop pcmk-1
pcmk-1: Stopping Cluster (pacemaker)...
pcmk-1: Stopping Cluster (corosync)...
[[email protected]1 heartbeat]# pcs status
Error: cluster is not currently running on this node
2.檢視VIP是否漂移到pcmk-2節點
[[email protected]2 ~]# pcs status
Cluster name: mycluster
Last updated: Fri Jan 15 10:42:41 2016 Last change: Fri Jan 15 10:37:59 2016 by root via cibadmin on pcmk-1
Stack: corosync
Current DC: pcmk-2 (version 1.1.13-10.el7-44eb2dd) - partition with quorum
2 nodes and 1 resource configured
Online: [ pcmk-2 ]
OFFLINE: [ pcmk-1 ]
Full list of resources:
ClusterIP (ocf::heartbeat:IPaddr2): Started pcmk-2
PCSD Status:
pcmk-1: Online
pcmk-2: Online
Daemon Status:
corosync: active/enabled
pacemaker: active/enabled
pcsd: active/enabled
其中pcmk-1節點已經offline,但是pcmk-1的pcsd程序還活着,是以為online,此時VIP已經漂移到pcmk-2
注意:當pcmk-1重新啟動後,會自動加入叢集中,但是vip不會再次漂移到pcmk-1;但是pacemaker老版本中,vip會重新漂移到恢複後的節點。
3.防止資源在節點恢複後遷移
資源在節點恢複後再遷移到原節點往往需要一點時間,此時會無法對外提供服務;當在資料庫間遷移時,會需要更長的時間。但是我們可以通過stickiness來解決,pacemaker預設所有節點的stickiness都為0,我們最通常更改預設情況下的stickiness就足夠了
[root@pcmk-1 ~]# pcs resource defaults resource-stickiness=100
[root@pcmk-1 ~]# pcs resource defaults
resource-stickiness: 100
總結
從cososync+pacemaker與未拆分heartbeat比,配置的确比較麻煩,但是從管理、擴充、應用等方面來說,前者還是非常友善的,沒有那麼多局限性;從長遠來看cososync+pacemaker是趨勢。