一、介紹
高可用,大家可能會想到比較簡單的Keepalived,或者更早一點的 heartbeat,也可能會用到 Corosync+Pacemaker,那么他們之間有什么區別。
Heartbeat到了v3版本后,拆分為多個子項目:Heartbeat、cluster-glue、Resource Agent、Pacemaker。
Heartbeat:只負責維護集群各節點的信息以及它們之前通信。
Cluster-glue:當於一個中間層,可以將heartbeat和crm(pacemaker)聯系起來,主要包含2個部分,LRM和STONITH;
Resource Agent :用來控制服務啟停,監控服務狀態的腳本集合,這些腳本將被LRM調用從而實現各種資源啟動、停止、監控等等。
pacemaker:原Heartbeat 拆分出來的資源管理器,用來管理整個HA的控制中心,客戶端通過pacemaker來配置管理監控整個集群。它不能提供底層心跳信息傳遞的功能,它要想與對方節點通信需要借助底層(新拆分的heartbeat或corosync)的心跳傳遞服務,將信息通告給對方。
Pacemaker 配置文件比較不太容易修改,可以使用命令行界面的crmsh、pcs和圖形化界面pygui、hawk等進行管理,看個人喜好。
Heartbeat 和 Corosync 的區別:
1、經過安裝heartbeat 體驗,Heartbeat 配置比較簡單,主要修改三個文件即可: ha.cf、 haresources、 authkeys ,但是在支持多節點的時候不知道個人配置問題,還是其他,腦裂嚴重(查看很多博客說只支持2個節點),並且自帶的服務腳本較少,很多服務監控腳本需要自己編寫。
2、Heartbeat只能為所有的資源配置一個主服務,而corosync則允許為不同的資源組配置不同的主服務 ,corosync支持多個節點的集群,支持把資源進行分組,按照組進行資源的管理,設置主服務,自行進行啟停 。
3、管理資源的靈活性:在corosync中,其會自行處理配置文件的同步問題,heartbeat則無此功能
二、環境
1、系統:CentOS Linux release 7.4.1708 (Core) 三台
2、hosts (三個節點修改):
10.6.32.20 ceph1
10.6.32.21 ceph2
10.6.32.22 ceph3
3、時間同步 chrony
4、關閉防火牆 firewalld 和 Selinux。
5、配置節點ssh信任(controller1 節點操作)。
# ssh-keygen (生成默認證書即可)
# ssh-copy-id 127.0.0.1
# 將 .ssh 文件拷貝覆蓋到其他節點。
# scp -r .ssh/ root@ceph2:/root/
# scp -r .ssh/ root@ceph3:/root/
三、配置安裝
1、安裝(all-node)
# yum install -y pacemaker pcs psmisc policycoreutils-python
2、查看服務是否已安裝
# rpm -qa | grep corosync
# rpm -qa | grep pacemaker
# rpm -qa | grep pcs
# rpm -qa | grep psmisc
# rpm -qa | grep policycoreutils-python

安裝完成之后,會生成一個用戶:hacluster ,供集群使用。

3、啟動 pcs 服務,並設置開機自啟動(all-node)
# systemctl start pcsd.service
# systemctl enable pcsd.service

創建了一個軟連接。
4、設置 hacluster密碼
安裝組件生成的hacluster用戶,用來本地啟動pcs進程,因此我們需要設定密碼,每個節點的密碼相同。

5、驗證集群節點(其中一個節點測試)
# pcs cluster auth ceph1 ceph2 ceph3

6、生成corosync 配置文件 (其中一個節點操作)
# pcs cluster setup --name openstack_cluster ceph{1,2,3}

建立集群:openstack_cluster,生成corosync文件 /etc/corosync/corosync.conf
7、啟動集群並設置開機自啟動 (其中一個節點操作)
# pcs cluster start --all (# all 參數標識所有節點生效,不加all 本地生效,也可以指定某節點:pcs cluster start ceph2)
# pcs cluster enable --all

8、查看集群
1、查看 集群狀態
# pcs status

Online: ceph1 ceph2 ceph3 存活, 0 resources configured:還沒有配置資源 ,有一個 WARNING 報錯。
2、查看corosync
# corosync-cfgtool -s

# corosync-cmapctl | grep members #查看成員信息

# pcs status corosync #查看狀態

3、查看 pacemaker
# ps axf |grep pacemaker

9、檢查配置文件
# crm_verify -L -V

為保證集群數據安全,pacemaker默認啟動STONITH 。因沒有配置,先禁用
# pcs property set stonith-enabled=false # 禁用 STONITH
# crm_verify -L -V

10、添加虛擬IP(VIP)
# pcs resource create VIP ocf:heartbeat:IPaddr2 ip=10.6.32.254 cidr_netmask=32 op monitor interval=30s

添加成功,目前虛擬IP在 ceph1 節點上,通過 ip add list 可查看。(虛擬ip:10.6.32.254 資源名稱:VIP,檢測時間:30s/次)
# ip add list

11、httpd 高可用
1、開啟 apache status url 監控頁
# vim /etc/httpd/conf.d/status.conf
<Location /server-status> SetHandler server-status Order deny,allow Deny from all Allow from all </Location>
2、關閉 httpd 服務,添加httpd 資源時會重新啟動http服務,如果不關閉,會報錯。
# systemctl stop httpd
3、添加 httpd 資源 到集群。
# pcs resource create WebSite ocf:heartbeat:apache configfile=/etc/httpd/conf/httpd.conf statusurl="http://localhost/server-status" op monitor interval=30s

創建了一個httpd 的集群資源 WebSite,主節點在 ceph2 上。檢測頁:http://localhost/server-status, 檢測時間:30s/次。 但是有一個新的問題,虛擬IP在ceph1 上, httpd資源在 ceph2 上,會導致客戶端無法訪問。如果VIP在任何節點都不存在,那么WebSite也不能運行。
4、設置 資源檢測超時時間
# pcs resource op defaults timeout=120s
# pcs resource op defaults

5、綁定服務資源和 VIP 資源,始終保持在一個節點上
# pcs constraint colocation add WebSite with VIP INFINITY

12、瀏覽器訪問測試

成功!!!!
OK,博客到此處,已經搞定需求。
五、后期維護+知識擴展
1、上節提到創建 服務資源, ocf:heartbeat:apache 這是是用來告訴pacemaker,第一個部分ocf,指明了這個資源采用的標准(類型)以及在哪能找到它。第二個部分標明這個資源腳本的在ocf中的名字空間,在這個例子中是heartbeat。最后一個部分指明了資源腳本的名稱。
2、查看 pacemaker 默認支持的資源
1、查看資源采用的標准類型
# pcs resource standards

2、查看可用的ocf資源提供者
# pcs resource providers

3、查看特定標准下所支持的腳本,例:ofc:heartbeat 下的腳本
# pcs resource agents ocf:heartbeat

3、手動切換某節點到 standby 狀態及取消standby 狀態
# pcs cluster standby ceph1

# pcs cluster unstandby ceph1
4、防止資源在節點恢復后立即遷移
# pacemaker默認所有節點的stickiness都為0
# pcs resource defaults resource-stickiness=100
# pcs resource defaults #查看

5、重啟資源
# pcs resource restart resource_name
6、查看幫助
# pcs resource --help
7、清理集群錯誤日志
# pcs resource cleanup
8、在集群節點小於2個,無法仲裁時,忽略仲裁,保證業務提供(集群所有節點均正常時配置)
# pcs property set no-quorum-policy=ignore
