一、什么是DRBD?    DRBD 是由内核模块和相关脚本而构成,用以构建高可用性的集群。其实现方式是通过网络来镜像整个设备。您可以把它看作是一种网络RAID。二、drbd 的应用范围是什么?除此之外,创建高可用性集群还需要什么?        Drbd 负责接收数据,把数据写到本地磁盘,然后发送给另一个主机。另一个主机再将数据存到自己的磁盘中。其他所需的组件有集群成员服务,如TurboHA 或 心跳连接,以及一些能在块设备上运行的应用程序。    例如:     --裸I/O     --文件系统及fsck     --具有恢复能力的数据库。三、它是如何工作的?

      less.  每 个设备(drbd提供了不止一个设备)都有一个状态,可能是‘主’状态或‘辅助’状态。在带有主要设备的节点上,应用程序应能运行和访问设备(/dev /nbX)。每次写入都会发往本地低层设备和带有‘辅助’状态设备的节点中。次要设备只能简单地把数据写入它的低层块设备上。  读取数据通常在本地进行。      如果主要节点发生故障,心跳将会把辅助设备转换到主状态,并启动其上的应用程序。(如果您将它和无日志FS 一起使用,则需要运行fsck)。     如果发生故障的节点恢复工作,它就会成为新的辅助节点,而且必须使自己的内容与主节点的内容保持同步。当然,这些操作不会干扰到后台的服务。 四、drbd 同现在的HA 集群有什么关系?         大部分现行高可用性集群(如:惠普、康柏等等)使用的是共享存储器,因此存储器连接多个节点(用共享的SCSI 总线或光纤通道就可以做到)。     Drbd 也可以作为一个共享的设备,但是它并不需要任何不常见的硬件。它在IP 网络中运行,而且在价格上IP 网络要比专用的存储网络经济的多。     目前,drbd 每次只允许对一个节点进行读写访问,这对于通常的故障切换高可用性集群来讲已经足够用了。以后的版本将支持两个节点进行读写存取。     这很有用,比如对GFS 来讲就是如此。兼容性Drbd 可以在ide、SCSI 分区和整个驱动器之上运行,但不能在回路模块设备上运行。    (如果您硬要这样做,它就会发生死锁)。     Drbd 也不能在回送网络设备中运行。(因为它同样会发生死锁:所有请求都会被发送设备占用,发送流程也会阻塞在sock_sendmsg()中。有时,     接收线程正从网络中提取数据块,并试图把它放在高速缓存器中;但系统却要把一些数据块从高速缓存器中取到磁盘中。     这种情况往往会在接收器的环境下发生,因为所有的请求都已经被接收器块占用了。 五、安装     下载软件     最新的稳定版本为 drbd-8.3.9.tar.gz ,您可从http:// http://oss.linbit.com/drbd/ 下载它。

    您可以从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(GPL)发行的。因此在这种许可条件下,它可以自由分发和修改。 
 
十二、编译问题 
 
    问:在编译drbd_syncer.c 时出现“structure has no member named `nice'”信息,这是为什么? 
 
       答:如果您指的是: 
 
       drbd_syncer.c:In function `drbd_syncer': 
 
       drbd_syncer.c:409:structure has no member named `nice' 
 
       drbd_syncer.c:439:structure has no member named `nice' 
 
       drbd_syncer.c:452:structure has no member named `nice' 
 
       make[1]:*** [drbd_syncer.o] Error 1 
 
       make[1]:Leaving directory `/usr/local/src/drbd-0.6.3/drbd' 
 
       Make*** [all] Error 2 
 
       请使用下面的补丁: 
 
       --- drbd_syncer.c Wed Oct 16 06:19:17 2002 
 
       +++ drbd_syncer.c.orig Wed Oct 16 06:18:27 2002 
 
       @@ -311,7 +311,7 @@ 
 
       #define SPEED_MIN(mdev-conf.sync_rate_min) 
 
       #define SYNC_MARKS 10 
 
       #define SYNC_MARK_STEP (3*HZ) 
 
       -#if defined ( MAX_RT_PRIO ) || defined 
 
       (CONFIG_MAX_RT_PRIO) 
 
       +#if 1 
 
       /* this should work for the O(1)scheduler */ 
 
       #define drbd_set_user_nice ( current,x ) set_user_nice ( current, 
 
       (x)) 
 
       #else 
 
十三、安装和设置 
 
    1、问:我能加次级设备吗(至少只读)? 
 
       答:DRBD 对此没有限制,但是您的文件系统会变得非常混乱,因为它无法了解底层设备的变化。总之,没有ext2、ext3、reiserFS、JFS 或XFS, 
 
        它不能工作。如果您需要的不只是一个镜像,而是共享文件系统,那您可以使用GFS 或OpenGFS,但它们速度较慢。这也是DRBD 不允许加载次级 
 
        设备的原因。因此如果您要加载次级设备,可以先把次级设置为主设备。同时加载的话,两个设备均不能工作。 
 
    2、问: DRBD 能使用两个容量大小不同的设备吗? 
 
        答: 一般情况下可以,但有些问题需要注意: 
 
        本地DRBD 使用的是配置的磁盘容量,与物理容量相等。如果没有给出,则将被设置为物理容量。连接时,设备容量将设置为两个节点中最小容量。 
 
        如果缺少常识的话,您可能会碰到一些问题:如果您先是在一个节点上使用drbd ,而且没有配置好磁盘容量,之后又连接了一个容量较小的设备。 
 
        这时,drbd 设备容量在运行时就会变小。在系统记录里,您会发现一条信息提示“your size hint is bogus,please change to some value” 
 
        (您的容量信息不真实,请更改)。这样一来就会让设备顶级的文件系统造成混淆。 
 
        因此,如果您的设备容量不同,请明确地为DRBD 设置所使用的容量。 
 
    3、问: XFS 能和DRBD 一起使用吗? 
 
        答:XFS 使用动态块大小,因此需要配备DRBD 0.7 或更高版本。 
 
    4、问:当我试着加载drbd 模块时,遇到了下面的问题: 
 
        compiled for kernel version 2.4.18-4GB while this kernel is version 2.4.18-64GB-SMP. 
 
        答:您的实际内核与要在其上构建drbd 的内核的.config 不一致。在 
 
        SuSE Linux 上,您可以使用下面的命令进行配置: 
 
        cd /usr/src/linux/ 
 
        make cloneconfig 
 
        make dep 
 
        通常,您不必重新编译内核,只编译drbd 即可。以后的DRBD 版本将在创建过程中解决这一问题。 
 
十四、操作问题 
 
    1、问:为什么drbdsetup /dev/nb0 复制((完全同步))的速度那么慢? 
 
        答:出于历史原因,复制需要回写数据。而在回写数据时,很多物理设备的速度都非常慢。在更新的DRBD 版本中可能会解决这一问题。 
 
    2、问:为什么我的“load averag”(平均负载)那么高? 
 
        答:平均负载定义为给定的时间间隔内,runqueue 里的平均进程数。如果进程具有以下特点,它就会被列入runqueue 中: 
 
        -- 不是在等待外部事件(如:在某些fd 上选择) 
 
        -- 不是在等待它自己的事件(不是受呼“等待”) 
 
        -- 未被终止 
 
        注:所有等待磁盘io 的进程都会包括在内。所以,虽然系统实际可能近乎是空闲的,但如果有很多进程在等待磁盘io, “load average”就会很高。 
 
        例:关闭nfs 服务器,启动100 
 
        ls /path/to/noncached/dir/on/nfs/mount-point 
 
        在客户机上,虽然CPU 什么也没做,只要nfs 超时(可能是几个星期),您还是会得到一个100+的“load average”。 
 
        您可以通过其他方式(例如vmstat,sysstat/sar)来检测您的系统负载,这样可帮您找出系统的瓶颈所在。或者您还可以使用多个磁盘(不只是 分区!)       或配备10.000rpm SCSI 磁盘的RAID,甚至是千兆以太网。即使在快速以太网设备中,您也很少会超过每秒6Mbyte。.((100MBit/s 除去协议开销等最多        可剩下12.5MByte/s) 
 
    3、问: 
 
        warning: Return code 255 from 
 
        /etc/ha.d/resource.d/datadisk 
 
        在使用带心跳的数据磁盘脚本时出现这些信息说明了什么? 
 
        答:退出码255 很可能产生于导致死机的脚本,它有一个详细的错误信息。捕获脚本输出,这是ha.cf 中的debugfile 指令iirc。.如果仍没有用, 
 
        您可以手动操作,并查看所给出的错误信息。 
 
    4、数据磁盘会提示如“cannot promote to primary, synchronization running” 
 
        或“fsck failed”等等。 
 
        问:当节点从次级站点上升到主站点时,drbd 设备就不能加载到主站点 
 
        上了,但可以进行手动加载。. 
 
        答:DRBD 不会自动加载分区,脚本数据磁盘就是用来做这项工作的。 
 
    5、问:当心跳在节点1 上启动并试着运行数据磁盘脚本以成为RAID 阵列中的主节点时,出现故障,原因是它仍在同步。 
 
        答: 在ha.cf 中启用“nice_failback on“,或者您还可以阻断drbd init 脚本块直到全部同步完成,请参见drbd.conf.A。 
 
    6、问:像st、ns、nr、dw、dr 等字段在/proc/drdb 中有什么含义? 
 
    答: 
 
表4. /proc/drbd 
 
Field        说明                  值: 
 
cs         连接状态               出现的值: 
 
                    o Unconfigured:设备在等待配置。 
 
                    o Unconnected:连接模块时的过渡状态。 
 
                    o WFConnection:设备等待另一测的配置。 
 
                    o WFReportParams:过渡状态,等待新TCP 连接的第一个数据包时。. 
 
                    o SyncingAll:正将主节点的所有模块复制到次级节点上。. 
 
                    o SyncingQuick:通过复制已被更新的模块(因为现在次级节点已经离开了集群)来更新次级节点。 
 
                    o Connected:一切正常。 
 
                    o Timeout:过渡状态。 
 
st         状态(设备的作用)      可能的值为: 
 
                    o 本地/远程一级状态 
 
                    o 二级状态 
 
                    o 未知(这不是一种作用) 
 
ns    网络发送    模块号码 
 
nr    网络接收    模块号码 
 
dw   磁盘写入    模块号码 
 
DR   磁盘读取    模块号码 
 
of    运行中(过时的)模块号码 
 
pe   待解决的    模块号码 
 
ua    未答复的    模块号码(最好为0)