Linux‎ > ‎

Linux HA - DRBD & Heartbeat

Preface

本文採用Open Source套件DRBD(Distributed Replicated Block Device)Heartbeat作為兩台Linux伺服器高可用性叢集架構(HA Cluster)DRBD可在網路環境下,進行資料鏡像(Mirror)的同步,不同於檔案的複製,而是利用區塊(Block)來進行資料的搬移及交換。DRBD也可將之視作為以網路為基礎的RAID-1

下圖為DRBD HA Cluster架構流程圖。


 

LAB Environment

OS: CentOS 6.3 (2.6.32-279.el6.x86_64)

Primary Server (DRBD-1)

eth0

eth1

Mirror HDD

172.20.144.198 (Mgmt)

1.1.1.1 (Mirror)

/dev/sdb

Secondary Server (DRBD-2)

eth0

eth1

Mirror HDD

172.20.144.199 (Mgmt)

1.1.1.2 (Mirror)

/dev/sdb

Cluster IP

eth0:0

172.20.144.200

DRBD Resource Name

r0

 

 

1.     安裝必要套件(YUM自動安裝)

I.     新增以下3YUM Repository。若連結失效請自行至該網站找最新連結。

II.    若無法使用YUM來自動安裝,可參考下一則手動安裝參考。

RPMforge

rpm -Uvh http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.2-2.el6.rf.x86_64.rpm

 

ELRepo

rpm -Uvh http://elrepo.org/elrepo-release-6-4.el6.elrepo.noarch.rpm

 

EPEL

rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-7.noarch.rpm

 

III.   安裝系統相關及編譯套件

yum -y install gcc policycoreutils-python setroubleshoot system-config-services

 

IV.  安裝DRBD相關套件

yum -y install drbd83-utils kmod-drbd83

 

V.   安裝Heartbeat相關套件

yum -y install heartbeat heartbeat-devel heart-libs

 

2.     安裝必要套件(無法連至Internet,需手動安裝)

I.    CentOS安裝時,選擇Basic Server安裝。

II.   設定YUM CentOS Disc套件安裝

            i.    使用YUM可自動安裝相依性套件,省去手動安裝麻煩。

           ii.    放入光碟,並掛載於 /mnt

          iii.    修改 /etc/yum.repos.d/CentOS-Media.repo,刪除原先內容,並加入以下資 料,下列內容請參考CentOS 6.3光碟目錄內的 .discinfo

[InstallMedia]

name=6.3

baseurl=file:///mnt/

mediaid=1341569670.539525

metadata_expire=-1

gpgcheck=0

cost=500

 

III.  準備DRBD安裝相關套件

drbd83-utils-8.3.13-1.el6.elrepo.x86_64.rpm

kmod-drbd83-8.3.13-2.el6_3.elrepo.x86_64.rpm

 

IV.  安裝DRBD套件

# yum -y localinstall drbd83-utils-8.3.13-1.el6.elrepo.x86_64.rpm

# yum -y localinstall kmod-drbd83-8.3.13-2.el6_3.elrepo.x86_64.rpm

 

V.    安裝Heartbeat套件

# yum -y localinstall heartbeat-3.0.4-1.el6.x86_64.rpm heartbeat-devel-3.0.4-1.el6.x86_64.rpm heartbeat-libs-3.0.4-1.el6.x86_64.rpm

 

3.     伺服器主機基礎設定 (兩台主機都需設定)

I.    主機名稱(Hostname)定義

Ø   Primary Server: DRBD-1

Ø   Secondary Server: DRBD-2

II.   防火牆及SELinux設定

III.  修改 /etc/hosts,加入兩台主機名稱及IP

[root@DRBD-1 ~]# vim /etc/hosts

172.20.144.198  DRBD-1

172.20.144.199  DRBD-2

 

IV.  IP配置,包含管理IP(172.20.144.x)及鏡像IP(1.1.1.x)

V.   配置鏡像磁碟,本例使用裝置 /dev/sdb

[root@DRBD-1 ~]# fdisk /dev/sdb

Command (m for help): n

Command action

   e   extended

   p   primary partition (1-4)

p

Partition number (1-4): 1

First cylinder (1-6527, default 1):

Using default value 1

Last cylinder, +cylinders or +size{K,M,G} (1-6527, default 6527):

Using default value 6527

 

Command (m for help): p

 

Disk /dev/sdb: 53.7 GB, 53687091200 bytes

255 heads, 63 sectors/track, 6527 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk identifier: 0x0009d6ac

 

   Device Boot      Start         End      Blocks   Id  System

/dev/sdb1               1        6527    52428096   83  Linux

 

Command (m for help): w

The partition table has been altered!

 

Calling ioctl() to re-read partition table.

Syncing disks.

 

VI.  於根目錄建立DRBD預備掛載資料夾

[root@DRBD-1 ~]# mkdir /DRBD

 

4.     修改drbd設定檔 (兩台主機都需設定)

I.    修改DRBD設定檔 (簡易設定)

[root@DRBD-1 ~]# vim /etc/drbd.d/global_common.conf

global {

  usage-count no;

}

common {

  syncer { rate 1000M; }

}

 

II.   修改DRBD資源設定檔 (簡易設定)

[root@DRBD-1 ~]# vim /etc/drbd.d/r0.res

resource r0 {

  protocol c;

  on DRBD-1 {

    device    /dev/drbd1;

    disk      /dev/sdb1;

    address   1.1.1.1:7789;

    meta-disk internal;

  }

  on DRBD-2 {

    device    /dev/drbd1;

    disk      /dev/sdb1;

    address   1.1.1.2:7789;

    meta-disk internal;

  }

}

 

5.     啟用裝置資源(Resource) (兩台主機都需執行)

I.   建立裝置Metadata

[root@DRBD-1 /]# drbdadm create-md r0

Writing meta data...

initializing activity log

NOT initialized bitmap

New drbd meta data block successfully created.

 

II.  啟動DRBD服務,並設定開機自動啟動。

[root@DRBD-1 /]# service drbd start

Starting DRBD resources: [ d(r0) s(r0) n(r0) ].

[root@DRBD-1 /]# chkconfig drbd on

 

III.  檢查DRBD服務目前狀態,由於尚未指派Primary,所以目前狀態都是Secondary

[root@DRBD-1 ~]# cat /proc/drbd

version: 8.3.13 (api:88/proto:86-96)

GIT-hash: 83ca112086600faacab2f157bc5a9324f7bd7f77 build by dag@Build64R6, 2012-09-04 12:06:10

 

 1: 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:b oos:10482024

  cs: 主從狀態。也可以用指令”drbdadm role r0”查詢。

  ds: 磁碟狀態

 

IV.  設定Primary主機,並開始同步兩台主機磁碟資料。(僅需Primary Server執行)

[root@DRBD-1 ~]# drbdadm -- --overwrite-data-of-peer primary r0

 

V.   查詢Primary Server同步狀 (同步進行中)

[root@DRBD-1 ~]# service drbd status

drbd driver loaded OK; device status:

version: 8.3.13 (api:88/proto:86-96)

GIT-hash: 83ca112086600faacab2f157bc5a9324f7bd7f77 build by dag@Build64R6, 2012-09-04 12:06:10

m:res  cs          ro                 ds                     p  mounted  fstype

...    sync'ed:    2.5%               (9984/10236)M

1:r0   SyncSource  Primary/Secondary  UpToDate/Inconsistent  C

 

VI.  查詢Secondary Server同步狀態 (同步進行中)

[root@DRBD-2 /]# cat /proc/drbd

version: 8.3.13 (api:88/proto:86-96)

GIT-hash: 83ca112086600faacab2f157bc5a9324f7bd7f77 build by dag@Build64R6, 2012-09-04 12:06:10

 

 1: cs:SyncTarget ro:Secondary/Primary ds:Inconsistent/UpToDate C r-----

    ns:0 nr:482048 dw:473856 dr:0 al:0 bm:28 lo:65 pe:7370 ua:64 ap:0 ep:1 wo:b oos:10008168

        [>....................] sync'ed:  4.6% (9772/10236)M

        finish: 0:05:37 speed: 29,616 (29,616) want: 1,024,000 K/sec

 

VII.  查詢Primary Server同步狀態 (同步完成)

[root@DRBD-1 ~]# service drbd status

drbd driver loaded OK; device status:

version: 8.3.13 (api:88/proto:86-96)

GIT-hash: 83ca112086600faacab2f157bc5a9324f7bd7f77 build by dag@Build64R6, 2012-09-04 12:06:10

m:res  cs         ro                 ds                 p  mounted  fstype

1:r0   Connected  Primary/Secondary  UpToDate/UpToDate  C

 

VIII. 查詢Secondary Server同步狀態 (同步完成)

[root@DRBD-2 /]# cat /proc/drbd

version: 8.3.13 (api:88/proto:86-96)

GIT-hash: 83ca112086600faacab2f157bc5a9324f7bd7f77 build by dag@Build64R6, 2012-09-04 12:06:10

 

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

    ns:0 nr:10482024 dw:10482024 dr:0 al:0 bm:640 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0

 

6.     開始使用DRBD

I.   /dev/drbd1格式化,並建立EXT4檔案系統。 (僅需Primary Server執行)

[root@DRBD-1 ~]# mkfs.ext4 /dev/drbd1

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

655360 inodes, 2620506 blocks

131025 blocks (5.00%) reserved for the super user

First data block=0

Maximum filesystem blocks=2684354560

80 block groups

32768 blocks per group, 32768 fragments per group

8192 inodes per group

Superblock backups stored on blocks:

        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632

 

Writing inode tables: done

Creating journal (32768 blocks): done

Writing superblocks and filesystem accounting information: done

 

This filesystem will be automatically checked every 31 mounts or

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

 

II.    /dev/drbd1掛載至 /DRBD ,並檢查掛載情形。 (僅需Primary Server執行)

[root@DRBD-1 ~]# mount /dev/drbd1 /DRBD

[root@DRBD-1 ~]# df

Filesystem           1K-blocks      Used   Available   Use%   Mounted on

/dev/sda1             16512936   2656832   13017296   17%   /

tmpfs                510320         0     510320     0% /   dev/shm

/dev/drbd1            10317472    154100   9639272    2%    /DRBD

 

7.     DRBD斷線測試

I.    Primary Server網路埠eth1的網路線拔掉或下指令斷線

[root@DRBD-1 ~]# ifdown eth1

 

II.   這時檢查Primary Serverdrbd狀態,發現Secondary變成Unknown

[root@DRBD-1 ~]# drbdadm role r0

Primary/Unknown

 

III.   Secondary Serverdrbd狀態,Primary變成Unknown

[root@DRBD-2 ~]# drbdadm role r0

Unknown /Primary

 

IV.   恢復網路連線,並執行drbd reconnect重新連接指令。

[root@DRBD-1 ~]# ifup eth1

[root@DRBD-1 ~]# drbdadm connect r0

[root@DRBD-1 ~]# drbdadm role r0

Primary/Secondary

 

8.     DRBD測試資料是否同步鏡像寫入

I.    Primary ServerDRBD目錄底下新增一個名為jtest.iso檔案。完成後,卸載 /DRBD裝置。

[root@DRBD-1 ~]# dd if=/dev/zero of=/DRBD/jtest.iso bs=1M count=1024

[root@DRBD-1 ~]# umount /DRBD

 

II.    Primary Serverdrbd 角色轉換為Secondary Server

[root@DRBD-1 ~]# drbdadm secondary r0

[root@DRBD-1 ~]# drbdadm role r0

Secondary/Secondary

 

III.   Secondary Serverdrbd 角色轉換為Primary Server

[root@DRBD-2 ~]# drbdadm primary r0

[root@DRBD-2 ~]# drbdadm role r0

Primary/Secondary

[root@DRBD-1 ~]# drbdadm role r0

Secondary/Primary

 

IV.   Secondary Server掛載 /DRBD,並檢查檔案是否正確被同步寫入。

[root@DRBD-2 /]# mount /dev/drbd1 /DRBD

[root@DRBD-2 /]# ll /DRBD

total 1112848

-rw-r--r--. 1 root root 1073741824 Nov 18 19:16 jtest.iso

 

9.     手動腦裂(Split brain)復原

I.      腦裂(Split brain)是指在某種情況下,造成DRBD兩個節點斷開了連接,都以Primary的身份來運行。當DRBDprimary節點連接對方節點準備發送訊息的時候如果發現對方也是primary狀態,那麼會立刻自行斷開連接,並認定當前已經發生split brain了,這時候他會在系統日志中記錄以下信息:“Split-Brain detected,dropping connection!”當發生split brain之後,如果查看連接狀態,其中至少會有一個是StandAlone狀態,另外一個可能也是StandAlone(如果是同時發現split brain狀態),也有可能是WFConnection的狀態。

II.     在手動復原前,需先確認好哪一台Server是正確的Primary。確定後,到另一台 Server,切換成Secondary角色,並放棄Secondary的資源資料。

[root@DRBD-2 ~]# drbdadm secondary r0

[root@DRBD-2 ~]# drbdadm disconnect r0

[root@DRBD-2 ~]# drbdadm -- --discard-my-data connect r0

 

III.   Primary Server當前狀態為WFConnection,則會開始自動重新同步。若狀態依然為StandAlone,則需手動下連接的指令。

[root@DRBD-1 ~]# drbdadm connect r0

 

10.Heartbeat

I.      在預設只有安裝DRBD情況下,Primary/Secondary主機只能靠手動去切換,很不方便也不即時。下列將透過Heartbeat配置達到兩台主機間自動切換。

II.     首先,新增Heartbeat服務於系統中。(兩台主機都要設定)

[root@DRBD-1 ~]# chkconfig --add heartbeat

[root@DRBD-1 ~]# chkconfig heartbeat on

 

III.    Heartbeat有三個設定檔,分別為 ha.cfharesourcesauthkkeys,將此三個範例設定檔複制到 /etc/ha.d/ 目錄底下或手動新增。(兩台主機都需要)

[root@DRBD-1 ~]# cp /usr/share/doc/heartbeat-3.0.4/ha.cf  /etc/ha.d/

[root@DRBD-1 ~]# cp /usr/share/doc/heartbeat-3.0.4/haresources  /etc/ha.d/

[root@DRBD-1 ~]# cp /usr/share/doc/heartbeat-3.0.4/authkeys  /etc/ha.d/

 

IV.   編輯Heartbeat主要配置檔ha.cf (兩台主機都需設定)

[root@DRBD-1 ~]# vim /etc/ha.d/ha.cf

autojoin none

 

# Debug messages

debugfile /var/log/ha-debug

 

# Other messages

logfile /var/log/ha-log

 

# Syslog系統日誌

logfacility local0

 

# 多久時間確認對方是否存活(單位:)

keepalive 2

 

# 多久時間確認對方已完全失去聯繫(單位:)

deadtime 10

 

# 連續多久時間聯繫不上後開始警告提示(單位:)

warntime 4

 

# 主機若重開機,等待網路開啟或其他應用程式執行的時間。(單位:)

initdead 60

 

# 使用694 Port來作Heartbeat監控

udpport 694

 

# 採用網路卡eth1UDP廣播來發送heartbeat訊息

#bcast eth1

 

# 採用網路卡eth1UDP單播 來發送heartbeat訊息,IP為對方IP位置。建議採用單播,避免多組cluster主機都會看到對方節點(第二台主機則填對方IP)

ucast eth0 172.20.144.199

ucast eth1 1.1.1.2

 

# Primay異常修復完畢,是否需要從Secondary自動切換回Primary。建議設定off

auto_failback off

 

# 節點1與節點2,必須要與 uname -n 指令得到的名稱一致。

node DRBD-1

node DRBD-2

 

ping 172.20.144.254

 

respawn hacluster /usr/lib64/heartbeat/ipfail

respawn hacluster /usr/lib64/heartbeat/dopd

apiauth dopd gid=haclient uid=hacluster

 

V.    編輯Heartbeat認證資訊檔authkeys (兩台主機authkeys內容需一致)

            i.   AuthkeysCluster節點間相互認證的密碼,也就是說主機必須擁有此密碼才可加入該Cluster群組。Authkeys共有三種認証方式,分別為crcmd5sha1,依安全性等級區分,sha1最不易破解,其次md5,最後為crc

           ii.    Authkeys的權限必須為600

          iii.    兩台主機authkeys內容需一致

[root@DRBD-1 ~]# (echo -ne "auth 1\n1 sha1 "; echo $RANDOM | openssl sha1 | awk '{print $2}') > /etc/ha.d/authkeys

[root@DRBD-1 ~]# chmod 600 /etc/ha.d/authkeys

[root@DRBD-1 ~]# scp /etc/ha.d/authkeys root@DRBD-2:/etc/ha.d/

 

# authkeys開啟內容如下

auth 1

1 sha1 ccde56f52bc06bcda0918cfa9439f5c91d941de6

 

VI.    編輯Heartbeat資源檔haresources (兩台主機內容需一致)

            i.    Haresources每一行代表一個資源組

           ii.    資源組的啟動順序是由左至右,關閉順序是由右往左。

          iii.    Script的參數是由 :: 來傳遞及分隔。

          iv.    每一個資源則以空格間隔

[root@DRBD-1 ~]# vim /etc/ha.d/haresources

DRBD-1 172.20.144.200 drbddisk::r0 Filesystem::/dev/drbd1::/DRBD::ext4 ftpd

 

參數說明:

 

DRBD-1

指定Primary節點

172.20.144.200

Cluster IP位址

drbddisk::r0

DRBD Resource名稱

Filesystem::/dev/drbd1::/DRBD::ext4

{Device}::{Mount Point}::{檔案系統型態}

ftpd

欲啟動daemon服務

 

VII.    啟動Heartbeat服務 (兩台主機)

[root@DRBD-1 ~]# service heartbeat start; ssh drbd-2 service heartbeat start

[root@DRBD-1 ~]# service heartbeat status ; ssh drbd-2 service heartbeat status

heartbeat OK [pid 3352 et al] is running on drbd-1 [drbd-1]...

heartbeat OK [pid 3003 et al] is running on drbd-2 [drbd-2]...

 

VIII. 啟動完Heartbeat服務後,確認Primary主機是否具備以下狀態。

            i.   DRBD Disk掛載於Primary主機

          ii.    Heartbeart新增一組Cluster IP

[root@DRBD-1 ~]# mount

/dev/drbd1 on /DRBD type ext4 (rw)

[root@DRBD-1 ~]# ifconfig

eth0:0    Link encap:Ethernet  HWaddr 00:50:56:BD:45:CC

          inet addr:172.20.144.200  Bcast:172.20.144.255  Mask:255.255.255.0

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

 

11. Heartbeat各種災害情況演練

I.     以下針對HA架構下PrimarySecondary可能進行切換、服務移轉的情境測試。包括手動切換節點、拔除Primary網路線及Shutdown Primary主機。

II.    HA服務移轉時間長短,係依據Heartbeat設定檔(/etc/ha.d/ha.cf)參數來決定移轉的時間。

III.   關閉Primary主機Heartbeat服務

[root@DRBD-1 ~]# service heartbeat stop

Stopping High-Availability services: Done.

Waiting to allow resource takeover to complete:Done.

 

[root@DRBD-1 ~]# drbdadm role r0

Secondary/Primary

[root@DRBD-2 ~]# drbdadm role r0

Primary/Secondary

IV.   拔除Primary對外(eth0)網路線

V.    關閉Primary主機

 

12.Primary / Secondary主機狀態確認及檢查

I.    Primary主機通常會具備以下條件

            i.   執行主要系統端相關服務,例如: FTPMySQL等服務。

           ii.    網卡被綁定Cluster IP (eth0:0)

          iii.     掛載DRBD Disk

II.   HA服務移轉時間長短,係依據Heartbeat設定檔(/etc/ha.d/ha.cf)參數來決定移轉的時間。

III.   關閉Primary主機Heartbeat服務

[root@DRBD-1 ~]# service heartbeat stop

Stopping High-Availability services: Done.

Waiting to allow resource takeover to complete:Done.

 

[root@DRBD-1 ~]# drbdadm role r0

Secondary/Primary

[root@DRBD-2 ~]# drbdadm role r0

Primary/Secondary

IV.  拔除Primary對外(eth0)網路線

V.   關閉Primary主機

 

ċ
James Chan,
2012年12月7日 上午3:14
ĉ
James Chan,
2013年5月3日 上午2:24
Ċ
James Chan,
2013年5月3日 上午2:24
ċ
James Chan,
2012年12月7日 上午3:43
Comments