天天看點

corosync+pacemaker實作web叢集高可用

一、高可用叢集

1、高可用叢集的定義

   高可用叢集,是指以減少服務中斷(如因伺服器當機等引起的服務中斷)時間為目的的伺服器叢集技術。簡單的說,叢集就是一組計算機,它們作為一個整體向使用者提供一組網絡資源。這些單個的計算機系統就是叢集的節點。

  高可用叢集的出現是為了減少由計算機硬體和軟體易錯性所帶來的損失。它通過保護使用者的業務程式對外不間斷提供的服務,把因軟體/硬體/人為造成的故障對業務的影響降低到最小程度。如果某個節點失效,它的備援節點将在幾秒鐘的時間内接管它的職責。是以,對于使用者而言,叢集永遠不會停機。高可用叢集軟體的主要作用就是實作故障檢查和業務切換的自動化。

2、高可用叢集的結構

   要想實作、配置高可用叢集,就必須要了解高可用叢集的結構,從底至上分為三層結構

   先上高可用叢集的結構圖

<a href="http://s3.51cto.com/wyfs02/M01/24/91/wKiom1NTGhHQNYtkAAIWwlO58Ms938.png" target="_blank"></a>

   1)Messaging Layer

       資訊層,心跳資訊傳輸層,它是運作在每一個主機上的一個程序

       今天要講的corosync就是運作在這一層的

   2)CRM,Cluster Resources Manager

       叢集資料總管,依賴于各自底層的心跳資訊層。之是以有這一層是因為那些非ha_aware軟體本身不具備叢集高可用能力,才借助于CRM來實作的;而如果一個應用程式自己能夠利用底層心跳資訊傳遞層的功能完成叢集事務決策的軟體就叫ha_aware。

       在這層中,其實還有一層叫做LRM(Local Resource Manager)本地資源管理層,這一層是真正去把CRM層的決策去落實的層次;就好比,CRM層是公司的董事長,LRM就是總經理,CRM負責整個公司的遠景規劃及戰略實施,然後配置設定給總經理(LRM)去實施,總經理再分攤給下面的各小弟(RA)去完成,這些在上圖中也可以直覺的表現出來

       pacemaker就是屬于這一層的,而pacemaker的配置接口的crm(suse),是以我們安裝的時候需要安裝crmsh

   3)RA,Resource Agent

       資源代理就是能夠接收CRM的排程,用于實作在節點上對某一個資源完成管理的工具,通常是一些腳本

   (1)heartbeat legacy

       heartbeat的傳統類型,監聽在udp的694端口上

   (2)LSB,linux standard base

       那些在/etc/rc.d/init.d/*的腳本就是屬于LSB的

   (3)OCF,Open Cluster Framework

       開放叢集架構,那些提供資源代理腳本的組織叫provider,pacemaker就是其中的一個provider

   (4)STONITH

       shoot the other node in the head,這個RA類型主要是做節點隔離的,專為配置stonith裝置耐用。

       使用STONITH主要目的就是為了避免由于網絡原因,節點之間不能完全通信(比如分為了兩部分,左邊3台,右邊2台),左邊的3台能收到各自的心跳資訊,右邊的2台也可以收到各自的心跳資訊,就是左邊部分和右邊部分收不到各自的心跳資訊,是以,它們都各自以為對方故障了,就會各自重新推選出一台做為DC(Designated Coordinator),進而出現了兩個叢集,這就導緻了資源争用;如果恰好雙方都往其共享存儲寫資料,很可能就會導緻檔案系統崩潰,這種現象就叫做叢集分裂(brain-split)。

       為了避免叢集分裂,就出現了法定票數(quorum,票數&gt;半數票數的叢集成為滿足法定票數)這一說法,就是在叢集通信故障時,為了避免資源搶占,應該讓一方放棄成為叢集,具體應該哪方放棄呢?這就是投票的結果了,隻有具有法定票數的一方才有資格做為叢集,相反的一方就應該退出叢集,但它放棄後并不代表服務停止,是以應該讓其釋放資源,關閉電源。stonith裝置就是在這裡用的,要讓退出叢集的裝置徹底失效,電源交換機就是這個原理了

       而如果一個叢集隻有兩個節點的話,這又是一種特殊的叢集,萬一出現叢集分裂後,它們雙方可能都不會具有法定票數,那結果可想而知,資源不會轉移,導緻整個資源都故障了,因為沒有仲裁裝置

       說這麼多,就是為了說明下面兩個比較重要的概念

       ①、corosync預設啟用了stonith功能,而我們要配置的叢集并沒有stonith裝置,是以在配置叢集的全局屬性時要對其禁用

       ②、當一個叢集沒有法定票數時,資源是不會正常轉移的,當一個節點出現故障時,資源不會正常的轉移到正常的節點上,就會導緻所有的資源都故障了。是以,應該定義法定票數不足時做忽略而不是停止所有資源

二、前景說明

1、拓撲圖

<a href="http://s3.51cto.com/wyfs02/M02/24/91/wKiom1NTJxXi8dTEAACtzmDFzqs291.png" target="_blank"></a>

2、伺服器說明 

   本篇博文主要講corosync+pacemaker實作web的高可用性,是以,為了配置的友善,使用yum方式安裝web和php到一台主機,做為主節點,另一台做為備用

   為了實作web的高可用性,兩台web伺服器挂載使用NFS檔案系統,且NFS與MySQL資料庫安裝到一台伺服器上

   當主節點出現故障的時候,能夠實作IP自動轉移到備用節點上,這就需要一個虛拟IP來實作流轉,這裡定義VIP:172.16.7.188

3、系統平台

   全部系統都為centos6.5

4、NFS

   在NFS上建立目錄/www,web伺服器的網頁目錄都挂載于此

三、前提準備(兩個節點都一樣,這裡隻示範在node1上操作)

1、各節點之間實作互相解析

   所有節點的主機名稱和對應的IP位址解析服務可以正常工作,且每個節點的主機名稱需要跟"uname -n“指令的結果保持一緻

1

2

3

4

5

6

7

8

9

10

<code>[root@node1 ~]</code><code># uname -n</code>

<code>node1.shuishui.com</code>

<code>[root@node1 ~]</code><code># vim /etc/hosts</code>

<code>127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4</code>

<code>::1         localhost localhost.localdomain localhost6 localhost6.localdomain6</code>

<code>172.16.7.10 node1.shuishui.com node1</code>

<code>172.16.7.20 node2.shuishui.com node2</code>

<code>[root@node1 ~]</code><code># ping node2</code>

<code>PING node2.shuishui.com (172.16.7.20) 56(84) bytes of data.</code>

<code>64 bytes from node2.shuishui.com (172.16.7.20): icmp_seq=1 ttl=64 </code><code>time</code><code>=1.41 ms</code>

2、做雙機互信

   設定兩個節點可以基于密鑰進行ssh通信,密碼要設為空,否則在節點切換的時候将會失敗

<code>[root@node1 ~]</code><code># ssh-keygen -t rsa -P ''                                  /生成空密碼</code>

<code>[root@node1 ~]</code><code># ssh-copy-id -i .ssh/id_rsa.pub [email protected]   /發送到node2</code>

   驗證從node1 ssh到node2不需密碼

<code>[root@node1 ~]</code><code># ssh 172.16.7.20</code>

<code>Last login: Sun Apr 20 02:37:55 2014 from 172.16.250.87</code>

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

3、時間同步

<code>[root@node1 ~]</code><code># ntpdate 172.16.0.1</code>

4、確定網頁都被挂載到了NFS上

<code>[root@node1 ~]</code><code># curl node1.shuishui.com</code>

<code>web </code><code>in</code> <code>nfs</code>

<code>[root@node1 ~]</code><code># curl node2.shuishui.com</code>

5、手動停止服務并關閉開機自動啟動

   加在叢集中的服務就交由crm來管理了,不需使用者參與

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

<code>[root@node1 ~]service httpd stop</code>

四、corosync+pacemaker實作web高可用

1、安裝corosync和pacemaker

   因為有依賴關系,是以我們最好使用yum方式安裝,前提配置好YUM源

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

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

2、修改corosync的配置檔案

   1)corosync安裝完成了,提供了配置檔案模闆,我們隻需改名即可使用

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

<code>[root@node1 corosync]</code><code># ls</code>

<code>corosync.conf.example  corosync.conf.example.udpu  service.d  uidgid.d</code>

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

   2)修改配置檔案,增加service段和aisexec段

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

36

<code>totem {</code>

<code>        </code><code>version: 2</code>

<code>        </code><code>secauth: off</code>

<code>        </code><code>threads: 0</code>

<code>        </code><code>interface {</code>

<code>                </code><code>ringnumber: 0</code>

<code>                </code><code>bindnetaddr: 172.16.0.0      </code><code>#綁定網絡位址</code>

<code>                </code><code>mcastaddr: 230.100.100.7     </code><code>#心跳資訊傳遞的多點傳播位址</code>

<code>                </code><code>mcastport: 5405</code>

<code>                </code><code>ttl: 1</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>to_logfile: </code><code>yes</code>

<code>        </code><code>to_syslog: </code><code>yes</code>

<code>        </code><code>logfile: </code><code>/var/log/cluster/corosync</code><code>.log   </code><code>/corosync</code><code>的日志檔案</code>

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

<code>        </code><code>timestamp: on</code>

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

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

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

<code>amf {</code>

<code>        </code><code>mode: disabled</code>

<code>service {</code>

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

<code>        </code><code>name: pacemaker            </code><code>#定義corosync在啟動時自動啟動pacemaker</code>

<code>aisexec {                          </code><code>#表示啟動corosync的ais功能,以哪個使用者的身份運作</code>

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

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

3、生成密鑰檔案

   對于corosync而言,各節點之間通信需要安全認證,是以需要安全密鑰,生成後會自動儲存至目前目錄下,命名為authkey,權限為400

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

<code>Corosync Cluster Engine Authentication key generator.</code>

<code>Gathering 1024 bits </code><code>for</code> <code>key from </code><code>/dev/random</code><code>.</code>

<code>Press keys on your keyboard to generate entropy.</code>

<code>Press keys on your keyboard to generate entropy (bits = 272).</code>

   生成的密鑰檔案是1024位元組的,但是在這個生成密鑰的過程中,系統會去調用/etc/random中的随機數,如果熵池中的随機數不夠用,就會提示讓我們逛敲鍵盤以來彌補随機數的不足,直到生成密鑰。如果對安全不是要求太高,此過程可以使用僞随機數,僞随機數是有規律的,是以可能會被找到規律進而破解密鑰,慎用。

   經過痛苦的敲鍵盤,終于成生了我們想要的密鑰,接下來就是把密鑰和剛才配置的corosync.conf複制到node2上

<code>authkey  corosync.conf  corosync.conf.example.udpu  service.d  uidgid.d</code>

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

4、安裝pacemaker的配置接口crmsh

   RHEL自6.4起不再提供叢集的指令行配置工具crmsh,轉而使用pcs;如果想繼續使用crm指令,必須下載下傳相關的程式包自行安裝才可。crmsh依賴于pssh,是以需要一并下載下傳,安裝過程中還會有其它的依賴關系,是以使用yum方式進行安裝

<code>[root@node1 ~]</code><code># yum -y install pssh-2.3.1-2.el6.x86_64.rpm crmsh-1.2.6-4.el6.x86_64.rpm</code>

5、啟動corosync并檢視相關資訊

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

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

(1)檢視corosync引擎是否正常啟動:

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

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

<code>Apr 20 12:07:38 corosync [MAIN  ] Successfully </code><code>read</code> <code>main configuration </code><code>file</code> <code>'/etc/corosync/corosync.conf'</code><code>.</code>

(2)檢視初始化成員節點通知是否正常發出:

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

<code>Apr 20 12:07:38 corosync [TOTEM ] Initializing transport (UDP</code><code>/IP</code> <code>Multicast).</code>

<code>Apr 20 12:07:38 corosync [TOTEM ] Initializing transmit</code><code>/receive</code> <code>security: libtomcrypt SOBER128</code><code>/SHA1HMAC</code> <code>(mode 0).</code>

<code>Apr 20 12:07:38 corosync [TOTEM ] The network interface [172.16.7.10] is now up.</code>

<code>Apr 20 12:07:39 corosync [TOTEM ] A processor joined or left the membership and a new membership was formed.</code>

<code>Apr 20 12:12:42 corosync [TOTEM ] A processor joined or left the membership and a new membership was formed.</code>

   如果最下面顯示的是一行,那說明是錯誤的,你還需啟動node2的corosync

(3)檢查啟動過程中是否有錯誤産生(此處可忽略)。

<code>[root@node1 ~]</code><code># grep ERROR: /var/log/cluster/corosync.log | grep -v unpack_resources</code>

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

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

(4)檢視pacemaker是否正常啟動

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

<code>Apr 20 12:07:39 corosync [pcmk  ] info: pcmk_startup: CRM: Initialized</code>

<code>Apr 20 12:07:39 corosync [pcmk  ] Logging: Initialized pcmk_startup</code>

<code>Apr 20 12:07:39 corosync [pcmk  ] info: pcmk_startup: Maximum core </code><code>file</code> <code>size is: 18446744073709551615</code>

<code>Apr 20 12:07:39 corosync [pcmk  ] info: pcmk_startup: Service: 9</code>

<code>Apr 20 12:07:39 corosync [pcmk  ] info: pcmk_startup: Local </code><code>hostname</code><code>: node1.shuishui.com</code>

(5)檢視叢集狀态

<code>[root@node1 ~]</code><code># crm_mon</code>

<code>Last updated: Sun Apr 20 12:20:24 2014</code>

<code>Last change: Sun Apr 20 12:12:42 2014 via crmd on node1.shuishui.com</code>

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

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

<code>Version: 1.1.10-14.el6-368c726</code>

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

<code>0 Resources configured</code>

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

   從叢集狀态資訊中我們可以看到,節點node1和node2都線上,node1是DC且擁有法定票數,但是0 Rewources configured,叢集中沒有任何資源,是以接下來的任務就是使用pacemaker配置資源

6、crmsh使用簡單說明,有迷糊的地方就help吧

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

<code>[root@node1 ~]</code><code># crm              #進入CRM</code>

<code>crm(live)</code><code># help                  #擷取幫助</code>

<code>This is crm shell, a Pacemaker </code><code>command</code> <code>line interface.</code>

<code>Available commands:</code>

<code>    </code><code>cib              manage shadow CIBs</code>

<code>    </code><code>resource         resources management</code>

<code>    </code><code>configure        CRM cluster configuration</code>

<code>    </code><code>node             nodes management</code>

<code>    </code><code>options          user preferences</code>

<code>    </code><code>history</code>          <code>CRM cluster </code><code>history</code>

<code>    </code><code>site             Geo-cluster support</code>

<code>    </code><code>ra               resource agents information center</code>

<code>    </code><code>status           show cluster status</code>

<code>    </code><code>help,?           show help (help topics </code><code>for</code> <code>list of topics)</code>

<code>    </code><code>end,</code><code>cd</code><code>,up        go back one level</code>

<code>    </code><code>quit,bye,</code><code>exit</code>    <code>exit</code> <code>the program   </code>

<code>crm(live)</code><code># configure              #進入configure</code>

<code>crm(live)configure</code><code>#               #兩下tab可顯示所有指令</code>

<code>?                  erase              ms                 rsc_template</code>

<code>bye                </code><code>exit</code>               <code>node               rsc_ticket</code>

<code>cd</code>                 <code>fencing_topology   op_defaults        rsctest</code>

<code>cib                filter             order              save</code>

<code>cibstatus          graph              primitive          schema</code>

<code>clone              group              property           show</code>

<code>collocation        help               ptest              simulate</code>

<code>colocation         </code><code>history</code>            <code>quit               template</code>

<code>commit             load               ra                 up</code>

<code>default-timeouts   location           refresh            upgrade</code>

<code>delete             master             rename             user</code>

<code>edit               modgroup           role               verify</code>

<code>end                monitor            rsc_defaults       xml</code>

<code>crm(live)configure</code><code># help           #在configure下擷取幫助</code>

<code>Commands </code><code>for</code> <code>resources are:</code>

<code>- `primitive`</code>

<code>- `monitor`</code>

<code>- `group`</code>

<code>- `clone`</code>

<code>- `ms`/`master` (master-slave)</code>

<code>In order to streamline large configurations, it is possible to</code>

<code>define a template </code><code>which</code> <code>can later be referenced </code><code>in</code> <code>primitives:</code>

<code>- `rsc_template`</code>

<code>In that </code><code>case</code> <code>the primitive inherits all attributes defined </code><code>in</code> <code>the</code>

<code>template.</code>

<code>There are three types of constraints:</code>

<code>crm(live)configure</code><code># help primitive            #檢視primitive指令的使用格式</code>

<code>Usage:</code>

<code>...............</code>

<code>        </code><code>primitive &lt;rsc&gt; {[&lt;class&gt;:[&lt;provider&gt;:]]&lt;</code><code>type</code><code>&gt;|@&lt;template&gt;}</code>

<code>          </code><code>[params attr_list]</code>

<code>          </code><code>[meta attr_list]</code>

<code>The primitive </code><code>command</code> <code>describes a resource. It may be referenced</code>

<code>only once </code><code>in</code> <code>group, clone, or master-slave objects. If it's not</code>

<code>referenced, </code><code>then</code> <code>it is placed as a single resource </code><code>in</code> <code>the CIB.</code>

7、定義全局屬性,設定沒有法定票數的行為和禁用stonith

   之于為什麼要這麼做,已經在第一部分的第4條做了詳細說明,這裡就不再贅述了

(1)禁用stonith

<code>[root@node1 ~]</code><code># crm</code>

<code>crm(live)</code><code># configure</code>

<code>crm(live)configure</code><code># property stonith-enabled=false     #禁用stonith</code>

<code> </code><code>crm(live)configure</code><code># verify            #校驗</code>

<code>crm(live)configure</code><code># commit             #校驗沒有錯誤再送出</code>

(2)定義法定票數不夠時應該做忽略操作

<code>crm(live)configure</code><code># property no-quorum-policy=ignore    #定義全局屬性</code>

<code> </code><code>crm(live)configure</code><code># verify        #每次在送出之前都要做一次校驗</code>

<code>crm(live)configure</code><code># commit         #送出</code>

<code>crm(live)configure</code><code># show       </code>

<code>node node1.shuishui.com</code>

<code>node node2.shuishui.com</code>

<code>property $</code><code>id</code><code>=</code><code>"cib-bootstrap-options"</code> <code>\</code>

<code>    </code><code>dc</code><code>-version=</code><code>"1.1.10-14.el6-368c726"</code> <code>\</code>

<code>    </code><code>cluster-infrastructure=</code><code>"classic openais (with plugin)"</code> <code>\</code>

<code>    </code><code>expected-quorum-votes=</code><code>"2"</code> <code>\</code>

<code>    </code><code>stonith-enabled=</code><code>"false"</code> <code>\           </code><code>#已然生效</code>

<code>    </code><code>no-quorum-policy=</code><code>"ignore"</code>

8、資源類型

   上面提到過了,添加資源是在crm中定義的,但是真正去幹活的卻是做RA的那些小弟們,是以,在添加資源之前,必須要知道目前叢集所支援的RA類型。corosync支援heartbeat,LSB和ocf等類型的資源代理,目前較為常用的類型為LSB和OCF兩類,stonith類專為配置stonith裝置而用。

(1)檢視目前叢集所支援的RA類型清單

<code>crm(live)</code><code># ra</code>

<code>crm(live)ra</code><code># classes</code>

<code>lsb</code>

<code>ocf / heartbeat pacemaker</code>

<code>service</code>

<code>stonith</code>

(2)檢視某種類别下的所用資源代理的清單

<code>crm(live)ra</code><code># list lsb</code>

<code>auditd            blk-availability  corosync          corosync-notifyd  crond             haldaemon         halt              htcacheclean</code>

<code>httpd             ip6tables         iptables          killall           libvirt-guests    lvm2-lvmetad      lvm2-monitor      messagebus</code>

<code>netconsole        netfs             network           nfs               nfslock           ntpdate           pacemaker         postfix</code>

<code>quota_nld         rdisc             restorecond       rpcbind           rpcgssd           rpcidmapd         rpcsvcgssd        rsyslog</code>

<code>sandbox           saslauthd         single            sshd              svnserve          udev-post         winbind      </code>

<code>crm(live)ra</code><code># list ocf heartbeat</code>

<code>CTDB            Dummy           Filesystem      IPaddr          IPaddr2         IPsrcaddr       LVM             MailTo          Route</code>

<code>SendArp         Squid           VirtualDomain   Xinetd          apache          conntrackd      dhcpd           ethmonitor      exportfs</code>

<code>mysql           mysql-proxy     named           nfsserver       nginx           pgsql           postfix         rsyncd          rsyslog</code>

<code>slapd           </code><code>symlink</code>         <code>tomcat     </code>

<code>crm(live)ra</code><code># list ocf pacemaker</code>

<code>ClusterMon    Dummy         HealthCPU     HealthSMART   Stateful      SysInfo       SystemHealth  controld      </code><code>ping</code>          <code>pingd</code>

<code>remote   </code>

<code>crm(live)ra</code><code># list stonith</code>

<code>fence_legacy  fence_pcmk</code>

(3)檢視代理資訊

我們在上面介紹過,pacemaker是OCF的一個provider,heartbeat也是其中一個,當你要檢視某個OCF資源代理時,就需為其指定provider

<code>格式:crm ra info [class:[provider:]]resource_agent</code>

<code>crm(live)ra</code><code># info ocf:heartbeat:IPaddr</code>

<code>Parameters (* denotes required, [] the default):</code>

<code>ip* (string): IPv4 or IPv6 address</code>

<code>    </code><code>The IPv4 (dotted quad notation) or IPv6 address (colon hexadecimal notation)</code>

<code>    </code><code>example IPv4 </code><code>"192.168.1.1"</code><code>.</code>

<code>    </code><code>example IPv6 </code><code>"2001:db8:DC28:0:0:FC57:D4C8:1FFF"</code><code>.</code>

<code>nic (string): Network interface</code>

<code>    </code><code>The base network interface on </code><code>which</code> <code>the IP address will be brought</code>

9、為叢集添加資源

    一個web叢集中應該有三個資源:webip,webstore和webserver

(1)為web叢集建立IP位址資源

   webip是要實作轉移的,目的就是為了實作一個節點故障的時候,webip可以轉移到另外一台備用的伺服器上,以實作web伺服器的高可用性

<code>crm(live)configure</code><code># primitive webip ocf:heartbeat:IPaddr params ip=172.16.7.188 op monitor interval=30s timeout=20s on-fail=restart</code>

<code>crm(live)configure</code><code># verify     #校驗</code>

<code>crm(live)configure</code><code># commit     #送出</code>

<code>crm(live)configure</code><code># cd ..      #傳回上層</code>

<code>crm(live)</code><code># status              #檢視叢集狀态</code>

<code>Last updated: Sun Apr 20 14:52:53 2014</code>

<code>Last change: Sun Apr 20 14:52:28 2014 via cibadmin on node1.shuishui.com</code>

<code>1 Resources configured</code>

<code> </code><code>webip  (ocf::heartbeat:IPaddr):    Started node1.shuishui.com    </code><code>#資源webip運作在node1上</code>

   這裡在定義資源時,使用了監控(monitor)的概念,上面沒提到,這裡補充說明:

   monitor是用來監控資源的,預設情況下pacemaker沒有對任何資源進行監控,那為什麼要對資源進行監控呢?假如一個節點出故障了,corosync檢測不到這個節點的心跳資訊,那麼它就認為這個節點故障了,是以資源就會轉移到另外的備用節點上;但如果是服務非正常關閉了呢?假如挂的是httpd服務而不是節點,在這種情況下,如果沒有對資源進行監控,資源是不會轉移的,因為壓根兒就沒節點什麼事,它也不會意識到服務停掉了,這就意味着如果服務非正常關閉的話,那web也就不會響應了,是以我們應該在定義資源時對其進行監控

   要想對資源進行監控,就必須在定義資源時指定op_type為monitor,假如服務非正常關閉的話,先讓其重新開機,如果重新開機不了,再轉移到其它節點上

   這也解釋清楚了,文法就在上面了,interval代表多久監聽一次,timeout代表逾時時間

<code>[root@node1 ~]</code><code># ip addr show     #檢視下webip是否生效</code>

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

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

<code>    </code><code>inet 127.0.0.1</code><code>/8</code> <code>scope host lo</code>

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

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

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

<code>    </code><code>link</code><code>/ether</code> <code>00:0c:29:37:b4:75 brd ff:ff:ff:ff:ff:ff</code>

<code>    </code><code>inet 172.16.7.10</code><code>/16</code> <code>brd 172.16.255.255 scope global eth0</code>

<code>    </code><code>inet 172.16.7.188</code><code>/16</code> <code>brd 172.16.255.255 scope global secondary eth0   </code><code>#webip在這裡</code>

<code>    </code><code>inet6 fe80::20c:29ff:fe37:b475</code><code>/64</code> <code>scope link</code>

   既然webip已經生效,那麼就可以使用通路這個webip:172.16.7.188檢視網頁了

<a href="http://s3.51cto.com/wyfs02/M01/24/93/wKiom1NTdiPilc3JAABElOj7S5k801.png" target="_blank"></a>

   此時,我們測試在node2上把node1的corosync停掉,然後看看叢集的狀态

<code>[root@node2 ~]</code><code># ssh node1 "service corosync stop"   #停掉node1的corosync</code>

<code>Signaling Corosync Cluster Engine (corosync) to terminate: [  OK  ]</code>

<code>Waiting </code><code>for</code> <code>corosync services to unload:.[  OK  ]    </code><code>#停止node1上的corosync成功</code>

<code>[root@node2 ~]</code><code># crm status     #檢視下node2上的叢集狀态資訊</code>

<code>Last updated: Sun Apr 20 16:56:11 2014</code>

<code>Last change: Sun Apr 20 16:50:32 2014 via crmd on node2.shuishui.com</code>

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

<code>Version: 1.1.8-7.el6-394e906</code>

<code>1 Resources configured.</code>

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

<code>OFFLINE: [ node1.shuishui.com ]        </code><code>#node1已經離線</code>

<code> </code><code>webip  (ocf::heartbeat:IPaddr):    Started node2.shuishui.com    </code><code>#webip轉移到了node2上</code>

   在node1上檢視叢集狀态資訊

   注意:這裡是在node1上檢視叢集的狀态資訊,隻代表node1這一台機器連不到叢集中,并不是整個叢集有問題

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

<code>Could not establish cib_ro connection: Connection refused (111)</code>

<code>ERROR: crm_mon exited with code 107 and said: Connection to cluster failed: Transport endpoint is not connected</code>

   此時再去通路172.16.7.188依然是正常狀态,而且在這個過程中,資源已經從node1轉移到node2上了

   因為我們這個叢集中有兩個節點,是以這裡可能出現無法定票數的情況,這個已經在上面提到過了,而且已經在第一步的時候就已經修改了當法定票數不足是應該做忽略操作,是以這裡就沒有報那個partition WITHOUT quorum的錯

   驗證完成之後,我把再讓node1重新上線吧

<code>[root@node2 ~]</code><code># ssh node1 "service corosync start"    #在node2上啟動node1的corosync</code>

<code>Starting Corosync Cluster Engine (corosync): [  OK  ]  </code><code>#啟動成功</code>

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

<code>Last updated: Sun Apr 20 17:14:53 2014</code>

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

<code>Online: [ node1.shuishui.com node2.shuishui.com ]       </code><code>#node1上線成功</code>

<code> </code><code>webip  (ocf::heartbeat:IPaddr):    Started node2.shuishui.com</code>

(2)為叢集建立webstore資源

<code>crm(live)configure</code><code># primitive webstore ocf:heartbeat:Filesystem params device="172.16.7.8:/www" directory="/var/www/html" fstype="nfs" op monitor interval=60s timeout=40s op start timeout=60s op stop timeout=60s</code>

<code>crm(live)configure</code><code># verify</code>

<code>crm(live)configure</code><code># commit</code>

(3)為叢集建立webserver資源

<code>crm(live)configure</code><code># primitive webserver lsb:httpd op monitor interval=30s timeout=20s on-fail=restart</code>

   當使用資源代理類型是LSB的時候,後面不需要批任何參數

   檢視叢集狀态,驗證3個資源是否都在運作

<code>crm(live)</code><code># status</code>

<code>Last updated: Sun Apr 20 17:28:52 2014</code>

<code>Last change: Sun Apr 20 17:26:19 2014 via cibadmin on node1.shuishui.com</code>

<code>3 Resources configured</code>

<code> </code><code>webstore   (ocf::heartbeat:Filesystem):    Started node1.shuishui.com</code>

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

10、定義組資源    

   從上一條可以看出,為了分攤負載,資源預設是運作在不同的節點上的,為了使其都運作在一個節點上,有兩種方式:(1)定義組資源(2)定義排列限制

   這裡就使用定義組資源吧

<code>crm(live)configure</code><code># group webcluster webip webstore webserver   #定義組webcluster,成員是後面三個資源</code>

   此時再檢視叢集狀态,看看資源是怎麼個分布法

<code>crm(live)configure</code><code># cd</code>

<code>Last updated: Sun Apr 20 17:45:06 2014</code>

<code>Last change: Sun Apr 20 17:42:56 2014 via cibadmin on node1.shuishui.com</code>

<code>                                                        </code><code>#三個資源以組的方式運作在一個節點上了</code>

<code> </code><code>Resource Group: webcluster</code>

<code>     </code><code>webip  (ocf::heartbeat:IPaddr):    Started node2.shuishui.com</code>

<code>     </code><code>webstore   (ocf::heartbeat:Filesystem):    Started node2.shuishui.com</code>

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

11、資源限制

(1)位置限制(Location)

       定義資源更傾向運作在哪一個節點上,數值越大,傾向性超高

       inf:無窮大    n    -n    -inf:負無窮,但凡有可能,就不會運作在這個節點上

(2)排列限制(Order)

       資源運作在同一節點的傾向性

       inf:    -inf:就代表那種老死不相往來的狀态

(3)順序限制(Colocation)

       定義資源的啟動與關閉次序

   就如我們定義的三個資源,他們的啟動順序應該是webip,webstore,webserver,那就給它們定義一個順序限制吧

<code>crm(live)configure</code><code># order webip_webstore_webserver mandatory: webip webstore webserver</code>

   show指令:The `show` command displays objects.It may display all objects or a set of objects.The user may also choose to see only objects which were changed。如果想檢視的更詳細,可以使用show xml

<code>crm(live)configure</code><code># show</code>

<code>primitive webip ocf:heartbeat:IPaddr \</code>

<code>        </code><code>params ip=</code><code>"172.16.7.188"</code> <code>\</code>

<code>        </code><code>op</code> <code>monitor interval=</code><code>"30s"</code> <code>timeout=</code><code>"20s"</code> <code>on-fail=</code><code>"restart"</code>

<code>primitive webserver lsb:httpd \</code>

<code>primitive webstore ocf:heartbeat:Filesystem \</code>

<code>        </code><code>params device=</code><code>"172.16.7.8:/www"</code> <code>directory=</code><code>"/var/www/html"</code> <code>fstype=</code><code>"nfs"</code> <code>\</code>

<code>        </code><code>op</code> <code>monitor interval=</code><code>"60s"</code> <code>timeout=</code><code>"40s"</code> <code>\</code>

<code>        </code><code>op</code> <code>start timeout=</code><code>"60s"</code> <code>interval=</code><code>"0"</code> <code>\</code>

<code>        </code><code>op</code> <code>stop timeout=</code><code>"60s"</code> <code>interval=</code><code>"0"</code>

<code>group webcluster webip webstore webserver</code>

<code>order webip_webstore_webserver inf: webip webstore webserver</code>

<code>        </code><code>dc</code><code>-version=</code><code>"1.1.8-7.el6-394e906"</code> <code>\</code>

<code>        </code><code>cluster-infrastructure=</code><code>"classic openais (with plugin)"</code> <code>\</code>

<code>        </code><code>expected-quorum-votes=</code><code>"2"</code> <code>\</code>

<code>        </code><code>stonith-enabled=</code><code>"false"</code> <code>\</code>

<code>        </code><code>no-quorum-policy=</code><code>"ignore"</code>

大緻就這樣吧,将安裝個論壇試試效果

五、安裝discuz論壇,驗證效果

1、在資料庫伺服器上授權

<code>MariaDB [(none)]&gt; grant all on *.* to </code><code>'web'</code><code>@</code><code>'172.16.%.%'</code> <code>identified by </code><code>'web'</code><code>;</code>

<code>Query OK, 0 rows affected (0.04 sec)</code>

<code>MariaDB [(none)]&gt; flush privileges;</code>

<code>Query OK, 0 rows affected (0.05 sec)</code>

2、安裝論壇

   基于NFS的論壇安裝,部落格中專門有一篇博文是介紹那個的;另外,此篇博文中所有沒有詳細介紹的,在本部落格中都可以找到相應的博文

3、模拟節點損壞前伺服器叢集狀态,各資源都是運作在node2上的

<code>Last updated: Sun Apr 20 18:18:01 2014</code>

<code>Last change: Sun Apr 20 18:08:03 2014 via cibadmin on node1.shuishui.com</code>

4、發一篇新貼,IP位址是VIP:172.16.7.188

5、剛才看到各資源是運作在node2上的,那我們就模拟node2損壞,看資源是否能夠自動 轉移到node1上

<code>[root@node2 ~]</code><code># crm</code>

<code>crm(live)</code><code># node</code>

<code>crm(live)node</code><code>#</code>

<code>crm(live)node</code><code># standby</code>

6、在node1上檢視此時的伺服器叢集狀态

<code>Node node2.shuishui.com: standby           </code><code>#node2standby了</code>

<code>Online: [ node1.shuishui.com ]</code>

<code> </code><code>Resource Group: webcluster                </code><code>#資源都在node1上</code>

<code>     </code><code>webip  (ocf::heartbeat:IPaddr):    Started node1.shuishui.com</code>

<code>     </code><code>webstore   (ocf::heartbeat:Filesystem):    Started node1.shuishui.com</code>

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

7、論壇依然可以正常通路,VIP已在使用者的不知不覺中轉移到了node1上,一切盡在掌握之中

<a href="http://s3.51cto.com/wyfs02/M01/24/94/wKioL1NTp0jCOlpgAADN5BdqpY0842.png" target="_blank"></a>

corosync+pacemaker實作web叢集高可用

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

繼續閱讀