目 录 1 概述..................................................................... 2 镜像要求................................................................. 3 准备工作................................................................. 3.1 编译安装................................................................. 3.2 drbd安装概............................................................... 3.3 调整启动脚本............................................................. 4 建立drbd................................................................. 4.1 初始化Primary机(master).................................................. 4.2 验证磁盘镜像结果.......................................................... 5 drbd测试................................................................. 5.1 写入文件测试............................................................. 5.2 写入50000个20k的小文件测试............................................... 6 几点注意的地方........................................................... 1 概述 Distributed Replicated Block Device (DRBD) 分布式复制块设备 DRBD实际上是一种块设备的实现,主要被用于Linux平台下的高可用(HA)方案之中。他是有内核模块和相关程序而组成,通过网络通信来同步镜像整个设备,有点类似于一个网络RAID的功能。也就是说当你将数据写入本地的DRBD设备上的文件系统时,数据会同时被发送到网络中的另外一台主机之上,并以完全相同的形式记录在一个文件系统中(实际上文件系统的创建也是由DRBD的同步来实现的)。本地节点(主机)与远程节点(主机)的数据可以保证实时的同步,并保证IO的一致性。所以当本地节点的主机出现故障时,远程节点的主机上还会保留有一份完全相同的数据,可以继续使用,以达到高可用的目的。 在高可用(HA)解决方案中使用DRBD的功能,可以代替使用一个共享盘阵存储设备。因为数据同时存在于本地主机和远程主机上,在遇到需要切换的时候,远程主机只需要使用它上面的那份备份数据,就可以继续提供服务了 源码下载http://oss.linbit.com/drbd/0.7/drbd-0.7.19.tar.gz 核心参考文档:http://www.drbd.org/drbd-howto.html 2 镜像要求 实现vmware虚拟机192.168.197.134磁盘/dev/sdb1镜像到vmware虚拟机192.168.197.135磁盘/dev/sdb1。 主服务器为192.168.197.134 (data01)简称为134; 备份服务器为192.168.10.135(data02) 简称为135; 3 准备工作 安装环境:Red Hat Enterprise Linux AS release 5,内核版本:2.6.18-164.el5 drbd内核源码存在,可到http://oss.linbit.com/drbd/去下载. 配置好yum仓库 [root@data01 ~]# yum install kernel* [root@data01 ~]# yum install gcc* [root@data01 ~]#yum install make* 3.1 编译安装 [root@data01 ~]#cd /usr/local/src/drbd [root@data01 ~]#./configure --prefix=/usr/local/drbd --with-km [root@data01 ~]#make [root@data01 ~]#make install [root@data01 ~]#ln -s /usr/local/drbd/etc/drbd.conf /etc/drbd.conf [root@data01 ~]#ln -s /usr/local/drbd/etc/rc.d/init.d/drbd /etc/init.d/drbd [root@data01 ~]#chkconfig --add drbd [root@data01 ~]#chkconfig drbd on 3.2 DRBD安装概述 [root@data01 ~]#make install 安装完主要生成命令:drbdsetup ,drbdadmin, 执行之后: drbd.ko被安装到/lib/modules/$KernelVersion/kernel/drivers/block下. 如果不是在上面的路径下的话,就到程序目录下的drbd/目录里,有一个drbd.ko drbd相关工具(drbdadm,drbdsetup)被安装到/sbin下. 并会在/etc/init.d/下建立drbd启动脚本. 3.3 调整启动脚本 [root@data01 ~]# vim /etc/init.d/drbd case "$1" in start) 在start服务后添加以下内容 insmod /lib/modules/2.6.18-164.el5/kernel/drivers/block/drbd.ko cat > /etc/drbd.conf <<EOF global { usage-count yes; } common { protocol C; syncer { rate 3M; } startup { wfc-timeout 10; degr-wfc-timeout 120; outdated-wfc-timeout 5; } } resource r0 { device minor 1; meta-disk internal; # 设置主备机之间通信使用的信息算法. net { cram-hmac-alg sha1; shared-secret "secret string"; } # 每个主机的说明以"on"开头,后面是主机名.在后面的{}中为这个主机的配置 on data01 { device /dev/drbd0; disk /dev/sdb1; address 192.168.197.134:7801; } on data02 { device /dev/drbd0; disk /dev/sdb1; address 192.168.197.135:7801; } } EOF 4.建立drbd 建立drbd设备,启动drbd服务(master,slave) 1.建立md设备 在启动DRBD之前,你需要分别在两台主机的sdc1分区上,创建供DRBD记录信息的数据块. 注意:如果你在这步之前已经给/dev/sdb1格式化的话,这里会报错,并且无法继续,抱错内容如下: md_offset ........... al_offset ........... bm_offset ........... Found ext3 filesystem which uses 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 根据报错和官方描述的大概意思就是:有了文件系统,会被认为该设备已经被使用,不能被drbd所使用,最好的解决办法就是低格硬盘破坏该文件系统 官方的方法如下: 破坏文件系统 :dd if=/dev/zero bs=1M count=1 of=/dev/sda3; sync [root@data01 ~]#drbdadm create-md r0 // 配置文件中的resource名 --== Thank you for participating in the global usage survey ==-- The server's response is: you are the 1889th user to install this version Writing meta data... initializing activity log NOT initialized bitmap New drbd meta data block successfully created. Success 2.启动drbd服务程序 [root@data01 ~]# /etc/init.d/drbd start 3. 确认drbd状态 [root@data01 ~]# cat /proc/drbd version: 8.3.9 (api:88/proto:86-91) GIT-hash: f3606c47cc6fcf6b3f086e425cb34af8b7a81bbf build by root@master , 2010-07-12 15:36:10 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:10723020 --------Secondary/Secondary 表示两个节点都处于辅助(从)状态 先确认两台要镜像的机器是否正常,之间的网络是否通畅,需要加载的硬盘是否处于umount状态,配置文件是否一致。 drbd采用的是模块控制的方式,所以先要加载drbd.ko 模块 4.1初始化Primary机(master): 1. 设为主导状态(同步发起端) [root@data01 ~]# drbdsetup /dev/drbd0 primary -o [root@data01 ~]#cat /proc/drbd version: 8.3.9 (api:88/proto:86-95) GIT-hash: 1c3b2f71137171c1236b497969734da43b5bec90 build by root@data01, 2011-06-19 11:05:32 0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r----- ns:2554636 nr:0 dw:104868 dr:2449970 al:36 bm:150 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0-------如需降级为备机,可执行 umount /dev/drbd0 drbdadm secondary r0 [root@data01 ~]#netstat -ant Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 127.0.0.1:2208 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:674 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:2207 0.0.0.0:* LISTEN tcp 0 0 192.168.197.134:35996 192.168.197.135:7801 ESTABLISHED tcp 0 0 192.168.197.134:7801 192.168.197.135:47924 ESTABLISHED tcp 0 0 :::22 :::* LISTEN tcp 0 1056 ::ffff:192.168.197.134:22 ::ffff:192.168.197.1:50615 ESTABLISHED 4.2 验证磁盘镜像结果 1. master主节点 [root@data01 ~]#mkfs.ext3 /dev/drbd0 //此操作只要主的上进行即可 [root@data01 ~]#mkdir /data [root@data01 ~]#mount -o rw /dev/drbd0 /data 2.slave备节点 [root@data02 ~]#mkdir /data 设置权限 drbd的基本服务都起来了,现在需要对主的服务器也就使192.168.197.134这台服务器进行配置,使之能够对drbd0设备进行读写。 在134机器上运行 [root@data01 data]# drbdadm -- --do-what-I-say primary r0 drbdsetup primary: unrecognized option '--do-what-I-say' Command 'drbdsetup 0 primary --do-what-I-say' terminated with exit code 20 drbdadm primary r0: exited with code 20 #设置134服务器为同步主目录,也就是同步以134的这个分区为准. 注意命令格式需要一样,没有任何提示的话表示基本上成功了 #df –h [root@data01 data]# df -h 文件系统 容量 已用 可用 已用% 挂载点 /dev/sda2 12G 5.0G 5.8G 47% / /dev/sda1 99M 29M 65M 31% /boot tmpfs 125M 0 125M 0% /dev/shm /dev/drbd0 2.3G 68M 2.2G 4% /data 现在/dev/drbd0就等于你服务器上面的一个硬件设备,你可以对他进行任何的读写操作。 5 drbd测试 5.1 写入文件测试 1:在134主服务器上 #drbdadm primary r0 #time dd if=/dev/zero of=/data/drbdtest count=100 bs=100000 #ls –lh /data/ [root@data01 data]# drbdadm primary r0 [root@data01 data]# time dd if=/dev/zero of=/data/drbdtest count=100 bs=100000 100+0 records in 100+0 records out 10000000 bytes (10 MB) copied, 0.0494228 seconds, 202 MB/s real 0m0.099s user 0m0.001s sys 0m0.049s [root@data01 data]# ls -lh /data/ 总计 9.6M -rw-r--r-- 1 root root 9.6M 06-19 14:11 drbdtest drwx------ 2 root root 16K 06-19 12:16 lost+found [root@data01 data]# umount /data/ [root@data01 ~]# drbdadm secondary r0 2:接着到135备用服务器上执行 [root@data02 ~]# drbdadm primary r0 [root@data02 ~]# mount /dev/drbd0 /data/ #ls –lh /data [root@data02 ~]# ls -lh /data/ 总计 9.6M -rw-r--r-- 1 root root 9.6M 06-19 14:11 drbdtest drwx------ 2 root root 16K 06-19 12:16 lost+found 可以看到数据在134服务器写入,在135马上可以看到。 5.2 写入50000个20k的小文件测试 [root@data02 ~]# cat test.sh #!/bin/sh for((i=0;i<$1;i++)); do dd if=/dev/zero of=/data/$i count=20 bs=1000; done 执行:time ./test.sh 50000 在/data目录下写入40000个20k的小文件,耗时10分20秒,速度稍慢。 6 几点注意的地方 1. mount drbd设备以前必须把设备切换到primary状态。 2. 两个节点中,同一时刻只能有一台处于primary状态,另一台处于secondary状态。 3. 处于secondary状态的服务器上不能加载drbd设备。 4. 主备服务器同步的两个分区大小最好相同,这样不至于浪费磁盘空间,因为drbd磁盘镜像相当于网络raid 1. 5.在配置过程中,如果出现下面错误 Missing argument 'meta_data_dev' USAGE: disk lower_dev meta_data_dev meta_data_index [{--size|-d} 0 ... 8587575296] [{--on-io-error|-e} {pass_on|call-local-io-error|detach}] [{--fencing|-f} {dont-care|resource-only|resource-and-stonith}] [{--use-bmbv|-b}] 那么就还要初始化meta-data area drbdadm create-md r0 5.测试中发现,一次性创建小文件过多的话,会导致/dingwy分区变成只读分区,不知道是在虚拟机的问题还是drbd不太稳定,还需要进一步测试。