Linux HA集羣之DRBD詳解

大綱:前端

   1、DRBD 是什麼
node

   2、DRBD 主要功能mysql

   3、DRBD 工做原理linux

   4、DRBD 複製模式sql

   5、DRBD 配置工具bootstrap

   6、DRBD 配置文件vim

   7、DRBD 資源api

   8、DRBD 支持的底層設備服務器

   9、DRBD 配置步驟網絡

   10、安裝與配置 DRBD 詳解
   11、DRBD+MariaDB+Corosync+Pacekmaer HA安裝配置詳解

1、DRBD 是什麼

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


2、DRBD 主要功能

wKiom1NVIF3iTjc6AAF1PGQOynA390.jpg

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


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


DRBD鏡像數據

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

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

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


3、DRBD 工做原理

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



4、DRBD 複製模式

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

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

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

簡言之:

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

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

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

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


5、DRBD 配置工具


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

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

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


6、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的默認中進行繼承而無須定義。


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

   }  

}


8、DRBD 支持的底層設備

 DRBD須要構建在底層設備之上,而後構建出一個塊設備出來。對於用戶來講,一個DRBD設備,就像是一塊物理的磁盤,能夠在商脈內建立文件系統。DRBD所支持的底層設備有如下這些類:

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

◆ 一個soft raid 設備。

◆ 一個LVM的邏輯卷。

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

◆ 其餘任何的塊設備。


9、DRBD 配置步驟

◆ 安裝drbd

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

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

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

◆ 啓動服務 service drbd start

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

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

◆ 一個節點進行掛載


10、安裝與配置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結合工做那兩節點就必須保持一致性了,由於在其定義資源時是要指定掛載點!


11、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

相關文章
相關標籤/搜索