天天看點

Corosync+Pacemaker實作web高可用叢集

 Corosync+Pacemaker實作web高可用叢集

1 、corosync簡介

oreosync在傳遞資訊的時候可以通過一個簡單的配置檔案來定義資訊傳遞的方式和協定等。它是一個新興的軟體,2008年推出,但其實它并不是一個真正意義上的新軟體,在2002年的時候有一個項目Openais , 它由于過大,分裂為兩個子項目,其中可以實作HA心跳資訊傳輸的功能就是Corosync ,它的代碼60%左右來源于Openais. Corosync可以提供一個完整的HA功能,但是要實作更多,更複雜的功能,那就需要使用Openais了。Corosync是未來的發展方向。在以後的新項目裡,一般采用Corosync,而hb_gui可以提供很好的HA管理功能,可以實作圖形化的管理。另外相關的圖形化有RHCS的套件luci+ricci。

2、實作說明:需要兩台主機即兩個服務節點,都需要安裝apache,并能夠提供服務,實際應用中網頁内容需一樣,但這裡隻為做實驗,需不一樣,才能看到效果。

節點1,IP位址:172.16.23.11 主機名node1.wl.com  主伺服器

節點2,IP位址:172.16.23.12 主機名 node2.wl.com  備用伺服器

3、設定web1,web2主機名,編輯/etc/hosts 檔案

網卡eth0設定

vim /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE=eth0

BOOTPROTO=static

ONBOOT=yes

IPADDR=172.16.23.11

GATEWAY=172.16.0.1

HWADDR=00:0c:29:33:45:ab

編緝/etc/hosts檔案,添加如下兩行

172.16.23.11     node1.wl.com      node1  //别名    

 172.16.23.12    node2.wl.com      node2  //别名    

重新開機網絡使生效

Service network restart

uname –n  名字沒改,用hostname使立即生效

hostname  node1

4、設定兩伺服器時鐘同步

date 0416185012.33   //目前時間 :格式月日時分年秒

hwclock –w         //把系統時間同步到硬體

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

Node1:

# 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

6、下載下傳安裝如下軟體包,及安裝http

cluster-glue-1.0.6-1.6.el5.i386.rpm     

heartbeat-3.0.3-2.3.el5.i386.rpm    

 pacemaker-libs-1.0.11-1.2.el5.i386.rpm

cluster-glue-libs-1.0.6-1.6.el5.i386.rpm 

heartbeat-libs-3.0.3-2.3.el5.i386.rpm 

perl-TimeDate-1.16-5.el5.noarch.rpm

corosync-1.2.7-1.1.el5.i386.rpm         

 libesmtp-1.0.4-5.el5.i386.rpm        

 resource-agents-1.0.4-1.1.el5.i386.rpm

corosynclib-1.2.7-1.1.el5.i386.rpm        pacemaker-1.0.11-1.2.el5.i386.rpm

使用如下指令安裝:

# yum -y --nogpgcheck localinstall *.rpm   //本地yum安裝,可幫助解決依賴關系

安裝httpd服務 yum install httpd

設定首頁 echo ”node1” > /var/www/html/index.html

浏覽器測試,確定成功!

以上内容node1,node2基本類似!

8、配置corosync

cd /etc/corosync

cpcorosync.conf.example  /corosync.conf

#vim /corosync.conf 配置檔案内容如下

totem {

        version: 2

        secauth: on

        threads: 0

        interface {

                ringnumber: 0

                bindnetaddr: 172.16.0.0    //設定你的網段

                mcastaddr: 226.194.1.23  //多點傳播方式,ip在224-239網段可随意設定                mcastport: 5405

        }

}

logging {               // 子系統設定

        fileline: off

        to_stderr: no

        to_logfile: yes  

        to_syslog: no  //日志有兩個,這裡關閉,友善查找日志内容

        logfile: /var/log/cluster/corosync.log

        debug: off      //如果想排錯,可臨時開啟

        timestamp: on

        logger_subsys {

                subsys: AMF

                debug: off

amf {

        mode: disabled

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

service {    # 定義一個服務

ver: 0       

name: pacemaker    //可啟動pacemaker

use_mgmtd: yes

aisexec {

user: root

group: root

建立日志存放檔案夾mkdir /var/log/cluster

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

# corosync-keygen

二進制,dev/random商不夠

将corosync和authkey複制至node2:

# scp -p corosync.conf  authkey  node2:/etc/corosync/   //拷貝内容到另一主機

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

# /etc/init.d/corosync start

service corosync start 5560

檢視corosync引擎是否正常啟動:                              /var/log/cluster/corosync.log

# grep -e "Corosync Cluster Engine" -e "configuration file" /var/log/cluster/corosync.log

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

Jun 14 19:03:49 node1 corosync[5120]:   [MAIN  ] Successfully read main configuration file

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

# grep  TOTEM  /var/log/cluster/corosync.log

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 [192.168.0.5] 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/cluster/corosync.log | grep -v unpack_resources

檢視pacemaker是否正常啟動:

# grep pcmk_startup /var/log/cluster/corosync.log

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.a.org

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

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

chkconfig httpd off

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

crm_mon

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

# crm status

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

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

Stack: openais

Current DC: node1.a.org - partition with quorum

Version: 1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87

2 Nodes configured, 2 expected votes

0 Resources configured.

Online: [ node1.a.org node2.a.org ]

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

12、配置叢集的工作屬性,禁用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.a.org

node node2.a.org

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

       dc-version="1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87" \

       cluster-infrastructure="openais" \

       expected-quorum-votes="2" \

       stonith-enabled="false

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

13、叢集添加叢集資源方法

檢視叢集系統所支援的類型:

# crm ra classes

heartbeat

lsb

ocf / heartbeat pacemaker

stonith

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

檢視某種類别下資源代理清單,方法如下

#crm ra list lsb| ocf heartbeat| ocf  pacemaker | stonith  //crm ra list 類别

例子:檢視資源代理幫助資訊

# crm ra info ocf:heartbeat:IPaddr

14、接下來要建立的web叢集建立一個IP位址資源,以在通過叢集提供web服務時使用

# crm configure primitive WebIP ocf:heartbeat:IPaddr params ip=172.16.23.1 //打開網頁時的ip位址

primitive    基本類型資源

WebIP       資源名稱

ocf:heartbeat:IPaddr  代理名稱

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

WebIP     (ocf::heartbeat:IPaddr):  Started node1.a.org

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

# ifconfig

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

          inet addr:192.168.0.66  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.a.org - partition WITHOUT quorum

1 Resources configured.

Online: [ node2.a.org ]

OFFLINE: [ node1.a.org ]

上面的資訊顯示node1.a.org已經離線,但資源WebIP卻沒能在node2.a.org上啟動。這是因為此時的叢集狀态為"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.a.org

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

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

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

# crm configure rsc_defaults resource-stickiness=100

17、我們将此httpd服務添加為叢集資源。将httpd添加為叢集資源有兩處資源代理可用:lsb和ocf:heartbeat,為了簡單起見,我

 # /etc/init.d/httpd stop

# chkconfig httpd off  //不能讓開機自動啟動

們這裡使用lsb類型:

http://172.16.23.1/index

建立資源WebSite:

# crm configure primitive WebSite lsb:httpd

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

primitive WebIP ocf:heartbeat:IPaddr \

       params ip="192.168.0.66"

primitive WebSite lsb:httpd

       stonith-enabled="false" \

       no-quorum-policy="ignore"

檢視資源的啟用狀态:

# crm status Online: [ node1.a.org node2.a.org ]

 WebIP   (ocf::heartbeat:IPaddr):  Started node1.a.org

 WebSite (lsb:httpd):     Started node2.a.org

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