天天看點

corosync+pacemaker實作web高可用

系統環境在redhat5.4下:

1)共有兩個測試節點,分别node1.magedu.com和node2.magedu.com,IP位址分别為172.16.26.11和172.16.26.12;

2)叢集服務為apache的httpd服務;

3)提供web服務的位址為172.16.26.1;

1、準備工作

為了配置一台Linux主機成為HA的節點,通常需要做出如下的準備工作:

1)所有節點的主機名稱和對應的IP位址解析服務可以正常工作,且每個節點的主機名稱需要跟"uname -n“指令的結果保持一緻;是以,需要保證兩個節點上的/etc/hosts檔案均為下面的内容:

172.16.26.11  node1.magedu.com node1

172.16.26.12  node2.magedu.com node2

為了使得重新啟動系統後仍能保持如上的主機名稱,還分别需要在各節點執行類似如下的指令:

Node1:

# sed -i 's@\(HOSTNAME=\).*@\1node1.magedu.com@g'  /etc/sysconfig/network

# hostname node1.magedu.com

或者編輯配置檔案

Node2:

# sed -i 's@\(HOSTNAME=\).*@\1node2.magedu.com@g' /etc/sysconfig/network

# hostname node2.magedu.com

2)設定兩個節點可以基于密鑰進行ssh通信,這可以通過類似如下的指令實作:

# ssh-keygen -t rsa

# ssh-copy-id -i ~/.ssh/id_rsa.pub root@node2

Node2:

# ssh-copy-id -i ~/.ssh/id_rsa.pub root@node1

2、安裝如下軟體包:

libibverbs, librdmacm, lm_sensors, libtool-ltdl, openhpi-libs, openhpi, perl-TimeDate

3、安裝corosync和pacemaker,首先下載下傳所需要如下軟體包至本地某專用目錄(這裡為/root/cluster):

cluster-glue

cluster-glue-libs

heartbeat

openaislib

resource-agents

corosync

heartbeat-libs

pacemaker

corosynclib

libesmtp

pacemaker-libs

下載下傳位址:http://clusterlabs.org/rpm/。請根據硬體平台及作業系統類型選擇對應的軟體包;這裡建議每個軟體包都使用目前最新的版本。

使用如下指令安裝:

# cd /root/cluster

# yum -y --nogpgcheck localinstall *.rpm

4、配置corosync,(以下指令在node1.magedu.com上執行)

# cd /etc/corosync

# cp corosync.conf.example corosync.conf

接着編輯corosync.conf,添加如下内容:

service {

 ver:  0

 name: pacemaker

}

aisexec {

 user: root

 group:  root

并設定此配置檔案中 bindnetaddr後面的IP位址為你的網卡所在網絡的網絡位址,我們這裡的兩個節點在192.168.0.0網絡,是以這裡将其設定為192.168.0.0;如下

bindnetaddr: 192.168.0.0

生成節點間通信時用到的認證密鑰檔案:

# corosync-keygen

将corosync和authkey複制至node2:

# scp -p corosync authkey  node2:/etc/corosync/

分别為兩個節點建立corosync生成的日志所在的目錄:

# mkdir /var/log/cluster

# ssh node2  'mkdir /var/log/cluster'

5、嘗試啟動,(以下指令在node1上執行):

# /etc/init.d/corosync start

檢視corosync引擎是否正常啟動:

# grep -e "Corosync Cluster Engine" -e "configuration file" /var/log/messages

Jun 14 19:02:08 node1 corosync[5103]:   [MAIN  ] Corosync Cluster Engine ('1.2.7'): started and ready to provide service.

Jun 14 19:02:08 node1 corosync[5103]:   [MAIN  ] Successfully read main configuration file '/etc/corosync/corosync.conf'.

Jun 14 19:02:08 node1 corosync[5103]:   [MAIN  ] Corosync Cluster Engine exiting with status 8 at main.c:1397.

Jun 14 19:03:49 node1 corosync[5120]:   [MAIN  ] Corosync Cluster Engine ('1.2.7'): started and ready to provide service.

Jun 14 19:03:49 node1 corosync[5120]:   [MAIN  ] Successfully read main configuration file '/etc/corosync/corosync.conf'.

檢視初始化成員節點通知是否正常發出:

# grep  TOTEM  /var/log/messages

Jun 14 19:03:49 node1 corosync[5120]:   [TOTEM ] Initializing transport (UDP/IP).

Jun 14 19:03:49 node1 corosync[5120]:   [TOTEM ] Initializing transmit/receive security: libtomcrypt SOBER128/SHA1HMAC (mode 0).

Jun 14 19:03:50 node1 corosync[5120]:   [TOTEM ] The network interface [172.16.100.11] is now up.

Jun 14 19:03:50 node1 corosync[5120]:   [TOTEM ] A processor joined or left the membership and a new membership was formed.

檢查啟動過程中是否有錯誤産生:

# grep ERROR: /var/log/messages | grep -v unpack_resources

檢視pacemaker是否正常啟動:

# grep pcmk_startup /var/log/messages

Jun 14 19:03:50 node1 corosync[5120]:   [pcmk  ] info: pcmk_startup: CRM: Initialized

Jun 14 19:03:50 node1 corosync[5120]:   [pcmk  ] Logging: Initialized pcmk_startup

Jun 14 19:03:50 node1 corosync[5120]:   [pcmk  ] info: pcmk_startup: Maximum core file size is: 4294967295

Jun 14 19:03:50 node1 corosync[5120]:   [pcmk  ] info: pcmk_startup: Service: 9

Jun 14 19:03:50 node1 corosync[5120]:   [pcmk  ] info: pcmk_startup: Local hostname: node1.magedu.com

如果上面指令執行均沒有問題,接着可以執行如下指令啟動node2上的corosync

# ssh node2  /etc/init.d/corosync start

注意:啟動node2需要在node1上使用如上指令進行,不要在node2節點上直接啟動;

使用如下指令檢視叢集節點的啟動狀态:

# crm status

============

Last updated: Tue Jun 14 19:07:06 2011

Stack: openais

Current DC: node1.magedu.com - partition with quorum

Version: 1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87

2 Nodes configured, 2 expected votes

0 Resources configured.

Online: [ node1.magedu.com node2.magedu.com ]

從上面的資訊可以看出兩個節點都已經正常啟動,并且叢集已經牌正常工作狀态。

6、配置叢集的工作屬性,禁用stonith

corosync預設啟用了stonith,而目前叢集并沒有相應的stonith裝置,是以此預設配置目前尚不可用,這可以通過如下指令驗正:

# crm_verify -L

crm_verify[5202]: 2011/06/14_19:10:38 ERROR: unpack_resources: Resource start-up disabled since no STONITH resources have been defined

crm_verify[5202]: 2011/06/14_19:10:38 ERROR: unpack_resources: Either configure some or disable STONITH with the stonith-enabled option

crm_verify[5202]: 2011/06/14_19:10:38 ERROR: unpack_resources: NOTE: Clusters with shared data need STONITH to ensure data integrity

Errors found during check: config not valid

  -V may provide more details

我們裡可以通過如下指令先禁用stonith:

# crm configure property stonith-enabled=false

使用如下指令檢視目前的配置資訊:

# crm configure show

node node1.magedu.com

node node2.magedu.com

property $id="cib-bootstrap-options" \

 dc-version="1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87" \

 cluster-infrastructure="openais" \

 expected-quorum-votes="2" \

 stonith-enabled="false

從中可以看出stonith已經被禁用。

上面的crm,crm_verify指令是1.0後的版本的pacemaker提供的基于指令行的叢集管理工具;可以在叢集中的任何一個節點上執行。

7、為叢集添加叢集資源

corosync支援heartbeat,LSB和ocf等類型的資源代理,目前較為常用的類型為LSB和OCF兩類,stonith類專為配置stonith裝置而用;

可以通過如下指令檢視目前叢集系統所支援的類型:

# crm ra classes

lsb

ocf / heartbeat pacemaker

stonith

如果想要檢視某種類别下的所用資源代理的清單,可以使用類似如下指令實作:

# crm ra list lsb

# crm ra list ocf heartbeat

# crm ra list ocf pacemaker

# crm ra list stonith

# crm ra info [class:[provider:]]resource_agent

例如:

# crm ra info ocf:heartbeat:IPaddr

8、接下來要建立的web叢集建立一個IP位址資源,以在通過叢集提供web服務時使用;這可以通過如下方式實作:

文法:

primitive <rsc> [<class>:[<provider>:]]<type>

          [params attr_list]

          [operations id_spec]

            [op op_type [<attribute>=<value>...] ...]

op_type :: start | stop | monitor

例子:

 primitive apcfence stonith:apcsmart \

          params ttydev=/dev/ttyS0 hostlist="node1 node2" \

          op start timeout=60s \

          op monitor interval=30m timeout=60s

應用:

# crm configure primitive WebIP ocf:heartbeat:IPaddr params ip=172.16.26.1

通過如下的指令執行結果可以看出此資源已經在node1.magedu.com上啟動:

Last updated: Tue Jun 14 19:31:05 2011

1 Resources configured.

 WebIP (ocf::heartbeat:IPaddr): Started node1.magedu.com

當然,也可以在node1上執行ifconfig指令看到此位址已經在eth0的别名上生效:

# ifconfig

eth0:0    Link encap:Ethernet  HWaddr 00:0C:29:AA:DD:CF 

          inet addr:172.16.26.1  Bcast:192.168.0.255  Mask:255.255.255.0

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          Interrupt:67 Base address:0x2000

而後我們到node2上通過如下指令停止node1上的corosync服務:

# ssh node1  /etc/init.d/corosync stop

檢視叢集工作狀态:

Last updated: Tue Jun 14 19:37:23 2011

Current DC: node2.magedu.com - partition WITHOUT quorum

Online: [ node2.magedu.com ]

OFFLINE: [ node1.magedu.com ]

上面的資訊顯示node1.magedu.com已經離線,但資源WebIP卻沒能在node2.magedu.com上啟動。這是因為此時的叢集狀态為"WITHOUT quorum",即已經失去了quorum,此時叢集服務本身已經不滿足正常運作的條件,這對于隻有兩節點的叢集來講是不合理的。是以,我們可以通過如下的指令來修改忽略quorum不能滿足的叢集狀态檢查:

# crm configure property no-quorum-policy=ignore

片刻之後,叢集就會在目前仍在運作中的節點node2上啟動此資源了,如下所示:

Last updated: Tue Jun 14 19:43:42 2011

 WebIP (ocf::heartbeat:IPaddr): Started node2.magedu.com

好了,驗正完成後,我們正常啟動node1.magedu.com:

# ssh node1 -- /etc/init.d/corosync start

正常啟動node1.magedu.com後,叢集資源WebIP很可能會重新從node2.magedu.com轉移回node1.magedu.com。資源的這種在節點間每一次的來回流動都會造成那段時間内其無法正常被通路,是以,我們有時候需要在資源因為節點故障轉移到其它節點後,即便原來的節點恢複正常也禁止資源再次流轉回來。這可以通過定義資源的黏性(stickiness)來實作。在建立資源時或在建立資源後,都可以指定指定資源黏性。

資源黏性值範圍及其作用:

0:這是預設選項。資源放置在系統中的最适合位置。這意味着當負載能力“較好”或較差的節點變得可用時才轉移資源。此選項的作用基本等同于自動故障回複,隻是資源可能會轉移到非之前活動的節點上;

大于0:資源更願意留在目前位置,但是如果有更合适的節點可用時會移動。值越高表示資源越願意留在目前位置;

小于0:資源更願意移離目前位置。絕對值越高表示資源越願意離開目前位置;

INFINITY:如果不是因節點不适合運作資源(節點關機、節點待機、達到migration-threshold 或配置更改)而強制資源轉移,資源總是留在目前位置。此選項的作用幾乎等同于完全禁用自動故障回複;

-INFINITY:資源總是移離目前位置;

我們這裡可以通過以下方式為資源指定預設黏性值:

# crm configure rsc_defaults resource-stickiness=100

9、結合上面已經配置好的IP位址資源,将此叢集配置成為一個active/passive模型的web(httpd)服務叢集

為了将此叢集啟用為web(httpd)伺服器叢集,我們得先在各節點上安裝httpd,并配置其能在本地各自提供一個測試頁面。

# yum -y install httpd

# echo "<h1>Node1.magedu.com</h1>" > /var/www/html/index.html

# echo "<h1>Node2.magedu.com</h1>" > /var/www/html/index.html

而後在各節點手動啟動httpd服務,并确認其可以正常提供服務。接着使用下面的指令停止httpd服務,并確定其不會自動啟動(在兩個節點各執行一遍):

# /etc/init.d/httpd stop

# chkconfig httpd off

接下來我們将此httpd服務添加為叢集資源。将httpd添加為叢集資源有兩處資源代理可用:lsb和ocf:heartbeat,為了簡單起見,我們這裡使用lsb類型:

首先可以使用如下指令檢視lsb類型的httpd資源的文法格式:

# crm ra info lsb:httpd

lsb:httpd

Apache is a World Wide Web server.  It is used to serve \

         HTML files and CGI.

Operations' defaults (advisory minimum):

    start         timeout=15

    stop          timeout=15

    status        timeout=15

    restart       timeout=15

    force-reload  timeout=15

    monitor       interval=15 timeout=15 start-delay=15

接下來建立資源WebSite:

# crm configure primitive WebSite lsb:httpd

檢視配置檔案中生成的定義:

primitive WebIP ocf:heartbeat:IPaddr \

 params ip="172.16.100.1"

primitive WebSite lsb:httpd

 stonith-enabled="false" \

 no-quorum-policy="ignore"

檢視資源的啟用狀态:

Last updated: Tue Jun 14 19:57:31 2011

Current DC: node2.magedu.com - partition with quorum

2 Resources configured.

 WebSite (lsb:httpd): Started node2.magedu.com

從上面的資訊中可以看出WebIP和WebSite有可能會分别運作于兩個節點上,這對于通過此IP提供Web服務的應用來說是不成立的,即此兩者資源必須同時運作在某節點上。

由此可見,即便叢集擁有所有必需資源,但它可能還無法進行正确處理。資源限制則用以指定在哪些群集節點上運作資源,以何種順序裝載資源,以及特定資源依賴于哪些其它資源。pacemaker共給我們提供了三種資源限制方法:

1)Resource Location(資源位置):定義資源可以、不可以或盡可能在哪些節點上運作;

2)Resource Collocation(資源排列):排列限制用以定義叢集資源可以或不可以在某個節點上同時運作;

3)Resource Order(資源順序):順序限制定義叢集資源在節點上啟動的順序;

定義限制時,還需要指定分數。各種分數是叢集工作方式的重要組成部分。其實,從遷移資源到決定在已降級叢集中停止哪些資源的整個過程是通過以某種方式修改分數來實作的。分數按每個資源來計算,資源分數為負的任何節點都無法運作該資源。在計算出資源分數後,叢集選擇分數最高的節點。INFINITY(無窮大)目前定義為 1,000,000。加減無窮大遵循以下3個基本規則:

1)任何值 + 無窮大 = 無窮大

2)任何值 - 無窮大 = -無窮大

3)無窮大 - 無窮大 = -無窮大

定義資源限制時,也可以指定每個限制的分數。分數表示指派給此資源限制的值。分數較高的限制先應用,分數較低的限制後應用。通過使用不同的分數為既定資源建立更多位置限制,可以指定資源要故障轉移至的目标節點的順序。

是以,對于前述的WebIP和WebSite可能會運作于不同節點的問題,可以通過以下指令來解決:

# crm configure colocation website-with-ip INFINITY: WebSite WebIP

接着,我們還得確定WebSite在某節點啟動之前得先啟動WebIP,這可以使用如下指令實作:

# crm configure order httpd-after-ip mandatory: WebIP WebSite

此外,由于HA叢集本身并不強制每個節點的性能相同或相近,是以,某些時候我們可能希望在正常時服務總能在某個性能較強的節點上運作,這可以通過位置限制來實作:

# crm configure location prefer-node1 WebSite rule 200: node1

這條指令實作了将WebSite限制在node1上,且指定其分數為200;

繼續閱讀