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可能會運作于不同節點的問題,可以通過以下指令來解決: