天天看點

LEMP環境+corosync+pacemaker+drbd 小菜帶你玩轉高可用叢集

實驗開始前先做以下準備:

實驗環境:RHEL6.4

    節點1:admin1.tuchao.com 192.168.18.201

    節點2:admin2.tuchao.com 192.168.18.202

首先兩個節點安裝DRBD,準備相同大小的分區。

yum install drbd-8.4.3-33.el6.i686.rpm  drbd-kmdl-2.6.32-358.el6-8.4.3-33.el6.i686.rpm -y

分區 (略)

接下來操作admin1.tuchao.com

1、配置/etc/drbd.d/global-common.conf

global {

        usage-count no;

        # minor-count dialog-refresh disable-ip-verification

}

common {

        protocol C;

        handlers {

                pri-on-incon-degr "/usr/lib/drbd/notify-pri-on-incon-degr.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f";

                pri-lost-after-sb "/usr/lib/drbd/notify-pri-lost-after-sb.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f";

                local-io-error "/usr/lib/drbd/notify-io-error.sh; /usr/lib/drbd/notify-emergency-shutdown.sh; echo o > /proc/sysrq-trigger ; halt -f";

                # fence-peer "/usr/lib/drbd/crm-fence-peer.sh";

                # split-brain "/usr/lib/drbd/notify-split-brain.sh root";

                # out-of-sync "/usr/lib/drbd/notify-out-of-sync.sh root";

                # before-resync-target "/usr/lib/drbd/snapshot-resync-target-lvm.sh -p 15 -- -c 16k";

                # after-resync-target /usr/lib/drbd/unsnapshot-resync-target-lvm.sh;

        }

        startup {

                #wfc-timeout 120;

                #degr-wfc-timeout 120;

        disk {

                on-io-error detach;

                #fencing resource-only;

        net {

                cram-hmac-alg "sha1";

                shared-secret "mydrbdlab";

        syncer {

                rate 1000M;

2、定義資源

vim /etc/drbd.d/mydrbd.res

resource mydrbd {

 on admin1.tuchao.com {

  device        /dev/drbd0;

  disk          /dev/sdb1;

  address       192.168.18.201:7789;

  meta-disk     internal;

 on admin2.tuchao.com {

  address       192.168.18.202:7789;

3、将配置檔案同步到另一個節點

scp global_common.conf mydrbd.res  admin2:/etc/drbd.d/

4、在兩個節點上初始化已定義的資源并啟動服務

drbdadm create-md mydrbd

/etc/init.d/drbd start

檢視狀态,也可以使用drbd-overview指令來檢視

cat /proc/drbd

version: 8.4.3 (api:1/proto:86-101)

GIT-hash: 89a294209144b68adb3ee85a73221f964d3ee515 build by gardner@, 2013-05-27 06:20:13

 0: cs:Connected ro:Secondary/Secondary ds:UpToDate/UpToDate C r-----

    ns:0 nr:4 dw:4 dr:0 al:0 bm:1 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

由此看出,目前兩個節點都是(secondary)備用狀态。

将admin1節點提升為(primary)主狀态

drbdadm primary --force mydrbd

<a href="http://s3.51cto.com/wyfs02/M02/43/5F/wKioL1PZ-M7ittS0AAGVU1gKATM160.jpg" target="_blank"></a>

同步完成

0:mydrbd/0  Connected Primary/Secondary UpToDate/UpToDate C r----- 

建立檔案系統在一個節點上操作就可以了,挂載。

mkfs.ext4 /dev/drbd0

mkdir /mnt/drbd

mount /dev/drbd0 /mnt/drbd

drbd基本配置完成,我們在裡面建立一個檔案夾。

mkdir /mnt/drbd/mydata

解除安裝/dev/drbd0,将狀态轉為備。

umount /dev/drbd0

drbdadm secondary mydrbd

在admin2上,把狀态提升為primary

ls /mnt/drbd

<a href="http://s3.51cto.com/wyfs02/M02/43/5F/wKiom1PZ-0jzjqwQAADmrbG3tI8969.jpg" target="_blank"></a>

這時我們再到兩個節點上添加一個分區sdb3,做成drbd,用于存放網頁資料。

資源配置檔案如下:

<a href="http://s3.51cto.com/wyfs02/M02/43/6E/wKioL1Pa8xCCx83QAAJNL5aqkZQ342.jpg" target="_blank"></a>

接下來初始化裝置,提升狀态,建立檔案系統都和前面一樣,這裡略。

兩個節點安裝配置corosync+pacemaker(略)這個過程我在早期文章有詳細介紹這裡不再重複。

請參考:http://tchuairen.blog.51cto.com/3848118/1439759

Nginx,PHP安裝過程(略),這個内容較多,不是這篇文章的重點,我早期文章也有介紹。

請參考http://tchuairen.blog.51cto.com/3848118/1437530

MySQL安裝配置(略)請參考http://tchuairen.blog.51cto.com/3848118/1422258

drbd資源mydrbd:

/dev/drbd0 挂載至  /mnt/drbd  

/mnt/drbd/mydata  --用于存放MySQL資料。

drbd資源webdrbd:

drbd1 挂載至  /mnt/http

/mnt/http/wordpress  --用于存放部落格站點資料

/mnt/http/myadmin  --用于存放phpMyAdmin

提升primary狀态,挂載檔案系統,初始化資料庫,測試啟動資料庫。

./scripts/mysql_install_db --user=mysql --datadir=/mnt/drbd/mydata/

/etc/init.d/mysqld start

建立wpdb庫,授權連接配接使用者,用做部落格站點。

create database wpdb;

grant all privileges on wpdb.* to 'wpuser'@'127.0.0.1' identified by '123456';

停止資料庫,解除安裝drbd0,狀态轉為備用。

到另一個節點,提升為primary狀态,挂載檔案系統,啟動服務。

注意這裡不需要再次初始化資料庫了,在一個節點上做了就可以了,資料會同步過來的。

要保證節點提升為primary挂載檔案系統正常,MySQL能啟動,MySQL這邊就差不多完事了。

webdrbd資源提升primary,挂載檔案系統,導入部落格站點資料。

drbdadm primary --force webdrbd

mkdir /mnt/http

mkfs.ext4 /dev/drbd1

mount /dev/drbd1  /mnt/http/

tar zxvf wordpress-3.9-zh_CN.tar.gz

mkdir /mnt/http/wordpress

mkdir /mnt/http/myadmin

mv wordpress/* /mnt/http/wordpress/

配置wordpress 資料庫接口。

cp config.sample.inc.php  config.inc.php 

vim config.inc.php

<a href="http://s3.51cto.com/wyfs02/M02/43/77/wKioL1PbLErQAXHzAAFWdnG5Ew8060.jpg" target="_blank"></a>

導入phpMyAdmin資料。

unzip phpMyAdmin-4.0.5-all-languages.zip 

cd phpMyAdmin-4.0.5-all-languages

mv phpMyAdmin-4.0.5-all-languages/* /mnt/http/myadmin/

生成一串随機數加入到config.inc.php檔案。

配置php-fpm

vim /usr/local/php/etc/php-fpm.conf

<a href="http://s3.51cto.com/wyfs02/M00/43/78/wKiom1PbMMuBriAPAAGCsUBOweE241.jpg" target="_blank"></a>

完成後儲存,啟動php-fpm。

接下來配置Nginx,包含vhost目錄下所有以.conf結尾的檔案。

在http段中加入:

include vhost/*.conf;

為wordpress部落格添加虛拟主機

vim /etc/nginx/vhost/www.tuchao.com.conf

<a href="http://s3.51cto.com/wyfs02/M00/43/78/wKioL1PbL2yBCOslAAElkTl150s689.jpg" target="_blank"></a>

為phpMyAdmin添加虛拟主機。

<a href="http://s3.51cto.com/wyfs02/M02/43/77/wKiom1PbLrqzk0h9AAEQy9rCjYo796.jpg" target="_blank"></a>

然後重新開機nginx服務,通路頁面測試。

www.tuchao.com

<a href="http://s3.51cto.com/wyfs02/M02/43/78/wKioL1PbMSqxG6mUAAFw4N2Olic582.jpg" target="_blank"></a>

www.myadmin.com

<a href="http://s3.51cto.com/wyfs02/M02/43/78/wKiom1PbMCXg27gbAAFwSz6RbA0937.jpg" target="_blank"></a>

另一個節點安裝好相應的應用程式,把配置檔案同步過去。

資料則是通過drbd切換過去,然後把服務都啟動起來測試一下能否正常工作,這裡一定要測試。

這裡我測試都工作正常,部落格和php-MyAdmin都可以正常通路,操作和前面差不多,我就省略了。

資源定義有常用的兩個工具,crmsh和pcs,這裡介紹下pcs簡單用法。

pcs property set stonith-enabled=false

pcs property set no-quorum-policy=ignore

pcs resource create vip ocf:heartbeat:IPaddr params ip=192.168.18.254 cidr_netmask=24

pcs resource create //建立資源

pcs constraint order vip then webstore then httpd  //定義順序限制

pcs resource group add myservice  &lt;res&gt; &lt;res&gt; ... //定義資源組

在定義php-fpm為叢集資源出錯時,解決方法請參考:http://tchuairen.blog.51cto.com/3848118/1534231

接下來進入正題,定義資源,實作兩個節點高可用。

我們需要定義的資源:

vip:192.168.18.254

mydrbd //需要定義為主從,當主節點出現故障後,從節點自動提升為主節點,實作高可用。

webdrbd //同上

為mydrbd定義檔案系統挂載點,為MySQL提供存儲。

為webdrbd定義檔案系統挂載點,為站點程式提供存儲。

mysqld //MySQL服務

nginx  //nginx服務

php-fpm //php-fpm服務

檢視資源代理使用幫助資訊

crm ra meta ocf:linbit:drbd

pcs resource describe ocf:linbit:drbd

由于我們沒有stonith裝置,是以要關閉stonith不然會報錯。

crm configure property stonith-enabled=false

由于我們隻有兩個節點,配置忽略票數。

crm configure property no-quorum-policy=ignore

定義主從drbd參數。

master-max 有多少個可以提升為主節點的。

master-node-max 在單個節點上最多可以運作幾個主資源

clone-max 最多可以運作多少個clone

clone-node-max 單個節點最多可以運作多少個clone

notify 是否啟用通知機制

定義mydrbd資源代理

primitive mydrbd ocf:linbit:drbd \

        params drbd_resource="mydrbd" \

        op monitor role="Master" interval="10" timeout="20" \

        op monitor role="Slave" interval="20" timeout="20" \

        op start timeout="240" interval="0" \

        op stop timeout="100" interval="0"

定義mysqld

primitive mysqld lsb:mysqld \

        op monitor interval="15" timeout="15" \

        op start timeout="30" interval="0" \

        op stop timeout="30" interval="0"

定義drbd0挂載資源,為mysql提供資料存儲。

primitive mystore ocf:heartbeat:Filesystem \

        params device="/dev/drbd0" directory="/mnt/drbd" fstype="ext4" \

        op monitor interval="60" timeout="50" \

        op start timeout="60" interval="0" \

        op stop timeout="60" interval="0"

定義nginx

primitive nginx lsb:nginx \

        op start timeout="15" interval="0" \

        op stop timeout="15" interval="0"

定義php-fpm

primitive php-fpm lsb:php-fpm

定義vip

primitive vip ocf:heartbeat:IPaddr \

        params ip="192.168.18.254" cidr_netmask="24" \

        op monitor interval="10" timeout="20" on-fail="restart" \

        op start timeout="20" interval="0" \

        op stop timeout="20" interval="0"

定義webdrbd資源代理

primitive webdrbd ocf:linbit:drbd \

        params drbd_resource="webdrbd" \

定義webdrbd挂載資源,為網站程式提供資料存儲。

primitive webstore ocf:heartbeat:Filesystem \

        params device="/dev/drbd1" directory="/mnt/http" fstype="ext4" \

定義資源組

group webserver mysqld nginx vip php-fpm

将mydrbd定義為主從類型

ms ms_mydrbd mydrbd \

        meta master-max="1" master-node-max="1" clone-max="2" clone-node-max="1" notify="true"

将webdrbd定義為主從類型

ms ms_webdrbd webdrbd \

排列限制

定義mysql與mystore在同一節點運作

colocation mysqld_with_mystore inf: mystore mysqld

定義mystore與ms_mydrbd的主節點在同一節點運作

colocation mystore_with_ms_mydrbd inf: ms_mydrbd:Master mystore

定義webstore與ms_webdrbd的主節點在同一節點運作

colocation webstore_with_ms_webdrbd inf: webstore ms_webdrbd:Master

定義nginx與webstore在同一節點運作

colocation webstore_with_nginx inf: webstore nginx

順序限制

定義先啟動mystore,再啟動mysqld。

order mysqld_after_mystore inf: mystore mysqld

定義先啟動ms_mydrbd,再啟動mystore。

order mystore_after_ms_mydrbd inf: ms_mydrbd:promote mystore:start

定義先啟動webstore,再啟動nginx。

order nginx_after_webstore inf: webstore nginx

定義先啟動ms_webdrbd,再啟動webstore。

order webstore_after_ms_webdrbd inf: ms_webdrbd:promote webstore:start

以下是crm configure show 整體資訊:

<a href="http://s3.51cto.com/wyfs02/M01/43/CA/wKioL1PcmPfwnibsAAMu0XI4LQc584.gif" target="_blank"></a>

檢視叢集狀态資訊

<a href="http://s3.51cto.com/wyfs02/M01/43/CA/wKioL1Pcmm2QK-eIAARj7Ghm63E395.jpg" target="_blank"></a>

我們去節點一檢測:

<a href="http://s3.51cto.com/wyfs02/M00/43/CA/wKioL1PcnHOTSjBUAAHyCbj1uXk157.jpg" target="_blank"></a>

<a href="http://s3.51cto.com/wyfs02/M00/43/C9/wKiom1Pcm2PgnzOSAAGGMYwiQws027.jpg" target="_blank"></a>

通路部落格站點

<a href="http://s3.51cto.com/wyfs02/M02/43/C9/wKiom1PcnCTQabsrAAHPLjcMZXE460.jpg" target="_blank"></a>

php-MyAdmin可以正常登入

<a href="http://s3.51cto.com/wyfs02/M01/43/CA/wKioL1PcnWCAE8uIAAKtdoq9Jjc533.jpg" target="_blank"></a>

這時我們把節點一關機,然後檢視狀态。

<a href="http://s3.51cto.com/wyfs02/M00/43/CA/wKioL1Pcn9zAZ1w4AARcgsy939w122.jpg" target="_blank"></a>

服務通路也正常。

實驗到這裡就完成了,我這裡漏了一點,在定義資源監控的時候沒有在後面加on-fail="restart" 這個可以實作,資源在運作過程中停止了,資料總管會自動把資源重新開機的。

有更好的建議歡迎與我交流QQ:1183710107

本文轉自qw87112 51CTO部落格,原文連結:http://blog.51cto.com/tchuairen/1534215

繼續閱讀