Linux HA集羣之DRBD詳解

大綱:

   一、DRBD 是什麼

   二、DRBD 主要功能

   三、DRBD 工作原理

   四、DRBD 複製模式

   五、DRBD 配置工具

   六、DRBD 配置文件

   七、DRBD 資源

   八、DRBD 支持的底層設備

   九、DRBD 配置步驟

   十、安裝與配置 DRBD 詳解
   十一、DRBD+MariaDB+Corosync+Pacekmaer HA安裝配置詳解

一、DRBD 是什麼

    簡單的說,DRBD (Distributed Replicated Block Device,分佈式複製塊設備)是由內核模塊和相關腳本而構成,用以構建高可用性的集羣。其實現方式是通過網絡來鏡像整個設備。可以把它看作是一種網絡RAID1。


二、DRBD 主要功能

wKiom1NVIF3iTjc6AAF1PGQOynA390.jpg

圖   DRBD在Linux的I/O堆棧中的位置


分佈式複製塊設備(DRBD技術)是一種基於軟件的,無共享,複製的存儲解決方案,在服務器之間的對塊設備(硬盤,分區,邏輯卷等)進行鏡像。


DRBD鏡像數據

實時性:當應用對磁盤的數據進行修改時,複製立即發生。

透明性:應用程序的數據存儲在鏡像設備上是獨立和透明的,數據可存儲在不同的服務器上。

同步鏡像和異步鏡像:同步鏡像,當本地發申請進行寫操作進行時,同步寫到兩臺服務器上。異步鏡像,當本地寫申請已經完成對本地的寫操作時,開始對對應的服務器進行寫操作。


三、DRBD 工作原理

  每個設備(drbd 提供了不止一個設備)都有一個狀態,可能是‘主’狀態或‘從’狀態。在主節點上,應用程序應能運行和訪問drbd設備(/dev/drbd*)。每次寫入都會發往本地磁盤設備和從節點設備中。從節點只能簡單地把數據寫入它的磁盤設備上。 讀取數據通常在本地進行。 如果主節點發生故障,心跳(heartbeat或corosync)將會把從節點轉換到主狀態,並啓動其上的應用程序。(如果您將它和無日誌FS 一起使用,則需要運行fsck)。如果發生故障的節點恢復工作,它就會成爲新的從節點,而且必須使自己的內容與主節點的內容保持同步。當然,這些操作不會干擾到後臺的服務。



四、DRBD 複製模式

◆ 協議A:一旦本地磁盤寫入已經完成,數據包已在發送隊列中,則寫被認爲是完成的 。在一個節點發生故障時,可能發生數據丟失,因爲被寫入到遠程節點上的數據可能仍在發送隊列。儘管,在故障轉移節點上的數據是一致的,但沒有及時更新。這通常是用於地理上分開的節點。

◆  協議B:一旦本地磁盤寫入已完成且複製數據包達到了對等節點則認爲寫在主節點上被認爲是完成的。數據丟失可能發生在參加的兩個節點同時故障的情況下,因爲在飛行中的數據可能不會被提交到磁盤。

◆ 協議C:只有在本地和遠程節點的磁盤已經確認了寫操作完成,寫才被認爲完成。沒有任何數據丟失,所以這是一個羣集節點的流行模式,但I/O吞吐量依賴於網絡帶寬。

簡言之:

A 數據一旦寫入磁盤併發送到網絡中就認爲完成了寫入操作。

B 收到接收確認就認爲完成了寫入操作。

C 收到寫入確認就認爲完成了寫入操作。

就目前而言應用最多和應用最廣泛的爲協議C。


五、DRBD 配置工具


◆ drbdadm:高層的DRBD程序管理套件工具。它從配置文件/etc/drbd.conf中獲取所有配置參數。drbdadm爲drbdsetup和drbdeta兩個命令充當程序的前端應用,執行drbdadm實際是執行的drbdsetup和drbdeta兩個命令。

◆  drbdsetup:drbdsetup可以讓用戶配置已經加載在內核中運行的DRBD模塊,它是底層的DRBD程序管理套件工具。使用該命令時,所有的配置參數都需要直接在命令行中定義,雖然命令和靈活,但是大大的降低了命令的簡單易用性,因此很多的用戶很少使用debdsetup。

◆ drbdmeta:drbdmeta允許用戶創建、轉儲、還原和修改drbd的原數據結構。這個命令也是用戶極少用到。


六、DRBD 配置文件

   DRBD的主配置文件爲/etc/drbd.conf;爲了管理的便捷性,目前通常會將些配置文件分成多個部分,且都保存至/etc/drbd.d目錄中,主配置文件中僅使用"include"指令將這些配置文件片斷整合起來。通常,/etc/drbd.d目錄中的配置文件爲global_common.conf和所有以.res結尾的文件。其中global_common.conf中主要定義global段和common段,而每一個.res的文件用於定義一個資源。

   在配置文件中,global段僅能出現一次,且如果所有的配置信息都保存至同一個配置文件中而不分開爲多個文件的話,global段必須位於配置文件的最開始處。目前global段中可以定義的參數僅有minor-count, dialog-refresh, disable-ip-verification和usage-count。

  common段則用於定義被每一個資源默認繼承的參數,可以在資源定義中使用的參數都可以在common段中定義。實際應用中,common段並非必須,但建議將多個資源共享的參數定義爲common段中的參數以降低配置文件的複雜度。

  resource段則用於定義drbd資源,每個資源通常定義在一個單獨的位於/etc/drbd.d目錄中的以.res結尾的文件中。資源在定義時必須爲其命名,名字可以由非空白的ASCII字符組成。每一個資源段的定義中至少要包含兩個host子段,以定義此資源關聯至的節點,其它參數均可以從common段或drbd的默認中進行繼承而無須定義。


七、DRBD 資源

Resource name:可以是除了空白字符的任意的ACSII碼字符

DRBD device:在雙方節點上,此DRBD設備的設備文件;一般爲/dev/drbdN,其主設備號147

Disk configuration:在雙方節點上,各自提供的存儲設備

Nerwork configuration:雙方數據同步時所使用的網絡屬性


resource mystore {              →#資源名爲"mystore"

   on node1.magelinux.com {    →#設置節點cluster1  

   device    /dev/drbd0;       →#指出drbd的標示名

   disk      /dev/sda5;       →#指出作爲drbd的設備

   address   172.16.41.1:7789; →#指定ip和端口號

   meta-disk internal;         →#網絡通信屬性,指定drbd的元數據在本機

  }  

   on node2.magelinux.com {  

   device    /dev/drbd0;  

   disk      /dev/sda5;  

   address   172.16.41.2:7789;  

   meta-disk internal;  

   }  

}


八、DRBD 支持的底層設備

 DRBD需要構建在底層設備之上,然後構建出一個塊設備出來。對於用戶來說,一個DRBD設備,就像是一塊物理的磁盤,可以在商脈內創建文件系統。DRBD所支持的底層設備有以下這些類:

◆ 一個磁盤,或者是磁盤的某一個分區。

◆ 一個soft raid 設備。

◆ 一個LVM的邏輯卷。

◆ 一個EVMS(Enterprise Volume Management System,企業卷管理系統)的卷。

◆ 其他任何的塊設備。


九、DRBD 配置步驟

◆ 安裝drbd

◆ 配置資源文件(定義資料名稱,磁盤,節點信息,同步限制等)

◆ 將drbd加入到系統服務chkconfig --add drbd  

◆ 初始化資源組drbdadm create-md resource_name

◆ 啓動服務 service drbd start

◆ 設置primary主機,並同步數據

◆ 在作爲主的節點上面分區、格式化/dev/drbd*

◆ 一個節點進行掛載


十、安裝與配置DRBD詳解

1.實驗拓撲

wKioL1NVJJ7DmB32AACz4_IQjBc011.jpg

2.實驗環境

(1).操作系統

CentOS 6.4 X86_64

(2).軟件環境

◆ drbd-8.4.3-33.el6.x86_64.rpm

◆ drbd-kmdl-2.6.32-431.el6-8.4.3-33.el6.x86_64.rpm


3.安裝DRBD

    說明:drbd共有兩部分組成:內核模塊和用戶空間的管理工具。其中drbd內核模塊代碼已經整合進Linux內核2.6.33以後的版本中,因此,如果您的內核版本高於此版本的話,你只需要安裝管理工具即可;否則,您需要同時安裝內核模塊和管理工具兩個軟件包,並且此兩者的版本號一定要保持對應。CentOS 6.5的內核版本是22.6.32-431.el6.x86_64,所以還提安裝內核模塊。

node1:

[root@node1 ~]# yum -y install drbd-8.4.3-33.el6.x86_64.rpm drbd-kmdl-2.6.32-431.el6-8.4.3-33.el6.x86_64.rpm

node2:

[root@node2 ~]# yum -y install drbd-8.4.3-33.el6.x86_64.rpm drbd-kmdl-2.6.32-431.el6-8.4.3-33.el6.x86_64.rpm


4.配置DRBD

(1).查看一下配置文件

[root@node1 ~]# ll /etc/drbd.conf  /etc/drbd.d/

-rw-r--r-- 1 root root  133 May 14  2013 /etc/drbd.conf //主配置文件文件


/etc/drbd.d/:  //其他模塊存放路徑

total 4

-rw-r--r-- 1 root root 1836 May 14  2013 global_common.conf

[root@node1 ~]#


[root@node1 ~]# vim /etc/drbd.conf //查看主配置文件

# You can find an example in  /usr/share/doc/drbd.../drbd.conf.example

include "drbd.d/global_common.conf";

include "drbd.d/*.res";   //告訴我們這些文件被包含在/etc/drbd.d目錄下


//查看主配置文件

[root@node1 ~]# cat /etc/drbd.conf


global {

       usage-count yes;

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

}


common {

       handlers {

               # These are EXAMPLE handlers only.

               # They may have severe implications,

               # like hard resetting the node under certain circumstances.

               # Be careful when chosing your poison.


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

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

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

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

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

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

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

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

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

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

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

               # 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 degr-wfc-timeout outdated-wfc-timeout wait-after-sb

       }


       options {

               # cpu-mask on-no-data-accessible

       }


       disk {

               # size max-bio-bvecs on-io-error fencing disk-barrier disk-flushes

               # disk-drain md-flushes resync-rate resync-after al-extents

               # c-plan-ahead c-delay-target c-fill-target c-max-rate

               # c-min-rate disk-timeout

       }


       net {

               # protocol timeout max-epoch-size max-buffers unplug-watermark

               # connect-int ping-int sndbuf-size rcvbuf-size ko-count

               # allow-two-primaries cram-hmac-alg shared-secret after-sb-0pri

               # after-sb-1pri after-sb-2pri always-asbp rr-conflict

               # ping-timeout data-integrity-alg tcp-cork on-congestion

               # congestion-fill congestion-extents csums-alg verify-alg

               # use-rle

       }

}



(2).修改全局配置文件  

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";

       }


       startup {

               #wfc-timeout 120;

               #degr-wfc-timeout 120;

       }


       disk {

               on-io-error detach;

               #fencing resource-only;

       }


       net {

               cram-hmac-alg "sha1";

               shared-secret "guomaoqiu150019";

       }


       syncer {

               rate 1000M;

       }

}



(3).增加資源

[root@node1 drbd.d]# vim mystore.res  

resource mystore {

       on node1.magelinux.com {

       device    /dev/drbd0;

       disk      /dev/sda3;

       address   172.16.41.1:7789;  

       meta-disk internal;

       }

       on node2.magelinux.com {

       device    /dev/drbd0;

       disk      /dev/sda3;

       address   172.16.41.2:7789;  

       meta-disk internal;

       }

}


(4).將配置文件同步到node2

[root@node1 drbd.d]# scp global_common.conf mystore.res node2.magelinux.com:/etc/drbd.d/

global_common.conf                  100% 1400     1.4KB/s   00:00    

mystore.res                         100%  291     0.3KB/s   00:00  


(5).在node1與node2上初始化初始化資源

node1

[root@node1 ~]# drbdadm create-md mystore

Writing meta data...

initializing activity log

NOT initializing bitmap

lk_bdev_save(/var/lib/drbd/drbd-minor-0.lkbd) failed: No such file or directory

New drbd meta data block successfully created.

lk_bdev_save(/var/lib/drbd/drbd-minor-0.lkbd) failed: No such file or directory

You have new mail in /var/spool/mail/root


node2

[root@node2 ~]# drbdadm create-md mystore

Writing meta data...
initializing activity log
NOT initializing bitmap
lk_bdev_save(/var/lib/drbd/drbd-minor-0.lkbd) failed: No such file or directory
New drbd meta data block successfully created.
lk_bdev_save(/var/lib/drbd/drbd-minor-0.lkbd) failed: No such file or directory
[root@node2 ~]#


(6).node1與node2上啓動DRBD服務

node1

[root@node1 drbd.d]# service drbd start

Starting DRBD resources: [

    create res: mystore

  prepare disk: mystore

   adjust disk: mystore

    adjust net: mystore

]

.

node2

[root@node2 ~]# service drbd start

Starting DRBD resources: [

    create res: mystore

  prepare disk: mystore

   adjust disk: mystore

    adjust net: mystore

]

.

\\或者用命令drbdadm命令查看

node1


[root@node1 drbd.d]# drbd-overview  

 0:mystore/0  Connected Secondary/Secondary Inconsistent/Inconsistent C r-----

node2

[root@node2 ~]# drbd-overview  

 0:mystore/0  Connected Secondary/Secondary Inconsistent/Inconsistent C r-----

[root@node2 ~]#


(7).查看一下啓動狀態

node1

[root@node1 drbd.d]# cat /proc/drbd

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

GIT-hash: 89a294209144b68adb3ee85a73221f964d3ee515 build by gardner@, 2013-11-29 12:28:00

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

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


node2

[root@node2 ~]# cat /proc/drbd

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

GIT-hash: 89a294209144b68adb3ee85a73221f964d3ee515 build by gardner@, 2013-11-29 12:28:00

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

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

[root@node2 ~]#

   從上面的信息中可以看出此時兩個節點均處於Secondary狀態。於是,接下來需要將其中一個節點設置爲Primary。在要設置爲Primary的節點上執行如下命令:

[root@node1 drbd.d]# drbdadm primary --force RESOURCE

也可以在要設置爲Primary的節點上使用如下命令來設置主節點:

[root@node1 drbd.d]# drbdadm -- --overwrite-data-of-peer primary RESOURCE


(8).將node1設置爲主節點

[root@node1 drbd.d]# drbdadm primary --force mystore  //提升當前節點爲主primary

[root@node1 ~]# watch -n1 'cat /proc/drbd' //通過該命令監視同步狀態
Every 1.0s: cat /proc/drbd                                                        Tue Apr 22 19:46:34 2014

version: 8.4.3 (api:1/proto:86-101)
GIT-hash: 89a294209144b68adb3ee85a73221f964d3ee515 build by gardner@, 2013-11-29 12:28:00
0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r---n-
   ns:2788500 nr:0 dw:0 dr:2797216 al:0 bm:170 lo:0 pe:3 ua:8 ap:0 ep:1 wo:f oos:370332
       [================>...] sync'ed: 88.4% (370332/3156636)K
       finish: 0:00:03 speed: 96,560 (96,076) K/sec


[root@node1 drbd.d]# drbd-overview  

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

[root@node2 ~]# drbd-overview  

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

[root@node2 ~]#

//在兩個節點各自看到的效果是不一樣的...


(9).格式化並掛載

   文件系統的掛載只能在Primary節點進行,因此,也只有在設置了主節點後才能對drbd設備進行格式化

[root@node1 ~]# mkfs -t ext4 /dev/drbd0

mke2fs 1.41.12 (17-May-2010)

Filesystem label=

OS type: Linux

Block size=4096 (log=2)

Fragment size=4096 (log=2)

Stride=0 blocks, Stripe width=0 blocks

66240 inodes, 264804 blocks

13240 blocks (5.00%) reserved for the super user

First data block=0

Maximum filesystem blocks=272629760

9 block groups

32768 blocks per group, 32768 fragments per group

7360 inodes per group

Superblock backups stored on blocks:

32768, 98304, 163840, 229376


Writing inode tables: done                            

Creating journal (8192 blocks): done

Writing superblocks and filesystem accounting information: done


This filesystem will be automatically checked every 29 mounts or

180 days, whichever comes first.  Use tune2fs -c or -i to override.

[root@node1 ~]#



[root@node1 ~]# mkdir /mydata

[root@node1 ~]# mount /dev/drbd0 /mydata/

[root@node1 ~]# ls /mydata/

lost+found

[root@node1 ~]# mount | grep drbd

/dev/drbd0 on /mydata type ext4 (rw)

[root@node1 ~]# cp /etc/issue /mydata/

[root@node1 ~]# ls /mydata/

issue  lost+found

[root@node1 ~]#


(10)切換Primary和Secondary節點

   對主Primary/Secondary模型的drbd服務來講,在某個時刻只能有一個節點爲Primary,因此,要切換兩個節點的角色,只能在先將原有的Primary節點設置爲Secondary後,才能原來的Secondary節點設置爲Primary:

node1:

[root@node1 ~]# umount /mydata/

[root@node1 ~]# drbdadm secondary mystore

[root@node1 ~]# drbd-overview

 0:mystore/0  Connected Secondary/Secondary UpToDate/UpToDate C r-----

[root@node1 ~]#


node2:

[root@node2 ~]# drbdadm primary mystore


//查看狀態node2

[root@node2 ~]# drbd-overview  

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

[root@node2 ~]# mkdir /mydata

[root@node2 ~]# mount /dev/drbd0 /mydata


//查看之前在主節點上覆制至此設備的文件是否存在

[root@node2 ~]# mount /dev/drbd0 /mydata/

[root@node2 ~]# ls /mydata/

issue  lost+found

[root@node2 ~]#


//ok,完全沒有問題,下面我們來個配置示例


   注意:以上配置過程中分別在node1和node2上面創建的掛載目錄可以保持不一致,但是如果與Pacemaker結合工作那兩節點就必須保持一致性了,因爲在其定義資源時是要指定掛載點!


十一、DRBD+MariaDB+Corosync+Pacekmaer HAA安裝配置詳解

1.安裝MariaDB
按照上面的步驟繼續:
(1)啓動DRBD,將DRBD 在node1節點上提升爲Primary

node1

[root@node1 ~]# service drbd start;ssh node2 "service drbd start"

[root@node1 ~]# drbdadm primary --force mystore

[root@node1 ~]# drbd-overview

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

[root@node1 ~]#


node2

[root@node2 ~]# drbd-overview
 0:mystore/0  Connected Secondary/Primary UpToDate/UpToDate C r-----
[root@node2 ~]#

(2)在Primary所在節點node1,掛載drbd設備到/mydata目錄

node1

[root@node1 ~]# mount /dev/drbd0 /mydata/

[root@node1 ~]# ls /mydata/
issue  lost+found
[root@node1 ~]#

(3)node1/node2解壓安裝MariDB<這裏使用二進制包>

node1

[root@node1 ~]# groupadd -r mysql
[root@node1 ~]# groupdel mysql
[root@node1 ~]# groupadd -r -g 306 mysql
[root@node1 ~]# useradd -r -u 306 -g mysql mysql
[root@node1 ~]# id mysql
uid=306(mysql) gid=306(mysql) groups=306(mysql)
[root@node1 ~]# tar -xf mariadb-10.0.10-linux-x86_64.tar.gz -C /usr/local/
[root@node1 ~]# cd /usr/local/

[root@node1 local]# ln -sv mariadb-10.0.10-linux-x86_64 mysql
`mysql' -> `mariadb-10.0.10-linux-x86_64'

[root@node1 local]# cd mysql/



[root@node1 mysql]# chown -R  root:mysql .*


[root@node1 mysql]# cp support-files/my-large.cnf /etc/my.cnf

cp: overwrite `/etc/my.cnf'?y

[root@node1 mysql]# cp support-files/mysql.server /etc/rc.d/init.d/mysqld
[root@node1 mysql]# chmod +x /etc/rc.d/init.d/mysqld

[root@node1 mysql]# echo "export PATH=$PATH:/usr/local/mysql/bin" > /etc/profile.d/mysql.sh

[root@node1 mysql]# source /etc/profile.d/mysql.sh

[root@node1 mysql]# vim /etc/my.cnf


datadir = /mydata/data//添加數據目錄
innodb_file_per_table = on  
//獨立表空間

log-bin=/mydata/binlogs/mysql-bin //二進制日誌存放目錄

[root@node1 mysql]# mkdir /mydata/binlogs
[root@node1 mysql]# mkdir /mydata/data
[root@node1 mysql]# chown mysql:mysql -R /mydata/*
[root@node1 mysql]# scripts/mysql_install_db --user=mysql --datadir=/mydata/data/ --basedir=/usr/local/mysql  //初始化MariaDB
[root@node1 data]# service mysqld start
Starting MySQL.                                            [  OK ]
[root@node1 data]# mysql
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 4
Server version: 10.0.10-MariaDB-log MariaDB Server

Copyright (c) 2000, 2014, Oracle, SkySQL Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>  //ok!已經成功登錄了.



[root@node1 data]# scp -p /etc/my.cnf node2:/etc/my.cnf
my.cnf                                     100% 4966     4.9KB/s   00:00  

[root@node1 data]# scp -p /etc/profile.d/mysql.sh node2:/etc/profile.d/mysql.sh

mysql.sh                                   100%  126     0.1KB/s   00:00  

[root@node1 data]# scp -p /etc/rc.d/init.d/mysqld node2:/etc/rc.d/init.d/
mysqld                                     100%   11KB  11.4KB/s   00:00  
[root@node1 ~]# scp mariadb-10.0.10-linux-x86_64.tar.gz node2:/root/
mariadb-10.0.10-linux-x86_64.tar.gz                                                                              100%  282MB  31.4MB/s   00:09    

[root@node1 ~]#



//在node2上面安裝MariaDB.(只需要將安裝包展開並創建用戶即可,無需初始化)

node2

[root@node2 ~]# groupadd -r -g 306 mysql
[root@node2 ~]# useradd -r -u 306 -g mysql mysql
[root@node2 ~]# tar -xf mariadb-10.0.10-linux-x86_64.tar.gz -C /usr/local/
[root@node2 ~]# cd /usr/local/
[root@node2 local]# ln -sv mariadb-10.0.10-linux-x86_64 mysql
`mysql' -> `mariadb-10.0.10-linux-x86_64'

[root@node2 local]#


//切換一下drbd的角色

node1

[root@node1 ~]# service mysqld stop
Shutting down MySQL..                                      [  OK  ]

[root@node1 ~]# umount /mydata/

[root@node1 ~]# drbdadm secondary mystore




node2

[root@node2 mysql]# drbdadm primary mystore  //將node2節點上的drbd提升爲primary
You have new mail in /var/spool/mail/root
[root@node2 mysql]# drbd-overview
 0:mystore/0  Connected Primary/Secondary UpToDate/UpToDate C r-----
[root@node2 mysql]# mount /dev/drbd0 /mydata/
[root@node2 ~]# ls /mydata/
binlogs  data  lost+found    
[root@node2 ~]#


[root@node2 ~]# service mysqld start
Starting MySQL.                                            [  OK ]
[root@node2 ~]# /usr/local/mysql/bin/mysql
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 4
Server version: 10.0.10-MariaDB-log MariaDB Server

Copyright (c) 2000, 2014, Oracle, SkySQL Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>


//從以上配置過程我們瞭解了DRBD與MariaDB結合的工作模式,同時也發現了在DRBD自身不能夠進行角色切換時只能依賴於人工手動進行;下面的示例將DRBD與Pacemaker結合實現DRBD的角色自動切換



(4)關閉mysql服務、drbd服務,並禁止開機自啓動;爲後續的HA配置做好準備

node1

[root@node1 ~]# service mysqld stop

Shutting down MySQL..                                      [  OK  ]
[root@node1 ~]# chkconfig mysqld off
[root@node1 ~]# service drbd stop
Stopping all DRBD resources: .
[root@node1 ~]# chkconfig drbd off
[root@node1 ~]#


node2

[root@node2 bin]# service mysqld stop

Shutting down MySQL..                                      [  OK  ]
You have new mail in /var/spool/mail/root
[root@node2 bin]# chkconfig mysqld off
[root@node2 bin]# service drbd stop
Stopping all DRBD resources:
.
[root@node2 bin]# chkconfig drbd off
[root@node2 bin]#




2.安裝Corosync,Pacemaker

(1).操作系統

   CentOS 6.5 X86_64

(2).軟件環境

   下面兩個包系統盤已自帶

◆ corosync-1.4.1-17.el6.x86_64

◆ pacemaker-1.1.10-14.el6.x86_64

   下面兩個包需要自己下載

◆ crmsh-1.2.6-4.el6.x86_64

◆ pssh-2.3.1-2.el6.x86_64

前提:配置好yum源

node1

[root@node1 ~]# yum install -y corosync pacemaker crmsh-1.2.6-4.el6.x86_64.rpm pssh-2.3.1-2.el6.x86_64.rpm


node2

[root@node1 ~]# yum install -y corosync pacemaker crmsh-1.2.6-4.el6.x86_64.rpm pssh-2.3.1-2.el6.x86_64.rpm


(3)查看修改Corosync配置文件:

[root@node1 ~]# cd /etc/corosync/

[root@node1 corosync]# cp corosync.conf.example corosync.conf

[root@node1 corosync]# vim corosync.conf


compatibility: whitetank


totem {

       version: 2

       secauth: on

       threads: 0

       interface {

               ringnumber: 0

               bindnetaddr: 172.16.41.100

               mcastaddr: 226.41.41.41

               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 {

      name:   pacemaker

      ver:    0

}


aisexec {

      user: root

      group: root


}


(4)生成密鑰文件:

   注:corosync生成key文件會默認調用/dev/random隨機數設備,一旦系統中斷的IRQS的隨機數不夠用,將會產生大量的等待時間,因此,這裏實驗爲了節約時間,我們在生成key之前講random替換成urandom,以便節約時間;如果是在實際生產環境中還是老老實實敲吧!

[root@node1 corosync]# mv /dev/{random,random.bak}

[root@node1 corosync]# ln -s /dev/urandom /dev/random

[root@node1 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@node1 corosync]# rm -rf /dev/random

You have new mail in /var/spool/mail/root

[root@node1 corosync]# mv /dev/{random.bak,random}


//查看是否生成

[root@node1 corosync]# ls

authkey  corosync.conf  corosync.conf.example  corosync.conf.example.udpu  service.d  uidgid.d

[root@node1 corosync]#



(5)將key文件authkey與配置文件corosync.conf複製到node2上

[root@node1 corosync]# scp authkey corosync.conf node2:/etc/corosync/

authkey                                 100%  128     0.1KB/s   00:00  

corosync.conf                           100%  556     0.5KB/s   00:00

[root@node1 corosync]#


(6)啓動corosync

node1

[root@node1 corosync]# service corosync start

Starting Corosync Cluster Engine (corosync):               [ OK ]


node2

[root@node2 corosync]# service corosync start

Starting Corosync Cluster Engine (corosync):               [ OK ]


(7)查看羣集狀態

node1

[root@node1 ~]# crm status

Last updated: Mon Apr 21 23:30:38 2014

Last change: Mon Apr 21 23:26:46 2014 via crmd on node1.magelinux.com

Stack: classic openais (with plugin)

Current DC: node1.magelinux.com - partition with quorum

Version: 1.1.10-14.el6-368c726

2 Nodes configured, 2 expected votes

0 Resources configured



Online: [ node1.magelinux.com node2.magelinux.com ]

[root@node1 ~]#


node2

[root@node2 ~]# crm status

Last updated: Thu Apr 17 22:00:13 2014

Last change: Mon Apr 21 23:26:46 2014 via crmd on node1.magelinux.com

Stack: classic openais (with plugin)

Current DC: node1.magelinux.com - partition with quorum

Version: 1.1.10-14.el6-368c726

2 Nodes configured, 2 expected votes

0 Resources configured


Online: [ node1.magelinux.com node2.magelinux.com ]

[root@node2 ~]#


大家可以看到,Corosync+Pacemaker運行正常,node1與node2都在線,DC是node1節點。但是還沒有配置資源;不慌,下面我們繼續...


3.配置當前集羣的配置信息,確保已經配置全局屬性參數爲兩節點集羣所適用:

[root@node1 ~]# crm

crm(live)# configure

crm(live)configure# property no-quorum-policy=ignore

crm(live)configure# property stonith-enabled=false

crm(live)configure# rsc_defaults resource-stickiness=100 //定義黏性爲100

crm(live)configure# verify

crm(live)configure# show

node node1.magelinux.com

node node2.magelinux.com

property $id="cib-bootstrap-options" \

dc-version="1.1.10-14.el6-368c726" \

cluster-infrastructure="classic openais (with plugin)" \

expected-quorum-votes="2" \

no-quorum-policy="ignore" \

stonith-enabled="false"


rsc_defaults $id="rsc-options" \

resource-stickiness="100"

crm(live)configure# commit

crm(live)configure#


//在如上輸出的信息中,請確保有stonith-enabled和no-quorum-policy出現且其值與如上輸出信息中相同



3.將已經配置好的drbd設備/dev/drbd0定義爲集羣服務

(1)按照集羣服務的要求,首先確保兩個節點上的drbd服務已經停止,且不會隨系統啓動而自動啓動(前面我已經停止過了)

(2)配置drbd爲集羣資源:

提供drbd的RA目前由OCF歸類爲linbit,其路徑爲/usr/lib/ocf/resource.d/linbit/drbd。我們可以使用如下命令來查看此RA及RA的meta信息:

[root@node1 ~]# crm

crm(live)# ra

crm(live)ra# classes  //查看有那些資源代理類型

lsb

ocf / heartbeat linbit pacemaker

service

stonith

crm(live)ra# list ocf linbit  //查看linbit所提過的資源代理

drbd      

crm(live)ra# meta ocf:linbit:drbd //查看此資源代理的詳細信息


Manages a DRBD device as a Master/Slave resource (ocf:linbit:drbd)


This resource agent manages a DRBD resource as a master/slave resource.

DRBD is a shared-nothing replicated storage device.

Note that you should configure resource level fencing in DRBD,

this cannot be done from this resource agent.

See the DRBD User's Guide for more information.

http://www.drbd.org/docs/applications/


Parameters (* denotes required, [] the default):


drbd_resource* (string): drbd resource name

   The name of the drbd resource from the drbd.conf file.


drbdconf (string, [/etc/drbd.conf]): Path to drbd.conf

   Full path to the drbd.conf file.


stop_outdates_secondary (boolean, [false]): outdate a secondary on stop

   Recommended setting: until pacemaker is fixed, leave at default (disabled).


   Note that this feature depends on the passed in information in

   OCF_RESKEY_CRM_meta_notify_master_uname to be correct, which unfortunately is

   not reliable for pacemaker versions up to at least 1.0.10 / 1.1.4.


   If a Secondary is stopped (unconfigured), it may be marked as outdated in the

   drbd meta data, if we know there is still a Primary running in the cluster.

   Note that this does not affect fencing policies set in drbd config,

   but is an additional safety feature of this resource agent only.

   You can enable this behaviour by setting the parameter to true.


   If this feature seems to not do what you expect, make sure you have defined

   fencing policies in the drbd configuration as well.


Operations' defaults (advisory minimum):


   start         timeout=240

   promote       timeout=90

   demote        timeout=90

   notify        timeout=90

   stop          timeout=100

   monitor_Slave timeout=20 interval=20

   monitor_Master timeout=20 interval=10


   drbd需要同時運行在兩個節點上,但只能有一個節點(primary/secondary模型)是Master,而另一個節點爲Slave;因此,它是一種比較特殊的集羣資源,其資源類型爲多態(Multi-state)clone類型,即主機節點有Master和Slave之分,且要求服務剛啓動時兩個節點都處於slave狀態。

[root@node1 ~]# crm

crm(live)#configure

crm(live)configure# primitive drbd_mysql ocf:linbit:drbd params drbd_resource="mystore" op monitor interval="29s" role=Master op monitor interval="31s" role="Slave" op start timeout=240s op stop timeout=100s

crm(live)configure# ms ms_drbd_mysql drbd_mysql meta master-max="1" master-node-max="1" clone-max="1" clone-node-max="1" notify="true"

crm(live)configure# verify

crm(live)configure# commit


//查看當前集羣狀態:


crm(live)configure# cd ..

crm(live)# status

Last updated: Wed Apr 23 02:10:17 2014

Last change: Wed Apr 23 02:05:05 2014 via cibadmin on node1.magelinux.com

Stack: classic openais (with plugin)

Current DC: node2.magelinux.com - partition with quorum

Version: 1.1.10-14.el6-368c726

2 Nodes configured, 2 expected votes

1 Resources configured



Online: [ node1.magelinux.com node2.magelinux.com ]


Master/Slave Set: ms_drbd_mysql [drbd_mysql]

Masters: [ node1.magelinux.com ]

Slaves: [ node2.magelinux.com ]


//ok!此時Master運行在node1上,Slave運行在node2上.配置drdb主從資源搞定!

crm(live)#



(3)模擬測試drbd主從資源是否能夠自動切換

crm(live)# node

crm(live)node# standby node1.magelinux.com

crm(live)node# cd ..

crm(live)# status

Last updated: Wed Apr 23 02:28:47 2014

Last change: Wed Apr 23 02:27:53 2014 via crm_attribute on node1.magelinux.com

Stack: classic openais (with plugin)

Current DC: node1.magelinux.com - partition with quorum

Version: 1.1.10-14.el6-368c726

2 Nodes configured, 2 expected votes

2 Resources configured



Node node1.magelinux.com: standby

Online: [ node2.magelinux.com ]


Master/Slave Set: ms_drbd_mysql [drbd_mysql]

Masters: [ node2.magelinux.com ]//此時node2節點爲Master

Stopped: [ node1.magelinux.com ]//此時node1節點爲離線停止狀態

crm(live)#


//讓node1從新上線

crm(live)# node

crm(live)node# online node1.magelinux.com

crm(live)node# cd ..

crm(live)# status

Last updated: Wed Apr 23 02:39:07 2014

Last change: Wed Apr 23 02:39:02 2014 via crm_attribute on node1.magelinux.com

Stack: classic openais (with plugin)

Current DC: node1.magelinux.com - partition with quorum

Version: 1.1.10-14.el6-368c726

2 Nodes configured, 2 expected votes

2 Resources configured



Online: [ node1.magelinux.com node2.magelinux.com ]


Master/Slave Set: ms_drbd_mysql [drbd_mysql]


Masters: [ node2.magelinux.com ] //此時node2節點爲Master

Slaves: [ node1.magelinux.com ]//此時node1上線後爲Slave

crm(live)#


//故,經驗證,drdb主從服務自動切換已初步完成!


(4)爲Primary節點上的mysql資源創建自動掛載的集羣服務

drbd_mysql的Master節點即爲drbd服務mysql資源的Primary節點,此節點的設備/dev/drbd0可以掛載使用,且在mysql集羣服務的應用當中也需要能夠實現自動掛載。

上面我們已經定義好了drbd的主從資源,下面是定義其他關於mysql的必要資源:

//文件系統

crm(live)# configure
crm(live)configure# primitive fs_mysql ocf:heartbeat:Filesystem params device="/dev/drbd0" directory="/mydata" fstype="ext4" op start timeout=60s op stop timeout=60s


//VIP資源

crm(live)configure# primitive myip ocf:heartbeat:IPaddr params ip="172.16.41.100"


//mysql服務

crm(live)configure# primitive mysqldserver lsb:mysqld  

crm(live)configure# verify


//ok,目前所有的資源都已經配置好,下面還需要對每個資源的位置、啓動(關閉)順序做一下調整

crm(live)configure# colocation fs_mysql_with_drbd_mysql inf: fs_mysql ms_drbd_mysql:Master //讓文件系統fs_mysql與ms_drdb_mysql的主節點在一起



crm(live)configure# order fs_mysql_after_ms_drbd_mysql  inf: ms_drbd_mysql:promote fs_mysql:start   //讓ms_drdb_mysql先於fs_mysql啓動



crm(live)configure# colocation myip_with_ms_drbd_mysql inf: myip ms_drbd_mysql:Master  //讓VIP與ms_drbd_mysql的主節點在一起




crm(live)configure# order fs_mysq_after_myip inf: myip fs_mysql:start//讓fs_mysql晚於VIP啓動


crm(live)configure# colocation mysqldserver_with_fs_mysql  inf: mysqldserver fs_mysql //讓mysql服務於fs_mysql在一起


crm(live)configure# order mysqldserver_after_fs_mysql  inf: fs_mysql mysqldserver:start  //讓mysql服務優先於fs_mysql啓動


最後要檢測一下,並提交。

crm(live)configure# verify
crm(live)configure# show
crm(live)configure# commit


//下面看一下集羣狀態

crm(live)configure# cd ..
crm(live)# status
Last updated: Wed Apr 23 12:32:46 2014
Last change: Wed Apr 23 12:30:15 2014 via cibadmin on node1.magelinux.com
Stack: classic openais (with plugin)
Current DC: node1.magelinux.com - partition with quorum
Version: 1.1.10-14.el6-368c726
2 Nodes configured, 2 expected votes
5 Resources configured


Online: [ node1.magelinux.com node2.magelinux.com ]

Master/Slave Set: ms_drbd_mysql [drbd_mysql]
    Masters: [ node1.magelinux.com ]
    Slaves: [ node2.magelinux.com ]
fs_mysql     (ocf::heartbeat:Filesystem):     Started node1.magelinux.com
myip     (ocf::heartbeat:IPaddr):     Started node1.magelinux.com
mysqldserver     (lsb:mysqld):     Started node1.magelinux.com
crm(live)#

//從上面可以看出來主節點是node1,從節點是node2,下面將node1變爲standby,看一下服務是否能夠轉移到node2上面

crm(live)# node
crm(live)node# standby node1.magelinux.com
crm(live)node# cd ..
crm(live)# status
Last updated: Wed Apr 23 12:38:32 2014
Last change: Wed Apr 23 12:38:15 2014 via crm_attribute on node1.magelinux.com
Stack: classic openais (with plugin)
Current DC: node1.magelinux.com - partition with quorum
Version: 1.1.10-14.el6-368c726
2 Nodes configured, 2 expected votes
5 Resources configured


Node node1.magelinux.com: standby
Online: [ node2.magelinux.com ]

Master/Slave Set: ms_drbd_mysql [drbd_mysql]
    Masters: [ node2.magelinux.com ]
    Stopped: [ node1.magelinux.com ]
fs_mysql     (ocf::heartbeat:Filesystem):     Started node2.magelinux.com
myip     (ocf::heartbeat:IPaddr):     Started node2.magelinux.com
mysqldserver     (lsb:mysqld):     Started node2.magelinux.com
crm(live)#


//從上面可以看出來所有的服務都轉移到了node2上;表明所有的服務、配置已經完成!後續我登錄了mysql服務器,毫無問題,能夠在兩個節點間自動切換;



至此,DRBD+Corosync+Pacemaker+Mysql高可用集羣實驗成功完成!

j_0010.gif


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