DRBD(Distributed Replicated Block Device):分布式复制块设备

http://www.drbd.org/

http://en.wikipedia.org/wiki/DRBD

DRBD,分布式复制块设备,是一种通过TCP/IP网络实现块设备数据实时镜像的方案。利用这种方案,单一主节点模式(single primary mode)双机系统能够实时地将业务数据保存在主备节点的磁盘中,正常情况下两个节点的数据是一模一样的。

DRBD's authors originally submitted the software to the Linux kernel community in July 2007, for possible future inclusion of DRBD into the "vanilla" (standard, without modifications) Linux kernel.[3] After a long time of review and several discussions, Linus Torvalds finally agreed to have DRBD as part of the official Linux kernel. DRBD got merged on 8 December 2009 during the "merge window" for Linux kernel version 2.6.33.

一旦主节点发生故障(比如磁盘写失败、断电之类),双机管理系统就将业务倒换到备节点,从外部看来,数据还是完整无缺。所以理论上来讲,DRBD这一方面相比于商业应用中的共享磁盘阵列方案,避免了共享磁阵潜在的单点故障风险。而DRBD另一个吸引某些人的地方是,其开发商(www.linbit.com)提供商业版本DRBD服务和开源DRBD源代码,所以成了Linux系统下构建低成本高可用(high availability)双机系统的可选组件。

不过DRBD由于通过网络来写数据,一方面网络传输引起的延迟显然要远远大于共享磁阵,另一方面网络带宽的限制也拖了后腿,所以对于目前的DRBD来说,可能比较适用于业务数据量较低的应用。对于这种应用场景,相比于使用磁盘阵列,成本更低而增加市场竞争力。

一、DRBD+Heartbeat 架設 HA NFS Server on CentOS 5

目標 : 由於 NFS Server 在公司非常重要,如果不能服務將會造成許多人無法工作,所以利用 DRBD 與 Heartbeat 來做出可以在NFS 主機當機時, NFS Server 會自動切換到備用機,來達成不停止服務的目標
目前這個方案的缺點是無法兩台同時服務,下次的目標是做出可以同時服務的 Cluster。

0. 環境
兩台主機 node1, node2, 虛擬 ip (vip) 為 172.16.1.10
node1 172.16.1.11
node2 172.16.1.12
vip 172.16.1.10
兩台均有兩顆硬碟, /dev/sda 作 OS 使用, 而 /dev/sdb 作 data 使用

在兩台主機
vi /etc/hosts
172.16.1.11 node1
172.16.1.12 node2

注意 主機名稱需與 /etc/sysconfig/network 的 HOSTNAME 相符
若有帶網域名稱, 則 /etc/hosts 也要使用網域名稱

1. 安裝套件

[node01],[node02] 皆執行
# yum -y install drbd83 kmod-drbd83 portmap nfs-utils heartbeat

NFS Service:
請設定 portmap 預測啟動, nfs 則可以不用 , Heartbeat 會自行啟動
[node01],[node02] 皆執行
chkconfig portmap on
service portmap start
service nfs on

NFS 分享設定: 分享 /data
[node01],[node02] 皆執行
vim /etc/exports
/data 172.16.1.0/255.255.255.0(rw,no_root_squash,no_all_squash,sync)

2. DRBD
分顆硬碟:
fdisk /dev/sdb -> 整顆切一塊為 /dev/sdb1
並會將 /dev/sdb1 在 drbd 指定為 r0 , 如下

設定 drbd.conf:
[node01],[node02] 皆執行
vim /etc/drbd.conf

  1. global {  
  2. usage-count yes;  
  3. }  
  4.  
  5. common {  
  6. syncer { rate 100M; }  
  7. }  
  8.  
  9. resource r0 {  
  10. protocol C;  
  11. startup {  
  12. wfc-timeout 0;  
  13. degr-wfc-timeout 120;  
  14. }  
  15.  
  16. disk {  
  17. on-io-error detach;  
  18. # no-disk-flushes;  
  19. # no-md-flushes  
  20. # size 1G;  
  21. }  
  22.  
  23. net {  
  24. }  
  25.  
  26. on node01 {  
  27. device /dev/drbd0;  
  28. disk /dev/sdb1;  
  29. address 172.16.1.12:7788;  
  30. meta-disk internal;  
  31. }  
  32.  
  33. on node02 {  
  34. device /dev/drbd0;  
  35. disk /dev/sdb1;  
  36. address 172.16.1.12:7788;  
  37. meta-disk internal;  
  38. }  

初始化 drbd :
node01, node02 兩台都執行以下指令

drbdadm create-md r0
chkconfig drbd on

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

查看 drbd 狀態, 一開始 node01, node02 都會是 Secondary 的狀態
cat /proc/drbd
version: 8.3.2 (api:88/proto:86-90)
GIT-hash: dd7985327f146f33b86d4bff5ca8c94234ce840e build by mockbuild@v20z-x86-64.home.local, 2009-08-29 14:02:24
0: 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:1044124

等 drbd 作完後, 把 node01 的 drbd 設為 primary
[node01]# drbdadm primary r0

作完後,開始格式化
[node01]# mkfs.ext3 /dev/drbd0
[node01]# mount /dev/drbd0 /data

注意: 若此時要變更 primary 由 node01 到 node02, 最安全的方法
先將 node01 變成 secondary, 即兩台都是 secodary
[node01]# umount /data
[node01]# drbdadm secondary r0
此時才把 node01 提升為 primary
[node02]# drbdadm primary r0
[node02]# mount /data

3. HA 的部分
[node01], [node02] 兩台設定均同

vim /etc/ha.d/ha.cf

  1. #debugfile /var/log/ha-debug.log  
  2. logfile /var/log/ha-log  
  3. logfacility local0  
  4.  
  5. keepalive 2 #設定心跳(監測)時間時間為2秒  
  6. warntime 5  
  7. deadtime 20  
  8. initdead 120  
  9. #hopfudge 1  
  10.  
  11. udpport 694 #使用 UDP Port 694 進行心跳監測  
  12. auto_failback off #如果主要伺服器故障後修復完成,另一台伺服器是否該放棄資源  
  13. #baud 19200  
  14. bcast eth0 #使用eth0做心跳監測 (注意:如果電腦只有 eth0, 請改成 eth0)  
  15. #ucast eth0 172.16.1.11  
  16.  
  17. #watchdog /dev/watchdog  
  18. #crm on  
  19.  
  20. node node01 #節點1,必須要與 hostname 或 uname -n 顯示的主機名稱相符合才可以,此處也可以寫為 node01  
  21. node node02 #節點2,此處也可以寫為 node02  
  22.  
  23. ping 172.16.1.254 #使用 ping Gateway 當成檢查主要主機是否仍在運作 (心跳是否正常)  
  24. #ping 172.16.1.11 172.16.1.12 172.16.1.10  
  25. #deadping 5  
  26.  
  27. #ping_group lbgroup 10.0.0.101 10.0.0.102  
  28. #ping_group lbgroup 172.16.1.11 172.16.1.12  
  29.  
  30. #設定和 heartbeat 一起啟動、關閉的進程  
  31. respawn hacluster /usr/lib/heartbeat/ipfail  
  32. apiauth ipfail gid=haclient uid=hacluster 

# vim /etc/ha.d/authkeys

  1. auth 1  
  2. 1 crc 

# chmod 600 /etc/ha.d/authkeys

# vim /etc/ha.d/haresources

  1. node01 IPaddr::172.16.1.10/24/eth0 drbddisk::r0 Filesystem::/dev/drbd0::/data::ext3 nfs 

# vim /etc/ha.d/resource.d/nfs

  1. killall -9 nfsd; /etc/init.d/nfs restart; exit 0 

以上參考所實作,

http://forum.icst.org.tw/phpbb/viewtopic.php?f=10&t=17893&start=0

啟動與測試:

假設 node01 是主結點, node02 為副節點,所以請在 [node01] 執行後, 再到 [node02] 執行
[node01]# service heartbeat start
[node01]# /etc/init.d/heartbeat start
[node02]# service heartbeat start
[node02]# /etc/init.d/heartbeat start

Case01, 假設 node01 死掉, 切到 node02
[node01]# /etc/init.d/heartbeat stop
將會把 VIP (172.16.1.10) 切到 node02

建議, 若 node01 若恢復正常, 請將 heartbeat 切回去
[node01]# /etc/init.d/heartbeat start
[node02]# /etc/init.d/heartbeat stop
[node01]# /etc/init.d/heartbeat start

Case02: 若在切回至 node01 , 相當於假設 node02 死掉 
要先讓 node01 的 heartbeat 為啟動狀態, 才能從 node02 接手過來
[node01]# /etc/init.d/heartbeat start
[node02]# /etc/init.d/heartbeat stop
等 node02 恢復
[node02]# /etc/init.d/heartbeat start
此時 VIP 仍在 node01

ps.
原有兩個錯誤
1. /etc/ha.d/haresources 內容為,
centos1.lu.idv.tw IPaddr::192.168.128.100/22/eth0 drbddisk::r0 Filesystem::/dev/drbd0::/d::ext3 nfs
遮罩應為 24, 才能順利啟動 heartbeat

2. /etc/ha.d/resource.d/killnfsd, 根據 haresources 設定名稱應為 /etc/ha.d/resource.d/nfs,
否則 heartbeat 會找不到 /etc/ha.d/resource.d/nfs, 而無法順利啟動 nfs service

************************************************

heartbeat + drbd 分布式系统的master

下图是drbd主页上一个结构图,感觉这才是冗余的,单个盘柜根本就是单点。

Heartbeat drbd Nfs - Homer - notnumb的博客


通过163的yum源安装heartbeat和drbd
# rpm -qa | grep drbd
drbd83-8.3.2-6.el5_3
kmod-drbd83-8.3.2-6.el5_3

CentOS5-1  192.168.170.51
CentOS5-2  192.168.170.52
floating ip 192.168.170.50

cat hosts
192.168.170.50  CentOS5
192.168.170.51  CentOS5-1
192.168.170.52  CentOS5-2


配置51,52两个节点的nfs服务
cat /etc/exports
/data/drbd 192.168.170.0/24(rw,sync)

配置drbd
先在两台机器上创建lvm分区

我是建立在lvm上面的
    pvcreate /dev/sdc1
    vgcreate vg_drbd /dev/sdc1
    lvcreate -l 1010M -n lv_drbd vg_drbd

lvs显示
  LV      VG      Attr   LSize    Origin Snap%  Move Log Copy%  Convert
  lv_drbd vg_drbd -wi-ao 1012.00M

分别在两台机器上启用drbd模块
#modprobe drbd
或者
#insmod /lib/modules/2.6.18-128.7.1.el5/extra/drbd83/drbd.ko

# lsmod | grep drbd
drbd                  220440  4

写两台机器的配置文件/etc/drbd.conf
global {
  usage-count yes;
}
common {
  syncer { rate 100M; }
}
resource r0 {
  protocol C;
  disk {
    on-io-error detach;
  }
  net {
        cram-hmac-alg sha1;
        shared-secret "ztpztp";
      }
  on CentOS5-1 {
    device     /dev/drbd0;
    disk       /dev/vg_drbd/lv_drbd;
    address    192.168.170.51:7788;
    meta-disk  internal;
  }
  on CentOS5-2 {
    device    /dev/drbd0;
    disk      /dev/vg_drbd/lv_drbd;
    address   192.168.170.52:7788;
    meta-disk internal;
  }
}



在两台机器上分别创建drbd的meta-data

# drbdadm create-md r0

md_offset 4294963200
al_offset 4294930432
bm_offset 4294799360

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

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

Writing meta data...
initializing activity log
NOT initialized bitmap
New drbd meta data block successfully created.

分别启动drbd服务
/etc/init.d/drbd start
 
查看状态

# /etc/init.d/drbd status
drbd driver loaded OK; device status:
version: 8.3.2 (api:88/proto:86-90)
GIT-hash: dd7985327f146f33b86d4bff5ca8c94234ce840e build by mockbuild@v20z-x86-64.home.local, 2009-08-29 14:02:24
m:res  cs         ro                   ds                 p  mounted  fstype
0:r0   Connected  Secondary/Secondary  UpToDate/UpToDate  C

在任一一台上执行
# drbdsetup /dev/drbd0 primary -o

# cat /proc/drbd
GIT-hash: d30881451c988619e243d6294a899139eed1183d build by mockbuild@v20z-x86-64.home.local, 2009-08-22 13:23:34
 0: cs:SyncSource st:Primary/Secondary ds:UpToDate/Inconsistent C r---
    ns:1588972 nr:0 dw:0 dr:1597120 al:0 bm:96 lo:2 pe:19 ua:256 ap:0
        [======>.............] sync'ed: 37.9% (2605756/4194140)K
        finish: 0:01:42 speed: 25,384 (24,064) K/sec
        resync: used:2/61 hits:99450 misses:98 starving:0 dirty:0 changed:98
        act_log: used:0/127 hits:0 misses:0 starving:0 dirty:0 changed:0


DL380G5 实际测试了下4块146GB RAID1+0 10000转SAS
同步速度
cat /proc/drbd
version: 8.3.2 (api:88/proto:86-90)
GIT-hash: dd7985327f146f33b86d4bff5ca8c94234ce840e build by mockbuild@v20z-x86-64.home.local, 2009-08-29 14:07:55
 0: cs:SyncTarget ro:Secondary/Primary ds:Inconsistent/UpToDate C r----
    ns:0 nr:42637888 dw:42637632 dr:0 al:0 bm:2602 lo:9 pe:4598 ua:8 ap:0 ep:1 wo:b oos:244037380
    [=>..................] sync'ed: 14.9% (238316/279956)M
    finish: 0:36:40 speed: 110,856 (102,248) K/sec

平均100MB左右的传输速度,同步完成273.4GB差不多。
4块刚好1Gb够用。
间接证明我bond失败,要更新驱动再看看。

primary
Device:         rrqm/s   wrqm/s   r/s   w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
cciss/c0d1     1689.50     0.00 1516.50  6.50 205408.00     6.50   134.87     8.24    5.42   0.58  89.05

slave
cciss/c0d1        0.00  1687.00  0.00 1523.00     0.00 205606.00   135.00     2.00    1.31   0.59  89.75

完成
# cat /proc/drbd
GIT-hash: d30881451c988619e243d6294a899139eed1183d build by mockbuild@v20z-x86-64.home.local, 2009-08-22 13:23:34
 0: cs:Connected st:Primary/Secondary ds:UpToDate/UpToDate C r---
    ns:4194140 nr:0 dw:0 dr:4194140 al:0 bm:256 lo:0 pe:0 ua:0 ap:0
        resync: used:0/61 hits:261878 misses:256 starving:0 dirty:0 changed:256
        act_log: used:0/127 hits:0 misses:0 starving:0 dirty:0 changed:0

格式化 mkfs.ext3 /dev/drbd0之后,就可以做块设备使用了。


分别在两台机器上配置heartbeat
#yum install heartbeat watchdog
#rpm -qa | egrep 'watchdog|heartbeat'
heartbeat-pils-2.1.3-3.el5.centos
watchdog-5.6-1.el5
heartbeat-2.1.3-3.el5.centos
heartbeat-stonith-2.1.3-3.el5.centos

ldmod检查softdog模块是否加载

# cat /etc/ha.d/authkeys
auth 1
1 crc

# cat /etc/ha.d/haresources
CentOS5-1 IPaddr::192.168.170.50/24/eth0 drbddisk::r0 Filesystem::/dev/drbd0::/data/drbd::ext3 portmap killnfsd

# cat /etc/ha.d/resource.d/killnfsd
pkill -9 nfsd ; /etc/init.d/nfs restart ; exit 0

# cat /etc/ha.d/ha.cf
watchdog /dev/watchdog
logfile /var/log/ha-log
bcast eth1
keepalive 2
warntime 5
deadtime 15
initdead 30
udpport 694
auto_failback off
node CentOS5-1 CentOS5-2
ping 192.168.170.1
respawn hacluster /usr/lib/heartbeat/ipfail


分别启动
#/etc/init.d/heartbeat start
可以从日志体现出来

[root@CentOS5-1 ~]# cat /proc/drbd
version: 8.3.2 (api:88/proto:86-90)
GIT-hash: dd7985327f146f33b86d4bff5ca8c94234ce840e build by mockbuild@v20z-x86-64.home.local, 2009-08-29 14:02:24
 0: cs:Connected ro:Secondary/Secondary ds:UpToDate/UpToDate C r----
    ns:32 nr:8 dw:1215004 dr:123197 al:21 bm:27 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

过一会之后
[root@CentOS5-1 ~]# cat /proc/drbd
version: 8.3.2 (api:88/proto:86-90)
GIT-hash: dd7985327f146f33b86d4bff5ca8c94234ce840e build by mockbuild@v20z-x86-64.home.local, 2009-08-29 14:02:24
 0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r----
    ns:36 nr:8 dw:1215008 dr:123214 al:21 bm:27 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0


自动挂载/dev/drbd0 到/data/drbd
/dev/drbd0            997M   22M  924M   3% /data/drbd

[root@CentOS5-1 ~]# ifconfig eth0:0
eth0:0    Link encap:Ethernet  HWaddr 08:00:27:62:6A:05
          inet addr:192.168.170.50  Bcast:192.168.170.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          Interrupt:11 Base address:0xd020


nfs共享分区下测试脚本
#!/bin/bash
while true
do
  echo     ---\> trying dd file.img : `date`
  dd if=/dev/zero of=file.img count=1024 bs=4k
  echo     \<----- done dd file.img : `date`
  echo
  sleep 2
done

在客户端上运行,测试切换是否影响服务。会中断一会。不会stale nfs handle
直接关闭CentOS5-1的电源, 或者kill heartbeat nfsd的进程,watchdog则会生效,自动重启CentOS5-1
相当于是一个软的fence设备,只要内核没挂,其他情况都能生效。

CentOS5-2上
drbd自动切换,floating ip,nfs服务
#cat /proc/drbd
[root@CentOS5-2 ~]# cat /proc/drbd
primary/unknow

CentOS5-1重启之后
0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r----

重启CentOS5-1之后
[root@CentOS5-1 ~]# cat /proc/drbd
version: 8.3.2 (api:88/proto:86-90)
GIT-hash: dd7985327f146f33b86d4bff5ca8c94234ce840e build by mockbuild@v20z-x86-64.home.local, 2009-08-29 14:02:24

可以看到client端的脚本没有中断,继续执行,当前挂载的目录也是可用的
 0: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r----
    ns:0 nr:86016 dw:86016 dr:0 al:0 bm:12 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0

drbd除了性能上被网络打了折扣,其他都还好。







切换drbd到不同状态 drbdadm primary/secondary r0
在线修改配置后       drbdadm adjust r0

之前在网上看篇帖子,要先格式化磁盘,再初始化drbd,我这里先格式化之后总是出问题。
执行命令 drbdadm create-md r0   出错!

[root@centos1 ~]# drbdadm create-md r0
md_offset 1069248512
al_offset 1069215744
bm_offset 1069182976

Found ext3 filesystem which uses 1044192 kB
current configuration leaves usable 1044124 kB

Device size would be truncated, which
would corrupt data and result in
'access beyond end of device' errors.
You need to either
   * use external meta data (recommended)
   * shrink that filesystem first
   * zero out the device (destroy the filesystem)
Operation refused.

Command 'drbdmeta /dev/drbd1 v08 /dev/sdb1 internal create-md' terminated with exit code 40
drbdadm create-md r0: exited with code 40



错误解决方案
# which means

    * you created your filesystem before you created your DRBD resource, or
    * you created your filesystem on your backing device, rather than your DRBD,

# neither of which is a problem by itself, except - as the error message tries to hint - you need to enlarge the device (e.g. lvextend), shrink the filesystem (e.g. resize2fs),

or place the DRBD metadata somewhere else (external meta data).
# DRBD tries to detect an existing use of the block device in question. E.g. if it detects an existing file system that uses all the available space (as is default for most

filesystems), and you try to use DRBD with internal meta data, there is no room for the internal meata data - creating that would corrupt the last few MiB of the existing file

system.
# If re-creating the filesystem on the DRBD is an option, one way to "zero out the device (destroy the filesystem)", and then recreate it on the DRBD is

dd if=/dev/zero bs=1M count=1 of=/dev/sdc1; sync
drbdadm create-md $r
/etc/init.d/drbd start
primary机器上执行
drbdadm -- -o primary $r 开始同步
mkfs /dev/drbdY

# If drbdadm would not refuse, you would soon be back reading the next answer.

清空了磁盘格式化信息,在初始化meta-data,同步后在格式化块设备。


如果出现primany/unknow和secondary/unknow 的状况

通过查看/proc/drbd可以查看所有drbd资源当前的状态.
[root@oem3 ~]# cat /proc/drbd
version: 8.2.6 (api:88/proto:86-88)
GIT-hash: 3e69822d3bb4920a8c1bfdf7d647169eba7d2eb4 build by buildsvn@c5-x8664-build, 2008-10-03 11:30:17
0: cs:Connected st:Secondary/Secondary ds:UpToDate/UpToDate C r---
    ns:0 nr:811016 dw:811016 dr:0 al:0 bm:61 lo:0 pe:0 ua:0 ap:0 oos:0
1: cs:Connected st:Secondary/Secondary ds:UpToDate/UpToDate C r---
    ns:0 nr:8 dw:8 dr:0 al:0 bm:1 lo:0 pe:0 ua:0 ap:0 oos:0
其中cs表示连接的状态, 常见的状态有,StandAlone,WFConnection,Connected等, Connected表示该resource的节点已经建立连接, WFConnection表示在等待连接, 常在启动过程中, 或者另外一方运行

disconnect后出现, StandAlone表示没有可用的网络配置, 常在运行disconnect后出现.
ds表示磁盘的状态,常见的状态有UpToDate, Unknown等, UpToDate表示表示数据是最新的,这一状态为正常状态, Unknow表示对方状态是未知的, 网络断开后, 对方节点的磁盘状态常变为Unknown.
drbd kernel module 会写一些日志到系统日志中, 可以通过dmesg查看
mirrorview的fracture/synchronize过程模拟如下:
1 在2个节点上attatch, connect resource,
2 检查磁盘状态为UpToDate/UptoDate, 连接状态为Connected, 状态为Primary/Secondary
3 在2个节点上disconnect resource, 此时连接状态应变为StandAlone, 状态变为Primary/Unknown(第1个节点)或Secondary/Unknown, 磁盘状态变为UpToDate/DUnknown
drbdadm disconnect resource
4 在第2个节点上将resource置为primary, 状态变为Primary/Unknown
drbdadm primary resource
5 在第2个节点上对resource对应的逻辑设备进行操作, 比如挂载文件系统, 备份等.
6 操作结束后, 停止对resource对应的逻辑设备的访问, 卸载文件系统
7 在第2个节点上, 将resorce置为Secondary
drbdadm secondary resource
8 在第1个节点上连接资源
drbdadm connect resource
9 在第2个节点上忽略数据变化, 同步数据,
drbdadm -- --discard-my-data connect resource
如果使用了普通的connect数据, 则一个节点处于WFconenct, 一个节点处于Standalone状态, dmesg信息中显示
drbd0: Split-Brain detected, dropping connection!
drbd0: self BF739B73E097B05E:D3B06FBE563C5580:7D4CAACF55C1C208:A625E780FF79A3B7
drbd0: peer 2FE125710E63486F:D3B06FBE563C5581:7D4CAACF55C1C208:A625E780FF79A3B7
drbd0: helper command: /sbin/drbdadm split-brain
drbd0: conn( WFReportParams -> Disconnecting )
此时只需要执行步骤8和9即可.
10 通过/proc/drbd检查同步状态, 直到磁盘状态变为UpToDate/UptoDate


在线扩展drbd,先扩展lvm,再使用drbd的resize就行了。
drbdadm primary r0
vgextend vg_drbd /dev/sdd1
lvextend -L +1010M /dev/vg_drbd/lv_drbd
cat /proc/drbd
drbdadm resize r0
cat /proc/drbd

***********************************************************************

二、heartbeat+drbd

    如果主服务器宕机,造成的损失是不可估量的。要保证主服务器不间断服务,就需要对服务器实现冗余。在众多的实现服务器冗余的解决方案中,heartbeat为我们提供了廉价的、可伸缩的高可用集群方案。我们通过heartbeat+drbd在Linux下创建一个高可用(HA)的集群服务器。
    DRBD是一种块设备,可以被用于高可用(HA)之中。它类似于一个网络RAID-1功能。当你将数据写入本地文件系统时,数据还将会被发送到网络中另一台主机上。以相同的形式记录在一个文件系统中。本地(主节点)与远程主机(备节点)的数据可以保证实时同步。当本地系统出现故障时,远程主机上还会保留有一份相同的数据,可以继续使用。在高可用(HA)中使用DRBD功能,可以代替使用一个共享盘阵。因为数据同时存在于本地主机和远程主机上。切换时,远程主机只要使用它上面的那份备份数据,就可以继续进行服务了。

安装heartbeat

[root@manager src]# rpm -ivh e2fsprogs-1.35-7.1.i386.rpm
[root@manager src]# tar zxvf libnet.tar.gz
[root@manager libnet]# ./configure
[root@manager libnet]# make
[root@manager libnet]# make install
[root@manager src]# tar zxvf heartbeat-2.1.2.tar.tar
[root@manager src]# cd heartbeat-2.1.2
[root@manager heartbeat-2.1.2]# ./ConfigureMe configure
[root@manager heartbeat-2.1.2]# make
[root@manager heartbeat-2.1.2]# make install
[root@manager heartbeat-2.1.2]# cp doc/ha.cf /etc/ha.d/
[root@manager heartbeat-2.1.2]# cp doc/haresources /etc/ha.d/
[root@manager heartbeat-2.1.2]# cp doc/authkeys /etc/ha.d/
[root@manager heartbeat-2.1.2]# cd /etc/ha.d/
开始编辑配置文件(两台机器上都需要安装和配置)
(heartbeat的配置比较简单,网上也有很多例子,这里就不多废话了)

clip_image001

开始编译安装DRBD

[root@manager root]# cp drbd-8.2.1.tar.tar /usr/src/
[root@manager root]# cd /usr/src/
[root@manager src]# tar zxvf drbd-8.2.1.tar.tar
[root@manager src]# cd drbd-8.2.1
[root@manager src]# make KERNVER=2.6.17.11 KDIR=/usr/src/linux-2.6.17.11

如果编译顺利可以看到Module build was successful.
[root@manager drbd-8.2.1]# make install

可以编辑配置文件了

[root@manager drbd-8.2.1]# vi /etc/drbd.conf
在manager和manage_bak上都需要安装drbd服务。
分别在两台机器上配置好/etc/drbd.conf
[root@manager_bak root]# grep -v "#" /etc/drbd.conf
global {
    usage-count yes;                  (是否参加使用者统计,yes为参加)
}
common {
  syncer { rate 300M; }
}
resource r0 {
  protocol C;                            (数据同步协议,C为收到数据并写入后返回,确认成功)
  disk {
    on-io-error   detach;
     size 100G;                         (由于实验环境下两台服务器硬盘大小不同,所以需要设置drbd的大小)
  }
  net {
    after-sb-0pri disconnect;
    rr-conflict disconnect;
  }
  syncer {
    rate 300M;                           (设置网络同步速率)
    al-extents 257;
  }
  on manager_bak {
    device     /dev/drbd0;
    disk       /dev/sda3;
    address    192.168.0.2:7788;
    meta-disk  internal;
  }
  on manager {
    device    /dev/drbd0;
    disk      /dev/sdc;
    address   192.168.0.1:7788;
    meta-disk internal;
  }
}

在启动DRBD之前,需要创建供DRBD记录信息的数据块.分别在两台主机上执行:

[root@manager ha.d]# drbdadm create-md r0
[root@manager ha.d]#mknod /dev/drbd0 b 147 0
[root@manager ha.d]# /etc/init.d/drbd srart

现在两台主机都是备机状态,都是”不一致”状态,这是由于DRBD无法判断哪一方为主机,以哪一方的磁盘数据作为标准数据。所以我们需要初始化,在manager上执行:

[root@manager /]#drbdsetup /dev/drbd0 primary –o

现在数据开始同步,可以用cat /proc/drbd查看数据同步的进度
等数据同步完查看DRBD的状态

[root@manager /]# cat /proc/drbd
version: 8.2.1 (api:86/proto:86-87)
GIT-hash: 318925802fc2638479ad090b73d7af45503dd184 build by root@manager, 2007-12-05 16:40:14
0: cs:Connected st Primary/Secondary ds:UpToDate/UpToDate C r---
    ns:1514 nr:1110 dw:2616 dr:2259 al:0 bm:482 lo:0 pe:0 ua:0 ap:0
        resync: used:0/31 hits:2 misses:2 starving:0 dirty:0 changed:2
        act_log: used:0/257 hits:202 misses:0 starving:0 dirty:0 changed:0
磁盘状态都是”实时”,表示数据同步完成了。

[root@manager /]# mkfs.xfs /dev/drbd0

现在可以把manager上的DRBD设备挂载到/export目录上进行使用。备机的DRBD设备无法被挂载,因为它是用来接收主机数据的,由DRBD负责操作。

[root@manager /]# mount /dev/drbd0 /export
[root@manager /]# df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/sda1             10229696   3019636   7210060  30% /
/dev/drbd0           104806400   3046752 101759648   3% /export

现在把之前备份的/export中的所有内容再恢复回去。
如果不使用heartbeat的情况下,DRBD只能手工切换主从关系
现在修改heartbeat的配置文件,使DRBD可以通过heartbeat自动切换

[root@manager /]# vi /etc/ha.d/haresources
manager 192.168.0.3 drbddisk::r0 Filesystem::/dev/drbd0::/export::xfs  dhcpd xinetd portmap nfs

注释:上面那行
manager                                              定义manager为heartbeat的主机
192.168.0.3                                         定义对外服务的IP地址,这个IP自动在主从机之间切换
drbddisk::r0                                         定义使用的drbd资源
Filesystem::/dev/drbd0::/export::xfs     定义挂载文件系统
dhcpd xinetd portmap nfs                    定义其他需要切换的服务(用空格隔开)

现在我们可以测试一下了

(dhcpd portmap nfs等需要切换的服务,应该先在两台服务器上都配置好)

[root@manager root]# chkconfig –list

确定heartbeat和DRBD开机自启动
确定需要由heartbeat切换的服务,开机不自启动(由heartbeat来启用相关的服务)
给gg1接通电源,通过pxe启动系统(gg1是一组服务器中的一台,是一台无盘服务器,启动后挂载在manager上保存的系统)
在manager上ssh gg1

[root@manager root]# ssh gg1
-bash-2.05b#
-bash-2.05b# arp -a
? (192.168.0.3) at 00:19:B9:E4:7D:22 [ether] on eth0
-bash-2.05b# ls
-bash-2.05b# touch test
-bash-2.05b# ls
test

现在在manager上关机或停止heartbeat服务
[root@manager root]# /etc/init.d/heartbeat stop
Stopping High-Availability services:                                                            [  OK  ]

到manager_bak上ifconfig
[root@manager_bak root]# ifconfig
可以看到eth1:0起来了,IP地址是192.168.0.3

[root@manager_bak root]# ssh gg1
-bash-2.05b#
-bash-2.05b# arp -a
? (192.168.0.3) at 00:19:B9:E5:3B:FC [ether] on eth0 (可以看到192.168.0.3的mac地址变了)
-bash-2.05b# ls
test

可以看到在manager上ssh上gg1后建立的test文件
-bash-2.05b# echo "this is test" > test
-bash-2.05b# cat test
this is test

可以看到现在gg1可以正常读写manager_bak上nfs出来的磁盘
现在把manager上的heartbeat服务启动起来

[root@manager root]# /etc/init.d/heartbeat start
Starting High-Availability services:
2007/12/06_12:46:08 INFO:  Resource is stopped                                                   [  OK  ]
-bash-2.05b# cat test
this is test

现在终于大功告成了,之前在不使用drbd的情况下,heartbeat也可以切换apache、dhcpd、portmap、nfs等等服务,但是 nfs服务切换后,必须重新mount一下nfs共享出来的目录,否则会报 Stale NFS file handle 的错误。现在heartbeat+drbd配合使用后,nfs等等服务可以无缝切换,不必再重新mount一下nfs目录了。

***************************************************************

三、openSUSE10.2系统中编译、安装、配置和调试DRBD的一次实践

1、编译
下载源代码:http://oss.linbit.com/drbd/。我选择drbd-0.7.25版本,支持linux内核2.6.XX。在这个页面,我们还可以找到DRBD各个发布版本的日志链接。阅读这些log,特别是我们要的目标版本,很有帮助。

以下所做的,基本上都可以按照www.drbd.org上面提供的manual来进行,见"Chapter 4 Building and installing DRBD from source"。唯一需要注意的是,这个manual针对的是8.0版本以后的DRBD,有些操作可能不适用于DRBD8.0.xx以前的版本。而另一个重要参考材料是源代码包中的INSTALL文件,这个是绝对没错的。需要看多几次,或者同时搜索一下别人安装DRBD的经验文档,结合来看就明了。

我下载到/home/download目录下,然后cd /usr/src,计划把解包后的DRBD源代码可以放在这里,执行:
tar -xzf /home/download/drbd-0.7.25.tar.gz ./
完成后得到/usr/src/drbd-0.7.25目录。

###################################################
在编译之前,首先要确认系统中已经安装了gcc, make, glibc库, flex scanner generator和bison等工具,其中gcc的版本必须和编译当前linux内核所用的gcc是相同版本的。
查看gcc版本的命令:gcc -v
查看当前linux内核对应gcc版本的命令:cat /proc/version
##################################################

##################################################
DRBD会被编译内核模块,其中需要用到若干内核头文件、内核源码等等,所以需要做点准备。详细阅读源代码目录中的INSTALL就了解,准备工作分两种情况:
(I) 当前系统使用的是发行版本(openSUSE, Fedora, ubuntu等等)编译好的内核(称为stock kernel),则可以检查一下系统/usr/src等目录。(关于内核模块的做法,可以找其它资料参考参考。)如果没有安装这些文件,那么就安装盘,通过安装包管理工具安装到文件系统中就是。
(II) 当前系统使用的不是发行版本编译好的内核,比如自己编译的、或者去www.kernel.org下载的。这种情况,就要去下载对应内核版本的源文件包进行安装。不过具体我还是没做过,呵呵。

本文基于第(1)种情况,在安装openSUSE时选择安装包时特意选择了对应的源文件包。
##################################################

以下开始正式的编译程序啦。
(1) 执行cd /usr/src/linux,进入linux目录;
(2) [可选] 执行make mrproper, 此举将内核源码树配置恢复到原始状态,删除早期构建版本或者运行时配置的多余内容;
(3) 执行make cloneconfig,此举将当前运行的kernel配置文件克隆到内核源码树;
(4) 执行cd /usr/src/drbd-0.7.25/drbd, 进入drbd目录
(5) 执行make clean all,这将编译得到/usr/src/drbd-0.7.25/drbd/drbd.ko目标文件;此时执行/sbin/modinfo drbd.ko可以查询该文件信息,以后使用insmod或者modprobe命令就可以把drbd模块加载到系统内核中。
(6) 执行cd .., 进入drbd-0.7.25目录;
(7) 执行make tools,此举将编译DRBD用户空间工具drbdadm, drbdsetup等程序, 检查/usr/src/drbd-0.7.25/user目录可见这些可执行文件; 安装了DRBD之后,用户可以通过drbdadm或者drbdsetup工具进行维护工作。
----- 执行编译已经完成。

2、安装
编译操作可以说是简单,也可以说复杂;Linux系统下的许多事情,如果你熟悉了之后就非常简单,不熟悉的话摸索一天两夜也许还是焦头烂额。谁叫微软的产品做的那么易用呢?!呵呵。
不过安装还是蛮简单的:
(1) 执行cd /usr/src/drbd-0.7.25, 进入drbd-0.7.25目录;
(2) 执行make install,此举做一些drbd.ko安装工作;
(3) 执行make install-tools,或者进入/usr/src/drbd-0.7.25/user目录执行make install-tools,将用户空间工具安装到/sbin目录中。

3、配置
安装之后,要使得DRBD运行起来,还是要配置哦。因为DRBD运行于双机之上,需要配置才能明确相关参数。
配置文件是/etc/drbd.conf,双机两个节点的配置文件是一模一样的。DRBD源码目录下有个样本,里面说得比较详细。下面是我自己的配置:
******************************************************************************************************
global {
#usage-count yes;
minor-count 1;
}

resource r0 {
protocol C;
incon-degr-cmd "echo '!DRBD! pri on incon-degr' | wall ; sleep 60 ; halt -f";
startup { wfc-timeout 0; degr-wfc-timeout 120; }
disk { on-io-error detach; }
syncer {
    rate 1M;
    #group 3;   # sync when r2 is finished syncing.
}
on yls0 {
    device /dev/drbd0;
    disk /dev/sda9;
    address 192.168.2.100:7789;
    meta-disk internal;
}
on yls02 {
    device    /dev/drbd0;
    disk      /dev/hda7;
    address   192.168.2.101:7789;
    meta-disk internal;
}
}
******************************************************************************************************

4、启动
启动操作需要在双机两个节点上都独立执行,首先将DRBD模块加载到系统中, 然后启动DRBD:
(1) 执行cd /usr/src/drbd-0.7.25/drbd,进入drbd目录,
(2) 执行modprobe drbd, 将drbd模块加载到内核空间
     此时使用lsmod | grep drbd命令, 如果得到类似于“drbd 143088 0”的信息,表明加载成功。
(3) 执行drbdadm up all, 此举将DRBD运行起来。
(4) 执行cat /proc/drbd可以观察到当前DRBD运行状态信息,此时两个节点的DRBD都处于secondary状态。

5、激活主节点DRBD
虽然DRBD配置没有固定主备节点的区别,激活节点一般处于DRBD主状态,去激活节点一般处于DRBD备状态。所以,我们首先确定哪个节点是激活的,然后在激活节点执行:
(1) 执行drbdadm primary all, 或者drbdadm --do-what-I-say primary all,此举将在激活节点的DRBD置primary状态,而去激活节点的DRBD还是处于secondary状态。
(2) 执行cat /proc/drbd,检查当前主备节点DRBD运行状态,连接状态、磁盘状态等等。
(3) 执行ll /dev/drbd*, 可以得到相关drbd设备文件信息。如果drbd.conf只配置一个资源,则此时得到drbd0设备文件的相关信息。
(4) 如果此时显示连接状态不是connected的,则说明有异常。
      首先检查drbd.conf, 其次检查双机的网络链路设置(物理链路、系统防火墙等等),如果这些检查点都无异常,那么就是dmesg命令来看看模块启动过程中的历史信息,从中或者可以找到一些蛛丝马迹哦。
      如果还是没有办法,那记得去官方网站看看DRBD版本更新日志,搜索一下drbd-user mail的信息吧,有时候还是蛮有帮助的。

6、[全新安装]创建DRBD文件系统
/dev/drbd0是DRBD模块运行时创建的,它只是一个虚拟块设备文件或者说是虚拟块设备驱动程序,底层支持块设备由drbd.conf的disk参数制定。

在全新安装情况下,DRBD还没有创建文件系统,所以到目前为止我们无法在文件系统下对DRBD设备进行文件操作(当然直接块读写还是可以的,这种情况下就把DRBD视作raw device裸设备啦)。文件系统的功用是什么?主要是按照人类的思维习惯来组织数据。下面可以在drbd设备中创建文件系统,以EXT3文件系统为例:
(1) 执行mkfs.ext3 -j /dev/drbd0,成功后,
(2) 执行mkdir /mnt/drbd0, 成功后,
(3) 执行mount -t ext3 rw /dev/drbd0 /mnt/drbd0,即将DRBD设备上文件系统安装到/mnt/drbd0挂载点上,此后可以在该挂载点中读写数据。
* 注意:以上操作只需在主DRBD上执行,备DRBD会实时同步过去。

此文章由 flyinweb 于 2010-05-26 14:59:08 编辑

本日志由 flyinweb 于 2010-05-13 12:47:20 发表,目前已经被浏览 5905 次,评论 0 次;

作者添加了以下标签: DRBD+Heartbeat+HA HFSDistributed Replicated Block DeviceDRBD

引用通告:http://www.517sou.net/Article/443/Trackback.ashx

评论订阅:http://www.517sou.net/Article/443/Feeds.ashx

评论列表

    暂时没有评论
(必填)
(必填,不会被公开)