一、什么是DRBD?
DRBD 是由内核模块和相关脚本而构成,用以构建高可用性的集群。其实现方式是通过网络来镜像整个设备。您可以把它看作是一种网络RAID。
二、drbd 的应用范围是什么?除此之外,创建高可用性集群还需要什么?
Drbd 负责接收数据,把数据写到本地磁盘,然后发送给另一个主机。另一个主机再将数据存到自己的磁盘中。其他所需的组件有集群成员服务,如TurboHA 或 心跳连接,以及一些能在块设备上运行的应用程序。
例如:
--裸I/O
--文件系统及fsck
--具有恢复能力的数据库。
www.ixdba.net
三、它是如何工作的?
每个设备(drbd 提供了不止一个设备)都有一个状态,可能是‘主’状态或‘辅助’状态。在带有主要设备的节点上,应用程序应能运行和访问设备(/dev/nbX)。每次写入都会发往本地低层设备和带有‘辅助’状态设备的节点中。次要设备只能简单地把数据写入它的低层块设备上。
读取数据通常在本地进行。
如果主要节点发生故障,心跳将会把辅助设备转换到主状态,并启动其上的应用程序。(如果您将它和无日志FS 一起使用,则需要运行fsck)。
如果发生故障的节点恢复工作,它就会成为新的辅助节点,而且必须使自己的内容与主节点的内容保持同步。当然,这些操作不会干扰到后台的服务。
四、drbd 同现在的HA 集群有什么关系?
大部分现行高可用性集群(如:惠普、康柏等等)使用的是共享存储器,因此存储器连接多个节点(用共享的SCSI 总线或光纤通道就可以做到)。
Drbd 也可以作为一个共享的设备,但是它并不需要任何不常见的硬件。它在IP 网络中运行,而且在价格上IP 网络要比专用的存储网络经济的多。
目前,drbd 每次只允许对一个节点进行读写访问,这对于通常的故障切换高可用性集群来讲已经足够用了。以后的版本将支持两个节点进行读写存取。
这很有用,比如对GFS 来讲就是如此。兼容性Drbd 可以在ide、SCSI 分区和整个驱动器之上运行,但不能在回路模块设备上运行。
(如果您硬要这样做,它就会发生死锁)。
Drbd 也不能在回送网络设备中运行。(因为它同样会发生死锁:所有请求都会被发送设备占用,发送流程也会阻塞在sock_sendmsg()中。有时,接收线程正从网络中提取数据块,并试图把它放在高速缓存器中;但系统却要把一些数据块从高速缓存器中取到磁盘中。
这种情况往往会在接收器的环境下发生,因为所有的请求都已经被接收器块占用了。
五、安装
下载软件
最新的稳定版本为0.6.11,您可从http://www.drbd.org/releases.html 下载它。
您可以从CVS 中得到最新的源文件。注意,有时代码不能进行编译。您可以通过cvs 或命令行界面得到它:
[philipp@alf drbd]$
export CVSROOT= :pserver :anonymous@cvs.drbd.org :/var/lib/cvs/drbd
[philipp@alf drbd]$ cvs login
(Logging in to anonymous@cvs.drbd.org)
CVS password:[Press the return key]
[philipp@alf drbd]$ cvs -z9 checkout drbd
要获取当前的开发分支,可以使用如下命令:
[philipp@alf drbd]$ cvs -z9 checkout -r rel-0_7-branch
六、编译包
直接编译即可。只需如下操作:
$ make
$make install
如果您想为drbd 编译不同版本的内核,您需要定义KERNVER(包括路径)同时您也要定义drbd 的安装路径。
make KERNVER=2.4.22-7 KDIR=/usr/src/linux-2.4.22-7-include
make KERNVER=2.4.22-7 PREFIX=/local/lib/module/path/ install
测试加载drbd 模块
如果这些都已经创建和安装妥当,您就可以测试加载模块了。
$ /sbin/insmod drbd
如果一切正常,您不会看见任何ERROR(错误)信息,用Ismod 程序可以验证模块是否已被加载。
dev2-98:~/rpm/SPECS # lsmod
Module Size Used by Tainted:PF
drbd 40140 0 (unused)
...
$ dmesg
...
drbd:initialised.Version:0.6.8(api:63/proto:62)
如果您看到了drbd,就表示一切正常。就可以继续执行rmmod,并转到举例配置部分。
$ /sbin/rmmod drbd
问题未解决符号
如果在加载模块时,出现了如下信息:
drbd.o:unresolved symbol sock_alloc
drbd.o:unresolved symbol proc_register
drbd.o:unresolved symbol schedule_timeout
...
这就表示您在内核中编译了CONFIG_MODVERSIONS,而DRBD 模块中没有编译MODVERSIONS,或者正好相反。这里给出两种解决方案:
用不带MODVERSIONS 的系统: 更改您的内核配置, 删掉CONFIG_MODVERSIONS 选项。(参见~linux/.config。)重建内核。
使用带MODVERSIONS 模块的系统:编辑~drbd/Makefile.vars,并将-DMODVERSIONS -DCONFIG_MODVERSIONS 添加到KERNFLAGS,最后重建DRBD。
七、命令的使用
drbdsetup
drbsetup 是drbd 程序套件中的底层配置工具。您可以使用该工具把低层模块设备和drbd 设备联系起来、安装drbd 设备对,
以便镜像它们的低层模块设备和检查运行drbd 设备的配置。
使用drbdsetup 的例子
假设您的两台机器分别命名为节点1(10.0.0.10)和节点2(10.0.0.20),您想在这两台机器上使用/dev/hdc6 作为它们的低层设备。
那么在节点2 上,您可以发出以下命令:
$ insmod drbd.o
$ drbdsetup /dev/nb0 disk /dev/hdc6
$ drbdsetup /dev/nb0 net 10.0.0.20 10.0.0.10 B
在节点1 上,您可以发出以下命令:
$ insmod drbd.o
$ drbdsetup /dev/nb0 disk /dev/hdc6
$ drbdsetup /dev/nb0 net 10.0.0.10 10.0.0.20 B
$ drbdsetup /dev/nb0 primary
此时,您就可以像在其他设备一样使用/dev/nb0 了。
$ mkfs -b 4096 /dev/nb0
$ mount /dev/nb0 /mnt/mountpoint
上例中使用了“B”协议。drbd 允许您选择所需的协议,以控制如何将数据写入辅助设备。
八、DRBD 协议
协议说明
A 数据一旦写入磁盘并发送到网络中就认为完成了写入操作。
B 收到接收确认就认为完成了写入操作。
C 收到写入确认就认为完成了写入操作。
您还可以选择其它参数来将数据传输给磁盘和网络选项。更多详情,请参见drbdsetup 手册页。
九、Config 和脚本的使用
drbd.conf 和脚本
在上面,我们介绍了drbdsteup 的使用。drbd 也允许您直接在drbd.conf 文件中进行设置。通过正确地设置该文件和使用init.d/drbd 脚本,
您能够轻松让drbd在机器启动后正常运行起来。
drbd.conf 设置举例
在本配置中,两台机器分别命名为thost1 和thost2。thost1 的IP 地址是10.1.1.31,thost2 的IP 地址是10.1.1.32。
我们要在thost1 的/dev/hda7 和thost2的/dev/hda7 之间创建镜像。下面是一个完成该操作的/etc/drbd.conf 文件范例:
resource drbd0 {
protocol=B
fsck-cmd=fsck.ext2 -p -y
on thost1 {
device=/dev/nb0
disk=/dev/hda7
address=10.1.1.31
port=7789
}
on thost2 {
device=/dev/nb0
disk=/dev/hda7
address=10.1.1.32
port=7789
}
}
脚本的使用
创建了drbd.conf 文件之后,在thost1 上运行如下命令:
$ /etc/rc.d/init.d/drbd start
在thost2 进行同样的操作,
$ /etc/rc.d/init.d/drbd start
此时,两台设备之间就建立起一个镜像,您可以查看/proc/drbd 进行核实。
$ cat /proc/drbd
现在您可以在设备上创建一个文件系统,然后把它加载到thost1 上。
$ mkfs /dev/nb0
$ mount /dev/nb0 /mnt/disk
恭喜您,现在您已经使用drbd 创建了一个镜像。要进一步创建高可用性的故障切换系统,请查看脚本子目录,并可结合使用linux-ha.org 上提供的心跳软件
########## FAQ ###########
十、其它问题
1、超时限制的工作原理是怎样的呢?
主节点在发出数据块之后,会等待另一个节点在某一时间范围内做出响应(该时间范围可以通过drbdsetup 中的超时限制选项进行设置)。
一旦另一个节点超过该时限仍未做出响应,主节点就会断开连接并尝试着重新再建立一个连接。
2、为什么超时限制短点好呢?
如果另一个节点停机,主节点会就地等待,阻断所有正在向DRBD 设备写入数据的应用。这样一来,一直要等到超时限制过后它才会判断出
另一个节点已经停机,而您的应用就会停滞这么长时间。
3、为什么短的超时限制会导致timeout/resync/connect 的情况发生呢?
如果次节点的IO 子系统较慢,就会发生这种情况。
4、什么是“延迟数据包”?
为改进这种状况,我产生了“延迟期限”数据包的设想。当次节点意识到它将超时的时候,它就会发送这种数据包。
5、如果看到出现了timeout/resync/connect 情况时,您会怎么办?
延长超时限制。(因为connect-int 和pint-int 需要比超时限制更长,所以也要相应地延长它们)
6、tl-size
对于syslog 中出现“transfer log too small”(传输日志太小)这样的信息,该采取的措施需要很大篇幅来描述。
7、SyncAll 只运行了一半,但我觉得它实在太慢了!
您可以在运行时使用drbdsetup 工具里的syncer 子命令来重新配置同步参数。请参见drbdsetup man page(手册页)了解更多信息。
十一、一般问题
1、问:首先,什么是DRBD?
DRBD 是Linux 操作系统的一个分布式远程块设备。它允许您在远程机器上建立一个本地块设备的实时镜像。与心跳连接结合使用,
它可打造出高可用性的Linux 集群。
2、问:哪里可以下载DRBD?
答:最新版本的DRBD 可以从LinBit Information Technologies GmbH 获得。此外,DRBDD 还包括在许多Linux 发行版中
例如DebianGNU/Linux 和其它程序。
3、问:DRBD 适用于哪种许可情形?
答: DRBD 是依照General Public License Version 2 vom Juni 1991