corosync+pacemaker實現web集羣高可用


pacemaker:心臟起搏器,是一個集羣資源管理器。它實現最大可用性羣集服務的節點和資源級別故障檢測和恢復使用首選集羣基礎設施提供的消息和成員能力。

pacemaker是個資源管理器,不提供心跳信息。

heartbeat3.0拆分後的組成部分:

    heartbeat:將原來的消息通信層獨立爲heartbeat項目,新的heartbeat只負責維護集羣各節點的信息以及他們之前通信。

    cluster-glue:相當於一箇中間層,它用來將heartbeat和pacemaker關聯起來,主要包含2個部分,即LRM和STONITH。

    resource-agent:用來控制服務啓停,監控服務器狀態的腳本集合

    pacemaker:也就是cluster resource manager(CRM),用來管理整個HA的控制中心,客戶端通過pacemaker來配置管理監控整個集羣。


pacemaker特點

    主機和應用程序級別的故障檢測和恢復

    幾乎支持任何冗餘配置

    同時支持多種集羣配置模式

    配置策略處理法定人數損失

    支持應用啓動/關機順序

    支持多種模式的應用程序

    可以測試任何故障或集羣的羣集狀態


pacemaker內部結構

600px-Stack.png

羣集組件說明

    stonithd:心跳系統

    lrmd:本地資源管理守護進程。它提供了一個通用的接口支持的資源類型,直接調用資源代理。

    pengine:策略引擎。

    cib:羣集信息庫。

    crmd:羣集資源管理守護進程。主要消息代理的PEnine和LRM,還選舉一個領導者DC統籌活動的集羣

    openais:OpenAIS的消息和成員層

    heartbeat:心跳消息層,OpenAIS的一種替代

    ccm:共識羣集成員,心跳成員層

功能

CIB使用XML表示集羣中所有資源的配置和當前狀態,CIB的內容會被自動同步整個集羣中,使用PEngine計算集羣的理想狀態,生成指令列表,然後輸送給DC。

pacemaker集羣中所有節點選舉的DC節點作爲主決策節點。如果當選DC的節點宕機,它會在所有的節點上迅速建立一個新的DC。DC將PEngine生成的策略傳遞給其他節點上的LRMD或CRMD通過集羣消息傳遞基礎結構。

當集羣中有節點宕機PEngine重新計算理想策略。在某些情況下,可能有必要關閉節點,以保護共享數據或完成的資源回收,因爲,pacemaker配置了stonithd設備。STONITH可以將其它節點爆頭,通常是實現與遠程電源斷開。pacemaker會將STONITH設備配置爲資源保存在CIB中,使他們可以更容易地監測資源失敗或宕機。


實驗操作centos6.X

拓撲圖

wKiom1S02QTQcxOvAAFJSxjKOk0076.jpg


1、安裝配置

yum install corosync pacemaker -y

cd /etc/corosync/

cp corosync.conf.example corosync.conf

2、修改配置文件

vim corosync.conf 
compatibility: whitetank 
totem {    #指定心跳信息傳遞的參數 
        version: 2                  
        secauth: off            #是否開啓安全認證 
        threads: 0              #開啓線程的個數 
        interface { 
                ringnumber: 0    #標識一個通信接口 
                bindnetaddr: 10.10.0.0  #指定心跳報文傳輸的網段  
                mcastaddr: 226.94.1.1    #指定心跳報文發送的組播地址 
                mcastport: 5405      #指定端口 
                ttl: 1                #生命週期,跨3層的話需要加大一點,不然對方接收不到,最大255 
        } 

logging { 
        fileline: off 
        to_stderr: no    #是否發送標準錯誤輸出 
        to_logfile: yes  #是否記錄到日誌文件中 
        to_syslog: no    #是否記錄到syslog,二者選其一即可 
        logfile: /var/log/cluster/corosync.log    #日誌文件的路徑 
        debug: off        #是否開啓調試信息 
        timestamp: on    #日誌中是否協商時間戳 
        logger_subsys { 
                subsys: AMF    #是否記錄AMF 
                debug: off    #是否開啓AMF的調試信息 
        } 

amf { 
        mode: disabled        #AMF的狀態 

service {              #corosync啓動時也將pacemaker啓動 
    ver:  0 
    name: pacemaker 

aisexec {              #指定ais的用戶和組的身份 
    user:  root 
    group:  root 
}


3、生成密鑰

corosync-keygen

ll /etc/corosync/    #保證authkey的權限爲400

4、拷貝到node2

scp -p authkey corosync.conf node2:/etc/corosync/

5、自從RH6之後就不再提供pacemaker的命令行工具,我們需要單獨安裝crmsh,它依賴pssh,另外可以使用pcs代替crmsh,下面會單獨講pcs使用。

rpm -ivh crmsh-2.1-1.6.i686.rpm pssh-2.3.1-4.1.i686.rpm

6、兩個節點都需要啓動corosync

service corosync start

7、查看corosync引擎是否正常啓動 

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

#查看初始化成員節點通知是否正常發出 

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

#查看pacemaker是否正常啓動

grep pcmk_startup /var/log/cluster/corosync.log   
#檢查啓動過程中是否有錯誤產生 

 grep ERROR: /var/log/cluster/corosync.log  

#在node2上啓動服務並查看日誌信息

ssh node2 'service corosync start'  

8、crm_mon  #查看集羣狀態

crm status    #查看集羣狀態


9、接下來要給兩個節點定一下資源配置,所有的操作都是在crm命令下進行的。

#crm

crm(live)# 進入crm模式並且按兩下Tab鍵補全
?           cd          configure   exit        history     options     ra          site        up      
bye         cib         end         help        node        quit        resource    status  
crm(live)# help  查看每個命令的意思
This is crm shell, a Pacemaker command line interface.
Available commands:
    cib              manage shadow CIBs
    resource         resources management
    configure        CRM cluster configuration
    node             nodes management
    options          user preferences
    history          CRM cluster history
    site             Geo-cluster support
    ra               resource agents information center
    status           show cluster status
    help,?           show help (help topics for list of topics)
    end,cd,up        go back one level
    quit,bye,exit    exit the program
crm(live)# configure
crm(live)configure#
?                  colocation         exit               load               op_defaults        refresh            save               user
bye                commit             fencing_topology   location           order              rename             schema             verify
cd                 default-timeouts   filter             master             primitive          role               show               xml
cib                delete             graph              modgroup           property           rsc_defaults       simulate       
cibstatus          edit               group              monitor            ptest              rsc_template       template       
clone              end                help               ms                 quit               rsc_ticket         up             
collocation        erase              history            node               ra                 rsctest            upgrade        
crm(live)configure# order help 還可以用這種方式查看命令使用格式
usage: order <id> {kind|<score>}: <rsc>[:<action>] <rsc>[:<action>] ...

        [symmetrical=<



10、定義全局配置並提交

crm(live)#configure property stonith-enabled=false 禁止stonith設備正常情況下不應該禁止但是我們這裏不考慮stonith設備

crm(live)#configure property no-quorum-policy=ignore 忽略法定投票因爲節點就兩個不可能超過半數票

crm(live)# configure  必須在configure目錄下執行

crm(live)configure# verify

crm(live)configure# commit

INFO: apparently there is nothing to commit

INFO: try changing something first

資源類型:

添加資源之前必須要知道當前集羣所支持的RA類型,corosync支持heartbeatLSB和ocf等類型的資源代理。目前較爲常用的類型爲LSB和OCF兩類,STONITH類專爲stonith設備而用。

查看當前集羣所支持的RA類型列表

crm(live)# ra 在資源列表目錄下

crm(live)ra# classes    查看資源的類型

lsb
ocf / heartbeat pacemaker
service

stonith

查看OCF類型下的資源代理

 crm(live)ra# list ocf

CTDB           ClusterMon     Dummy          Filesystem     HealthCPU      HealthSMART    IPaddr         IPaddr2        IPsrcaddr      LVM            MailTo
Route          SendArp        Squid          Stateful       SysInfo        SystemHealth   VirtualDomain  Xinetd         apache         conntrackd     controld
dhcpd          ethmonitor     exportfs       mysql          mysql-proxy    named          nfsserver      nginx          pgsql          ping           pingd

postfix        remote         rsyncd         rsyslog        slapd          symlink        tomcat 

crm(live)ra# list ocf heartbeat

CTDB           Dummy          Filesystem     IPaddr         IPaddr2        IPsrcaddr      LVM            MailTo         Route          SendArp        Squid
VirtualDomain  Xinetd         apache         conntrackd     dhcpd          ethmonitor     exportfs       mysql          mysql-proxy    named          nfsserver
nginx          pgsql          postfix        rsyncd         rsyslog        slapd          symlink        tomcat     

11、爲集羣添加資源

IP資源名:node1,IP類型:ocfheartbeat:IPaddr IP:10.10.0.11,啓動監控程序,檢測到失敗後的方式爲重啓服務。

crm(live)# configure

crm(live)configure# primitive vip ocf:heartbeat:IPaddr params ip=10.10.0.11 op monitor interval=30s timeout=20s on-fail=restart

crm(live)configure# verify     #校驗

crm(live)configure# commit


12、定義本地資源httpd服務

crm(live)configureprimitive httpd lsb:httpd


13、爲了避免資源分裂,可以把IP和服務加入到一個組內

crm(live)configuregroup webgroup vip httpd


14、查看IP是否生效

ifconfig

用瀏覽器查看服務是否正常


15、停掉node1,看是否node2能夠正常提供服務,這是實現高可用最重要的一步。

crm(live)# node standby 讓當前節點自動成爲備用節點

crm(live)# status


16、資源粘性

我們有時候需要在資源因爲節點故障轉移到其它節點後,即便原來的節點恢復正常也禁止資源再次流轉回來。這可以通過定義資源的黏性(stickiness)來實現。在創建資源時或在創建資源後,都可以指定指定資源黏性

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

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

大於0:資源更願意留在當前位置,但是如果有更合適的節點可用時會移動。值越高表示資源越願意留在當前位置;
   小於0:資源更願意移離當前位置。絕對值越高表示資源越願意離開當前位置;
   INFINITY:如果不是因節點不適合運行資源(節點關機、節點待機、達到migration-threshold 或配置更改)而強制資源轉移,資源總是留在當前位置。此選項的作用幾乎等同於完全禁用自動故障回覆;
   -INFINITY:資源總是移離當前位置;
手動設置資源的默認黏性值:
# crm configure rsc_defaults resource-stickiness=100
 
資源約束
  資源vip和httpd有可能會分別運行於兩個節點上,這對於通過此IP提供Web服務的應用來說是不成立的,即兩者資源必須同時運行在某節點上,由此可見,即便集羣擁有所有必需資源,但它可能還無法進行正確處理。資源約束則用以指定在哪些羣集節點上運行資源,以何種順序裝載資源,以及特定資源依賴於哪些其它資源。
pacemaker共給我們提供了三種資源約束方法:

1)Resource Location(資源位置):定義資源可以、不可以或儘可能在哪些節點上運行;
    2)Resource Collocation(資源排列):用以定義集羣資源可以或不可以在某個節點上同時運行;
    3)Resource Order(資源順序):順序約束定義集羣資源在節點上啓動的順序;

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

1)任何值 + 無窮大 = 無窮大
    2)任何值 - 無窮大 = -無窮大
    3)無窮大 - 無窮大 = -無窮大

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

對於前述的vip和httpd可能會運行於不同節點的問題,我們還可以通過以下方法來解決:
# crm configure colocation httpd-with-vip INFINITY: httpd vip

我們還可以設置資源啓動順序,vip首先運行,再運行httpd
# crm configure order httpd-after-vip mandatory: vip httpd

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


增加nfs資源

1、配置NFS服務器

mkdir -pv /web

vim /etc/exports

/web/    10.10.0.0/12(ro,aysnc)

echo '<h1>cluster nfs server</h1>' > /web/index.html

service rpcbind start

service nfs start

showmount -e 10.10.21.221

2、節點掛載測試

mount -t nfs 10.10.21.221:/web /mnt

ll /mnt

total 4

-rw-r--r-- 1 root root 28 Jan 29 17:14 index.html

mount

umount /mnt

3、配置vip、httpd、nfs

crm(live)configure# primitive vip ocf:heartbeat:IPaddr params ip=10.10.0.221 nic=eth0:0 cidr_netmask=12 op monitor interval=15m timeout=30s on-fail=restart

crm(live)configure# verify

crm(live)configure# commit

crm(live)configure# primitive httpd lsb:httpd

crm(live)configure# verify

crm(live)configure# commit

crm(live)configure# primitive nfs ocf:heartbeat:Filesystem params device=10.10.0.221:/web directory=/var/www/html fstype=nfs op monitor timeout=20s

property default-action-timeout=60

crm(live)configure# verify

crm(live)configure# commit

WARNING: nfs: default timeout 20s for start is smaller than the advised 60

WARNING: nfs: default timeout 20s for stop is smaller than the advised 60

出現WARNING的時候,運行下面這條命令

crm(live)configure# property default-action-timeout=60

crm(live)configure# show

node node1.test.com \

        attributes standby=off

node node2.test.com \

        attributes standby=off

primitive httpd lsb:httpd

primitive nfs Filesystem \

        params device="10.10.0.221:/web" directory="/var/www/html" fstype=nfs

primitive vip IPaddr \

        params ip=10.10.0.221 nic="eth0:0" cidr_netmask=12 \

        op monitor interval=15m timeout=30s on-fail=restart

property cib-bootstrap-options: \

        dc-version=1.1.11-97629de \

        cluster-infrastructure="classic openais (with plugin)" \

        expected-quorum-votes=2 \

        stonith-enabled=false \

        no-quorum-policy=ignore \

        last-lrm-refresh=1422524733 \

        default-action-timeout=60


4、定義組資源

這三個資源不在同一節點上。可以定義一個組來使資源在同一節點上。

crm(live)configure# group webservie vip nfs httpd

crm(live)configure# verify

crm(live)configure# commit

配置順序約束

crm(live)configure# order vip_then_nfs_then_httpd inf: vip nfs httpd         

crm(live)configure# verify

crm(live)configure# commit

#表示啓動順序依次是vip、nfs、httpd


5、定義網絡ping node監控

(1).配置ping node主資源

crm(live)configure# primitive pnode ocf:pacemaker:ping params host_list=10.10.0.1 multiplier=100 op monitor interval=10s timeout=60s         

crm(live)configure# verify

crm(live)configure# commit

#host_list:是網關或者可以ping通的其他節點,可以使用多個。

#multiplier:表示如果集羣中的節點可以ping通,那麼節點的分數就會乘以這個參數指定值來進行累加。比如node1,ping通一次就是1*100,2 次就是2*100,依次類推

(2).配置pnode的克隆資源

crm(live)configure# clone cl_pnode pnode

crm(live)configure# verify

crm(live)configure# commit

(3).配置ping node失敗的時候,資源的故障轉移

crm(live)configure# location nfs_on_ping webservie rule -inf: not_defined pingd or pingd number:lte 0 

crm(live)configure# verify

crm(live)configure# commit

#表示如果由ping node得出的分數小於等於0 或者某個節點沒有定義域ping node 相關的屬性的話,那麼就進行資源的轉移。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章