分布式复制块设备(DRBD,Distributed Replicated Block Device)是一种基于Linux的软件组件, 它是由内核模块和相关程序而组成的,通过网络镜像促进共享存储系统的替换。也就是说: 当你将数据写入本地的DRBD设备上的文件系统时,数据会同时被发送到网络中的另外一台主机之上,并以完全相同的形式记录在一个文件系统中(实际上文件系统的创建也是由DRBD的同步来实现的)。本地节点(主机)与远程节点(主机)的数据可以保证 实时的同步,并保证IO的一致性。所以当本地节点的主机出现故障时,远程节点的主机上还会保留有一份完全相同的数据.                                                         .AD:

 

【51CTO.com独家特稿】一、DRBD简介

分布式复制块设备(DRBD,Distributed Replicated Block Device)是一种基于Linux的软件组件, 它是由内核模块和相关程序而组成的,通过网络镜像促进共享存储系统的替换。也就是说: 当你将数据写入本地的DRBD设备上的文件系统时,数据会同时被发送到网络中的另外一台主机之上,并以完全相同的形式记录在一个文件系统中(实际上文件系统的创建也是由DRBD的同步来实现的)。本地节点(主机)与远程节点(主机)的数据可以保证 实时的同步,并保证IO的一致性。所以当本地节点的主机出现故障时,远程节点的主机上还会保留有一份完全相同的数据,可以继续使用,以达到高可用的目的。

在高可用(HA)解决方案中使用DRBD的功能,可以代替使用一个共享盘阵存储设备。因为数据同时存在于本地主机和远程主机上,在遇到需要切换的时候,远程主机只需要使用它上面的那份备份数据,就可以继续提供服务

分布式复制块设备(DRBD)是在90年代末由Philipp Reisner和Lars Ellenberg设想和开发的。开发者是为了创建一个Linux安全标准,以最低成本提供最佳的安全保障。分布式复制块设备的当前版本可以与Linux 的普通版本一起使用,用于在被动系统和主动系统之间进行存储数据的同步复制。数据可以在两个系统同时读取和输入。分布式复制块设备还支持资源级别防护。分布式复制块设备(DRBD)工程与一组称为Heartbeat的管理程序一起使用。它已经被收集到Linux的一些发行版中,目前流行的Linux中只有Centos有预编译好的安装包和对应内核。

分布式复制块设备(DRBD)是LINBIT信息技术有限责任公司的一个注册商标,总部设在奥地利维也纳。该软件已通过通用公共许可证(GNU GPL)发布,它可以在许可协议允许的范围内自由分发和修改。

二、DRBD的工作原理

 

    理解DRBD其实就是网络RAID-1,二台服务器中就算其中的某台因电源或主板损坏而宕机而对数据无任何影响(可以用硬盘RAID-1来理解DRBD),而真正的热切换可以通过Heartbeat来实现,这样切换过程跟Keepalived类似,是非常短及不需要人为干预的。

 

三、DRBD的使用

DRBD需要构建在底层设备之上,然后构建出一个块设备出来。对于用户来说,一个DRBD设备,就像是一块物理的磁盘,可以在商脉内创建文件系统。DRBD所支持的底层设备有以下这些类:

(1)一个磁盘,或者是磁盘的某一个分区

(2)一个soft raid 设备

(3)一个LVM的逻辑卷

(4)一个EVMS(Enterprise Volume Management System,企业卷管理系统)的卷

(5)其他任何的块设备

我们的线上环境采取的第一种,即用单独的磁盘来做的DRBD。

四、DRBD的配置过程

我查阅了网上大量的教程类文间,感觉写得不算是详细;今天我登陆到服务器上,发现我的DRBD+Heartbeat已经稳定运行了161天(海量图片文件服务器),相当的稳定和高效。如果没有线上环境的同学也不要着急,大家完全可以根据我的文章用VMware workstation6.0+Centos5.x系统实现这个实验,达到熟练掌握的目的。需要注意的地方我会重点说明,整个测试过程参考生产服务器。

服务器1:centos1.7788.com,单独拿一块硬盘sdb作DRBD

服务器2:centos2.7788.com,单独拿一块硬盘sdb作DRBD

网络拓补很简单:

centos1.7788.com eth0:192.168.4.191,物理bridge连接,eth1:10.0.0.1,这个可以采用虚拟网段VM5

centos2.7788.com eth0:192.168.4.192,物理bridge连接,eth1:10.0.0.2,这个可以采用虚拟网段VM5

VIP:   192.168.4.194,这个是通过Heartbeat来实现的,原理跟Keepalived类似,它通过在某台服务器的eth0:0上绑定,如果遇到故障就转移,达到高HA的目的;这个同时也是对外提供服务的IP。

Hosts的配置在二台机器上一样,不需要太复杂,只配置心跳部分即可,即:

centos1.7788.com 192.168.4.191 centos1
centos2.7788.com 192.168.4.192 centos2

另外关于时间同步一说,蛮多哥哥说要ntpdate,其实也没什么必要;不过为了线上环境的严谨,这步就做一下吧,ntpdate ntp.api.bz。

◆DRBD的安装和配置

DRBD官方网站:http://www.linux-ha.org/DRBD

×××地址: http://oss.linbit.com/drbd

FAQ: http://www.linux-ha.org/DRBD/FAQ

目前流行的Linux中只有Centos有预编译好的安装包和对应内核.

如果不想用Centos可以选择从源码安装.

DRBD有两种安装模式:直接编译进内核 或 作为一个可加载的内核模块编译.

以下使用的是CentOS 5.2 i386 系统安装与测试:

1. 安装依赖库.

yum install gcc gcc-c++ make glibc flex

2. 在primary和secondary上都使用相同的安装方法:

 
    
  1. tar zxvf drbd-8.0.6.tar.gz  
  2. cd drbd-8.0.6  
  3. make  
  4. //make KDIR=/usr/src/linux *内核所在的位置*, 如果没有更改内核可  
  5. //直接运行make, 软件会直接到/lib/module里边去寻找系统环境,  
  6. //如果是新的内核需要对内核进行编译安装, 否则make时候会错误中断掉.  
  7. make install 

 

3. 安装完主要生成命令: “drbdsetup”, “drbdadmin”

和配置文件: /etc/drbd.conf

启动文件: /etc/init.d/drbd

模块文件: drbd.ko  (在编译好的安装包目录下的drbd下可以找到)

 

 
    
  1. ls /lib/modules/2.6.18-128.el5/kernel/drivers/block/  
  2. cpqarray.ko  drbd.ko  nbd.ko  sx8.ko 

 

所有命令和配置文件都可以在源码包编译成功的目录下面找到.

./scripts/drbd.conf是最原始的配置文件, 当/etc/drbd.conf被破坏, 可以直接拷贝覆盖掉.

 

4. drbd采用的是模块控制的方式, 所以先要加载drbd.ko 模块.

 

 
    
  1. modprobe drbd  
  2. 查看drbd模块是否已经加载到内核中了:  
  3. lsmod | grep drbd  
  4. drbd    226352  2         //有的话表示加载模块成功. 

 

5. 先确认两台要镜像的机器是否正常, 之间的网络是否通畅, 需要加载的硬盘是否处于umount状态.

6. 在两台主机上都创建硬件设备drbd.

 

 
    
  1. mknod /dev/drbd0 b 147 0  
  2. //mknod /dev/drbd1 b 147 1  
  3. //mknod /dev/drbd2 b 147 2  如需多个drbd设备则依次去创建. 

 

7. 二台机器将/dev/sdb1互为镜相(两台机器配置相同).

 
    
  1. yum -y install portmap  
  2. yum -y install nfs  
  3. mkdir /d      //创建共享目录.  
  4. vim /etc/exports  
  5. /d 10.1.2.0/255.255.252.0(rw,no_root_squash,no_all_squash,sync)  
  6. /etc/init.d/portmap start  
  7. chkconfig –level 3 portmap on  
  8. chkconfig –level 3 nfs off  
  9. //nfs不需要启动, 也不需要设置成开机自动运行, 这些都将由后面的heartbeat来完成. 

 

8. 配置drbd.

DRBD运行时,会读取一个配置文件/etc/drbd.conf.

这个文件里描述了DRBD设备与硬盘分区的映射关系, 和DRBD的一些配置参数

 

 
    
  1. [root@centos1 ~]# cat /etc/drbd.conf  
  2. #创建一个资源,名字叫r0  
  3. resource r0 {  
  4.  protocol C;  
  5.  #采用C协议,表示收到远程主机的写入确认后,则认为写入完成。  
  6.  startup { wfc-timeout 0; degr-wfc-timeout 120; }  
  7.  disk { on-io-error detach; }  
  8.  net {  
  9.      timeout 60;  
  10.      connect-int 10;  
  11.      ping-int 10;  
  12.      max-buffers 2048;  
  13.      max-epoch-size 2048;  
  14.      } 
 
    
  1.  syncer { rate 30M; }  
  2. #设置主备节点同步时的网络速率最大值  
  3.  on centos1.7788.com {  
  4.    device    /dev/drbd0;  
  5.    disk      /dev/sdb;  
  6.    address   10.0.0.1:7788;  
  7.    meta-disk internal;  
  8.  }  
  9.  on centos2.7788.com {  
  10.    device    /dev/drbd0;  
  11.    disk      /dev/sdb;  
  12.    address   10.0.0.2:7788;  
  13.    meta-disk internal;  
  14.  }  
  15. }  
  16. #每个主机的说明以"on"开头,分别是各自的主机名,再后面的{}为这个主机的配置;监听端口为7788, meta-disk internal即表示在同一个局域网内 

 

 

9.drbd的启动, 激活前面配置的drbd资源 “r0″. (两个节点都要执行)

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

分别在两台主机上执行:

 

 
    
  1. [root@centos1 /]# drbdadm create-md r0    //创建r0的资源, r0是我们在drbd.conf里定义的资源名称.  
  2. [root@centos2 /]# drbdadm create-md r0 

 

现在可以启动drbd了, 分别在两台主机上执行.

 
    
  1. [root@centos1 /]# /etc/init.d/drbd start #我喜欢用service drbd start  
  2. [root@centos2 /]# /etc/init.d/drbd start 

 

设置drbd开机自动启动.

 
    
  1. [root@centos1 /]# chkconfig --add drbd  
  2. [root@centos2 /]# chkconfig --add drbd 

 

现在可以查看drbd当前的状态, 然后在centos1上执行:

 

 
    
  1. [root@centos1 /]# cat /proc/drbd  
  2. version: 8.0.0 (api:86/proto:86)  
  3. SVN Revision: 2713 build by root@centos1, 2008-06-27 14:07:14  
  4. 1: cs:Connected st:Secondary/Secondary ds:Inconsistent/Inconsistent C r—  
  5. ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0  
  6. resync: used:0/31 hits:0 misses:0 starving:0 dirty:0 changed:0  
  7. act_log: used:0/257 hits:0 misses:0 starving:0 dirty:0 changed:0 

 

第一行的’st’表示两台主机的状态,都是”备机”状态.

‘ds’是磁盘状态,都是”不一致”状态.

这是由于,DRBD无法判断哪一方为主机,以哪一方的磁盘数据作为标准数据.

所以,我们需要初始化一个主机, 那么需要在centos1上执行.

10.初始化centos1(这步只要在主节点上操作)

 

 
    
  1. [root@centos1 /]# drbdsetup /dev/drbd0 primary -o   //定义为主节点.  
  2. # drbdadm primary r0 

 

第一次设置主节点时用 drbdadm 命令会失败, 所以先用drbdsetup 来做, 以后就可以用drbdadm了.

再次查看drbd当前的状态.

 

 
    
  1. [root@centos1 ~]# cat /proc/drbd  
  2. version: 8.0.0 (api:86/proto:86)  
  3. SVN Revision: 2713 build by root@centos1, 2008-06-27 14:07:14  
  4. 1: cs:SyncSource st:Primary/Secondary ds:UpToDate/Inconsistent C r—  
  5. ns:18528 nr:0 dw:0 dr:18528 al:0 bm:1 lo:0 pe:0 ua:0 ap:0  
  6. [>...................] sync’ed:  0.3% (8170/8189)M  
  7. finish: 6:46:43 speed: 336 (324) K/sec  
  8. resync: used:0/31 hits:1156 misses:2 starving:0 dirty:0 changed:2  
  9. act_log: used:0/257 hits:0 misses:0 starving:0 dirty:0 changed:0 

 

现在主备机状态分别是’主/备’, 主机磁盘状态是’实时’, 备机状态是’不一致’.

在第3行, 可以看到数据正在同步中, 即主机正在将磁盘上的数据, 传递到备机上.

现在的进度是0.3%.

设置完之后的第一次同步耗时比较长, 因为需要把整个分区的数据全部同步一遍.

第一次同步完成之后, 就可以对drbd的设备创建文件系统了:

稍等一段时间, 在数据同步完后, 再查看一下两台机器的DRBD状态:

 

 
    
  1. [root@centos1 ~]# cat /proc/drbd  
  2. SVN Revision: 3048 build by root@centos1.7788.cn, 2010-01-20 06:09:12  
  3. 0: cs:Connected st:Primary/Secondary ds:UpToDate/UpToDate C r— 

 

 

 
    
  1. [root@centos2 ~]# service drbd status  
  2. SVN Revision: 3048 build by root@centos2.7788.cn, 2010-01-20 06:09:02  
  3. 0: cs:Connected st:Secondary/Primary ds:UpToDate/UpToDate C r— 

 

现在磁盘状态都是’实时’, 表示数据同步完成了.

#查看drbd的实时状态,我喜欢用service drbd status

11.drbd的使用.

现在可以把主机上的DRBD设备挂载到一个目录上进行使用.

备机的DRBD设备无法被挂载, 因为它是用来接收主机数据的, 由DRBD负责操作.

在centos1主服务器上执行:

 

 
    
  1. [root@centos1 /]# mkfs.ext3 /dev/drbd0  
  2. [root@centos1 mnt]# mount /dev/drbd0 /d      //只要在主节点上操作 

 

现在, 就可以对 /d 分区进行读写操作了.

注意: secondary节点上不允许对drbd设备进行任何操作, 包括只读.

所有的读写操作只能在primary节点上进行.

只有当primary节点挂掉之后, secondary节点才能提升成为primary节点, 继续进行读写操作.