高可用叢集之corosync+pacemaker

1874發表於2020-08-31

  1、概念

  在傳統Linux叢集種類,主要分了三類,一類是LB叢集,這類叢集主要作用是對使用者的流量做負載均衡,讓其後端每個server都能均衡的處理一部分請求;這類叢集有一個特點就是前端排程器通常是單點,後端server有很多臺,即便某一臺後端server掛掉,也不影響使用者的請求;其次就是HA叢集,所謂ha叢集就是高可用叢集,這類叢集的主要作用是對叢集中的單點做高可用,所謂高可用就是在發生故障時,能夠及時的將故障轉移,從而使故障修復時間最小;這類叢集的特點是在多臺節點上,各空閒節點會一直盯著工作節點,工作節點也會基於多播或廣播的方式把自己的心跳資訊傳送給其他空閒節點,一旦工作節點的心跳資訊在一定時間內空閒節點沒有收到,那麼此時就會觸發資源搶佔,先搶到資源的成為新的工作節點,而其他節點又會一直盯著新的工作節點,直到它掛掉,然後再次觸發資源搶佔;這類叢集的特點就是一個節點工作,其他節點看著它工作,一旦工作節點掛了,立刻會有其他節點上來頂替它的工作;最後就是HP叢集,HP叢集主要用於在複雜計算中場景中,把多臺server的算力綜合一起,對複雜計算要求比較高的環境中使用;在生產環境中常見的LB和HA叢集較多;

  2、衡量系統的可用性

  A=MTBF/(MTBF+MTTR)

  MTBF(Mean Time Between Failure)平均無故障工作時間;MTTR(Mean Time to Repair)平均修復時長;也就是說衡量一個系統的可用性是系統無故障執行時間除以系統無故障執行時間+故障修復時間;我們知道一個系統完全沒有故障,這是不可能的,這也意味著A的取值是小於1;如果說一個系統的可用性為0,那麼我們會認為該系統沒有任何用,所以系統可用性通常是大於0小於1,通常我們用一個百分比來描述系統的可用性;從上面的公式,如果我們要提升系統的可用性我們有兩種辦法,第一種就是無限提升mtbf的值,讓mtbf的值大到可以忽略mttr的值,當然這種方式理想中可行,在現實中,我們的系統一旦發生故障,修復的時間都不會是很少,也就說這種增大MTBF的方式,不是可行的;其次就是降低MTTR的值,降低MTTR的值就是縮短故障修復時間;通常我們降低MTTR的方式是通過冗餘主機的方式;就是在容易發生故障的關鍵性業務上,提前給它配置好相同的服務,然後這臺空閒的server就一直盯著工作的server,一旦工作server發生故障,此時空閒的server就立刻把工作的server的IP 地址給搶過來,然後把服務啟動了,後端如果有共享儲存,此時把共享儲存掛載到自己對應的目錄;如果有必要我們還需要通過某些機制讓之前的server“爆頭”,以免發生死灰復燃的場景;

  3、HA解決方案

  我們知道高可用的是服務,但是通常一個服務該有的多元件也會高可用,比如httpd服務,對於httpd對外它一定會有一個ip地址在對外提供服務,其次就是httpd服務自身的程式,如果業務需要,我們可能還會用到共享儲存;通過上述描述,對於高可用httpd服務,我們需要在備份節點上對httpd的ip地址做高可用,服務程式,以及後端的共享儲存;對於ip地址的高可用通常是在備份節點上探測到活動節點故障時,第一時間把活動節點的ip地址配置到備份節點上,通常這個ip地址是一個虛擬的ip地址,所以我們叫它vip;對應用程式程式的高可用,通常是我們在備份節點上直接把對應服務提前啟動起來;後端共享儲存的高可用也是通過某種機制探測活動節點發生故障後,然後把共享儲存掛載到備份節點,使得整個httpd服務可用;我們把httpd從一個節點遷移到另一個節點的過程叫故障轉移(failover);這裡需要注意,在發生故障轉移後,之前活動節點有可能發生故障恢復的情況,此時為了不讓之前活動的節點對現有的服務資源發生爭用,我們在發生故障轉移時,應該讓其之前的節點“死”的更徹底一些,我們會讓備份節點對活動節點“開一槍”,讓發生故障的節點更徹底的故障;這種是為了避免資源爭用而導致服務的不可用;

  vrrp協議的實現:keepalived

  基於OpenAIS規範的實現:corosync;所謂AIS(application interface standard)是指用來定義應用程式介面標準,openais就是開放的應用程式介面標準,它是有SA Forum釋出的一套規範;這些規範的主要目的就是為了提高中介軟體可移植和應用程式的高可用;

  4、corosync+pacemaker架構

  corosync的主要作用是提供messaging Layer,這個訊息傳遞層的主要作用是,把個主機間的各狀態資訊,空閒資訊等等一系列資訊通過訊息傳遞層互相傳遞,使得託管在corosync上的服務能夠根據底層各主機傳遞的訊息來決定該服務該執行到那臺主機上,一旦執行的服務所在主機發生故障時,它們又能夠根據訊息傳遞層的訊息來判斷該把服務遷移到那臺主機上執行;這樣一來託管在corosync上的服務能夠高可用;簡單點講,託管在corosync之上的服務對底層主機上不可見的,這也意味著託管在corosync上的服務是能夠呼叫和理解Messaging Layer中的訊息;這樣一來託管在上面的服務就必須得提供介面來呼叫messaging Layer對外提供的介面,然後實現服務的遷移;而對於大多數程式來講,它根本就沒有這樣的介面,這樣一來我們要使用corosync實現服務高可用變得困難;為了解決託管在corosync的服務能夠呼叫corosync提供的介面,我們需要開發一箇中介軟體,讓這個中介軟體能夠向下理解和呼叫coroysnc提供的介面,向上能夠託管服務;這個中間層就是pacemaker;它的主要作用是通過呼叫corosync提供的介面,來判斷把叢集資源該怎麼分配,服務該怎麼遷移和執行;同時pacemaker還提供一個管理介面,能夠讓管理員來管理這些叢集資源;而對於pacemaker來講,它主要有3各層次,其中CRM(cluster resource manager)的主要作用是通過呼叫messaging Layer提供的介面和各節點的狀態資訊來決策叢集資源的管理;然後通過介面把決策資訊傳遞給LRM(local resource manager);LRM的主要作用是對本地的資源做各種管理;而對於LRM來講,它要怎麼管理本地資源呢?它通常不會自己去管理本地的資源,而是通過RA去管理,所謂RA(resource agent)就是資源代理;它會根據LRM傳送的資訊來對本地的資源進行管理,而這種管理通常是基於各種服務提供的起停指令碼來實現的;比如,我們要把httpd服務託管在corosync+pacemaker這個架構上,首先我們得提供一個管理httpd的服務的指令碼,比如centos7上的httpd.service,centos6上的/etc/init.d/httpd來實現;而這些指令碼通常在我們使用yum安裝都會提供,這樣一來,我們要託管httpd服務就變得尤為簡單,我們只需要在pacemaker上配置,把httpd識別成叢集資源即可;只要配置httpd為叢集的資源,此時我們就可以在各主機上遷移httpd服務來實現httpd服務的高可用;要實現httpd服務在各節點主機上遷移,我們需要要注意各主機上必須有httpd服務;對於其他服務也是同樣的邏輯;簡單講corosync主要提供底層各主機訊息狀態,叢集狀態資訊,而pacemaker主要對託管在其上的服務進行管理;當然pacemaker也可以通過呼叫corosync的介面來管理底層的主機,比如讓某一臺主機下線上線等等操作;

   5、corosync叢集的投票系統

  在叢集發生網路分割槽以後,怎樣確定該那一方繼續代表叢集工作呢?所謂叢集分割槽就表示,叢集中的某一臺主機或一些主機不能檢測到其他主機的心跳;當叢集發生分割槽以後,到底哪一方能夠繼續代表叢集工作呢?如果是2臺主機組成的叢集,當其中一臺host不能夠正常檢測到另一臺host的心跳時,它們都會認為對方故障了,此時就會存在一個資源爭用的問題,A認為B掛了,B認為A掛了,此時叢集資源就會來回在A和B上飄動,使得整個服務都不可用;為了解決這樣的問題,我們必須有一個系統來來決定到底誰該代表叢集工作;通常情況在一個分散式叢集中,投票系統尤為重要,它決定了整個叢集是否能夠正常工作;假如我們的叢集有3臺主機組成,當其中一臺主機掛掉了,那麼到底誰來代表叢集工作呢?如果是A那麼整個叢集將不可用,那麼是B C,誰來當領導呢?這個時候就需要投票系統來決策了;預設情況我們的叢集各host都會有選票在自己手中,當發生分割槽以後,各host會根據自己檢測到的心跳資訊傳送給叢集其他節點,根據選票的數量來決定誰故障了,誰能夠代表叢集工作,如上面的例子,如果A掛了,那麼B會把對A的檢測的心跳資訊,傳送給C,然後C也會把對A的檢測心跳資訊傳送給B,此時投票就是A掛了2票,而整個叢集總共3票,已經有過半的選票都認為A掛了,那麼A此時就不會繼續代表叢集工作了;剩下的B和C可繼續代表叢集工作;我們把能夠繼續代表叢集工作的一方叫with quorum,就是選票大於總選票一半的一方;而對於選票小於或等於總選票的一方我們稱為without quorum;此時A就是without quorum一方,它會遵循no_quorum_policy指定的行為,通常no_quorum_policy預設是stop行為,意思就是without quorum一方會停止代表叢集工作,當然它還有ignore、suicide、freeze行為;ignore表示忽略自己是without quorum一方的選票結果,繼續代表叢集工作,suicide表示自殺,就是一旦不是with quorum一方就自我毀滅,freeze表示凍結,所謂凍結就是繼續服務老的請求,拒絕新的請求;B和C就是with quorum一方,它們會利用某種機制來挑選一個領導,然後根據訊息傳遞層的訊息決定把A上的資源搶過來跑在那個節點上繼續代表叢集工作;而對於BC來講它們只是聯絡不到A,A是否真的掛了呢?如果A沒有真的掛,那麼BC此時把A上的ip地址搶過來,繼續代表叢集工作,A可能再把ip地址搶過去,這樣一來叢集就不能夠正常工作,為了解決BC的後顧之憂,BC會通過其他機制把A幹掉(比如爆頭,stonith機制“shoot the other node in the head”),讓A即便是存活的也讓其掛掉,這樣做的目的就是為了保證叢集資源不再受A的干擾,正常提供服務;在corosync+pacemaker這種架構中,領導的角色稱為DC(disignated coordinator指派的協調員);DC的主要作用是接收管理員的配置資訊和更新叢集各狀態事務資訊,並指派對應節點上的LRM對其叢集資源操作,並通過訊息傳遞層把管理配置資訊同步給叢集其他節點;這樣一來,在下一次叢集發生分割槽以後,能夠在叢集其他節點上選出新的DC,從而繼續代表叢集工作;叢集中的各狀態事務、配置資訊,通常儲存在CIB(cluster information base)中,而對於CIB中的各狀態事務資訊由DC去更新,然後再同步到叢集各節點中去;通常DC節點上會執行CRM、CIB、PE(policy engine)、LRM這四個元件;而非DC節點會執行CRM、CIB、LRM這三個元件;而PE的作用就是排程指揮DC把配置資訊應用後的結果通過訊息傳遞層傳送給其他非DC節點並儲存至各非DC節點的CIB中;

  6、資源型別

  在corosync+pacemaker架構上,最為核心的就是資源,前邊說了那麼多,最終目的是為了管理託管在上面的資源;而對於資源來講資源是有型別的;簡單講就是可以用來調配的服務稱為資源,比如一個httpd服務,一個ip地址,一個後端共享儲存等等,這些都叫做資源;而對於一個完整的服務來講,它是由多個單一的資源組合而成;比如一個完整的httpd服務它應該由ip地址、httpd服務程式、在特殊場景中很有可能會有後端共享儲存;而這些資源在corosync+pacemaker上每個資源是有型別的,不同的型別執行方式個不相同;

  primitive:基本資源,主資源;通常僅能執行為一份,執行在單個節點上的資源;

  group:組;將一個或多個資源組織成一個可統一管理的單一單位資源;什麼意思呢?預設情況託管在corosync+pacemaker上的資源會負載均衡的執行在多個主機之上,如果我們不將這些資源邏輯的關聯在一起,就會存在,ip地址在A主機上,服務程式在B主機上,後端儲存在C主機上,這樣一來,我們託管的服務就沒有辦法向外提供服務,為了解決各依賴資源分散的問題,我們需要將多個有關聯依賴的資源邏輯的組織成一個組,然後根據這個組為單位進行排程和管理;

  clone:克隆;一個資源可以在叢集中執行多個副本,可以執行於多個節點;

  mutil-state(master/slave):是clone型別的資源的特殊表現,可以存在多個副本,副本間存在主從關係;

  7、資源傾向性

  什麼叫資源傾向性呢?我們知道一個資源託管在corosync+pacemaker上,最終都會把資源落在某一個節點上執行,而我們怎麼來限制這些資源在那個或那些各節點上執行呢?這個就需要我們配置資源對節點的傾向性了;所謂傾向性就是該資源更加傾向在那個節點執行或更加討厭在那個幾點上執行;在corosync+pacemaker叢集上執行資源的方式有3中,N-1、N-M、N-N,其中N表示節點數量,M表示資源數量;N-1表示N個幾點上執行1各資源;這也意味這有N減1各節點上處於空先狀態,這對於伺服器的資源利用率有點浪費;所以對於corosync+pacemaker叢集和keepalived來講,keepalived更加輕量化;N-M表示N個幾點上執行M個資源通常M小於N;這意味著有N減M個節點冗餘;N-N表示N個節點上執行N個資源,沒有冗餘節點,這意味著一旦一個資源掛掉,那麼對應就會遷移到其他節點,對於其他節點遷移到的節點只要提供的ip地址,程式,埠不衝突就不會有很大的問題,只不過相對壓力要大一點;對於不同執行方式,冗餘的節點數量也是不同的;而對於資源該執行到那個節點我們可以通過定義資源對節點的傾向性來決定;預設情況每個資源都能夠在任意節點上執行;也就說預設情況當A資源掛掉以後,它的故障轉移範圍是其他節點,為了不讓A服務執行到B節點,我們可以定義A資源的對B資源的傾向性為負無窮,所謂負無窮就是隻要有其他節點可執行就絕不在B節點上執行;通過定義資源對節點的傾向性,從而來限制資源在那些節點上進行轉移;這種限制資源對節點的傾向性我們叫做定義資源的故障轉移域;除了能夠定義資源對節點的傾向性,我們還可以定義資源與資源的傾向性,其邏輯都是相似的;對於資源傾向性通常我們會用分數來表示,其取值範圍是真無窮到負無窮;正無窮表示無限喜歡到某個節點或資源,只要對應節點正常存在就一定在該節點上,負無窮相反;

  8、資源代理

  所謂資源代理,就是指幫助去啟動一個資源的;在corosync+pacemaker叢集上,資源代理就是指的是能夠幫助我們去啟動一個資源的指令碼或程式,對於不同的資源代理,用到的指令碼或程式不同;對於不同的資源在不同的系統,資源代理的型別也有不同,比如在centos6上,各服務的啟動指令碼通常在/etc/init.d/下,所以通常會把/etc/init.d/目錄下的各指令碼當作資源代理的指令碼;這種資源型別叫做LSB的資源型別,通常這些指令碼都支援start|stop|restart|status等等引數;對於LSB型別的資源代理,前提是代理的資源一定不能開機啟動,如果開機啟動對於託管corosync+pacemaker就無意義了,所以資源的啟動一定要交給corosync+pacemaker來管理不能開機啟動;對於centos7來說,它使用的是systemd方式來管理各服務的啟動,停止;它預設的存放unit file的路徑是/usr/lib/systemd/system/目錄下;而對於systemd型別的資源代理,我們一定要把託管為叢集的服務 enable起來,可以理解為corosync+pacemaker它會到/etc/systemd/system/目錄下對應資源啟動指令碼;而只有把對應服務enable來以後,它才會在/etc/systemd/system/目錄下存在;除了以上兩種資源代理還有OCF和stonith,OCF型別資源代理類似LSB指令碼,當支援start,stop,status,monitor,mata-data等引數;stonith型別的資源代理專用配置stonith裝置RA;service型別,以上4種都不符合的其他型別的資源代理;

  9、corosync+pacemaker的安裝配置

  前提:

  1、各host時間同步;

  2、各hosts檔案能夠解析其他節點的主機名;選擇一各不和其他叢集衝突的多播地址;

  3、有需要可配置各節點ssh互信;

主機名 ip地址 多播地址
node01 192.168.0.41 239.255.100.12
node02 192.168.0.42 239.255.100.12

 

 

 

 

  驗證:各主機上的時間和主機名以及hosts檔案;

  提示:為這裡以兩主機演示特殊的兩節點叢集;node01和node02都把時間伺服器地址指向內網192.168.0.99這個時間伺服器上;有關時間伺服器的配置請參考https://www.cnblogs.com/qiuhom-1874/p/12079927.html;有關ssh互信配置可以參考https://www.cnblogs.com/qiuhom-1874/p/11783371.html

  配置好時間同步和ssh戶型以及host主機名解析以後,接下來安裝pacemaker

[root@node01 ~]# yum install pacemaker
已載入外掛:fastestmirror, langpacks
base                                                                         | 3.6 kB  00:00:00     
docker-ce-stable                                                             | 3.5 kB  00:00:00     
epel                                                                         | 4.7 kB  00:00:00     
extras                                                                       | 2.9 kB  00:00:00     
updates                                                                      | 2.9 kB  00:00:00     
(1/3): epel/x86_64/updateinfo                                                | 1.0 MB  00:00:00     
(2/3): epel/x86_64/primary_db                                                | 6.9 MB  00:00:01     
(3/3): updates/7/x86_64/primary_db                                           | 4.5 MB  00:00:01     
Loading mirror speeds from cached hostfile
 * base: mirrors.aliyun.com
 * extras: mirrors.aliyun.com
 * updates: mirrors.aliyun.com
正在解決依賴關係
--> 正在檢查事務
---> 軟體包 pacemaker.x86_64.0.1.1.21-4.el7 將被 安裝
--> 正在處理依賴關係 pacemaker-libs(x86-64) = 1.1.21-4.el7,它被軟體包 pacemaker-1.1.21-4.el7.x86_64 需要
--> 正在處理依賴關係 pacemaker-cluster-libs(x86-64) = 1.1.21-4.el7,它被軟體包 pacemaker-1.1.21-4.el7.x86_64 需要
--> 正在處理依賴關係 pacemaker-cli = 1.1.21-4.el7,它被軟體包 pacemaker-1.1.21-4.el7.x86_64 需要
--> 正在處理依賴關係 libqb > 0.17.0,它被軟體包 pacemaker-1.1.21-4.el7.x86_64 需要
--> 正在處理依賴關係 resource-agents,它被軟體包 pacemaker-1.1.21-4.el7.x86_64 需要
--> 正在處理依賴關係 libquorum.so.5(COROSYNC_QUORUM_1.0)(64bit),它被軟體包 pacemaker-1.1.21-4.el7.x86_64 需要
--> 正在處理依賴關係 libcmap.so.4(COROSYNC_CMAP_1.0)(64bit),它被軟體包 pacemaker-1.1.21-4.el7.x86_64 需要
--> 正在處理依賴關係 libcfg.so.6(COROSYNC_CFG_0.82)(64bit),它被軟體包 pacemaker-1.1.21-4.el7.x86_64 需要
--> 正在處理依賴關係 corosync,它被軟體包 pacemaker-1.1.21-4.el7.x86_64 需要
……省略部分內容……
依賴關係解決

====================================================================================================
 Package                         架構            版本                        源                大小
====================================================================================================
正在安裝:
 pacemaker                       x86_64          1.1.21-4.el7                base             478 k
為依賴而安裝:
 corosync                        x86_64          2.4.5-4.el7                 base             221 k
 corosynclib                     x86_64          2.4.5-4.el7                 base             136 k
 libqb                           x86_64          1.0.1-9.el7                 base              96 k
 pacemaker-cli                   x86_64          1.1.21-4.el7                base             362 k
 pacemaker-cluster-libs          x86_64          1.1.21-4.el7                base             163 k
 pacemaker-libs                  x86_64          1.1.21-4.el7                base             637 k
 perl-TimeDate                   noarch          1:2.30-2.el7                base              52 k
 resource-agents                 x86_64          4.1.1-46.el7_8.2            updates          455 k

事務概要
====================================================================================================
安裝  1 軟體包 (+8 依賴軟體包)

總下載量:2.5 M
安裝大小:6.5 M
Is this ok [y/d/N]: y
Downloading packages:
(1/9): corosynclib-2.4.5-4.el7.x86_64.rpm                                    | 136 kB  00:00:00     
(2/9): corosync-2.4.5-4.el7.x86_64.rpm                                       | 221 kB  00:00:00     
(3/9): libqb-1.0.1-9.el7.x86_64.rpm                                          |  96 kB  00:00:00     
(4/9): pacemaker-1.1.21-4.el7.x86_64.rpm                                     | 478 kB  00:00:00     
(5/9): pacemaker-cli-1.1.21-4.el7.x86_64.rpm                                 | 362 kB  00:00:00     
(6/9): pacemaker-libs-1.1.21-4.el7.x86_64.rpm                                | 637 kB  00:00:00     
(7/9): perl-TimeDate-2.30-2.el7.noarch.rpm                                   |  52 kB  00:00:00     
(8/9): pacemaker-cluster-libs-1.1.21-4.el7.x86_64.rpm                        | 163 kB  00:00:00     
(9/9): resource-agents-4.1.1-46.el7_8.2.x86_64.rpm                           | 455 kB  00:00:00     
----------------------------------------------------------------------------------------------------
總計                                                                2.0 MB/s | 2.5 MB  00:00:01     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  正在安裝    : libqb-1.0.1-9.el7.x86_64                                                        1/9 
  正在安裝    : corosynclib-2.4.5-4.el7.x86_64                                                  2/9 
  正在安裝    : corosync-2.4.5-4.el7.x86_64                                                     3/9 
  正在安裝    : pacemaker-libs-1.1.21-4.el7.x86_64                                              4/9 
  正在安裝    : pacemaker-cluster-libs-1.1.21-4.el7.x86_64                                      5/9 
  正在安裝    : 1:perl-TimeDate-2.30-2.el7.noarch                                               6/9 
  正在安裝    : pacemaker-cli-1.1.21-4.el7.x86_64                                               7/9 
  正在安裝    : resource-agents-4.1.1-46.el7_8.2.x86_64                                         8/9 
  正在安裝    : pacemaker-1.1.21-4.el7.x86_64                                                   9/9 
  驗證中      : pacemaker-cli-1.1.21-4.el7.x86_64                                               1/9 
  驗證中      : pacemaker-libs-1.1.21-4.el7.x86_64                                              2/9 
  驗證中      : libqb-1.0.1-9.el7.x86_64                                                        3/9 
  驗證中      : corosynclib-2.4.5-4.el7.x86_64                                                  4/9 
  驗證中      : pacemaker-1.1.21-4.el7.x86_64                                                   5/9 
  驗證中      : corosync-2.4.5-4.el7.x86_64                                                     6/9 
  驗證中      : pacemaker-cluster-libs-1.1.21-4.el7.x86_64                                      7/9 
  驗證中      : resource-agents-4.1.1-46.el7_8.2.x86_64                                         8/9 
  驗證中      : 1:perl-TimeDate-2.30-2.el7.noarch                                               9/9 

已安裝:
  pacemaker.x86_64 0:1.1.21-4.el7                                                                   

作為依賴被安裝:
  corosync.x86_64 0:2.4.5-4.el7                      corosynclib.x86_64 0:2.4.5-4.el7               
  libqb.x86_64 0:1.0.1-9.el7                         pacemaker-cli.x86_64 0:1.1.21-4.el7            
  pacemaker-cluster-libs.x86_64 0:1.1.21-4.el7       pacemaker-libs.x86_64 0:1.1.21-4.el7           
  perl-TimeDate.noarch 1:2.30-2.el7                  resource-agents.x86_64 0:4.1.1-46.el7_8.2      

完畢!
[root@node01 ~]# 

  提示:安裝pacemaker會依賴corosync這個包,所以直接安裝pacemaker這一個包就可以了;對於node02也是同樣的操作;

  配置corosync

  檢視corosync的程式環境

[root@node01 ~]# rpm -ql corosync
/etc/corosync
/etc/corosync/corosync.conf.example
/etc/corosync/corosync.conf.example.udpu
/etc/corosync/corosync.xml.example
/etc/corosync/uidgid.d
/etc/dbus-1/system.d/corosync-signals.conf
/etc/logrotate.d/corosync
/etc/sysconfig/corosync
/etc/sysconfig/corosync-notifyd
/usr/bin/corosync-blackbox
/usr/bin/corosync-xmlproc
/usr/lib/systemd/system/corosync-notifyd.service
/usr/lib/systemd/system/corosync.service
/usr/sbin/corosync
/usr/sbin/corosync-cfgtool
/usr/sbin/corosync-cmapctl
/usr/sbin/corosync-cpgtool
/usr/sbin/corosync-keygen
/usr/sbin/corosync-notifyd
/usr/sbin/corosync-quorumtool
/usr/share/corosync
/usr/share/corosync/corosync
/usr/share/corosync/corosync-notifyd
/usr/share/corosync/xml2conf.xsl
/usr/share/doc/corosync-2.4.5
/usr/share/doc/corosync-2.4.5/LICENSE
/usr/share/doc/corosync-2.4.5/SECURITY
/usr/share/man/man5/corosync.conf.5.gz
/usr/share/man/man5/corosync.xml.5.gz
/usr/share/man/man5/votequorum.5.gz
/usr/share/man/man8/cmap_keys.8.gz
/usr/share/man/man8/corosync-blackbox.8.gz
/usr/share/man/man8/corosync-cfgtool.8.gz
/usr/share/man/man8/corosync-cmapctl.8.gz
/usr/share/man/man8/corosync-cpgtool.8.gz
/usr/share/man/man8/corosync-keygen.8.gz
/usr/share/man/man8/corosync-notifyd.8.gz
/usr/share/man/man8/corosync-quorumtool.8.gz
/usr/share/man/man8/corosync-xmlproc.8.gz
/usr/share/man/man8/corosync.8.gz
/usr/share/man/man8/corosync_overview.8.gz
/usr/share/snmp/mibs/COROSYNC-MIB.txt
/var/lib/corosync
/var/log/cluster
[root@node01 ~]# 

  提示:/etc/corosync這個目錄用來存放corosync配置檔案;其中corosync.conf.example是corosync的文字格式配置檔案示例;corosync.conf.example.udpu這個是corosync使用udpu方式提供服務的配置檔案示例;corosync.xml.example是xml格式的配置檔案示例;/usr/lib/systemd/system/corosync.service這個是corosync unit file檔案;/usr/sbin/corosync二進位制程式檔案;/usr/sbin/corosync-keygen這個工具用於生成corosync的金鑰檔案;/var/lib/corosync這個目錄主要存放CIB資料庫檔案;/var/log/cluster/目錄用於存放日誌相關檔案;

  複製/etc/corosync/corosync.conf.example檔案為/etc/corosync.conf

[root@node01 ~]# cp /etc/corosync/corosync.conf.example /etc/corosync/corosync.conf

  編輯配置檔案

  提示:對於totem這個配置段主要用於配置totem協議的相關屬性,其中version表示使用的版本,預設是2這個不用更改,保持預設就好;下面的crypto_cipher和crypto_hash這兩項用於配置是否啟用加密,這裡預設是none,這意味這隻要是在相同多播域內,它都會識別成叢集成員;所以為了安全建議啟用叢集事務訊息通訊加密;預設情況crypto_cipher支援aes256, aes192, aes128 and 3des這些加密演算法,隨便配置一個加密演算法即可;crypto_hash支援md5, sha1, sha256, sha384,sha512這些加密演算法,隨便選一個即可;如果啟用以上兩項加密,我們需要在/etc/corosync/目錄下建立一個金鑰檔案,且許可權是600或著400的許可權;並且叢集各節點的金鑰檔案必須相同;

  建立金鑰檔案

[root@node01 ~]# corosync-keygen 
Corosync Cluster Engine Authentication key generator.
Gathering 1024 bits for key from /dev/random.
Press keys on your keyboard to generate entropy.
Press keys on your keyboard to generate entropy (bits = 920).
Press keys on your keyboard to generate entropy (bits = 1000).
Writing corosync key to /etc/corosync/authkey.
[root@node01 ~]# ll /etc/corosync/
總用量 20
-r-------- 1 root root  128 8月  30 23:30 authkey
-rw-r--r-- 1 root root 2886 8月  30 23:30 corosync.conf
-rw-r--r-- 1 root root 2881 4月   2 21:28 corosync.conf.example
-rw-r--r-- 1 root root  767 4月   2 21:28 corosync.conf.example.udpu
-rw-r--r-- 1 root root 3278 4月   2 21:28 corosync.xml.example
drwxr-xr-x 2 root root    6 4月   2 21:28 uidgid.d
[root@node01 ~]# 

  提示:可以現在把金鑰檔案複製給node02也可以待會把配置檔案配置好以後一併複製給node02都行;

  繼續編輯配置檔案

  提示:interface配置段主要用於定義叢集事務資訊通訊介面相關引數;其中ringnumber: 0表示第一塊網路卡,如果有第二卡和第三塊,可以在totem配置段繼續用interface配置段來指定;bindnetaddr: 192.168.0.0用於配置用於叢集事務資訊通訊的網路地址,它預設會根據我們配置的網路地址去本地主機上找對應的網路卡;當然我們也可以配置ip地址也行,通常建議使用網路地址;mcastaddr:是用來指定多播通訊地址;這個如果在實驗環境中可以不用該,只要在叢集中的各節點都是同一個多播地址即可;在生產中一定要注意不能和其他叢集的多播通訊地址衝突;mcastport用於指定多播通訊的埠,預設是5405,這個通常不需要更改,保持預設即可;ttl: 1這個是配置多播通訊的報文生存時長,預設配置為1,是為了防止其他節點收到多播報文後再次轉發;

  提示:logging配置段主要用於定義日誌相關;其中fileline: off表示不開啟fileline;所謂fileline就是記錄原始檔和訊息所在的行; to_stderr: no表示不把日誌輸出到標準錯誤控制檯;to_logfile: yes表示把日誌輸出到檔案;logfile: /var/log/cluster/corosync.log用於指定日誌檔案路徑; to_syslog: yes是否將日誌傳送給syslog,預設是允許;debug: off是否關閉除錯資訊;預設是關閉的;timestamp: on是否加上時間戳,預設是開啟;如果我們只玩syslog中傳送日誌,可以將這一項關閉,因為syslog會自動將時間給我們補上;logger_subsys用於定義日誌子系統,subsys指子系統的名稱,debug指定是否開啟除錯資訊;上面的subsys: QUORUM 表示開啟記錄quorum的日誌資訊;

  提示:quorum用於配置投票系統相關配置,這裡面預設是註釋了,我們只需要開啟provider: corosync_votequorum即可;

  提示:nodelist這段配置在預設的配置檔案中沒有,我們加上這段配置就是告訴corosync我們期望的叢集中的節點有兩個,他們的ip地址是那些;這裡的ip地址可以寫主機名,也可以寫ip地址,建議使用主機名;

  複製/etc/corosync/corosync.conf 和authkey檔案到其他節點

  啟動corosync

  提示:如果啟動corosync服務以後,能夠看到udp的5405埠和5404埠處於監聽狀態和我們配置的多播地址,則說明corosync服務就配置好了;

  驗證:檢視corosync的日誌,看看是否識別到兩個節點

  提示:在node01上可以看到對應的叢集成員有2個;

  提示:在node02的日誌檔案中也能看到node01加入到叢集,對應叢集成員有兩個;

  驗證:使用corosync-cfgtool命令來檢視當前節點的初始化資訊

  提示:-s表示檢視當前節點各ring上的狀態資訊;從上面的資訊可以看到node01上節點id為1,ring0上的id為192.168.0.41,狀態是活躍沒有發現錯誤;

  提示:同樣在node02上使用corosync-cfgtool -s 可以看到當前node02上的ring0的狀態資訊;從上面的截圖可以看到兩個節點都已經處於活躍狀態;

  驗證:使用corosync-cmaptools檢視成員

[root@node01 ~]# corosync-cmapctl 
config.totemconfig_reload_in_progress (u8) = 0
internal_configuration.service.0.name (str) = corosync_cmap
internal_configuration.service.0.ver (u32) = 0
internal_configuration.service.1.name (str) = corosync_cfg
internal_configuration.service.1.ver (u32) = 0
internal_configuration.service.2.name (str) = corosync_cpg
internal_configuration.service.2.ver (u32) = 0
internal_configuration.service.3.name (str) = corosync_quorum
internal_configuration.service.3.ver (u32) = 0
internal_configuration.service.4.name (str) = corosync_pload
internal_configuration.service.4.ver (u32) = 0
internal_configuration.service.5.name (str) = corosync_votequorum
internal_configuration.service.5.ver (u32) = 0
logging.debug (str) = off
logging.fileline (str) = off
logging.logfile (str) = /var/log/cluster/corosync.log
logging.logger_subsys.QUORUM.debug (str) = off
logging.logger_subsys.QUORUM.subsys (str) = QUORUM
logging.timestamp (str) = on
logging.to_logfile (str) = yes
logging.to_stderr (str) = no
logging.to_syslog (str) = yes
nodelist.local_node_pos (u32) = 0
nodelist.node.0.nodeid (u32) = 1
nodelist.node.0.ring0_addr (str) = node01.test.org
nodelist.node.1.nodeid (u32) = 2
nodelist.node.1.ring0_addr (str) = node02.test.org
quorum.provider (str) = corosync_votequorum
runtime.blackbox.dump_flight_data (str) = no
runtime.blackbox.dump_state (str) = no
runtime.config.totem.block_unlisted_ips (u32) = 1
runtime.config.totem.consensus (u32) = 1200
runtime.config.totem.downcheck (u32) = 1000
runtime.config.totem.fail_recv_const (u32) = 2500
runtime.config.totem.heartbeat_failures_allowed (u32) = 0
runtime.config.totem.hold (u32) = 180
runtime.config.totem.join (u32) = 50
runtime.config.totem.max_messages (u32) = 17
runtime.config.totem.max_network_delay (u32) = 50
runtime.config.totem.merge (u32) = 200
runtime.config.totem.miss_count_const (u32) = 5
runtime.config.totem.rrp_autorecovery_check_timeout (u32) = 1000
runtime.config.totem.rrp_problem_count_mcast_threshold (u32) = 100
runtime.config.totem.rrp_problem_count_threshold (u32) = 10
runtime.config.totem.rrp_problem_count_timeout (u32) = 2000
runtime.config.totem.rrp_token_expired_timeout (u32) = 238
runtime.config.totem.send_join (u32) = 0
runtime.config.totem.seqno_unchanged_const (u32) = 30
runtime.config.totem.token (u32) = 1000
runtime.config.totem.token_retransmit (u32) = 238
runtime.config.totem.token_retransmits_before_loss_const (u32) = 4
runtime.config.totem.window_size (u32) = 50
runtime.connections.active (u64) = 1
runtime.connections.closed (u64) = 4
runtime.connections.corosync-cmapct:4355:0x55c18dd16300.client_pid (u32) = 4355
runtime.connections.corosync-cmapct:4355:0x55c18dd16300.dispatched (u64) = 0
runtime.connections.corosync-cmapct:4355:0x55c18dd16300.flow_control (u32) = 0
runtime.connections.corosync-cmapct:4355:0x55c18dd16300.flow_control_count (u64) = 0
runtime.connections.corosync-cmapct:4355:0x55c18dd16300.invalid_request (u64) = 0
runtime.connections.corosync-cmapct:4355:0x55c18dd16300.name (str) = corosync-cmapct
runtime.connections.corosync-cmapct:4355:0x55c18dd16300.overload (u64) = 0
runtime.connections.corosync-cmapct:4355:0x55c18dd16300.queue_size (u32) = 0
runtime.connections.corosync-cmapct:4355:0x55c18dd16300.recv_retries (u64) = 0
runtime.connections.corosync-cmapct:4355:0x55c18dd16300.requests (u64) = 0
runtime.connections.corosync-cmapct:4355:0x55c18dd16300.responses (u64) = 0
runtime.connections.corosync-cmapct:4355:0x55c18dd16300.send_retries (u64) = 0
runtime.connections.corosync-cmapct:4355:0x55c18dd16300.service_id (u32) = 0
runtime.services.cfg.0.rx (u64) = 0
runtime.services.cfg.0.tx (u64) = 0
runtime.services.cfg.1.rx (u64) = 0
runtime.services.cfg.1.tx (u64) = 0
runtime.services.cfg.2.rx (u64) = 0
runtime.services.cfg.2.tx (u64) = 0
runtime.services.cfg.3.rx (u64) = 0
runtime.services.cfg.3.tx (u64) = 0
runtime.services.cfg.service_id (u16) = 1
runtime.services.cmap.0.rx (u64) = 3
runtime.services.cmap.0.tx (u64) = 2
runtime.services.cmap.service_id (u16) = 0
runtime.services.cpg.0.rx (u64) = 0
runtime.services.cpg.0.tx (u64) = 0
runtime.services.cpg.1.rx (u64) = 0
runtime.services.cpg.1.tx (u64) = 0
runtime.services.cpg.2.rx (u64) = 0
runtime.services.cpg.2.tx (u64) = 0
runtime.services.cpg.3.rx (u64) = 0
runtime.services.cpg.3.tx (u64) = 0
runtime.services.cpg.4.rx (u64) = 0
runtime.services.cpg.4.tx (u64) = 0
runtime.services.cpg.5.rx (u64) = 3
runtime.services.cpg.5.tx (u64) = 2
runtime.services.cpg.6.rx (u64) = 0
runtime.services.cpg.6.tx (u64) = 0
runtime.services.cpg.service_id (u16) = 2
runtime.services.pload.0.rx (u64) = 0
runtime.services.pload.0.tx (u64) = 0
runtime.services.pload.1.rx (u64) = 0
runtime.services.pload.1.tx (u64) = 0
runtime.services.pload.service_id (u16) = 4
runtime.services.quorum.service_id (u16) = 3
runtime.services.votequorum.0.rx (u64) = 7
runtime.services.votequorum.0.tx (u64) = 4
runtime.services.votequorum.1.rx (u64) = 0
runtime.services.votequorum.1.tx (u64) = 0
runtime.services.votequorum.2.rx (u64) = 0
runtime.services.votequorum.2.tx (u64) = 0
runtime.services.votequorum.3.rx (u64) = 0
runtime.services.votequorum.3.tx (u64) = 0
runtime.services.votequorum.service_id (u16) = 5
runtime.totem.pg.mrp.rrp.0.faulty (u8) = 0
runtime.totem.pg.mrp.srp.avg_backlog_calc (u32) = 0
runtime.totem.pg.mrp.srp.avg_token_workload (u32) = 0
runtime.totem.pg.mrp.srp.commit_entered (u64) = 2
runtime.totem.pg.mrp.srp.commit_token_lost (u64) = 0
runtime.totem.pg.mrp.srp.consensus_timeouts (u64) = 0
runtime.totem.pg.mrp.srp.continuous_gather (u32) = 0
runtime.totem.pg.mrp.srp.continuous_sendmsg_failures (u32) = 0
runtime.totem.pg.mrp.srp.firewall_enabled_or_nic_failure (u8) = 0
runtime.totem.pg.mrp.srp.gather_entered (u64) = 2
runtime.totem.pg.mrp.srp.gather_token_lost (u64) = 0
runtime.totem.pg.mrp.srp.mcast_retx (u64) = 0
runtime.totem.pg.mrp.srp.mcast_rx (u64) = 12
runtime.totem.pg.mrp.srp.mcast_tx (u64) = 13
runtime.totem.pg.mrp.srp.memb_commit_token_rx (u64) = 4
runtime.totem.pg.mrp.srp.memb_commit_token_tx (u64) = 4
runtime.totem.pg.mrp.srp.memb_join_rx (u64) = 5
runtime.totem.pg.mrp.srp.memb_join_tx (u64) = 3
runtime.totem.pg.mrp.srp.memb_merge_detect_rx (u64) = 1771
runtime.totem.pg.mrp.srp.memb_merge_detect_tx (u64) = 1771
runtime.totem.pg.mrp.srp.members.1.config_version (u64) = 0
runtime.totem.pg.mrp.srp.members.1.ip (str) = r(0) ip(192.168.0.41) 
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(192.168.0.42) 
runtime.totem.pg.mrp.srp.members.2.join_count (u32) = 1
runtime.totem.pg.mrp.srp.members.2.status (str) = joined
runtime.totem.pg.mrp.srp.mtt_rx_token (u32) = 181
runtime.totem.pg.mrp.srp.operational_entered (u64) = 2
runtime.totem.pg.mrp.srp.operational_token_lost (u64) = 0
runtime.totem.pg.mrp.srp.orf_token_rx (u64) = 3624
runtime.totem.pg.mrp.srp.orf_token_tx (u64) = 2
runtime.totem.pg.mrp.srp.recovery_entered (u64) = 2
runtime.totem.pg.mrp.srp.recovery_token_lost (u64) = 0
runtime.totem.pg.mrp.srp.rx_msg_dropped (u64) = 0
runtime.totem.pg.mrp.srp.token_hold_cancel_rx (u64) = 0
runtime.totem.pg.mrp.srp.token_hold_cancel_tx (u64) = 0
runtime.totem.pg.msg_queue_avail (u32) = 0
runtime.totem.pg.msg_reserved (u32) = 1
runtime.votequorum.ev_barrier (u32) = 2
runtime.votequorum.highest_node_id (u32) = 2
runtime.votequorum.lowest_node_id (u32) = 1
runtime.votequorum.this_node_id (u32) = 1
runtime.votequorum.two_node (u8) = 0
totem.crypto_cipher (str) = aes256
totem.crypto_hash (str) = sha1
totem.interface.0.bindnetaddr (str) = node01.test.org
totem.interface.0.mcastaddr (str) = 239.255.100.12
totem.interface.0.mcastport (u16) = 5405
totem.interface.0.ttl (u8) = 1
totem.version (u32) = 2
[root@node01 ~]# 

  提示:預設不跟任何選項表示答應當前CIB中儲存的配置內容;

  提示:通過grep過濾,可以看到有兩個成員,他們的ip地址分別是192.168.0.41和42;到此corosync就配置並啟動成功了;

  完整的corosync.conf配置檔案內容

高可用叢集之corosync+pacemaker
[root@node01 ~]# grep -v "^[[:space:]].*#" /etc/corosync/corosync.conf
# Please read the corosync.conf.5 manual page
totem {
        version: 2

        crypto_cipher: aes256
        crypto_hash: sha1

        interface {
                ringnumber: 0
                bindnetaddr: 192.168.0.0
                mcastaddr: 239.255.100.12
                mcastport: 5405
                ttl: 1
        }
}

logging {
        fileline: off
        to_stderr: no
        to_logfile: yes
        logfile: /var/log/cluster/corosync.log
        to_syslog: yes
        debug: off
        timestamp: on
        logger_subsys {
                subsys: QUORUM
                debug: off
        }
}

quorum {
        provider: corosync_votequorum
}

nodelist {
        node {
                ring0_addr: node01.test.org
                nodeid: 1
        }
        node {
                ring0_addr: node02.test.org
                nodeid: 2
        }
}

[root@node01 ~]# 
View Code

  啟動pacamaker服務

  提示:pacemaker預設不需要怎麼配置就可以啟動,啟動以後,我們可以通過管理介面來配置;預設才開始啟動pacemaker時都會有一個pengine的程式啟動,但是通常只有DC上的pengine才會生效;

  驗證:檢視DC節點所在節點/叢集狀態資訊

  提示:在叢集任何一個幾點執行crm_mon就可以看到當前叢集的狀態資訊;上面截圖中可以看到node01.test.org是dc節點,線上的節點有兩個,分別是node01.test.org和node02.test.org;

  到此corosync+pacemaker高可用叢集就搭建好了,後續我們就直接可以在上面託管服務;

相關文章