天天看點

基于corosync+packmaker對http做高可用叢集

前提:

   1)本配置共有兩個測試節點,分别node1.wangfeng7399.com和node2.wangfeng7399.com,相的IP位址分别為192.168.1.200和192.168.1.201;

   2)叢集服務為apache的httpd服務;

   3)提供web服務的位址為192.168.1.240,即vip;

   4)系統為CentOS 6.5 64bits

   5)192.168.1.202提供nfs服務

1、準備工作

2、安裝配置corosync,(以下指令在node1.wangfeng7399.com上執行

1

<code>[root@node1 ~]# yum -y install corosync pacemaker pcs</code>

   提供配置檔案

2

<code>[root@node1 ~]# cd /etc/corosync/</code>

<code>[root@node1 corosync]# cp corosync.conf.example corosync.conf</code>

   修改配置檔案

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

<code>totem { </code><code>//定義通信的協定</code>

<code>        </code><code>version: </code><code>2</code> <code>//版本</code>

<code>        </code><code>secauth: on  </code><code>//安全認證是否開啟</code>

<code>        </code><code>threads: </code><code>0</code>   <code>//線程數</code>

<code>        </code><code>interface</code> <code>{  </code><code>//發送心跳的網卡</code>

<code>                </code><code>ringnumber: </code><code>0</code> <code>//環号碼</code>

<code>                </code><code>bindnetaddr: </code><code>192.168</code><code>.</code><code>1.0</code> <code>//目前位址的網絡位址</code>

<code>                </code><code>mcastaddr: </code><code>226.94</code><code>.</code><code>73.99</code>  <code>//多點傳播端口</code>

<code>                </code><code>mcastport: </code><code>5405</code>   <code>//多點傳播端口</code>

<code>                </code><code>ttl: </code><code>1</code>  <code>//發送一次,不轉發</code>

<code>        </code><code>}</code>

<code>}</code>

<code>logging {</code>

<code>        </code><code>fileline: off</code>

<code>        </code><code>to_stderr: no </code><code>//是否記入标準輸出</code>

<code>        </code><code>to_logfile: yes </code><code>//是否使用自動的日志檔案</code>

<code>        </code><code>to_syslog: no  </code><code>//是否使用syslog日志</code>

<code>        </code><code>logfile: /</code><code>var</code><code>/log/cluster/corosync.log </code><code>//日志的存放路徑</code>

<code>        </code><code>debug: off  </code><code>//是否開啟調試功能</code>

<code>        </code><code>timestamp: on </code><code>//是否開啟時間戳</code>

<code>        </code><code>logger_subsys {</code>

<code>                </code><code>subsys: AMF</code>

<code>                </code><code>debug: off</code>

<code>添加以下内容</code>

<code>service {</code>

<code>  </code><code>ver:  </code><code>0</code>

<code>  </code><code>name: pacemaker</code>

<code>  </code><code># use_mgmtd: yes</code>

<code>aisexec {</code>

<code>  </code><code>user: root</code>

<code>  </code><code>group:  root</code>

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

<code>[root@node1 corosync]# corosync-keygen</code>

   在node2上安裝軟體包    

<code>[root@node2 ~]# yum install corosync pacemaker pcs -y</code>

   将corosync和authkey複制至node2:

<code>[root@node1 corosync]# scp -p authkey corosync.conf node2:/etc/corosync/</code>

3、啟動corosync(以下指令在node1上執行):

<code>[root@node1 ~]# service corosync start</code>

<code>Starting Corosync Cluster Engine (corosync):               [  OK  ]</code>

<code>檢視corosync引擎是否正常啟動</code>

<code>[root@node1 ~]# grep -e </code><code>"Corosync Cluster Engine"</code> <code>-e </code><code>"configuration file"</code> <code>/</code><code>var</code><code>/log/cluster/corosync.log</code>

<code>Apr </code><code>20</code> <code>23</code><code>:</code><code>48</code><code>:</code><code>45</code> <code>corosync [MAIN  ] Corosync Cluster Engine (</code><code>'1.4.1'</code><code>): started and ready to provide service.</code>

<code>Apr </code><code>20</code> <code>23</code><code>:</code><code>48</code><code>:</code><code>45</code> <code>corosync [MAIN  ] Successfully read main configuration file </code><code>'/etc/corosync/corosync.conf'</code><code>.</code>

<code>Apr </code><code>20</code> <code>23</code><code>:</code><code>48</code><code>:</code><code>45</code> <code>corosync [MAIN  ] Corosync Cluster Engine exiting </code><code>with</code> <code>status </code><code>8</code> <code>at main.c:</code><code>1797</code><code>.</code>

<code>Apr </code><code>21</code> <code>00</code><code>:</code><code>01</code><code>:</code><code>53</code> <code>corosync [MAIN  ] Corosync Cluster Engine (</code><code>'1.4.1'</code><code>): started and ready to provide service.</code>

<code>Apr </code><code>21</code> <code>00</code><code>:</code><code>01</code><code>:</code><code>53</code> <code>corosync [MAIN  ] Successfully read main configuration file </code><code>'/etc/corosync/corosync.conf'</code><code>.</code>

<code>檢視初始化成員節點通知是否正常</code>

<code>[root@node1 ~]# grep </code><code>"TOTEM"</code> <code>/</code><code>var</code><code>/log/cluster/corosync.log</code>

<code>Apr </code><code>21</code> <code>00</code><code>:</code><code>01</code><code>:</code><code>53</code> <code>corosync [TOTEM ] Initializing transport (UDP/IP Multicast).</code>

<code>Apr </code><code>21</code> <code>00</code><code>:</code><code>01</code><code>:</code><code>53</code> <code>corosync [TOTEM ] Initializing transmit/receive security: libtomcrypt SOBER128/SHA1HMAC (mode </code><code>0</code><code>).</code>

<code>Apr </code><code>21</code> <code>00</code><code>:</code><code>01</code><code>:</code><code>53</code> <code>corosync [TOTEM ] The network </code><code>interface</code> <code>[</code><code>192.168</code><code>.</code><code>1.200</code><code>] </code><code>is</code> <code>now up.</code>

<code>Apr </code><code>21</code> <code>00</code><code>:</code><code>01</code><code>:</code><code>53</code> <code>corosync [TOTEM ] A processor joined or left the membership and a </code><code>new</code> <code>membership was formed.</code>

<code>檢視啟動過程中是否有錯誤産生,下面表示在以後pacemaker在以後将不再作為corosync的插件提供 ,建議使用cman作為叢集的基礎架構,可以安全忽略</code>

<code>[root@node1 ~]# grep </code><code>"ERROR"</code> <code>/</code><code>var</code><code>/log/cluster/corosync.log</code>

<code>Apr </code><code>21</code> <code>00</code><code>:</code><code>01</code><code>:</code><code>53</code> <code>corosync [pcmk  ] ERROR: process_ais_conf: You have configured a cluster using the Pacemaker plugin </code><code>for</code> <code>Corosync. The plugin </code><code>is</code> <code>not supported </code><code>in</code> <code>this</code> <code>environment and will be removed very soon.</code>

<code>Apr </code><code>21</code> <code>00</code><code>:</code><code>01</code><code>:</code><code>53</code> <code>corosync [pcmk  ] ERROR: process_ais_conf:  Please see Chapter </code><code>8</code> <code>of </code><code>'Clusters from Scratch'</code> <code>(http:</code><code>//www.clusterlabs.org/doc) for details on using Pacemaker with CMAN</code>

<code>Apr </code><code>21</code> <code>00</code><code>:</code><code>02</code><code>:</code><code>17</code> <code>[</code><code>2461</code><code>] node1.wangfeng7399.com    pengine:   notice: process_pe_message:     Configuration ERRORs found during PE processing.  Please run </code><code>"crm_verify -L"</code> <code>to identify issues</code>

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

<code>[root@node1 ~]# ssh node2 </code><code>"service corosync start"</code>

<code>Starting Corosync Cluster Engine (corosync): [  OK  ]</code>

   注意:啟動node2需要在node1上使用如上指令進行,不要在node2節點上直接啟動。下面是node1上的相關日志。

<code>Apr </code><code>21</code> <code>00</code><code>:</code><code>10</code><code>:</code><code>44</code> <code>[</code><code>2462</code><code>] node1.wangfeng7399.com       crmd:     info: do_te_invoke:   Processing graph </code><code>1</code> <code>(ref=pe_calc-dc-</code><code>1398010244</code><code>-</code><code>18</code><code>) derived from /</code><code>var</code><code>/lib/pacemaker/pengine/pe-input-</code><code>1</code><code>.bz2</code>

<code>Apr </code><code>21</code> <code>00</code><code>:</code><code>10</code><code>:</code><code>44</code> <code>[</code><code>2462</code><code>] node1.wangfeng7399.com       crmd:   notice: te_rsc_command:     Initiating action </code><code>3</code><code>: probe_complete probe_complete on node2.wangfeng7399.com - no waiting</code>

<code>Apr </code><code>21</code> <code>00</code><code>:</code><code>10</code><code>:</code><code>44</code> <code>[</code><code>2462</code><code>] node1.wangfeng7399.com       crmd:     info: te_rsc_command:     Action </code><code>3</code> <code>confirmed - no wait</code>

<code>Apr </code><code>21</code> <code>00</code><code>:</code><code>10</code><code>:</code><code>44</code> <code>[</code><code>2462</code><code>] node1.wangfeng7399.com       crmd:   notice: run_graph:  Transition </code><code>1</code> <code>(Complete=</code><code>1</code><code>, Pending=</code><code>0</code><code>, Fired=</code><code>0</code><code>, Skipped=</code><code>0</code><code>, Incomplete=</code><code>0</code><code>, Source=/</code><code>var</code><code>/lib/pacemaker/pengine/pe-input-</code><code>1</code><code>.bz2): Complete</code>

<code>Apr </code><code>21</code> <code>00</code><code>:</code><code>10</code><code>:</code><code>44</code> <code>[</code><code>2462</code><code>] node1.wangfeng7399.com       crmd:     info: do_log:     FSA: Input I_TE_SUCCESS from notify_crmd() received </code><code>in</code> <code>state S_TRANSITION_ENGINE</code>

<code>Apr </code><code>21</code> <code>00</code><code>:</code><code>10</code><code>:</code><code>44</code> <code>[</code><code>2462</code><code>] node1.wangfeng7399.com       crmd:   notice: do_state_transition:    State transition S_TRANSITION_ENGINE -&gt; S_IDLE [ input=I_TE_SUCCESS cause=C_FSA_INTERNAL origin=notify_crmd ]</code>

<code>Apr </code><code>21</code> <code>00</code><code>:</code><code>10</code><code>:</code><code>44</code> <code>[</code><code>2457</code><code>] node1.wangfeng7399.com        cib:     info: cib_process_request:    Completed cib_modify operation </code><code>for</code> <code>section status: OK (rc=</code><code>0</code><code>, origin=local/attrd/</code><code>6</code><code>, version=</code><code>0.5</code><code>.</code><code>6</code><code>)</code>

<code>Apr </code><code>21</code> <code>00</code><code>:</code><code>10</code><code>:</code><code>44</code> <code>[</code><code>2457</code><code>] node1.wangfeng7399.com        cib:     info: cib_process_request:    Completed cib_query operation </code><code>for</code> <code>section </code><code>//cib/status//node_state[@id='node1.wangfeng7399.com']//transient_attributes//nvpair[@name='probe_complete']: OK (rc=0, origin=local/attrd/7, version=0.5.6)</code>

<code>Apr </code><code>21</code> <code>00</code><code>:</code><code>10</code><code>:</code><code>44</code> <code>[</code><code>2457</code><code>] node1.wangfeng7399.com        cib:     info: cib_process_request:    Completed cib_modify operation </code><code>for</code> <code>section status: OK (rc=</code><code>0</code><code>, origin=local/attrd/</code><code>8</code><code>, version=</code><code>0.5</code><code>.</code><code>6</code><code>)</code>

<code>Apr </code><code>21</code> <code>00</code><code>:</code><code>10</code><code>:</code><code>46</code> <code>[</code><code>2457</code><code>] node1.wangfeng7399.com        cib:     info: cib_process_request:    Completed cib_modify operation </code><code>for</code> <code>section status: OK (rc=</code><code>0</code><code>, origin=node2.wangfeng7399.com/attrd/</code><code>6</code><code>, version=</code><code>0.5</code><code>.</code><code>7</code><code>)</code>

   檢視叢集節點的啟動狀态:

<code>[root@node1 ~]# pcs status</code>

<code>Cluster name:</code>

<code>WARNING: no stonith devices and stonith-enabled </code><code>is</code> <code>not </code><code>false</code>

<code>Last updated: Mon Apr </code><code>21</code> <code>00</code><code>:</code><code>12</code><code>:</code><code>53</code> <code>2014</code>

<code>Last change: Mon Apr </code><code>21</code> <code>00</code><code>:</code><code>10</code><code>:</code><code>41</code> <code>2014</code> <code>via crmd on node1.wangfeng7399.com</code>

<code>Stack: classic openais (</code><code>with</code> <code>plugin)</code>

<code>Current DC: node1.wangfeng7399.com - partition </code><code>with</code> <code>quorum</code>

<code>Version: </code><code>1.1</code><code>.</code><code>10</code><code>-</code><code>14</code><code>.el6_5.</code><code>2</code><code>-368c726</code>

<code>2</code> <code>Nodes configured, </code><code>2</code> <code>expected votes</code>

<code>0</code> <code>Resources configured</code>

<code>Online: [ node1.wangfeng7399.com node2.wangfeng7399.com ]</code>

<code>Full list of resources:</code>

   我們已經看到我們的兩個節點

4、配置叢集的工作屬性,禁用stonith(生産環境中應該提供stonith)

   corosync預設啟用了stonith,而目前叢集并沒有相應的stonith裝置,是以此預設配置目前尚不可用,這可以通過如下指令驗正:

<code>[root@node1 ~]# crm_verify -L -V</code>

<code>   </code><code>error: unpack_resources:     Resource start-up disabled since no STONITH resources have been defined</code>

<code>   </code><code>error: unpack_resources:     Either configure some or disable STONITH </code><code>with</code> <code>the stonith-enabled option</code>

<code>   </code><code>error: unpack_resources:     NOTE: Clusters </code><code>with</code> <code>shared data need STONITH to ensure data integrity</code>

<code>Errors found during check: config not valid</code>

   我們裡可以通過如下指令先禁用stonith:

<code>[root@node1 ~]# pcs property </code><code>set</code> <code>stonith-enabled=</code><code>false</code>

   使用如下指令檢視目前的配置資訊:

<code>[root@node1 ~]# pcs cluster cib|grep stonith</code>

<code>        </code><code>&lt;nvpair id=</code><code>"cib-bootstrap-options-stonith-enabled"</code> <code>name=</code><code>"stonith-enabled"</code> <code>value=</code><code>"false"</code><code>/&gt;</code>

   或執行如下指令檢視:

<code>[root@node1 ~]# pcs config</code>

<code>Cluster Properties:</code>

<code> </code><code>cluster-infrastructure: classic openais (</code><code>with</code> <code>plugin)</code>

<code> </code><code>dc-version: </code><code>1.1</code><code>.</code><code>10</code><code>-</code><code>14</code><code>.el6_5.</code><code>2</code><code>-368c726</code>

<code> </code><code>expected-quorum-votes: </code><code>2</code>

<code> </code><code>stonith-enabled: </code><code>false</code>

5、為叢集添加叢集資源

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

   可以通過如下指令檢視目前叢集系統所支援的類型:

<code>[root@node1 ~]# pcs resource standards</code>

<code>ocf</code>

<code>lsb</code>

<code>service</code>

<code>stonith</code>

   檢視資源代理的provider:

<code>[root@node1 ~]# pcs resource providers</code>

<code>heartbeat</code>

<code>pacemaker</code>

   如果想要檢視某種類别下的所用資源代理的清單,可以使用類似如下指令實作:

   # pcs resource agents [standard[:provider]]

   如果要檢視某資源代理的可配置屬性等資訊,則使用如下指令:

   # pcs resource describe &lt;class:provider:type|type&gt;  

6、接下來要建立的web叢集建立一個IP位址資源,以在通過叢集提供web服務時使用;這可以通過如下方式實作:

   文法:    

<code>create &lt;resource id&gt; &lt;standard:provider:type|type&gt; [resource options]</code>

<code>           </code><code>[op &lt;operation action&gt; &lt;operation options&gt; [&lt;operation action&gt;</code>

<code>           </code><code>&lt;operation options&gt;]...] [meta &lt;meta options&gt;...]</code>

<code>           </code><code>[--clone &lt;clone options&gt; | --master &lt;master options&gt; |</code>

<code>           </code><code>--group &lt;group name&gt;]</code>

   應用示例:為叢集配置一個IP位址,用于實作提供高可用的web服務。

<code>[root@node1 ~]# pcs resource create WebIP ocf:heartbeat:IPaddr2 ip=</code><code>192.168</code><code>.</code><code>1.240</code> <code>cidr_netmask=</code><code>24</code> <code>op moniter interval=30s</code>

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

<code>Last updated: Mon Apr </code><code>21</code> <code>00</code><code>:</code><code>28</code><code>:</code><code>54</code> <code>2014</code>

<code>Last change: Mon Apr </code><code>21</code> <code>00</code><code>:</code><code>28</code><code>:</code><code>32</code> <code>2014</code> <code>via cibadmin on node1.wangfeng7399.com</code>

<code>Current DC: node2.wangfeng7399.com - partition </code><code>with</code> <code>quorum</code>

<code>1</code> <code>Resources configured</code>

<code> </code><code>WebIP  (ocf::heartbeat:IPaddr2):   Started node1.wangfeng7399.com</code>

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

<code>[root@node1 ~]# ip add</code>

<code>1</code><code>: lo: &lt;LOOPBACK,UP,LOWER_UP&gt; mtu </code><code>16436</code> <code>qdisc noqueue state UNKNOWN</code>

<code>    </code><code>link/loopback </code><code>00</code><code>:</code><code>00</code><code>:</code><code>00</code><code>:</code><code>00</code><code>:</code><code>00</code><code>:</code><code>00</code> <code>brd </code><code>00</code><code>:</code><code>00</code><code>:</code><code>00</code><code>:</code><code>00</code><code>:</code><code>00</code><code>:</code><code>00</code>

<code>    </code><code>inet </code><code>127.0</code><code>.</code><code>0.1</code><code>/</code><code>8</code> <code>scope host lo</code>

<code>    </code><code>inet6 ::</code><code>1</code><code>/</code><code>128</code> <code>scope host</code>

<code>       </code><code>valid_lft forever preferred_lft forever</code>

<code>2</code><code>: eth0: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu </code><code>1500</code> <code>qdisc pfifo_fast state UP qlen </code><code>1000</code>

<code>    </code><code>link/ether </code><code>00</code><code>:0c:</code><code>29</code><code>:4f:1c:</code><code>52</code> <code>brd ff:ff:ff:ff:ff:ff</code>

<code>    </code><code>inet </code><code>192.168</code><code>.</code><code>1.200</code><code>/</code><code>24</code> <code>brd </code><code>192.168</code><code>.</code><code>1.255</code> <code>scope global eth0</code>

<code>    </code><code>inet </code><code>192.168</code><code>.</code><code>1.240</code><code>/</code><code>24</code> <code>brd </code><code>192.168</code><code>.</code><code>1.255</code> <code>scope global secondary eth0</code>

<code>    </code><code>inet6 fe80::20c:29ff:fe4f:1c52/</code><code>64</code> <code>scope link tentative dadfailed</code>

       我們模拟node1壞掉,可以将corosync關掉,在node2上檢視叢集工作狀态

<code>[root@node2 ~]# pcs status</code>

<code>Last updated: Mon Apr </code><code>21</code> <code>00</code><code>:</code><code>31</code><code>:</code><code>59</code> <code>2014</code>

<code>Current DC: node2.wangfeng7399.com - partition WITHOUT quorum</code>

<code>Online: [ node2.wangfeng7399.com ]</code>

<code>OFFLINE: [ node1.wangfeng7399.com ]</code>

<code> </code><code>WebIP  (ocf::heartbeat:IPaddr2):   Stopped</code>

   上面的資訊顯示node1.wangfeng7399.com已經離線,但資源WebIP卻沒能在node2.wangfeng7399.com上啟動。這是因為此時的叢集狀态為"WITHOUT quorum",即已經失去了quorum,此時叢集服務本身已經不滿足正常運作的條件,這對于隻有兩節點的叢集來講是不合理的。是以,我們可以通過如下的指令來修改忽略quorum不能滿足的叢集狀态檢查:

<code>[root@node2 ~]# pcs property </code><code>set</code> <code>no-quorum-policy=</code><code>"ignore"</code>

片刻之後,叢集就會在目前仍在運作中的節點node2上啟動此資源了,如下所示:

<code>[root@node2 ~]# ip add</code>

<code>    </code><code>link/ether </code><code>00</code><code>:0c:</code><code>29</code><code>:ab:d1:9c brd ff:ff:ff:ff:ff:ff</code>

<code>    </code><code>inet </code><code>192.168</code><code>.</code><code>1.201</code><code>/</code><code>24</code> <code>brd </code><code>192.168</code><code>.</code><code>1.255</code> <code>scope global eth0</code>

<code>    </code><code>inet6 fe80::20c:29ff:feab:d19c/</code><code>64</code> <code>scope link</code>

   好了,驗正完成後,我們正常啟動node1上的corosync

   正常啟動node1.magedu.com後,叢集資源WebIP很可能會重新從node2.magedu.com轉移回node1.magedu.com。資源的這種在節點間每一次的來回流動都會造成那段時間内其無法正常被通路,是以,我們有時候需要在資源因為節點故障轉移到其它節點後,即便原來的節點恢複正常也禁止資源再次流轉回來。這可以通過定義資源的黏性(stickiness)來實作。在建立資源時或在建立資源後,都可以指定指定資源黏性。

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

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

   大于0:資源更願意留在目前位置,但是如果有更合适的節點可用時會移動。值越高表示資源越願意留在目前位置;

   小于0:資源更願意移離目前位置。絕對值越高表示資源越願意離開目前位置;

INFINITY:如果不是因節點不适合運作資源(節點關機、節點待機、達到migration-threshold 或配置更改)而強制資源轉移,資源總是留在目前位置。此選項的作用幾乎等同于完全禁用自動故障回複;

   -INFINITY:資源總是移離目前位置;

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

   # pcs resource rsc defaults resource-stickiness=100

7、結合上面已經配置好的IP位址資源,将此叢集配置成為一個active/passive模型的web(httpd)服務叢集

   為了将此叢集啟用為web(httpd)伺服器叢集,我們得先在各節點上安裝httpd,并配置其能在本地各自提供一個測試頁面。

<code>[root@node1 corosync]# echo </code><code>"node1.wangfeng7399.com"</code> <code>&gt; /</code><code>var</code><code>/www/html/index.html</code>

<code>[root@node2 ~]# echo </code><code>"node2.wangfeng7399.com"</code> <code>&gt; /</code><code>var</code><code>/www/html/index.html</code>

<code>然後關閉httpd,并確定開機不能自啟動</code>

<code>[root@node2 ~]# chkconfig httpd off</code>

<code>[root@node1 corosync]# chkconfig httpd off</code>

   接下來我們将此httpd服務添加為叢集資源。将httpd添加為叢集資源有兩處資源代理可用:lsb和ocf:heartbeat,為了簡單起見,我們這裡使用lsb類型:

<code>[root@node1 corosync]# pcs resource create webserver lsb:httpd</code>

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

<code>[root@node1 corosync]# pcs status</code>

<code>Last updated: Mon Apr </code><code>21</code> <code>00</code><code>:</code><code>46</code><code>:</code><code>15</code> <code>2014</code>

<code>Last change: Mon Apr </code><code>21</code> <code>00</code><code>:</code><code>45</code><code>:</code><code>53</code> <code>2014</code> <code>via cibadmin on node1.wangfeng7399.com</code>

<code>2</code> <code>Resources configured</code>

<code> </code><code>WebIP  (ocf::heartbeat:IPaddr2):   Started node2.wangfeng7399.com</code>

<code> </code><code>webserver  (lsb:httpd):    Started node1.wangfeng7399.com</code>

   從上面的資訊中可以看出WebIP和WebServer有可能會分别運作于兩個節點上,這對于通過此IP提供Web服務的應用來說是不成立的,即此兩者資源必須同時運作在某節點上。

   7.1 資源限制

   通過前面的描述可知,即便叢集擁有所有必需資源,但它可能還無法進行正确處理。資源限制則用以指定在哪些群集節點上運作資源,以何種順序裝載資源,以及特定資源依賴于哪些其它資源。pacemaker共給我們提供了三種資源限制方法:

   1)Resource Location(資源位置):定義資源可以、不可以或盡可能在哪些節點上運作;

   2)Resource Collocation(資源排列):排列限制用以定義叢集資源可以或不可以在某個節點上同時運作;

   3)Resource Order(資源順序):順序限制定義叢集資源在節點上啟動的順序;

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

   1)任何值 + 無窮大 = 無窮大

   2)任何值 - 無窮大 = -無窮大

   3)無窮大 - 無窮大 = -無窮大

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

   7.1.1 排列限制

   使用pcs指令定義資源排列限制的文法:

<code>location add &lt;id&gt; &lt;resource name&gt; &lt;node&gt; &lt;score&gt;</code>

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

<code>[root@node1 corosync]# pcs constraint colocation add webserver WebIP</code>

<code>INFINITY</code>

   如下的狀态資訊顯示,兩個資源已然運作于同一個節點。

<code>Last updated: Mon Apr </code><code>21</code> <code>00</code><code>:</code><code>50</code><code>:</code><code>03</code> <code>2014</code>

<code>Last change: Mon Apr </code><code>21</code> <code>00</code><code>:</code><code>49</code><code>:</code><code>53</code> <code>2014</code> <code>via cibadmin on node1.wangfeng7399.com</code>

<code> </code><code>webserver  (lsb:httpd):    Started node2.wangfeng7399.com</code>

   7.1.2 順序限制

   通過pcs指令定義順序限制的文法如下所示:

<code>order [action] &lt;resource id&gt; then [action] &lt;resource id&gt; [options]</code>

   是以,要確定WebServer在某節點啟動之前得先啟動WebIP可以使用如下指令實作:

<code>[root@node1 corosync]# pcs constraint order WebIP then webserver</code>

<code>Adding WebIP webserver (kind: Mandatory) (Options: first-action=start then-action=start)</code>

   檢視定義的結果:

<code>[root@node1 corosync]# pcs constraint order</code>

<code>Ordering Constraints:</code>

<code>  </code><code>start WebIP then start webserver</code>

   7.1.3 位置限制

   由于HA叢集本身并不強制每個節點的性能相同或相近,是以,某些時候我們可能希望在正常時服務總能在某個性能較強的節點上運作,這可以通過位置限制來實作。通過pcs指令定義位置限制的文法略複雜些,如下所述。

   傾向運作于某節點:

<code>location &lt;resource id&gt; prefers &lt;node[=score]&gt;...</code>

   傾向離開某節點:

<code>location &lt;resource id&gt; avoids &lt;node[=score]&gt;...</code>

   通過限制分數來定義其傾向運作的節點:

   例如:如果期望WebServer傾向運作于node1.wangfeng7399.com的分數為1000,則可以使用類似如下指令實作:

<code>[root@node1 corosync]# pcs constraint location add webservce_on_node1 webserver node1.wangfeng7399.com </code><code>1000</code>

   可以看到我們的資源運作狀态

<code>Last updated: Mon Apr </code><code>21</code> <code>00</code><code>:</code><code>59</code><code>:</code><code>44</code> <code>2014</code>

<code>Last change: Mon Apr </code><code>21</code> <code>00</code><code>:</code><code>59</code><code>:</code><code>24</code> <code>2014</code> <code>via cibadmin on node1.wangfeng7399.com</code>

   最終的配置結果如下所示:

<code>[root@node1 corosync]# pcs config</code>

<code>Cluster Name:</code>

<code>Corosync Nodes:</code>

<code>                                                                                                              </code> 

<code>Pacemaker Nodes:</code>

<code> </code><code>node1.wangfeng7399.com node2.wangfeng7399.com</code>

<code>Resources:</code>

<code> </code><code>Resource: WebIP (</code><code>class</code><code>=ocf provider=heartbeat type=IPaddr2)</code>

<code>  </code><code>Attributes: ip=</code><code>192.168</code><code>.</code><code>1.240</code> <code>cidr_netmask=</code><code>24</code>

<code>  </code><code>Operations: moniter interval=30s (WebIP-moniter-interval-30s)</code>

<code>              </code><code>monitor interval=60s (WebIP-monitor-interval-60s)</code>

<code> </code><code>Resource: webserver (</code><code>class</code><code>=lsb type=httpd)</code>

<code>  </code><code>Operations: monitor interval=60s (webserver-monitor-interval-60s)</code>

<code>Stonith Devices:</code>

<code>Fencing Levels:</code>

<code>Location Constraints:</code>

<code>  </code><code>Resource: webserver</code>

<code>    </code><code>Enabled on: node1.wangfeng7399.com (score:</code><code>1000</code><code>) (id:webservce_on_node1)</code>

<code>  </code><code>start WebIP then start webserver (Mandatory) (id:order-WebIP-webserver-mandatory)</code>

<code>Colocation Constraints:</code>

<code>  </code><code>webserver </code><code>with</code> <code>WebIP (INFINITY) (id:colocation-webserver-WebIP-INFINITY)</code>

<code> </code><code>no-quorum-policy: ignore</code>

   8.測試

<a href="http://s3.51cto.com/wyfs02/M02/24/98/wKioL1NUA8Sxx6udAABlhTPQl0Q463.jpg" target="_blank"></a>

将node1停掉

<a href="http://s3.51cto.com/wyfs02/M01/24/99/wKiom1NUBDizGGamAABmrDZB--g207.jpg" target="_blank"></a>

本文轉自wangfeng7399 51CTO部落格,原文連結:http://blog.51cto.com/wangfeng7399/1399862,如需轉載請自行聯系原作者

繼續閱讀