DRBD學習筆記

來源:互聯網
上載者:User
1,什麼是DRBD

DRBD(Distributed
Replicated Block Device),DRBD 號稱是 "網路 RAID",開源軟體,由 LINBIT
公司開發。

2,DRBD的主要功能

DRBD實際上是一種塊裝置的實現,主要被用於Linux平台下的高可用(HA)方案之中。他是有核心模組和相關程式而組成,通過網路通訊來同步鏡像整個裝置,有點類似於一個網路RAID的功能。也就是說當你將資料寫入本地的DRBD裝置上的檔案系統時,資料會同時被發送到網路中的另外一台主機之上,並以完全相同的形式記錄在一個檔案系統中(實際上檔案系統的建立也是由DRBD的同步來實現的)。本地節點(主機)與遠程節點(主機)的資料可以保證即時的同步,並保證IO的一致性。所以當本地節點的主機出現故障時,遠程節點的主機上還會保留有一份完全相同的資料,可以繼續使用,以達到高可用的目的。

3,DRBD的主要應用

如果主伺服器宕機,造成的損失是不可估量的。要保證主伺服器不間斷服務,就需要對伺服器實現冗餘。在眾多的實現伺服器冗餘的解決方案中,heartbeat為我們提供了廉價的、可伸縮的高可用叢集方案。我們通過heartbeat
+
drbd在Linux下建立一個高可用(HA)的叢集伺服器,在高可用(HA)解決方案中使用DRBD的功能,可以代替使用一個共用盤陣存放裝置。因為資料同時存在於本地主機和遠程主機上,在遇到需要切換的時候,遠程主機只需要使用它上面的那份備份資料,就可以繼續提供服務了。

4,DRBD於mysql的關係

MySQL
與 LINBIT 達成了合作關係,大張旗鼓的搞了這個 "12 天 Scale-Out" 活動,也是這個商業合作驅動的吧。DRBD 助力 MySQL,
號稱可以得到四個 9 的可靠性,這不低於任何一款商務資料庫軟體了。

DRBD 的出現的確對 MySQL
叢集的可用性有很大提高。而且,有獨到的特點,非常適合面向互連網的應用。因為是在儲存層的資料區塊同步,很容易的做到應用程式層的 IO
負載平衡(備機承擔一定的讀壓力),不但支援資料庫失敗接管,還能做到 IP 失敗接管,接管時間小於 30
秒,真是窮人的絕佳叢集解決方案。
------------------------------------------------------------------------------------------------------------------------------------------------------------
本文所提到實驗環境為:

作業系統:
Red Hat
Enterprise Linux AS release 4 (Nahant Update
4)

軟體:
drbd-8.2.6.tar.gz

heartbeat-2.1.3-3.el4.centos
heartbeat-pils-2.1.3-3.el4.centos
heartbeat-stonith-2.1.3-3.el4.centos

mysql-5.1.26-rc-linux-i686-icc-glibc23.tar.gz

主機環境:

drbd
主機列表 IP 位址 主機名稱
主機1(primary) 192.168.1.241
drbd-1
主機2(secondary) 192.168.1.242 drbd-2

另外,2個主機都預留一個空白的分區:/dev/sdb1,不需要建立任何檔案系統。

1,編譯與安裝DRBD,heartbeat

在2台主從機器上都要安裝DRBD

[root@drbd-1
~] tar -xvzf drbd-8.2.6.tar.gz
[root@drbd-1 ~] cd drbd-8.2.6 && make
&& make rpm
[root@drbd-1 ~] cd dist/RPMS/i386

[root@drbd-1 ~]
ls

drbd-8.2.6-3.i386.rpm
drbd-debuginfo-8.2.6-3.i386.rpm
drbd-km-2.6.9_42.EL-8.2.6-3.i386.rpm

[root@drbd-1
~] rpm -ivh drbd-8.2.6-3.i386.rpm
[root@drbd-1 ~] rpm -ivh
drbd-debuginfo-8.2.6-3.i386.rpm
[root@drbd-1 ~] rpm -ivh
drbd-km-2.6.9_42.EL-8.2.6-3.i386.rpm

[root@drbd-1 ~] yum install
heartbeat

yum升級安裝的軟體包下載儲存在:/var/cache/yum/extras/packages

安裝mysql就太簡單了,這裡就不廢話了!

2,載入DRBD模組

[root@drbd-1
~] modprobe drbd
[root@drbd-1 ~] lsmod |grep drbd
drbd
242924
2

如果有,則表示成功了!!!

3,配置/etc/drbd.conf

編輯設定檔,2個主機上的內容一樣,內容如下:

#讓linbit公司收集目前drbd的使用方式,yes為參加。

global
{
usage-count
yes;
}

#drbd所管理的多個資源之間的common,主要是配置drbd的所有resource可以設定為相同的參數項,比如protocol,syncer等等.

common
{
syncer { rate 100M; }
}

#建立一個資源,名字叫”db”

resource db
{

#使用協議C.表示收到遠程主機的寫入確認後,則認為寫入完成。

protocol C;

startup
{
wfc-timeout 0;
degr-wfc-timeout 120;

}

#由於實驗環境下兩台伺服器硬碟大小可能不同,所以需要設定drbd的大小。

disk {

on-io-error detach;
size 6G;
}

net {
max-buffers 2048;

ko-count 4;
}

syncer {
rate 100M;

}

#設定一個節點,分別以各自的主機名稱命名

on drbd-1 {

#設定資源裝置/dev/drbd0
指向實際的物理分區 /dev/sdb1

device /dev/drbd0;
disk /dev/sdb1;

#設定監聽地址以及連接埠

address 192.168.1.241:8888;

#設定中繼資料儲存方式:可以用 internal(即儲存在同一個物理分區下)
#也可以儲存在其他分區上

meta-disk
internal;
}

on drbd-2 {
device /dev/drbd0;
disk
/dev/sdb1;
address 192.168.1.242:8888;
meta-disk internal;

}
}

4,啟動drbd

準備啟動之前,需要分別在2個主機上的 /dev/sdb1
分區上建立相應的中繼資料儲存的資料區塊:

[root@drbd-1 ~] drbdadm create-md db
[root@drbd-2
~] drbdadm create-md db

2次輸入“yes”,如果出現下面的提示資訊,表示成功
[root@drbd-1 /]#
drbdadm create-md db
md_offset 8587153408
al_offset
8587120640
bm_offset 8586858496

Found ext3 filesystem which uses
6291456 kB
current configuration leaves usable 8385604 kB

==> This
might destroy existing data! <==

Do you want to proceed?
[need to
type 'yes' to confirm] yes

v07 Magic number not found
v07 Magic number
not found
You want me to create a v08 style flexible-size internal meta data
block.
There apears to be a v08 flexible-size internal meta data
block
already in place on /dev/sdb1 at byte offset 8587153408
Do you
really want to overwrite the existing v08 meta-data?
[need to type 'yes' to
confirm] yes

Writing meta data...
initialising activity log
NOT
initialized bitmap
New drbd meta data block sucessfully
created.

接下來就可以啟動drbd進程了:

[root@drbd-1 ~] /etc/init.d/drbd
start
[root@drbd-2 ~] /etc/init.d/drbd
start

在啟動第一個節點上的DRBD服務的時候,他會等待第2個節點的DRBD服務的啟動,此時啟動第2個節點上的DRBD服務即可。

[root@drbd-1
/]# /etc/init.d/drbd start
Starting DRBD resources: [ d(db) s(db) n(db)
].
..........
***************************************************************
DRBD's
startup script waits for the peer node(s) to appear.
- In case this node was
already a degraded cluster before the
reboot the timeout is 120 seconds.
[degr-wfc-timeout]
- If the peer was available before the reboot the timeout
will
expire after 0 seconds. [wfc-timeout]
(These values are for
resource 'db'; 0 sec -> wait forever)
To abort waiting enter 'yes' [
47]:

此時,2台機器的DRBD服務都起來了,檢查進程是否存在:

[root@drbd-1 /]# ps aux
| grep drbd
root 3758 14.5 0.0 0 0 ? S 15:56 0:20
[drbd0_worker]
root 3762 9.6 0.0 0 0 ? S 15:56 0:13
[drbd0_receiver]
root 3787 2.4 0.0 0 0 ? S 15:56
0:03 [drbd0_asender]
root 3794 0.0 0.2 644 128 pts/0 R+
15:58 0:00 grep
drbd

可以看到兩個節點的進程都起來了,每個drbd裝置會有三個進程:drbd0_worker是drbd0的主要進城,drbd0_asender是primary上drbd0的資料發送進程,drbd0_receiver是secondary上drbd0的資料接收進程。

看看剛啟動後的drbd狀態:

[root@drbd-1
/]# cat /proc/drbd
version: 8.2.6 (api:88/proto:86-88)
GIT-hash:
3e69822d3bb4920a8c1bfdf7d647169eba7d2eb4 build by root@drbd-1, 2008-09-17
17:46:45
0: cs:Connected st: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
oos:6291456

[root@drbd-2 /]# cat /proc/drbd
version: 8.2.6
(api:88/proto:86-88)
GIT-hash: 3e69822d3bb4920a8c1bfdf7d647169eba7d2eb4 build
by root@drbd-2, 2008-09-17 17:51:50
0: cs:Connected st: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
oos:6291456

注意:這個時候,2台伺服器都為從節點狀態(st:Secondary/Secondary),因為還沒有指定哪一台為主節點。

然後,設定啟動的一個節點為主節點,我們設定drbd-1為主節點:

[root@drbd-1
/]# drbdadm primary db
State change failed: (-2) Refusing to be Primary
without at least one UpToDate disk
Command 'drbdsetup /dev/drbd0 primary'
terminated with exit code 11

[root@drbd-1 /]# drbdsetup /dev/drbd0
primary -o

可以看到,第一次設定主節點時用 drbdadm 命令會失敗,所以先用drbdsetup 來做,以後就可以用 drbdadm
了。

再次查看2台伺服器的drbd狀態:

[root@drbd-1 /]# cat
/proc/drbd
version: 8.2.6 (api:88/proto:86-88)
GIT-hash:
3e69822d3bb4920a8c1bfdf7d647169eba7d2eb4 build by root@drbd-1, 2008-09-17
17:46:45
0: cs:SyncSource st:Primary/Secondary ds:UpToDate/Inconsistent C
r---
ns:3483280 nr:0 dw:0 dr:3491456 al:0 bm:212 lo:1 pe:8 ua:256 ap:0
oos:2808416
[==========>.........] sync'ed: 55.5%
(2742/6144)M
finish: 0:11:24 speed: 4,084 (4,648)
K/sec

[root@drbd-2 /]# cat /proc/drbd
version: 8.2.6
(api:88/proto:86-88)
GIT-hash: 3e69822d3bb4920a8c1bfdf7d647169eba7d2eb4 build
by root@drbd-2, 2008-09-17 17:51:50
0: cs:SyncTarget st:Secondary/Primary
ds:Inconsistent/UpToDate C r---
ns:0 nr:3556832 dw:3556832 dr:0 al:0
bm:217 lo:1 pe:2464 ua:0 ap:0 oos:2734624
[==========>.........]
sync'ed: 56.7% (2670/6144)M
finish: 0:07:35 speed: 5,856 (4,128)
K/sec

此時可以看到,已經開始同步資料了。設定完之後的第一次同步耗時比較長,因為需要把整個分區的資料全部同步一遍。

第一次同步完成之後,就可以對drbd的裝置建立檔案系統了:

[root@drbd-1
/]# mkfs.ext3 /dev/drbd0

將檔案系統mount上:

[root@drbd-1 /]# mount
/dev/drbd0 /drbddata

在主節點上測試資料寫入:

[root@drbd-1 drbddata]#
ll
total 4
drwx------ 4 mysql root 4096 Oct 13 16:29
mysql

然後,我們把primary降級成secondary,把secondary提升成primary:

[root@drbd-1
/]# umount /drbddata/
[root@drbd-1 /]# drbdadm secondary
db

把primary降級前,一定要先umount裝置才行。然後提升secondary:

[root@drbd-2 /]#
drbdadm primary db
[root@drbd-2 /]# mount /dev/drbd0
/drbddata/
[root@drbd-2 drbddata]# ll
total 4
drwx------ 4 mysql root
4096 Oct 13 16:29
mysql

可以看到,資料已經完全同步過去了。

下面就要開始和heartbeat的整合了,前面heartbeat已經安裝過,只需要修改下設定檔就可以了,

cp
/usr/share/doc/heartbeat-2.1.3/ha.cf .
cp
/usr/share/doc/heartbeat-2.1.3/authkeys .
cp
/usr/share/doc/heartbeat-2.1.3/haresources
.

配置ha.cf(ha主要設定檔):

[root@drbd-1 ha.d]# more ha.cf
logfile
/var/log/ha-log
logfacility local0
keepalive
2
deadtime 30
warntime 10
initdead
120
udpport 694
bcast eth0
auto_failback
off
node drbd-1
node drbd-2
ping_group group1
192.168.1.1 192.168.1.254
respawn root /usr/lib/heartbeat/ipfail
apiauth
ipfail gid=root uid=root

配置authkeys認證:

[root@drbd-1 ha.d]# more
authkeys
auth 1
1 crc

配置haresources資源檔:

drbd-1 drbddisk
Filesystem::/dev/drbd0::/drbddata::ext3 mysql
192.168.1.243

注意:

資源群組設定檔主要是配置切換過程需要管理的各種資源的,有一個很關鍵的點,那就是一個資源群組中的各個資源的排列順序是需要注意的,在hearbeat管理資源群組的時候,擷取資源的過程是從左往右依次處理,釋放資源的時候是從右往左依次處理。

資源群組的第一列是我們在ha.cf設定檔中的node之一,而且應該是當前準備作為primary節點的那一個node。

上面資源群組中的各項含義如下:

drbd-1 當前primary節點名(uname
-n)

drbddisk 告訴heartbeat要管理drbd的資源

Filesystem
這裡是告訴heartbeat需要管理檔案系統資源,其實實際上就是執行mount/umount命令,後面的“::”符號之後是跟的Filesystem的參數
裝置名稱和mount點)
mysql 告訴需要管理mysql

192.168.1.243
這裡是讓heartbeat幫你管理一個service ip,會跟著主節點一起漂移

測試切換:

1) 手工調用heartbeat的節點切換指令碼:

執行/usr/lib/heartbeat/hb_standby
指令碼,讓heartbeat通知對方節點自己請求變成standby節點,請求對方成為primary節點,切換工作在10s左右即完成.

2)
拔掉網線,測試在primary節點的網路斷開後的切換情況

通過測試,在拔掉網線後,當主節點發現無法和standby節點無法通訊後,會在log中記錄warn資訊,如果延續時間達到在ha.cf中設定的時間長度後,會開始釋放資
源,standby節點發現無法和主節點通訊一段時間(ha.cf設定)後,開始嘗試啟動資源並將自己active成primary節點。切換過程除開ha.cf中設定的時間長度之外
的時間段同樣非常短。

3) shutdown primary主機,測試是否能夠正常切換,基本上和上面測試2差不多。

4) primary node 掉電測試,這裡還沒有到機房實際操作過,後面會繼續測試這個操作。

測試結果:

1,正常切換,資料完整。
2,正常切換,但是主從資料相差一條。
3,正常切換,資料完整。

4,正常切換,資料完整。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.