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

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

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

关于DRBD的信息可从以下链接获取:
(1) DRBD官方网站: www.drbd.org 及其中提供的外部链接
(2) Wiki English: http://en.wikipedia.org/wiki/DRBD
注意,DRBD-User 用户电子邮件链接也是很不错的。世界各地DRBD用户遇到问题都可以通过这种方式进行沟通,常常见DRBD作者Philips浮出水面,帮忙分析解决问题。

本文总结了在 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-07-23 11:21:57 发表,目前已经被浏览 4976 次,评论 0 次;

作者添加了以下标签: DRBDDistributed Replicated Block Device

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

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

评论列表

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