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! 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,正常切換,數據完整。
====================================================
1、下載對應版本的heartbeat包
由於安裝beartbeat的rpm包需要其他一些包為前提條件,所以可能還需要下載對應版本的其他的幾個rpm包,像如下:
[root@MySQL1 heartbeat]# rpm -ivh heartbeat-2.1.3-3.el4.centos.i386.rpm
warning: heartbeat-2.1.3-3.el4.centos.i386.rpm: V3 DSA signature: NOKEY, key ID 443e1821
error: Failed dependencIEs:
heartbeat-pils = 2.1.3-3.el4.centos is needed by heartbeat-2.1.3-3.el4.centos.i386
heartbeat-stonith = 2.1.3-3.el4.centos is needed by heartbeat-2.1.3-3.el4.centos.i386
libpils.so.1 is needed by heartbeat-2.1.3-3.el4.centos.i386
libstonith.so.1 is needed by heartbeat-2.1.3-3.el4.centos.i386
然後下載heartbeat-pils-2.1.3-3.el4.centos.i386.rpm和heartbeat-stonith-2.1.3-3.el4.centos.i386.rpm,
在安裝這兩個包之後,即可正常安裝heartbeat了。
2、配置相關文件
1) 找到安裝後heartbeat的文檔目錄,將三個需要的配置文件樣例copy到/etc/ha.d目錄下准備後面的配置設
置(這樣會更方便,而且有較為詳細的配置說明):
[root@MySQL1 ha.d]# rpm -q heartbeat -d
… /usr/share/doc/heartbeat-2.1.3/AUTHORS
… [root@MySQL1 ha.d]# cp /usr/share/doc/heartbeat-2.1.3/ha.cf .
[root@MySQL1 ha.d]# cp /usr/share/doc/heartbeat-2.1.3/authkeys .
[root@MySQL1 ha.d]# cp /usr/share/doc/heartbeat-2.1.3/haresources .
2) 配置ha.cf(ha主要配置文件):
logfacility local0 #這個是設置heartbeat的日志,這裡是用的系統日志
keepalive 500ms #多長時間檢測一次
deadtime 10 #連續多長時間聯系不上後認為對方掛掉了(單位是妙)
warntime 5 #連續多長時間聯系不上後開始警告提示
initdead 100 #這裡主要是給重啟後預留的一段忽略時間段(比如:重啟後啟動網絡等,
如果在網絡還沒有通,keepalive檢測肯定通不過,但這時候並不能切換)
bcast eth0
auto_failback off #恢復正常後是否需要再自動切換回來
node MySQL1 #節點名(必須是集群中機器的主機名,通過uname -n取得)
node MySQL2 #節點名(必須是集群中機器的主機名,通過uname -n取得) ping 10.0.65.250
respawn hacluster /usr/lib/heartbeat/ipfail #這裡是配置ip綁定和切換的功能,
ipfail就是控制ip切換的程序
apiauth ipfail gid=haclIEnt uid=hacluster #控制ip切換的時候所使用的用戶
deadping 5
2) haresources 資源組文件配置(v1 style):
[root@MySQL1 ha.d]# cat haresources
mysql1 drbddisk Filesystem::/dev/drbd0::/drbddata::ext3 MySQL 10.0.65.44
資源組配置文件主要是配置切換過程需要管理的各種資源的,有一個很關鍵的點,那就是一個資源組中的各個資源
的排列順序是需要注意的,在hearbeat管理資源組的時候,獲取資源的過程是從左往右依次處理,釋放資源的時候是從
右往左依次處理。
資源組裡面的資源可以是ip的管理,可以是各種服務,也可以是我們自己寫的各種腳本,甚至可以是需要傳參數的
腳本(通過::來分割參數)。每一行代表一個資源組,每個資源組之間沒有必然的關系。
資源組的第一列是我們在ha.cf配置文件中的node之一,而且應該是當前准備作為primary節點的那一個node。
上面資源組中的各項含義如下:
MySQL1 當前primary節點名(uname -n)
drbddisk 告訴heartbeat要管理drbd的資源
Filesystem 這裡是告訴heartbeat需要管理文件系統資源,其實實際上就是執行mount/umount命令,
後面的“::”符號之後是跟的Filesystem的參數(設備名和mount點)
mysql 告訴需要管理MySQL
10.0.65.44 這裡是讓heartbeat幫你管理一個service ip,會跟著主節點一起漂移
3) authkeys 通信認證配置文件
root@MySQL2:/root>cat /etc/ha.d/authkeys
auth 2 #認證方式,有如下三種
#1 crc #
2 sha1 HI!
#3 md5 Hello!
3、測試切換:
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 掉電測試,這裡還沒有到機房實際操作過,後面會繼續測試這個操作。
注:以上測試都是基於Heartbeat v1 style的設置情況下所作,由於v1 style配置的heartbeat沒辦法做到對資源狀態的監控,drbddisk RA, although
主要職能通過監控與對方節點以及集群對外的網絡狀況的監控,而v2 style的配置已經提控了對資源狀態的監控,所以後面准備再
針對v2 style的heartbeat進行詳細一點的測試。不過,在Linux-ha網站上面發現有一個聲明,說drbd的作者建議用戶繼續
使用v1 style來讓heartbeat管理drbd資源(http://www.Linux-ha.org/DRBD/HowTov2),詳細的原因並沒有說明。
原文如下:
Note: as of 2008-02-15, the DRBD developers recommend to use the v1