Corosync
Corosync是叢集管理套件的一部分,它在傳遞資訊的時候可以通過一個簡單的配置檔案來定義資訊傳遞的方式和協定等。它是一個新興的軟體,2008年推出,但其實它并不是一個真正意義上的新軟體,在2002年的時候有一個項目Openais , 它由于過大,分裂為兩個子項目,其中可以實作HA心跳資訊傳輸的功能就是Corosync ,它的代碼60%左右來源于Openais. Corosync可以提供一個完整的HA功能,但是要實作更多,更複雜的功能,那就需要使用Openais了。Corosync是未來的發展方向。在以後的新項目裡,一般采用Corosync,而hb_gui可以提供很好的HA管理功能,可以實作圖形化的管理。另外相關的圖形化有RHCS的套件luci+ricci,當然還有基于java開發的LCMC叢集管理工具。
前提:
1)本配置共有兩個測試節點,分别node1.shine.com和node2.shine.com,相的IP位址分别為172.16.100.11和172.16.100.12;
2)叢集服務為apache的httpd服務;
3)提供web服務的位址為172.16.100.1;
4)系統為rhel5.8
1、準備工作
為了配置一台Linux主機成為HA的節點,通常需要做出如下的準備工作:
1)所有節點的主機名稱和對應的IP位址解析服務可以正常工作,且每個節點的主機名稱需要跟"uname -n“指令的結果保持一緻;是以,需要保證兩個節點上的/etc/hosts檔案均為下面的内容:
<code>172.16.100.11 node1.shine.com node1</code>
<code>172.16.100.12 node2.shine.com node2</code>
為了使得重新啟動系統後仍能保持如上的主機名稱,還分别需要在各節點執行類似如下的指令:
Node1:
<code># sed -i 's@\(HOSTNAME=\).*@\1node1.shine.com@g' /etc/sysconfig/network</code>
<code># hostname node1.shine.com</code>
Node2:
<code># sed -i 's@\(HOSTNAME=\).*@\1node2.shine.com@g' /etc/sysconfig/network</code>
<code># hostname node2.shine.com</code>
2)設定兩個節點可以基于密鑰進行ssh通信,這可以通過類似如下的指令實作:
<code># ssh-keygen -t rsa</code>
<code># ssh-copy-id -i ~/.ssh/id_rsa.pub root@node2</code>
Node2:
<code># ssh-copy-id -i ~/.ssh/id_rsa.pub root@node1</code>
2、安裝如下rpm包:
<code>libibverbs, librdmacm, lm_sensors, libtool-ltdl, openhpi-libs, openhpi, perl-TimeDate</code>
<code>#yum install libibverbs librdmacm lm_sensors libtool-ltdl openhpi-libs openhpi perl-TimeDate</code>
3、安裝corosync和pacemaker,首先下載下傳所需要如下軟體包至本地某專用目錄(這裡為/root/cluster):
<code>cluster-glue</code>
<code>cluster-glue-libs</code>
<code>heartbeat</code>
<code>resource-agents</code>
<code>corosync</code>
<code>heartbeat-libs</code>
<code>pacemaker</code>
<code>corosynclib</code>
<code>libesmtp</code>
<code>pacemaker-libs</code>
下載下傳位址:http://clusterlabs.org/rpm/。請根據硬體平台及作業系統類型選擇對應的軟體包;這裡建議每個軟體包都使用目前最新的版本。
32bits rpm包下載下傳位址: http://clusterlabs.org/rpm/epel-5/i386/
64bits rpm包下載下傳位址: http://clusterlabs.org/rpm/epel-5/x86_64/
使用如下指令安裝:
<code># cd /root/cluster</code>
<code># yum -y --nogpgcheck localinstall *.rpm</code>
4、配置corosync,(以下指令在node1.shine.com上執行)
<code># cd /etc/corosync</code>
<code># cp corosync.conf.example corosync.conf</code>
接着編輯corosync.conf,添加如下内容:
<code>service {</code>
<code> </code><code>ver: 0</code>
<code> </code><code>name: pacemaker</code>
<code> </code><code># use_mgmtd: yes</code>
<code>}</code>
<code>aisexec {</code>
<code> </code><code>user: root</code>
<code> </code><code>group: root</code>
并設定此配置檔案中 bindnetaddr後面的IP位址為你的網卡所在網絡的網絡位址,我們這裡的兩個節點在172.16.0.0網絡,是以這裡将其設定為172.16.0.0;如下
<code>bindnetaddr: 172.16.0.0</code>
生成節點間通信時用到的認證密鑰檔案:
<code># corosync-keygen</code>
将corosync和authkey複制至node2:
<code># scp -p corosync authkey node2:/etc/corosync/</code>
分别為兩個節點建立corosync生成的日志所在的目錄:
<code># mkdir /var/log/cluster</code>
<code># ssh node2 'mkdir /var/log/cluster'</code>
5、嘗試啟動,(以下指令在node1上執行):
<code># /etc/init.d/corosync start</code>
檢視corosync引擎是否正常啟動:
<code># grep -e "Corosync Cluster Engine" -e "configuration file" /var/log/messages</code>
<code>Jun 14 19:02:08 node1 corosync[5103]: [MAIN ] Corosync Cluster Engine (</code><code>'1.2.7'</code><code>): started and ready to provide service.</code>
<code>Jun 14 19:02:08 node1 corosync[5103]: [MAIN ] Successfully </code><code>read</code> <code>main configuration </code><code>file</code> <code>'/etc/corosync/corosync.conf'</code><code>.</code>
<code>Jun 14 19:02:08 node1 corosync[5103]: [MAIN ] Corosync Cluster Engine exiting with status 8 at main.c:1397.</code>
<code>Jun 14 19:03:49 node1 corosync[5120]: [MAIN ] Corosync Cluster Engine (</code><code>'1.2.7'</code><code>): started and ready to provide service.</code>
<code>Jun 14 19:03:49 node1 corosync[5120]: [MAIN ] Successfully </code><code>read</code> <code>main configuration </code><code>file</code> <code>'/etc/corosync/corosync.conf'</code><code>.</code>
檢視初始化成員節點通知是否正常發出:
<code># grep TOTEM /var/log/messages</code>
<code>Jun 14 19:03:49 node1 corosync[5120]: [TOTEM ] Initializing transport (UDP</code><code>/IP</code><code>).</code>
<code>Jun 14 19:03:49 node1 corosync[5120]: [TOTEM ] Initializing transmit</code><code>/receive</code> <code>security: libtomcrypt SOBER128</code><code>/SHA1HMAC</code> <code>(mode 0).</code>
<code>Jun 14 19:03:50 node1 corosync[5120]: [TOTEM ] The network interface [172.16.100.11] is now up.</code>
<code>Jun 14 19:03:50 node1 corosync[5120]: [TOTEM ] A processor joined or left the membership and a new membership was formed.</code>
檢查啟動過程中是否有錯誤産生:
<code># grep ERROR: /var/log/messages | grep -v unpack_resources</code>
檢視pacemaker是否正常啟動:
<code># grep pcmk_startup /var/log/messages</code>
<code>Jun 14 19:03:50 node1 corosync[5120]: [pcmk ] info: pcmk_startup: CRM: Initialized</code>
<code>Jun 14 19:03:50 node1 corosync[5120]: [pcmk ] Logging: Initialized pcmk_startup</code>
<code>Jun 14 19:03:50 node1 corosync[5120]: [pcmk ] info: pcmk_startup: Maximum core </code><code>file</code> <code>size is: 4294967295</code>
<code>Jun 14 19:03:50 node1 corosync[5120]: [pcmk ] info: pcmk_startup: Service: 9</code>
<code>Jun 14 19:03:50 node1 corosync[5120]: [pcmk ] info: pcmk_startup: Local </code><code>hostname</code><code>: node1.shine.com</code>
如果上面指令執行均沒有問題,接着可以執行如下指令啟動node2上的corosync
<code># ssh node2 -- /etc/init.d/corosync start</code>
注意:啟動node2需要在node1上使用如上指令進行,不要在node2節點上直接啟動;
使用如下指令檢視叢集節點的啟動狀态:
<code># crm status</code>
<code>============</code>
<code>Last updated: Tue Jun 14 19:07:06 2011</code>
<code>Stack: openais</code>
<code>Current DC: node1.shine.com - partition with quorum</code>
<code>Version: 1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87</code>
<code>2 Nodes configured, 2 expected votes</code>
<code>0 Resources configured.</code>
<code>Online: [ node1.shine.com node2.shine.com ]</code>
從上面的資訊可以看出兩個節點都已經正常啟動,并且叢集已經處于正常工作狀态。
執行ps auxf指令可以檢視corosync啟動的各相關程序。
<code>root 4665 0.4 0.8 86736 4244 ? Ssl 17:00 0:04 corosync</code>
<code>root 4673 0.0 0.4 11720 2260 ? S 17:00 0:00 \_ </code><code>/usr/lib/heartbeat/stonithd</code>
<code>101 4674 0.0 0.7 12628 4100 ? S 17:00 0:00 \_ </code><code>/usr/lib/heartbeat/cib</code>
<code>root 4675 0.0 0.3 6392 1852 ? S 17:00 0:00 \_ </code><code>/usr/lib/heartbeat/lrmd</code>
<code>101 4676 0.0 0.4 12056 2528 ? S 17:00 0:00 \_ </code><code>/usr/lib/heartbeat/attrd</code>
<code>101 4677 0.0 0.5 8692 2784 ? S 17:00 0:00 \_ </code><code>/usr/lib/heartbeat/pengine</code>
<code>101 4678 0.0 0.5 12136 3012 ? S 17:00 0:00 \_ </code><code>/usr/lib/heartbeat/crmd</code>
6、配置叢集的工作屬性,禁用stonith
corosync預設啟用了stonith,而目前叢集并沒有相應的stonith裝置,是以此預設配置目前尚不可用,這可以通過如下指令驗正:
<code># crm_verify -L</code>
<code>crm_verify[5202]: 2011</code><code>/06/14_19</code><code>:10:38 ERROR: unpack_resources: Resource start-up disabled since no STONITH resources have been defined</code>
<code>crm_verify[5202]: 2011</code><code>/06/14_19</code><code>:10:38 ERROR: unpack_resources: Either configure some or disable STONITH with the stonith-enabled option</code>
<code>crm_verify[5202]: 2011</code><code>/06/14_19</code><code>:10:38 ERROR: unpack_resources: NOTE: Clusters with shared data need STONITH to ensure data integrity</code>
<code>Errors found during check: config not valid</code>
<code> </code><code>-V may provide </code><code>more</code> <code>details</code>
我們裡可以通過如下指令先禁用stonith:
<code># crm configure property stonith-enabled=false</code>
使用如下指令檢視目前的配置資訊:
<code># crm configure show</code>
<code>node node1.shine.com</code>
<code>node node2.shine.com</code>
<code>property $</code><code>id</code><code>=</code><code>"cib-bootstrap-options"</code> <code>\</code>
<code> </code><code>dc</code><code>-version=</code><code>"1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87"</code> <code>\</code>
<code> </code><code>cluster-infrastructure=</code><code>"openais"</code> <code>\</code>
<code> </code><code>expected-quorum-votes=</code><code>"2"</code> <code>\</code>
<code> </code><code>stonith-enabled="</code><code>false</code>
從中可以看出stonith已經被禁用。
上面的crm,crm_verify指令是1.0後的版本的pacemaker提供的基于指令行的叢集管理工具;可以在叢集中的任何一個節點上執行。
7、為叢集添加叢集資源
corosync支援heartbeat,LSB和ocf等類型的資源代理,目前較為常用的類型為LSB和OCF兩類,stonith類專為配置stonith裝置而用;
可以通過如下指令檢視目前叢集系統所支援的類型:
<code># crm ra classes</code>
<code>lsb</code>
<code>ocf / heartbeat pacemaker</code>
<code>stonith</code>
如果想要檢視某種類别下的所用資源代理的清單,可以使用類似如下指令實作:
<code># crm ra list lsb</code>
<code># crm ra list ocf heartbeat</code>
<code># crm ra list ocf pacemaker</code>
<code># crm ra list stonith</code>
<code># crm ra info [class:[provider:]]resource_agent</code>
例如:
<code># crm ra info ocf:heartbeat:IPaddr</code>
8、接下來要建立的web叢集建立一個IP位址資源,以在通過叢集提供web服務時使用;這可以通過如下方式實作:
文法:
<code>primitive <rsc> [<class>:[<provider>:]]<</code><code>type</code><code>></code>
<code> </code><code>[params attr_list]</code>
<code> </code><code>[operations id_spec]</code>
<code> </code><code>[</code><code>op</code> <code>op_type [<attribute>=<value>...] ...]</code>
<code> </code>
<code>op_type :: start | stop | monitor</code>
例子:
<code> </code><code>primitive apcfence stonith:apcsmart \</code>
<code> </code><code>params ttydev=</code><code>/dev/ttyS0</code> <code>hostlist=</code><code>"node1 node2"</code> <code>\</code>
<code> </code><code>op</code> <code>start timeout=60s \</code>
<code> </code><code>op</code> <code>monitor interval=30m timeout=60s</code>
應用:
<code># crm configure primitive WebIP ocf:heartbeat:IPaddr params ip=172.16.100.1</code>
通過如下的指令執行結果可以看出此資源已經在node1.shine.com上啟動:
<code>Last updated: Tue Jun 14 19:31:05 2011</code>
<code>1 Resources configured.</code>
<code> </code><code>WebIP (ocf::heartbeat:IPaddr): Started node1.shine.com</code>
當然,也可以在node1上執行ifconfig指令看到此位址已經在eth0的别名上生效:
<code># ifconfig</code>
<code>eth0:0 Link encap:Ethernet HWaddr 00:0C:29:AA:DD:CF </code>
<code> </code><code>inet addr:172.16.100.1 Bcast:192.168.0.255 Mask:255.255.255.0</code>
<code> </code><code>UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1</code>
<code> </code><code>Interrupt:67 Base address:0x2000</code>
而後我們到node2上通過如下指令停止node1上的corosync服務:
<code># ssh node1 -- /etc/init.d/corosync stop</code>
檢視叢集工作狀态:
<code>Last updated: Tue Jun 14 19:37:23 2011</code>
<code>Current DC: node2.shine.com - partition WITHOUT quorum</code>
<code>Online: [ node2.shine.com ]</code>
<code>OFFLINE: [ node1.shine.com ]</code>
上面的資訊顯示node1.shine.com已經離線,但資源WebIP卻沒能在node2.shine.com上啟動。這是因為此時的叢集狀态為"WITHOUT quorum",即已經失去了quorum,此時叢集服務本身已經不滿足正常運作的條件,這對于隻有兩節點的叢集來講是不合理的。是以,我們可以通過如下的指令來修改忽略quorum不能滿足的叢集狀态檢查:
<code># crm configure property no-quorum-policy=ignore</code>
片刻之後,叢集就會在目前仍在運作中的節點node2上啟動此資源了,如下所示:
<code>Last updated: Tue Jun 14 19:43:42 2011</code>
<code> </code><code>WebIP (ocf::heartbeat:IPaddr): Started node2.shine.com</code>
好了,驗正完成後,我們正常啟動node1.shine.com:
<code># ssh node1 -- /etc/init.d/corosync start</code>
正常啟動node1.shine.com後,叢集資源WebIP很可能會重新從node2.shine.com轉移回node1.shine.com。資源的這種在節點間每一次的來回流動都會造成那段時間内其無法正常被通路,是以,我們有時候需要在資源因為節點故障轉移到其它節點後,即便原來的節點恢複正常也禁止資源再次流轉回來。這可以通過定義資源的黏性(stickiness)來實作。在建立資源時或在建立資源後,都可以指定指定資源黏性。
資源黏性值範圍及其作用:
0:這是預設選項。資源放置在系統中的最适合位置。這意味着當負載能力“較好”或較差的節點變得可用時才轉移資源。此選項的作用基本等同于自動故障回複,隻是資源可能會轉移到非之前活動的節點上;
大于0:資源更願意留在目前位置,但是如果有更合适的節點可用時會移動。值越高表示資源越願意留在目前位置;
小于0:資源更願意移離目前位置。絕對值越高表示資源越願意離開目前位置;
INFINITY:如果不是因節點不适合運作資源(節點關機、節點待機、達到migration-threshold 或配置更改)而強制資源轉移,資源總是留在目前位置。此選項的作用幾乎等同于完全禁用自動故障回複;
-INFINITY:資源總是移離目前位置;
我們這裡可以通過以下方式為資源指定預設黏性值:
<code># crm configure rsc_defaults resource-stickiness=100</code>
9、結合上面已經配置好的IP位址資源,将此叢集配置成為一個active/passive模型的web(httpd)服務叢集
為了将此叢集啟用為web(httpd)伺服器叢集,我們得先在各節點上安裝httpd,并配置其能在本地各自提供一個測試頁面。
<code># yum -y install httpd</code>
<code># echo "<h1>Node1.shine.com</h1>" > /var/www/html/index.html</code>
<code># echo "<h1>Node2.shine.com</h1>" > /var/www/html/index.html</code>
而後在各節點手動啟動httpd服務,并确認其可以正常提供服務。接着使用下面的指令停止httpd服務,并確定其不會自動啟動(在兩個節點各執行一遍):
<code># /etc/init.d/httpd stop</code>
<code># chkconfig httpd off</code>
接下來我們将此httpd服務添加為叢集資源。将httpd添加為叢集資源有兩處資源代理可用:lsb和ocf:heartbeat,為了簡單起見,我們這裡使用lsb類型:
首先可以使用如下指令檢視lsb類型的httpd資源的文法格式:
<code># crm ra info lsb:httpd</code>
<code>lsb:httpd</code>
<code>Apache is a World Wide Web server. It is used to serve \</code>
<code> </code><code>HTML files and CGI.</code>
<code> </code>
<code>Operations' defaults (advisory minimum):</code>
<code> </code><code>start timeout=15</code>
<code> </code><code>stop timeout=15</code>
<code> </code><code>status timeout=15</code>
<code> </code><code>restart timeout=15</code>
<code> </code><code>force-reload timeout=15</code>
<code> </code><code>monitor interval=15 timeout=15 start-delay=15</code>
接下來建立資源WebSite:
<code># crm configure primitive WebSite lsb:httpd</code>
檢視配置檔案中生成的定義:
<code>primitive WebIP ocf:heartbeat:IPaddr \</code>
<code> </code><code>params ip=</code><code>"172.16.100.1"</code>
<code>primitive WebSite lsb:httpd</code>
<code> </code><code>stonith-enabled=</code><code>"false"</code> <code>\</code>
<code> </code><code>no-quorum-policy=</code><code>"ignore"</code>
檢視資源的啟用狀态:
<code>Last updated: Tue Jun 14 19:57:31 2011</code>
<code>Current DC: node2.shine.com - partition with quorum</code>
<code>2 Resources configured.</code>
<code> </code><code>WebSite (lsb:httpd): Started node2.shine.com</code>
從上面的資訊中可以看出WebIP和WebSite有可能會分别運作于兩個節點上,這對于通過此IP提供Web服務的應用來說是不成立的,即此兩者資源必須同時運作在某節點上。
由此可見,即便叢集擁有所有必需資源,但它可能還無法進行正确處理。資源限制則用以指定在哪些群集節點上運作資源,以何種順序裝載資源,以及特定資源依賴于哪些其它資源。pacemaker共給我們提供了三種資源限制方法:
1)Resource Location(資源位置):定義資源可以、不可以或盡可能在哪些節點上運作;
2)Resource Collocation(資源排列):排列限制用以定義叢集資源可以或不可以在某個節點上同時運作;
3)Resource Order(資源順序):順序限制定義叢集資源在節點上啟動的順序;
定義限制時,還需要指定分數。各種分數是叢集工作方式的重要組成部分。其實,從遷移資源到決定在已降級叢集中停止哪些資源的整個過程是通過以某種方式修改分數來實作的。分數按每個資源來計算,資源分數為負的任何節點都無法運作該資源。在計算出資源分數後,叢集選擇分數最高的節點。INFINITY(無窮大)目前定義為 1,000,000。加減無窮大遵循以下3個基本規則:
1)任何值 + 無窮大 = 無窮大
2)任何值 - 無窮大 = -無窮大
3)無窮大 - 無窮大 = -無窮大
定義資源限制時,也可以指定每個限制的分數。分數表示指派給此資源限制的值。分數較高的限制先應用,分數較低的限制後應用。通過使用不同的分數為既定資源建立更多位置限制,可以指定資源要故障轉移至的目标節點的順序。
是以,對于前述的WebIP和WebSite可能會運作于不同節點的問題,可以通過以下指令來解決:
<code># crm configure colocation website-with-ip INFINITY: WebSite WebIP</code>
接着,我們還得確定WebSite在某節點啟動之前得先啟動WebIP,這可以使用如下指令實作:
<code># crm configure order httpd-after-ip mandatory: WebIP WebSit</code>
此外,由于HA叢集本身并不強制每個節點的性能相同或相近,是以,某些時候我們可能希望在正常時服務總能在某個性能較強的節點上運作,這可以通過位置限制來實作:
<code># crm configure location prefer-node1 WebSite rule 200: node1</code>
這條指令實作了将WebSite限制在node1上,且指定其分數為200;
本文轉自 SoulMio 51CTO部落格,原文連結:http://blog.51cto.com/bovin/1865139,如需轉載請自行聯系原作者