Linux高可用性方案之Heartbeat的CRM配置

本文轉載至http://czmmiao.iteye.com/blog/1179225


heartbeat默認模式是沒法監控資源的,也就是說其中某個資源要是 crash掉了,也不會發生任何動作,它只有當它認爲對方機器dead後纔會發生動作,也就是機器crashed,網絡斷掉了之類。這顯然沒法達到我們的 目標。爲了達到我們的目標就要採用crm(cluster resource management)模式了。

本文需要實現的目標,讓ha自動監控資源的運行狀態。啓動服務ip爲192.168.0.222,自動運行腳本echo.sh
echo.sh腳本內容如下
#!/bin/bash
echo "ii" >> /var/lib/heartbeat/crm/1.txt
exit 0

配置crm
首先,先按默認模式安裝、配置Heartbeat讀者可參見
http://czmmiao.iteye.com/blog/1174010
默認模式配置成功後在ha.cf裏面增加
crm on
將haresources資源文件轉換成 cib.xml文件,2.1.3自帶有轉換腳本
#/usr/lib/heartbeat/haresources2cib.py haresources
輸出文件在/var/lib /heartbeat/crm/cib.xml
如果hacluster和haclient用戶和用戶組是在安裝heartbeat之後創建的話,則需要執行下面命令修改權限
修改heartbeat目錄權限,可以用以下命令:
#find / -type d -name "heartbeat" -exec chown -R hacluster {} ;
#find / -type d -name "heartbeat" -exec chgrp -R haclient {} ;

在2.0的版本中ipfail與crm 模式有衝突,所以在ha.cf中不可打開ipfail。
cib.xml文件的修改
Heartbeat的cib.xml文件資源有兩種配置風格分別是ocf和lsb在修改前先介紹一下ocf和lsb格式的區別:
LSB格式的角本必須支持status功能,必須能接收start,stop,status,三個參數。
lsb格式的啓動角本在 /usr/lib/lsb/resource.d/heartbeat目錄下。
例如LSB風格的腳本,運行./mysql status時候,
返回值包含OK或則running則表示資源正常
返回值包含stopped或者No則表示資源不正常。
OCF格式,則必須支持start,stop,monitor三個參數.其中status和monitor參數是用來監控資源的。ocf格式的啓動腳本在/usr/lib/ocf/resource.d/heartbeat(也許你的機器上目錄不是這個,可以搜索ocf來查找)
假如是OCF風格的腳本,運行./mysql monitor時候,
返回0表示資源是正常的,
返回7表示資源出現問題.
在Heartbeat2.1.3中默認的資源配置風格爲ocf,如果需要將資源的配置風格聰ocf修改爲lsb有兩種修改方法
1.修改cib.xml,將資源的ocf改成lsb。
將腳本文件拷貝至/usr/lib/lsb/resource.d/heartbeat(如果該目錄不存在,則手工創建,並將權限賦給hacluster:haclient)
2.修改/usr /lib/ocf/resource.d/heartbeat下面的腳本,使之能正常工作。或者將/etc/init.d/下的腳本拷過來,修改使它支持monitor操作
配置完成後啓動heartbeat服務

#/etc/init.d/heartbeat start
創建羣集資源
可以創建以下類型的資源
原始資源:原始資源是最基本的資源類型。
資源組:資源組包含一系列需要放置在一起、按順序啓動和以反序停止的資源。
克隆資源:克隆資源是可以在多個主機上處於活動狀態的資源。如果各個資源代理支持,則任何資源均可克隆。

主資源:主資源是一種特殊的克隆資源,主資源可以具有多種模式。主資源必須只能包含一個組或一個常規資源。
資源選項
您可以爲添加的每個資源定義選項。羣集使用這些選項來決定資源的行爲方式,它們會告知 CRM 如何對待特定的資源。可使用 crm_resource –meta 命令或 GUI 來設置資源選項

原始資源選項
priority 如果不允許所有的資源都處於活動狀態,羣集會停止優先級較低的資源以便保持較高優先級資源處於活動狀態。

target-role 羣集應試圖將此資源保持在何種狀態,允許的值:Stopped 和 Started。
is-managed 是否允許羣集啓動和停止資源,允許的值:true和 false。
resource-stickiness 資源留在所處位置的自願程度如何,默認爲default- resource-stickiness 的值。
migration-threshold 節點上的此資源應發生多少故障後才能確定該節點沒有資格主管此資源,默認值:none。
multiple-active 如果發現資源在多個節點上活動,羣集該如何操作,允許的值:block(將資源標記爲未受管)、stop_only 和 stop_start。
failure-timeout 在恢復爲如同未發生故障一樣正常工作(並允許資源返回它發生故障的節點)之前,需要等待幾秒鐘,默認值:never。
資源操作
默認情況下,羣集將不會確保您的資源一直正常。要指示羣集如此操作,需要向資源的定義中添加一個監視操作。可爲所有類或資源代理添加監視操作。

ID :您的操作名稱。必須是唯一的。
name :要執行的操作。常見值:monitor、start 和 stop。
interval :執行操作的頻率。單位:秒。
timeout : 需要等待多久才能聲明操作失敗。
requires :需要滿足什麼條件才能發生此操作。允許的值:nothing、quorum 和 fencing。默認值取決於是否啓用屏障和資源的類是否爲 stonith。對於 STONITH 資源,默認值爲 nothing。
on-fail :此操作失敗時執行的操作。允許的值:

ignore:假裝資源沒有失敗。
block:不對資源執行任何進一步操作。
stop:停止資源並且不在其他位置啓動該資源。
restart:停止資源並(可能在不同的節點上)重啓動。
fence:關閉資源失敗的節點 (STONITH)。
standby:將所有資源從資源失敗的節點上移走。
enabled 如果值爲 false,將操作視爲不存在。允許的值:true、false。

原始資源包含的參數
元屬性:元屬性是可以爲資源添加的選項。它們告訴 CRM 如何處理特定資源。
實例屬性:實例屬性是特定資源類的參數,用於確定資源類的行爲方式及其控制的服務實例。
操作:可以爲資源添加監視操作。監視操作指示羣集確保資源狀況依然正常。所有資源代理類都可以添加監視操作。您還可以設置特定參數,如爲 start 或stop 操作設置 timeout值。
定義原始資源:primitive   唯一ID   資源代理類型:資源代理的提供程序:資源代理名稱  實例屬性   操作  元屬性

migration-threshold用來定義資源的故障次數,假設已經爲資 源配製了一個首選在節點上運行的位置約束。如果那裏失敗了,系統會檢查 migration-threshold 並與故障計數進行比較。如果故障計數 >= migration-threshold,會將資源遷移到下一個自選節點。
默認情況下,一旦達到閾值,就只有在管理員手動重置資源的故障計數後(在修復故障原因後),才允許在該節點上運行有故障的資源。
但是,可以通過設置資源的 failure-timeout 選項使故障計數失效。如果設置migration-threshold=2 和 failure-timeout=60s ,將會導致資源在兩次故障後遷移到新的節點,並且可能允許在一分鐘後移回(取決於黏性和約束分數)。
遷移閾值概念有兩個例外,在資源啓動失敗或停止失敗時出現:啓動故障會使故障計數設置爲 INFINITY,因此總是導致立即遷移。停止故障會導致屏障(stonith-enabled 設置爲 true 時,這是默認設置)。如果不定義 STONITH資源(或 stonith-enabled 設置爲 false),則該資源根本不會遷移。
重置資源的故障計數:對指定節點上的指定資源執行 crm_resource -C 和 crm_failcount -D 命令。
如果在創建時將資源的初始狀態設置爲 stopped(target-role 元屬性的值爲 stopped),則資源在創建後不會自動啓動。要想啓動資源使用命令:crm resource start 資源ID
配置資源監視(可以在定義資源時用op monitor命令定義)
雖然 High Availability Extension 可以檢測節點故障,但也能夠檢測節點上的各個資源何時發生故障。如果希望確保資源運行,則必須爲該資源配置資源監視。資源監視包括指定超時和/或啓動延遲值以及間隔。間隔告訴 CRM 檢查資源狀態的頻率。
配置資源約束
配置好所有資源只是完成了該作業的一部分。即便羣集熟悉所有必需資源,它可能還無法進行正確處理。資源約束允許您指定在哪些羣集節點上運行資源、以何種順序裝載資源,以及特定資源依賴於哪些其他資源。
三種不同的約束:
Resource Location(資源位置): 位置約束定義資源可以、不可以或首選在哪些節點上運行。
Resource Collocation(資源排列): 排列約束告訴羣集資源可以或不可以在某個節點上一起運行。
Resource Order(資源順序):排序約束定義操作的順序。
定義約束時,還需要指定分數。各種分數是羣集工作方式的重要組成部分。其實,從遷移資源到決定在已降級羣集中停止哪些資源的整個過程是通過以某種方式操縱 分數來實現的。分數按每個資源來計算,資源分數爲負的任何節點都無法運行該資源。在計算出資源分數後,羣集選擇分數最高的節點。INFINITY(無窮 大)目前定義爲 1,000,000。加減無窮大遵循以下 3 個基本規則:
任何值 + 無窮大 = 無窮大
任何值 – 無窮大 = -無窮大
無窮大 – 無窮大 = -無窮大
定義資源約束時,也可以指定每個約束的分數。分數表示您指派給此資源約束的值。分數較高的約束先應用,分數較低的約束後應用。通過使用不同的分數爲既定資源創建更多位置約束,可以指定資源要故障轉移至的目標節點的順序。
指定資源故障轉移節點
資源在出現故障時會自動重啓動。如果在當前節點上無法實現重啓動,或如果在當前節點上發生 N 次故障,則資源會試圖故障轉移到其他節點。您可以多次定義資源的故障次數(migration-threshold),在該值之後資源會遷移到新節點。
指定資源故障回覆節點(資源黏性)
當原始節點恢復聯機並位於羣集中時,資源可能會故障回覆到該節點。如果希望阻止資源故障回覆到故障轉移前運行的節點上,或如果希望指定其他的節點讓資源進行故障回覆,則必須更改資源黏性值。在創建資源時或在創建資源後,都可以指定指定資源黏性。
在指定資源黏性值時,請考慮以下情況:
值爲 0:這是默認選項。資源放置在系統中的最適合位置。這意味着當負載能力“較好”或較差的節點變得可用時才轉移資源。此選項的作用幾乎等同於自動故障回覆,只是資源可能會轉移到非之前活動的節點上。
值大於 0:資源更願意留在當前位置,但是如果有更合適的節點可用時會移動。值越高表示資源越願意留在當前位置。
值小於 0:資源更願意移離當前位置。絕對值越高表示資源越願意離開當前位置。
值爲 INFINITY:如果不是因節點不適合運行資源(節點關機、節點待機、達到migration-threshold 或配置更改)而強制資源轉移,資源總是留在當前位置。此選項的作用幾乎等同於完全禁用自動故障回覆。
值爲 -INFINITY:資源總是移離當前位置。
 定義位置約束:location  唯一ID  資源ID  規則
定義位置約束:location  唯一ID  資源ID  規則
location Prefer-Node1 ldirectord
rule $id="prefer-node1-rule" 100: #uname eq NODE1
資源排列約束
colocation 命令用於定義哪些資源應在相同主機上運行,哪些資源應在不同主機上運行。通常情況下使用以下順序:
crm(live)configure# order rsc1 rsc2
crm(live)configure# colocation rsc2 rsc1
只能設置 +INFINITY 或 -INFINITY 的分數來定義必須始終或決不能在同一節點上運行的資源。例如,要始終在同一個主機上運行 ID 爲filesystem_resource 和 nfs_group 的兩個資源,可使用以下約束:
crm(live)configure# colocation nfs_on_filesystem inf: nfs_group filesystem_resource
對於主從屬配置,除在本地運行資源以外,還有必要了解當前節點是否爲主節點。這可以通過附加 to_role 或 from_role 屬性來檢查。
排序約束:
有時提供啓動資源的順序是必要的。例如,在設備可用於系統之前,您不能裝入文件系統。使用排序約束可在另一個資源滿足某個特殊條件之前或之後啓動或停止某項服務,如已啓動、已停止或已升級到主資源。可使用 crm 中的以下命令來配置排序約束:
crm(live)configure# order nfs_after_filesystem mandatory: filesystem_resource nfs_group
配置羣集資源組
某些羣集資源與其他組件或資源相關,要求每個組件或資源以特定的順序啓動並在相同的服務器上運行。爲了簡化配置,引入資源組的概念。
資源組具有以下屬性:
啓動和停止資源:資源以顯示順序啓動,以相反順序停止。
相關性:如果組中某個資源在某處無法運行,則該組中位於其之後的任何資源都不允許運行。
組內容:組可能僅包含一些原始羣集資源。要引用組資源的子代,請使用子代的 ID代替組的 ID。
限制:儘管在約束中可以引用組的子代,但通常傾向於使用組的名稱。
黏性:黏性在組中可以累加。每個活動的組成員可以將其黏性值累加到組的總分中。因此,如果默認的 resource-stickiness 值爲 100,而組中有七個成員,其中五個成員是活動的,則組總分爲 500,更喜歡其當前位置。
定義資源組:group  唯一ID  資源列表
例如:
group Load-Balancing Virtual-IP-Tomcat ldirectord
配置克隆資源:
可能希望某些資源在羣集的多個節點上同時運行。爲此,必須將資源配置爲克隆資源。可以配置爲克隆資源的資源示例包括 STONITH 和羣集文件系統(如OCFS2)。如果受資源的資源代理支持,則可以克隆任何資源。克隆資源的配置甚至也有不同,具體取決於資源駐留的節點。
資源克隆有三種類型:
匿名克隆:這是最簡單的克隆類型。這種克隆類型在所有位置上的運行方式都相同。因此,每臺計算機上只能有一個匿名克隆實例是活動的。
全局唯一克隆:這些資源各不相同。一個節點上運行的克隆實例與另一個節點上運行的實例不同,同一個節點上運行的任何兩個實例也不同。
狀態克隆:這些資源的活動實例分爲兩種狀態:主動和被動。有時也稱爲主要和輔助,或主和從。狀態克隆可以是匿名克隆也可以是全局唯一克隆。
定義克隆資源:clone  唯一ID  資源ID
例如:
clone cl-tomcat tomcat
clone cl-mysql mysql
狀態克隆:
primitive drbd_mysql ocf:linbit:drbd \
        params drbd_resource="mysql" \
        op monitor interval="15s"
ms ms_drbd_mysql drbd_mysql \
        meta master-max="1" master-node-max="1" \
        clone-max="2" clone-node-max="1" \
        notify="true"
設置CRM其他屬性
如果是兩個節點的集羣,應該設置no-quorum-policy爲ignore,如果一個節點down掉,另一個節點仍能正常運行。設置start- failure-is-fatal 爲false 允許你爲每一個資源設置migration-threshold屬性。如果沒有定義stonith資源則必須設置stonith-enabled爲 false。
property no-quorum-policy="ignore" \
        start-failure-is-fatal="false" \
        stonith-enabled="false"
遷移羣集資源
crm(live)# resource
crm(live)resource# migrate VIP node2
啓動/停止資源:
crm resource start resource-ID
crm resource stop resource-ID
在特定節點上執行:
使節點變成備份節點
crm node standby
使節點變成活動節點
crm node online

cib.xml
 <cib admin_epoch="0" have_quorum="true" num_peers="1" cib_feature_revision="1.3" generated="true" epoch="22" num_updates="347" cib-last-written="Fri Sep 16 17:47:45 2011" ccm_transition="1" dc_uuid="24b27021-ce78-43e5-90d3-1814255fa435">
   <configuration>
     <crm_config>
       <cluster_property_set id="cib-bootstrap-options">
         <attributes>               #配置資源元屬性
           <nvpair id="cib-bootstrap-options-symmetric_cluster" name="symmetric_cluster" value="true"/>
           <nvpair id="cib-bootstrap-options-no_quorum_policy" name="no_quorum_policy" value="stop"/>
           <nvpair id="cib-bootstrap-options-default_resource_stickiness" name="default_resource_stickiness" value="0"/>      
               #將默認得分設爲0
           <nvpair id="cib-bootstrap-options-default_resource_failure_stickiness" name="default_resource_failure_stickiness" value="0"/>               #將默認失分設爲0
           <nvpair id="cib-bootstrap-options-stonith_enabled" name="stonith_enabled" value="false"/>
           <nvpair id="cib-bootstrap-options-stonith_action" name="stonith_action" value="reboot"/>
           <nvpair id="cib-bootstrap-options-stop_orphan_resources" name="stop_orphan_resources" value="true"/>
           <nvpair id="cib-bootstrap-options-stop_orphan_actions" name="stop_orphan_actions" value="true"/>
           <nvpair id="cib-bootstrap-options-remove_after_stop" name="remove_after_stop" value="false"/>
           <nvpair id="cib-bootstrap-options-short_resource_names" name="short_resource_names" value="true"/>
           <nvpair id="cib-bootstrap-options-transition_idle_timeout" name="transition_idle_timeout" value="5min"/>
           <nvpair id="cib-bootstrap-options-default_action_timeout" name="default_action_timeout" value="5s"/>
           <nvpair id="cib-bootstrap-options-is_managed_default" name="is_managed_default" value="true"/>
         </attributes>
       </cluster_property_set>
     </crm_config>
     <nodes>
       <node id="0a6b4ab3-2d15-4dbf-804f-9700d85df3c9" uname="ha2" type="normal"/>
       <node id="24b27021-ce78-43e5-90d3-1814255fa435" uname="ha1" type="normal"/>
     </nodes>
     <resources>
       <group id="group_1">
               #配置資源組屬性
         <primitive class="ocf" id="IPaddr_192_168_0_222" provider="heartbeat" type="IPaddr">
           <operations>
             <op id="IPaddr_192_168_0_222_mon" interval="5s" name="monitor" timeout="5s" role="Started"/>
           </operations>
           <instance_attributes id="IPaddr_192_168_0_222_inst_attr">
             <attributes>
               <nvpair id="IPaddr_192_168_0_222_attr_0" name="ip" value="192.168.0.222"/>
               <nvpair id="IPaddr_192_168_0_222_attr_1" name="netmask" value="24"/>
               <nvpair id="IPaddr_192_168_0_222_attr_2" name="nic" value="eth0"/>
               <nvpair id="IPaddr_192_168_0_222_attr_3" name="resource_stickiness" value="100"/>
               #配置ip得分
               <nvpair id="IPaddr_192_168_0_222_attr_4" name="resource_failure_stickiness" value="-10"/>               #配置ip失分
             </attributes>
           </instance_attributes>
         </primitive>
       </group>
       <group id="group_echo.sh">
         <primitive class="heartbeat" id="echo.sh_2" provider="heartbeat" type="echo.sh">
           <operations>
             <op id="echo.sh_2_mon" name="monitor" timeout="60s"/>
               #去掉interval值避免不斷執行echo.sh腳本
           </operations>
           <instance_attributes id="echo.sh_2">
             <attributes>
               <nvpair id="echo.sh_2-target-role" name="target-role" value="start"/>
             </attributes>
           </instance_attributes>
         </primitive>
       </group>
     </resources>
     <constraints>          
#配置資源約束
       <rsc_location id="rsc_location_group_1" rsc="IPaddr_192_168_0_222">
         <rule id="prefered_location_group_1" score="10000">
               #爲ha1上的ip資源配置默認分數值,注意,在rsc裏配置了資源組的限制如group_1的情況下,如果只設置資源的得分,沒有配置默認資源的情況下,則該限制無效。筆者無法成功測試配置資源組的得分,如果有成功的讀者望與筆者分享下配置心得
           <expression attribute="#uname" id="prefered_location_group_1_expr" operation="eq" value="ha1"/>
         </rule>
       </rsc_location>
       <rsc_location id="rsc_location_group_2" rsc="echo.sh_2">
         #爲ha1上的腳本資源配置默認分數值
         <rule id="prefered_location_group_2" score="0">
           <expression attribute="#uname" id="prefered_location_group_2_expr" operation="eq" value="ha1"/>
         </rule>
       </rsc_location>
       <rsc_location id="rsc_location_group_3" rsc="IPaddr_192_168_0_222">
         <rule id="prefered_location_group_3" score="9950">          
#爲ha2上的ip資源配置默認分數值
           <expression attribute="#uname" id="prefered_location_group_3_expr" operation="eq" value="ha2"/>
         </rule>
       </rsc_location>
       <rsc_location id="rsc_location_group_4" rsc="echo.sh_2">
         <rule id="prefered_location_group_4" score="0">        
#爲ha2上的腳本資源配置默認分數值
           <expression attribute="#uname" id="prefered_location_group_4_expr" operation="eq" value="ha2"/>
         </rule>
       </rsc_location>
       <rsc_colocation id="colocation1" from="IPaddr_192_168_0_222" to="echo.sh_2" score="INFINITY" symmetrical="true"/>
         #限制ip資源和echo.sh資源跑在一起
     </constraints>
   </configuration>
 </cib>


參考至:http://club.topsage.com/thread-530660-1-1.html

             http://www.jfox.info/xtgl/a/dl/2984f.html
             http://zhouchunyan500.blog.163.com/blog/static/132443720112134554891/

             http://tech.ddvip.com/2009-12/1262248972142506_3.html

             http://bbs.chinaunix.net/thread-2208623-1-1.html
             http://doc.chinaunix.net/linux/200902/239743.shtml
             http://www.novell.com/documentation/sles10/heartbeat/?page=/documentation//sles10/heartbeat/data/sec_hb_manual_config_constraints.html


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