mysql+drbd+heartbeat實現高可用性

來源:互聯網
上載者: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!  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.