vmwere虛擬機器實現corosync+pacemaker的高可用叢集

來源:互聯網
上載者:User

實驗環境:
1)基於vmwere虛擬機器實現
2)本配置共有兩個測試節點,分別node1.a.com和node2.a.com,相的IP地址分別為172.16.4.11和172.16.4.22;
3)類比實現的叢集服務是web服務;
4)提供web服務的地址為172.16.4.1
實驗拓撲圖:

1,基礎環境設定:
首先配置一台HA主機需要做的準備工作:
1)因為叢集節點的工作的重要性,而且需要提供穩定的網路環境,這裡我們需要給節點配置固定的IP地址,編輯/etc/sysconfig/network-scripts/ifcfg-eth0,配置IP如下:
DEVICE=eth0

BOOTPROTO=static

IPADDR=172.16.4.11

NETMASK=255.255.0.0

ONBOOT=yes

HWADDR=00:0c:29:a2:fa:bb

2)保證節點主機的名稱和“uname -n”命令的結果保持一致,我們需要編輯/etc/sysconfig/network,配置如下:
NETWORKING=yes

NETWORKING_IPV6=no

HOSTNAME=node1.a.com
而且要做以下操作,使主機名稱本次生效:
#source /etc/sysconfig/network
#hostname node1.a.com
3)所有節點的主機名稱和對應的IP位址解析服務可以正常工作,我們不需要DNS服務,只需要保證兩個節點上的/etc/hosts檔案均為下面的內容:

172.16.4.11 node1.a.com node1

172.16.4.22 node2.a.com node2
以上三步配置完成後能實現相互解析主機名稱,如下:

4)配置節點信任關係:
節點1:
# ssh-keygen -t rsa
# ssh-copy-id -i ~/.ssh/id_rsa.pub root@node2
節點2:
# ssh-keygen -t rsa
# ssh-copy-id -i ~/.ssh/id_rsa.pub root@node1
然後測試:

2,安裝環境需要的相應的軟體包:
#yum install -y libibverbs librdmacm lm_sensors libtool-ltdl openhpi-libsopenhpi perl-TimeDate
3,安裝corosync和pacemaker,我們這裡將軟體包放在/root/corosync目錄下(兩個節點都要做):
cluster-glue-1.0.6-1.6.el5.i386.rpm

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

corosync-1.2.7-1.1.el5.i386.rpm

corosynclib-1.2.7-1.1.el5.i386.rpm

heartbeat-3.0.3-2.3.el5.i386.rpm

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

libesmtp-1.0.4-5.el5.i386.rpm

openais-1.1.3-1.6.el5.i386.rpm

openaislib-1.1.3-1.6.el5.i386.rpm

pacemaker-1.0.11-1.2.el5.i386.rpm

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

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

resource-agents-1.0.4-1.1.el5.i386.rpm
這裡您安裝的軟體版本可能和筆者的不一致,只要符合您的實驗平台就行。
開始安裝:
# cd /root/corosync/
# yum -y --nogpgcheck localinstall *.rpm
這裡我們使用本地yum安裝,並忽略包的檢查。
4,corosync的相關配置(在節點1上執行):
# cd /etc/corosync
# cp corosync.conf.example corosync.conf
這裡corosync.conf.example是配置樣本,我們只需拷貝一份,並進行修改即可:
# vim /etc/corosync/corosync.conf

# Please read the corosync.conf.5 manual page

compatibility: whitetank

totem {

version: 2

secauth: off

threads: 0

interface {

ringnumber: 0

bindnetaddr: 172.16.0.0《------此處是您需要修改的地方,為網卡的網路地址

mcastaddr: 226.94.1.1

mcastport: 5405

}
}
logging {
fileline: off

to_stderr: no

to_logfile: yes

to_syslog: yes

logfile: /var/log/cluster/corosync.log《-----此處日誌存放的地方

debug: off

timestamp: on

logger_subsys {

subsys: AMF

debug: off

}

}

amf {

mode: disabled

}

service {《-----------------此處以下是您需要添加的內容

ver: 0

name: pacemaker

}

aisexec {

user: root

group: root

}
產生節點間通訊時用到的認證密鑰檔案:
# corosync-keygen《---此處會在目前的目錄下產生一個認證密鑰檔案
然後拷貝相關的檔案到節點2上:
# scp -p corosync.conf authkey node2:/etc/corosync/
為兩個節點建立corosync產生的日誌所在的目錄:
# mkdir /var/log/cluster
# ssh node2 -- mkdir /var/log/cluster
5,開始啟動corosync(在節點1上執行):
# /etc/init.d/corosync start
Starting Corosync Cluster Engine (corosync): [ OK ] 《------出現此,說明您的corosync已經啟動
開始驗證是否有其他錯誤:
查看corosync引擎是否正常啟動
# grep -e "Corosync Cluster Engine" -e "configuration file"/var/log/messages

Sep 15 11:20:41 localhost smartd[2350]: Opened configuration file/etc/smartd.conf

Sep 15 11:24:24 localhost smartd[2416]: Opened configuration file/etc/smartd.conf

Sep 15 11:30:14 localhost smartd[2659]: Opened configuration file/etc/smartd.conf

Sep 15 15:12:38 localhost corosync[694]: [MAIN ] Corosync Cluster Engine('1.2.7'): started and ready to provide service.

Sep 15 15:12:38 localhost corosync[694]: [MAIN ] Successfully read mainconfiguration file '/etc/corosync/corosync.conf'.
查看初始化成員節點通知是否正常發出
# grep TOTEM /var/log/messages

Sep 15 15:12:38 localhost corosync[694]: [TOTEM ] Initializing transport(UDP/IP).

Sep 15 15:12:38 localhost corosync[694]: [TOTEM ] Initializing transmit/receivesecurity: libtomcrypt SOBER128/SHA1HMAC (mode 0).

Sep 15 15:12:38 localhost corosync[694]: [TOTEM ] The network interface[172.16.4.11] is now up.

Sep 15 15:12:39 localhost corosync[694]: [TOTEM ] Process pause detected for515 ms, flushing membership messages.

Sep 15 15:12:39 localhost corosync[694]: [TOTEM ] A processor joined or leftthe membership and a new membership was formed.

檢查啟動過程中是否有錯誤產生
# grep ERROR: /var/log/messages | grep -v unpack_resources
如果沒有出現錯誤,此處則不會出現任何資訊
查看pacemaker是否正常啟動
# grep pcmk_startup /var/log/messages
Sep 15 15:12:39 localhost corosync[694]: [pcmk ] info: pcmk_startup: CRM:Initialized

Sep 15 15:12:39 localhost corosync[694]: [pcmk ] Logging: Initializedpcmk_startup

Sep 15 15:12:39 localhost corosync[694]: [pcmk ] info: pcmk_startup: Maximumcore file size is: 4294967295

Sep 15 15:12:39 localhost corosync[694]: [pcmk ] info: pcmk_startup: Service: 9

Sep 15 15:12:39 localhost corosync[694]: [pcmk ] info: pcmk_startup: Localhostname : node1.a.com

上述驗證錯誤的操作沒有出現問題的話,您就可以啟動節點2了:
# ssh node2 -- /etc/init.d/corosync start《-----此步您需要在節點1上進行
Starting Corosync Cluster Engine (corosync): [ OK ]《----出現此,說明您的節點2corosync已經啟動,您需要在節點2上繼續驗證是否出現異常錯誤,執行驗證錯誤的步驟即可。
查看節點的運行狀態:
# crm status

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

Last updated: Thu Sep 15 15:17:50 2011

Stack: openais

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

Version: 1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87

2 Nodes configured, 2 expected votes

0 Resources configured.

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

Online: [ node1.a.com node2.a.com ]《----此處說明您的兩個叢集節點均已運行正常。
6,配置叢集的工作屬性:
因為corosync預設已經啟用了stonith,而當前又沒有添加stonith裝置,會出現預設配置停用狀態:
# crm_verify -L

crm_verify[762]: 2011/09/15_15:20:13 ERROR: unpack_resources: Resource start-updisabled since no STONITH resources have been defined

crm_verify[762]: 2011/09/15_15:20:13 ERROR: unpack_resources: Either configuresome or disable STONITH with the stonith-enabled option

crm_verify[762]: 2011/09/15_15:20:13 ERROR: unpack_resources: NOTE: Clusterswith 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《----這樣執行的命令會提交而且會立即生效
INFO: building help index
使用一下命令可以查看當前corosync的配置資訊:
# crm configure show

node node1.a.com

node node2.a.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和lsb兩類,stonith類專為配置stonith裝置而用。
查看當前叢集系統支援的資源代理類型:
# crm ra classes

heartbeat

lsb

ocf / heartbeat pacemaker

Stonith
查看某種類型的資源代理的列表:
#crm ra list lsb

#crm ra list ocf heartbeat

# crm ra list ocf pacemaker

# crm ra list stonith

下面我們來實現web叢集簡單案例:
安裝httpd,並配置相應測試網頁:
# yum -y install httpd
#echo "<h1>Node1.a.com</h1>" >/var/www/html/index.html
#chkconfig httpd off
#service httpd stop
#ssh node2 -- 'echo "<h1>Node2.a.com</h1>" >/var/www/html/index.html'
#ssh node2 -- 'chkconfig httpd off'
#ssh node2 -- 'service httpd stop'
添加web資源:
首先建立的web叢集建立一個IP地址資源,
# crm configure primitive WebIP ocf:heartbeat:IPaddr params ip=172.16.4.1
然後將httpd服務添加為叢集資源。將httpd添加為叢集資源有兩處資源代理可用:lsb和ocf:heartbeat,為了簡單起見,我們這裡使用lsb類型:
#crm configure primitive WebSite lsb:httpd
您此時就可以通過主機的瀏覽器輸入http://172.16.4.1進行訪問web服務:

Ps:筆者在這個實驗時首先添加了web伺服器資源,然後才安裝httpd服務,最後導致查看節點資訊時出現錯誤,無法訪問測試頁面,解決方案:重啟corosync服務即可,當然這在實際生產中是不允許的。
查看節點狀態資訊:
# crm status
============

Last updated: Thu Sep 15 15:51:17 2011

Stack: openais

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

Version: 1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87

2 Nodes configured, 2 expected votes

2 Resources configured.

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

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

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

WebSite (lsb:httpd): Started node2.a.com
我們發現IP資源和web網站資源分別位於兩個節點上,實際生產中我們的網站資源也會分別在不同的節點上;我們也可以將兩個資源分別歸為一組,只供一個網站使用:
# crm configure group Web WebIP WebSite
# crm status

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

Last updated: Thu Sep 15 15:54:31 2011

Stack: openais

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

Version: 1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87

2 Nodes configured, 2 expected votes

1 Resources configured.

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

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

Resource Group: Web

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

WebSite (lsb:httpd): Started node1.a.com《-----注意此處,已經改變為同一節點
後續相關測試:
1,在節點2上使節點1離線:
# ssh node1 -- /etc/init.d/corosync stop
# crm status
============

Last updated: Thu Sep 15 15:57:31 2011

Stack: openais

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

Version: 1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87

2 Nodes configured, 2 expected votes

1 Resources configured.

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

Online: [ node2.a.com ]

OFFLINE: [ node1.a.com ]
此時節點1已經離線,而節點2卻無法獲得相應的資源,當然也無法訪問相應的服務,這不是我們想要的結果,此時的叢集狀態是“WITHOUT quorum”,沒有了quorum,就無法使節點獲得相應的資源,叢集服務無法正常運行。我們可以採取設定quorum,來忽略quorum。如下設定:
# crm configure property no-quorum-policy=ignore
# crm status
============

Last updated: Thu Sep 15 16:00:24 2011

Stack: openais

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

Version: 1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87

2 Nodes configured, 2 expected votes

1 Resources configured.

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

Online: [ node2.a.com ]

OFFLINE: [ node1.a.com ]

Resource Group: Web

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

WebSite (lsb:httpd): Started node2.a.com《-------此時節點2已經獲得資源
測試網頁如下:

如果此時您再啟動節點1的corosync服務,您猜想會出現什麼情況呢?
# ssh node1 -- /etc/init.d/corosync start
# crm status
============

Last updated: Thu Sep 15 16:02:09 2011

Stack: openais

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

Version: 1.0.11-1554a83db0d3c3e546cfd3aaff6af1184f79ee87

2 Nodes configured, 2 expected votes

1 Resources configured.

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

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

Resource Group: Web

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

WebSite (lsb:httpd): Started node1.a.com《------資源又重新被節點1獲得
測試網頁如下:

啟動節點1的後資源又被重新獲得,如果節點1的裝置效能非常好,而且比較重要,這種情況我們可以允許它發生,但是如果節點效能相當,且兩節點相距不是很近,這種資源不斷的“易主”,會造成那段時間內其無法正常被訪問,所以,我們有時候需要在資源因為節點容錯移轉到其它節點後,即便原來的節點恢複正常也禁止資源再次流轉回來。這可以通過定義資源的黏性(stickiness)來實現。在建立資源時或在建立資源後,都可以指定指定資源黏性。

資源黏性值範圍及其作用:
等於0:這是預設選項。資源放置在系統中的最適合位置,這意味著當負載能力“較好”或較差的節點變得可用時才轉移資源。此選項的作用基本等同於自動容錯回復,只是資源可能會轉移到非之前活動的節點上;
大於0:資源更願意留在當前位置,但是如果有更合適的節點可用時會移動。值越高表示資源越願意留在當前位置;
小於0:資源更願意移離當前位置。絕對值越高表示資源越願意離開當前位置;
INFINITY:如果不是因節點不適合運行資源(節點關機、節點待機、達到migration-threshold或配置更改)而強制資源轉移,資源總是留在當前位置。此選項的作用幾乎等同於完全禁用自動容錯回復;
-INFINITY:資源總是移離當前位置;

筆者通俗的理解就是:你沒錢誰還願意跟你呀,你越有錢我就越捨不得你!

手動設定資源的預設黏性值:
# crm configure rsc_defaults resource-stickiness=100

這裡我們又涉及一個概念:資源約束
由以上的實驗我們瞭解資源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

我們還可以設定資源啟動順序,WebIP首先運行,再運行WebSite:
# crm configure order httpd-after-ip mandatory: WebIP WebSite

此外,某些時候我們可能希望在正常時服務總能在某個效能較強的節點上運行,這可以通過位置約束來實現:
# crm configure location prefer-node1 WebSite rule 200: node1
這條命令實現了將WebSite約束在node1上,且指定其分數為200;

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.