Mysql+DRBD+Heartbeat 實現mysql高可用的雙擊熱備(DRBD篇)

DRBD官方tar包下載地址:   http://oss.linbit.com/drbd/


環境介紹: 


系統版本:CentOS 6.4 (64位)  

內核版本  2.6.32-358.el6.x86_64 


軟件版本:drbd-8.4.3.tar.gz 


主:10.0.0.1   從:10.0.0.2


兩臺機器上的hosts都需要修改:

[root@localhost ~]# vim /etc/hosts

 10.0.0.1    node1

 10.0.0.2    node2 


兩臺服務器雙網卡,其中10.0.0.x的網卡用於傳輸drbd數據,兩臺服務器網線直連,用做傳輸心跳線。



****爲了方便實驗,兩臺機器都各自加一塊15G的硬盤,用過來做DRBD存儲盤 (兩臺機器都需要此操作)


對新添加的硬盤進行分區:

#fdisk /dev/sdb                                                  //準備爲 sdb 建立分區


 The number of cylinders for this disk is set to 20805.

 There is nothing wrong with that, but this is larger than 1024,

 and could in certain setups cause problems with:

 1) software that runs at boot time (e.g., old versions of LILO)

 2) booting and partitioning software from other OSs

   (e.g., DOS FDISK, OS/2 FDISK)

 Command (m for help): n                                              //鍵入 n 表示要建立分區

 Command action

    e   extended

    p   primary partition (1-4)

 p                                                                    //鍵入 p 表示建立主要分區

 Partition number (1-4): 1                                            //鍵入 1 爲此主要分區代號

 First cylinder (1-20805, default 1):                                 //開始磁柱值,按下 enter 即可

 Using default value 1

 Last cylinder or +size or +sizeM or +sizeK (1-20805, default 20805): //結束磁柱值,按下 enter 即可

 Using default value 20805

 Command (m for help): w                                              //鍵入 w 表示確定執行剛纔設定

 The partition table has been altered!

 Calling ioctl() to re-read partition table.

 Syncing disks.


[root@node1 ~]# partprobe                                  //使剛纔的 partition table 變更生效

######不需要進行分區格式化!



編譯安裝drbd-8.4.3  :


[root@node1 soft]# tar zxf drbd-8.4.3.tar.gz  

[root@node1 soft]# cd drbd-8.4.3 

[root@node1 soft]# mkdir /usr/local/drbd/

[root@node1 drbd-8.4.3]# ./configure --prefix=/usr/local/drbd --with-km 注意:--with-km是啓用內核模塊 

[root@node1 ~]# make KDIR=/usr/src/kernels/2.6.32-358.el6.x86_64/      注意KDIR的路徑 (這個內核源碼路徑需要根據自己的系統修改) 

[root@node1 drbd-8.4.3]# make install  

[root@node1 ~]# mkdir -p /usr/local/drbd/var/run/drbd 


配置啓動腳本以及開機自啓動

[root@node1 ~]# cp /usr/local/drbd/etc/rc.d/init.d/drbd  /etc/rc.d/init.d/ 

[root@node1 ~]# chkconfig --add drbd 

[root@node1 ~]# chkconfig drbd on


拷貝DRBD模塊到內核,並加載DRBD模塊。

[root@node1 drbd]# cp drbd.ko /lib/modules/2.6.32-358.el6.x86_64/kernel/lib/ 

[root@node1 drbd]# modprobe drbd 


查看模塊是否加載成功

[root@node1 drbd]#lsmod |grep drbd

drbd                  325626  3 

libcrc32c               1246  1 drbd


添加開機自動加載drbd模塊

[root@node1 drbd]#echo "modprobe drbd " >> /etc/rc.local


*********別忘了同樣在node2上也進行以上步驟操作****************


********************************配置DRBD************************************

[root@node1 ~]# cd /usr/local/drbd/etc/

[root@node1 etc]# cat 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";


由此可見:主配置文件裏面已經包含了全局配置文件和drbd目錄下以.res結尾的文件


修改全局配置文件:                    *****下面是筆者所用配置,爲了高效配製成功,請務必保證文件各項配置一致********


[root@node1 etc]# cd drbd.d/

[root@node1 drbd.d]# cat global_common.conf 

global {

usage-count no;    #是否參加DRBD使用者統計,默認爲yes

}


common {

syncer { rate 200M; }   #設置主、備節點同步時的網絡速率最大值,單位是字節

        protocol        C;  #使用DRBD的第三種同步協議,表示收到遠程主機的寫入確認後,認爲寫入完成

        handlers {

         pri-on-incon-degr "echo o > /proc/sysrq-trigger ; halt -f";

         pri-lost-after-sb "echo o > /proc/sysrq-trigger ; halt -f";

         local-io-error "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";

        }


        net {

                cram-hmac-alg   "sha1";    

                shared-secret   "MySQL-HA";   #DRBD 同步時使用的驗證方式和密碼信息

        }


        disk {

                on-io-error     detach;       #配置I/O錯誤處理策略爲分離

         #       fencing resource-only;

        }


        startup { 

         #       wfc-timeout     120;

         #       degr-wfc-timeout    120;

        }

}



修改資源配置文件,默認沒有此文件,需要手動創建:    *****下面是筆者所用配置,爲了高效配製成功,請務必保證文件各項配置一致********

[root@node1 ~]# vim /usr/local/drbd/etc/drbd.d/drbd.res

resource r0 {     #這個r0是定義資源的名字

        on node1 { #每個主機的說明以on開頭,後面的名稱需要與hostname、uname -n一致,其後的{}中的配置是此主機的配置

device /dev/drbd0;         #drbd設備名稱

        disk    /dev/sdb1;#/dev/drbd0使用的磁盤分區爲sdb1

        address         10.0.0.1:7788;      #設置drbd監聽地址與端口

        meta-disk       internal;    #DRBD的元數據存放方式

        }


        on node2 {

device  /dev/drbd0;

        disk    /dev/sdb1;

        address         10.0.0.2:7788;

        meta-disk       internal;

        }

}


****************************此時,DRBD的配置文件完成!***************************


爲了保證配置項一致,將兩個配置文件拷貝到node2上:


[root@node1 drbd]#scp etc/drbd.d/global_common.conf etc/drbd.d/drbd.res [email protected]:/root/


切換到node2 將配置文件放到drbd目錄:


[root@node2 ~]#mv drbd.res global_common.conf /usr/local/drbd/etc/drbd.d/


在node1上初始化資源

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

You want me to create a v08 style flexible-size internal meta data block.

There appears to be a v08 flexible-size internal meta data block

already in place on /dev/sdb1 at byte offset 16105058304

Do you really want to overwrite the existing v08 meta-data?

[need to type 'yes' to confirm] yes


Writing meta data...

initializing activity log

NOT initializing bitmap

New drbd meta data block successfully created.


同樣,在node2上初始化資源

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


***注意:如果初始化資源報錯:


Command 'drbdmeta 0 v08 /dev/sdb1 internal create-md' terminated with exit code 40

這是因爲sdb1已經有文件系統了,已經有數據存在了(進行下面的操作前,請保證/dev/sdb1裏的數據是否備份)

解決方法:

[root@node1 ~]# dd if=/dev/zero bs=1M count=1 of=/dev/sdb1  ***注意,此處就是/dev/sdb1此硬盤,而不是他的掛載目錄


請務必在兩臺服務器上同時啓動服務:


[root@node1 ~]# service drbd start

Starting DRBD resources: [

     create res: r0

   prepare disk: r0

    adjust disk: r0

     adjust net: r0

]

......

[root@node2 ~]# service drbd start


查看drbd監聽端口:

[root@node2 ~]# netstat -anptul |grep 7788

tcp        0      0 10.0.0.2:50569              10.0.0.1:7788               ESTABLISHED -                   

tcp        0      0 10.0.0.2:7788               10.0.0.1:39663              ESTABLISHED -          


********************************設置DRBD主、備節點***************************************


注意:第一次啓動drbd時,兩個drbd節點默認都處於Secondary狀態:


[root@node1 ~]# drbdadm role r0         #查看r0主、備節點的命令

Secondary/Secondary


由於默認沒有主備節點之分,因而需要設置兩個主機的主備節點,選擇需要設置爲主節點的主機,然後執行如下命令:


[root@node1 ~]# drbdadm -- --overwrite-data-of-peer primary all


第一次執行完此命令後,在後面如果需要設置哪個是主節點時,就可以使用另外一個命令:


drbdadm primary all


查看資源的連接狀態:


[root@node1 ~]# drbdadm cstate r0

SyncSource


資源連接狀態可能有以下狀態中的一種:


StandAlone 獨立的:網絡配置不可用;資源還沒有被連接或是被管理斷開(使用 drbdadm disconnect 命令),或是由於出現認證失敗或是腦裂的情況

Disconnecting 斷開:斷開只是臨時狀態,下一個狀態是StandAlone獨立的

Unconnected 懸空:是嘗試連接前的臨時狀態,可能下一個狀態爲WFconnection和WFReportParams

Timeout 超時:與對等節點連接超時,也是臨時狀態,下一個狀態爲Unconected懸空

BrokerPipe:與對等節點連接丟失,也是臨時狀態,下一個狀態爲Unconected懸空

NetworkFailure:與對等節點推動連接後的臨時狀態,下一個狀態爲Unconected懸空

ProtocolError:與對等節點推動連接後的臨時狀態,下一個狀態爲Unconected懸空

TearDown 拆解:臨時狀態,對等節點關閉,下一個狀態爲Unconected懸空

WFConnection:等待和對等節點建立網絡連接

WFReportParams:已經建立TCP連接,本節點等待從對等節點傳來的第一個網絡包

Connected 連接:DRBD已經建立連接,數據鏡像現在可用,節點處於正常狀態

StartingSyncS:完全同步,有管理員發起的剛剛開始同步,未來可能的狀態爲SyncSource或PausedSyncS

StartingSyncT:完全同步,有管理員發起的剛剛開始同步,下一狀態爲WFSyncUUID

WFBitMapS:部分同步剛剛開始,下一步可能的狀態爲SyncSource或PausedSyncS

WFBitMapT:部分同步剛剛開始,下一步可能的狀態爲WFSyncUUID

WFSyncUUID:同步即將開始,下一步可能的狀態爲SyncTarget或PausedSyncT

SyncSource:以本節點爲同步源的同步正在進行

SyncTarget:以本節點爲同步目標的同步正在進行

PausedSyncS:以本地節點是一個持續同步的源,但是目前同步已經暫停,可能是因爲另外一個同步正在進行或是使用命令(drbdadm pause-sync)暫停了同步

PausedSyncT:以本地節點爲持續同步的目標,但是目前同步已經暫停,這可以是因爲另外一個同步正在進行或是使用命令(drbdadm pause-sync)暫停了同步

VerifyS:以本地節點爲驗證源的線上設備驗證正在執行

VerifyT:以本地節點爲驗證目標的線上設備驗證正在執行


查看資源角色的命令:


[root@node1 ~]# drbdadm role r0


Primary/Secondary (在前面爲當前節點)


Parimary 主:資源目前爲主,並且可能正在被讀取或寫入,如果不是雙主只會出現在兩個節點中的其中一個節點上

Secondary 備:資源目前爲備,正常接收對等節點的更新

Unknown 未知:資源角色目前未知,本地的資源不會出現這種狀態



查看硬盤狀態:


[root@node1 ~]# drbdadm dstate r0


UpToDate/UpToDate


本地和對等節點的硬盤有可能爲下列狀態之一:

Diskless 無盤:本地沒有塊設備分配給DRBD使用,這表示沒有可用的設備,或者使用drbdadm命令手工分離或是底層的I/O錯誤導致自動分離

Attaching:讀取無數據時候的瞬間狀態

Failed 失敗:本地塊設備報告I/O錯誤的下一個狀態,其下一個狀態爲Diskless無盤

Negotiating:在已經連接的DRBD設置進行Attach讀取無數據前的瞬間狀態

Inconsistent:數據是不一致的,在兩個節點上(初始的完全同步前)這種狀態出現後立即創建一個新的資源。此外,在同步期間(同步目標)在一個節點上出現這種狀態

Outdated:數據資源是一致的,但是已經過時

DUnknown:當對等節點網絡連接不可用時出現這種狀態

Consistent:一個沒有連接的節點數據一致,當建立連接時,它決定數據是UpToDate或是Outdated

UpToDate:一致的最新的數據狀態,這個狀態爲正常狀態



查看同步進度:


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

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

GIT-hash: 89a294209144b68adb3ee85a73221f964d3ee515 build by root@node2, 2014-06-09 15:12:58

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

    ns:24 nr:16108076 dw:16108100 dr:1017 al:2 bm:960 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

【注】:

從輸出的”ds“ 信息得知,磁盤狀態都是“UpToDate”,表示數據同步已經完成了

ro是角色信息,Primary/Secondary 說明了當前主機是primary主節點,另一臺是secondary備節點

ds是磁盤狀態,顯示數據是否一致,(如果顯示UpToDate/UpToDate 表明同步沒有延時)

ns是網絡發送的數據包,以K字節計算

dw是磁盤寫信息

dr是磁盤讀信息


**************************最後一步,掛載drbd0設備**************************


注意:

  *****掛載DRBD分區之前,首先需要確認當前主機的DRBD分區是Primary狀態,可以從"/cat/proc/drbd" 命令中查詢到


[root@node1 ~]# cat /proc/drbd |grep ro

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

GIT-hash: 89a294209144b68adb3ee85a73221f964d3ee515 build by root@node2, 2014-06-09 15:12:58

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

 

  *****處於主狀態的主機,才能進行掛載*****


格式化文件系統(文件格式根據自己的系統環境選擇)


!!!!!!注意:只格式化主節點的/dev/drbd0!!!!


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


掛載此文件系統

[root@node1 ~]# mkdir /data

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

[root@node1 ~]# df -Th

文件系統    類型      容量  已用  可用 已用%% 掛載點

/dev/sda3     ext4     11G  3.5G  6.9G  34% /

tmpfs        tmpfs    499M     0  499M   0% /dev/shm

/dev/sda1     ext4    2.0G   68M  1.9G   4% /tmp

/dev/drbd0    ext4     15G  166M   14G   2% /data


**************************此時,DRBD的配置已經完成!***************************



**************************測試驗證***********************************************


命題:在掛載的data目錄中創建一個測試文件,然後卸載掛載目錄,然後切換主備節點,在備用節點上查看剛剛建立的測試文件還是否存在


[root@node1 ~]# touch /data/test

[root@node1 ~]# umount /data/


然後將node1變爲備用節點:


[root@node1 ~]# drbdadm secondary r0


[root@node1 ~]# drbdadm role r0

Secondary/Secondary


DRBD執行角色切換前,需要在主節點執行 umount 命令, 去掉對DRBD設備的掛載,然後在另一臺主機上將DRBD的角色修改爲”Primary“,最後再進行掛載


接着在node2上進行操作:


[root@node2 ~]# drbdadm primary all

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


查看文件是否存在:

[root@node2 ~]# ls /data/

lost+found  test


******************************此時表明DRBD配置已成功!!!**************************



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