Corosync+pacemaker高可用集羣實現

目錄:


    1. 實驗規劃

    2. 實驗準備

    3. 軟件安裝

    4. Corosync配置文件

    5. 高可用功能實現

    6. 資源粘性實例

    7. 注意事項

  1. 實驗規劃

    1. 有兩個結點分別爲RS1和RS2 IP地址分別爲192.168.1.127和192.168.1.128

    2. 高可用的訪問VIP地址爲192.168.1.122

    3. 高可用服務爲httpd服務、

    4. 系統爲CentOS Linux release 6.0 (Final)

  2. 實驗準備

1.配置RS1的IP地址(/etc/sysconfig/network-scripts/ifcfg-eth0)    
        DEVICE="eth0"
        NM_CONTROLLED="yes"
        ONBOOT="yes"
        BOOTPROTO=static
        IPADDR=192.168.1.127
        NETMASK=255.255.255.0
        GATEWAY=192.168.1.1
        DNS1=192.168.1.1
    同理:RS2的配置如下:
        DEVICE="eth0"
        NM_CONTROLLED="yes"
        ONBOOT="yes"
        BOOTPROTO=static
        IPADDR=192.168.1.128
        NETMASK=255.255.255.0
        GATEWAY=192.168.1.1
        DNS1=192.168.1.1
    2.配置主機名和/etc/hosts文件
        vim /etc/sysconfig/network 中的HOSTNAME=RS1,同理將RS2中的改爲RS2.
        vim /etc/hosts 文件把自己127.0.0.1解析爲自己,並添加
        192.168.1.127 RS1
        192.168.1.128 RS2這兩行。
    3.設置兩個主機能夠進行ssh密鑰認證通信。
        在RS1和RS2上執行同樣的操作
        #ssh-keygen -t rsa -f ~/.ssh/id_rsa -P ''
        #ssh-copy-id -i ~/.ssh/id_rsa.pub root@node1
        測試成功:
            #ssh RS1 'ifconfig'
    4.同步時間:
        在RS1上安裝ntp並開啓服務同步
        #yum install ntp -y
        #/etc/init.d/ntpd start
        注意RS2無法進行ntpdate同步,出現no server suitable for synchronization found錯誤:
        則修改:/etc/ntp.conf,在最後加入
        server 127.127.1.0
        fudge 127.127.1.0 stratum 8 
        在RS2上安裝ntpdate:
        #yum install ntpdate -y
        #crontab -e
        */5 * * * * /usr/sbin/ntpdate 192.168.1.127
    5.此處關閉兩個節點的防火牆和selinux
        [root@RS1 ~]# service  iptables stop
        [root@RS1 ~]# setenforce 0
        
        [root@RS2 ~]# service  iptables stop
        [root@RS1 ~]# setenforce 0

4. 軟件安裝


    1. 首先要解決安裝包之間的依賴。

        libibverbs, librdmacm, lm_sensors, libtool-ltdl, openhpi-libs, openhpi, perl-TimeDate

 #yum install libibverbs  librdmacm lm_sensors libtool-ltdl openhpi-libs openhpi perl-TimeDate

    b.  安裝corosync和pacemaker,下載所需要如下軟件包至本地.

          注意:由於pacemaker對heartbeat有依賴作用,所以要安裝上heartbeat。

        cluster-glue
        cluster-glue-libs
        heartbeat
        resource-agents
        corosync
        heartbeat-libs
        pacemaker
        corosynclib
        libesmtp
        pacemaker-libs
        pssh
        python-pssh
        crmsh
       我們要想使用pacemaker配置的話需要安裝一個pacemaker的接口,它的這個程序的接口叫crmshell,它在新版本的 pacemaker已經被獨立出來了,不再是pacemaker的組成部分了,早期裝上pacemaker就會自帶有crmshell,因此要想用 crmshell的話得去安裝crmshell,而安裝crmshell又依賴於pssh的相關包,因此得安裝這兩個組件,(這裏的這兩個包是自己製件 的),哪個節點配置就安裝在哪個節點上就可以了,也無需兩個節點都安裝這兩個包。
       #yum localinstall --nogpgcheck *.rpm

5.  配置Corosync

1.首先複製一個配置文件:
    #cp corosync.conf.example corosync.conf
2.修改配置文件內容:
    # vim /etc/corosync/corosync.conf   編輯配置文件修改如下內容
compatibility: whitetank    #這個表示是否兼容0.8之前的版本
totem {    #圖騰,這是用來定義集羣中各節點中是怎麼通信的以及參數
        version: 2        #圖騰的協議版本,它是種協議,協議是有版本的,它是用於各節點互相通信的協議,這是定義版本的
        secauth: on        #表示安全認證功能是否啓用的
        threads: 0        #實現認證時的並行線程數,0表示默認配置
        interface {        # 指定在哪個接口上發心跳信息的,它是個子模塊
                ringnumber: 0    #環號碼,集羣中有多個節點,每個節點上有多個網卡,別的節點可以接收,同時我們本機的別一塊網卡也可以接收,爲了避免這些信息在這樣的環狀發送,因此要爲這個網卡定義一個唯一的環號碼,以避免心跳信息環發送。這裏只有一張網卡,就不會形成環路。
                bindnetaddr: 192.168.1.0       # 綁定的網絡地址
                mcastaddr: 226.94.1.1    #多播地址,一對多通信
                mcastport: 5405        # 多播端口
                ttl: 1        # 表示只向外播一次
        }
}
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
}
service {  #定義一個服務來啓動pacemaker
    ver: 0    #定義版本
    name: pacemaker  #這個表示啓動corosync時會自動啓動pacemaker
}
aisexec {  #表示啓動ais的功能時以哪個用戶的身份去運行的
    user: root
    group: root  #其實這個塊定義不定義都可以,corosync默認就是以root身份去運行的
}
3.生成節點之間通信的密鑰文件:
    # corosync-keygen
    這個可能熵池中的隨機數不夠,可以這樣
    [root@RS1 corosync]# mv /dev/random /dev/m
    [root@RS1 corosync]# ln /dev/urandom /dev/random
    [root@RS1 corosync]# corosync-keygen 
    Corosync Cluster Engine Authentication key generator.
    Gathering 1024 bits for key from /dev/random.
    Press keys on your keyboard to generate entropy.
    Writing corosync key to /etc/corosync/authkey.
    [root@RS1 corosync]# rm -ef /dev/random 
    rm: invalid option -- 'e'
    Try `rm --help' for more information.
    [root@RS1 corosync]# rm -rf /dev/random 
    [root@RS1 corosync]# mv /dev/m /dev/random
4.將配置好的文件發給其他節點:
    # scp /etc/corosync/{authkey,corosync.conf} RS2:/etc/corosync/
5.在節點上建立日誌文件存的地方
[root@RS1 corosync]# mkdir /var/log/cluster
[root@RS1 corosync]# ssh RS2 'mkdir /var/log/cluster'
6.啓動Corosync
 1.查看corosync引擎是否正常啓動:
   # grep -e "Corosync Cluster Engine" -e "configuration file" /var/log/messages
 2.查看初始化成員節點通知是否正常發出:
   # grep  TOTEM  /var/log/messages
 3.檢查啓動過程中是否有錯誤產生:
   # grep ERROR: /var/log/messages | grep -v unpack_resources
 4.查看pacemaker是否正常啓動:
   # grep pcmk_startup /var/log/messages
 5.如果以上沒有問題那麼啓動RS2(遠程啓動)
   [root@RS1 corosync]# ssh RS2 '/etc/init.d/corosync start'
   Starting Corosync Cluster Engine (corosync): [  OK  ]
 6.查看啓動情況:
    [root@RS1 ~]# crm status
    Last updated: Sun May 24 15:58:18 2015
    Last change: Sun May 24 15:55:52 2015
    Stack: classic openais (with plugin)
    Current DC: RS1 - partition with quorum
    Version: 1.1.11-97629de
    2 Nodes configured, 2 expected votes
    0 Resources configured
    Online: [ RS1 RS2 ]

6.  高可用功能實現

    1)由於這裏沒有STONITH設備,所以關閉STONITH設備

wKioL1VhlxCiI_c4AAEwgx1hjh0379.jpg

    2)爲集羣添加資源

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

        1)可以通過如下命令查看當前集羣系統所支持的類型:

            # crm ra classes 

            heartbeat

            lsb

            ocf / heartbeat pacemaker

            stonith 

        2)如果想要查看某種類別下的所用資源代理的列表,可以使用類似如下命令實現:

            # crm ra list lsb

            # crm ra list ocf heartbeat

            # crm ra list ocf pacemaker

            # crm ra list stonith

        3)配置web集羣的IP地址資源,cib的語法如下:

            語法:

            primitive <rsc> [<class>:[<provider>:]]<type>

                      [params attr_list]

                      [operations id_spec]

                        [op op_type [<attribute>=<value>...] ...

            op_type :: start | stop | monitor

            例子:

             primitive apcfence stonith:apcsmart \

                      params ttydev=/dev/ttyS0 hostlist="node1 node2" \

                      op start timeout=60s \

                      op monitor interval=30m timeout=60s

           配置命令:          

            # crm configure primitive WebIP ocf:heartbeat:IPaddr params ip=192.168.1.122

wKioL1Vh2i7yTUg-AAFQ1f_1ug0921.jpg

            如果想要在RS1上看WebIP的信息;

            可以再RS1上直接 #ip addr show;  

wKioL1Vh2rbxFGxCAAKAQsZMjyA130.jpg

            現在如果將RS1的Corosync關閉之後就可以看到高可用的作用,如下:(在RS2上關閉RS1的服務) 此時注意在cib中不能有location cli-prefer-WebIP WebIP role=Started inf: RS1,這個是資源粘性,說明即使是RS1宕機之後也不能轉移資源。

    [root@RS2 ~]# ssh RS1 '/etc/init.d/corosync stop'
    Signaling Corosync Cluster Engine (corosync) to terminate: [  OK  ]
    Waiting for corosync services to unload:.[  OK  ]
    You have new mail in /var/spool/mail/root

        但是這裏並沒有轉移,這個就是因爲quorum法定票數的問題,由於現在來說,兩個節點的票數都是一樣多的,所以這裏就默認,兩邊節點票數一樣多的話就會stop,所以這裏可以配置參數 

     # crm configure property no-quorum-policy=ignore 
     這裏表示如果集羣分裂的話就忽略,運行的結點繼續提供服務。

wKioL1VilIrRUBNMAAFvAohHWrc339.jpg

7.    資源粘性

        由上圖看出,RS1上線之後並沒有進行資源的轉移,這是由於資源粘性的原因:

    如下是關於資源粘性的解釋:

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

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

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

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

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

       1)下面修改一下默認的資源粘性,這樣的話一開始在運行的結點上設置默認的資源粘性爲100

        # crm configure rsc_defaults resource-stickiness=100 

      此時WebIP資源又轉移到了RS1上,那麼重新上線之後的結果也是沒有轉移到RS2上,因爲此時的默認的資源粘性都是100,如果要是將在RS2上對WebIP的資源粘性比100大的話,那麼會轉移到RS2上。

       2)下面再配置一個httpd(web)的資源,

            首先,在兩個結點上都安裝上httpd服務,

            # yum install httpd -y

                注意:安裝完成之後將

                 [root@RS1]# echo RS1 > /var/www/html/index.html 

                 [root@RS2]# echo RS2 > /var/www/html/index.html 

                   service httpd start 開啓服務

                   chkconfig httpd off     去掉開機自動啓動,方便集羣的管理。

                測試httpd是否成功(用瀏覽器),也可以用curl命令,例如:

                 curl http://192.168.1.127

            其次,配置httpd資源

                #crm configure primitive httpd lsb:httpd

wKioL1VimW6zYrkwAAHmMiODx1w728.jpg

           此時查看狀態會發現,資源默認的分配方式是平均分配,也是就說會將資源輪着分給每一個結點:    

         

wKiom1VimGXRKEc6AAB8r2pOMao081.jpg

      3)調整資源約束:

        WebIP和httpd服務要在一個節點上才能夠提供服務,那麼如何約束結點之間的行爲,那就是資源約束的功能:

        資源約束則用以指定在哪些羣集節點上運行資源,以何種順序裝載資源,以及特定資源依賴於哪些其它資源。pacemaker共給我們提供了三種資源約束方法:

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

            2、Resource Collocation(資源排列):排列約束用以定義集羣資源可以或不可以在某個節點上同時運行;

            3、Resource Order(資源順序):順序約束定義集羣資源在節點上啓動的順序;

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

        加減無窮大遵循以下3個基本規則:

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

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

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

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

        4)對WebIP和httpd可要在一起資源的約束

            #crm configure collocation http-with-WebIP INFINITY: httpd WebIP

wKioL1VingDxF6djAACNeVty10Y558.jpg

         可以看到現在資源在一個節點上運行。  

        5)先啓動WebIP然後啓動httpd服務。

        #crm configure order httpd-after-WebIP mandatory: WebIP WebSite

        6)如果兩個節點的性能不一樣,總是希望服務能夠運行在RS1則個高性能的結點上,那麼要定位置約束,例如:

        #crm configure location prefer-RS1 httpd rule 200: #uname eq RS1

        當RS1宕機之後重新上線就會引起資源重新回到RS1。


注意事項:

    1.在Corosync的配置文件中可以進行多播地址的修改,下面是多播地址的知識:

        多播地址(multicast address)即組播地址,是一組主機的標示符,它已經加入到一個多播組中。在以太網中,多播地址是一個48位的標示符,命名了一組應該在這個網絡中應用接收到一個分組的站點。在IPv4中,它歷史上被叫做D類地址,一種類型的IP地址,它的範圍從224.0.0.0到239.255.255.255,或,等同的,在224.0.0.0/4。在IPv6,多播地址都有前綴ff00::/8。

        多播是第一個字節的最低位爲1的所有地址,例如01-12-0f-00-00-02。廣播地址是全1的48位地址,也屬於多播地址。但是廣播又是多播中的特例,就像是正方形屬於長方形,但是正方形有長方形沒有的特點。

    2.crmshell中如果不會使用某一個指令可以用help + 命令來查詢。

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