最近因为工作需要,搭建了一个DRBD环境,发现网上很多关于此部分的配置内容不是太全,以下内容是配置过程, 其中很多内容是copy 过来的
1 drbd 工作原理DRBD是一种块设备,可以被用于高可用(HA)之中.它类似于一个网络RAID-1功能.当你将数据写入本地文件系统时,数据还将会被发送到网络中另一台主机上.以相同的形式记录在一个文件系统中。 本地(主节点)与远程主机(备节点)的数据可以保证实时同步.当本地系统出现故障时,远程主机上还会保留有一份相同的数据,可以继续使用.在高可用(HA)中使用DRBD功能,可以代替使用一个共享盘阵.因为数据同时存在于本地主机和远程主机上,切换时,远程主机只要使用它上面的那份备份数据,就可以继续进行服务了。 DRBD的工作原理如下图: +-----------+ | 文件系统 | +-----------+ | V +--------------+ | 块设备层 | | (/dev/drbd1) | +--------------+ | | | | V V +-------------+ +--------------+ | 本地硬盘 | | 远程主机硬盘| | (/dev/hdb1)| |(/dev/hdb1) | +-------------+ +--------------+ ========================================================== 2 安装2.1 安装前须知1. 对操作系统要求 在编译之前,首先要确认系统中已经安装了gcc, make,glibc库, flex scannergenerator和bison等工具,其中gcc的版本必须和编译当前linux内核所用的gcc是相同版本的。 查看gcc版本的命令: #gcc -v
查看当前linux内核对应gcc版本的命令: #cat /proc/version DRBD会被编译内核模块,其中需要用到若干内核头文件、内核源码等等,所以需要做点准备。详细阅读源代码目录中的INSTALL就了解,准备工作分两种情况: 1) 当前系统使用的是发行版本(openSUSE,Fedora, ubuntu等等)编译好的内核(称为stockkernel),则可以检查一下系统/usr/src等目录。(关于内核模块的做法,可以找其它资料参考参考。)如果没有安装这些文件,那么就安装盘,通过安装包管理工具安装到文件系统中就是。 2) 当前系统使用的不是发行版本编译好的内核,比如自己编译的、或者去 www.kernel.org下载的。这种情况,就要去下载对应内核版本的源文件包进行安装。本次安装时基于第(1)种情况。 2. 在安装系统的时候注意划分一个干净的分区,在以下的操作中(创建matadata时)会用到。 2.2 Centos5.4安装1. 操作系统配置: 1) Cw
n0主服务器主机名:master IP:192.168.2.124 镜像的硬盘:/dev/hda2 2) 备份服务器 主机名:slave IP:192.168.2.125 镜像的硬盘:/dev/hda2 2. 在安装过程中选择安装开发工具和开发包 3. 在划分磁盘分区时,划分一个分区专供DRBD使用,Master和slave的这两个分区大小最好相同(如果测试用,分区最好划小点,因为drbd初次同步时分区越大需要的时间越长) 。 2.3 下载安装drbd2. 把下载好的drbd-8.3.5.tar.gz放置到/usr目录下,执行以下命令 1) 进入安装包所在目录 [iyunv@master ]#cd /usr 2) 解压 [iyunv@master ] # tar –zxvf drbd-8.3.5.tar.gz 3) 进入解压后的文件夹 [iyunv@master ] # cddrbd-8.3.5 4) 执行make命令 [iyunv@master ] #make 备注: l 此命令适合于没有更改内核的情况,直接运行make,软件会直接到/lib/module里边去寻找系统环境 l 如果如果是新的内核需要以下命令来make # make KDIR=/usr/src/linux(“/usr/src/linux”为内核所在的位置) 5) 执行make install 命令 [iyunv@master ] # make install 如果没有报错,应该基本install好了,检查是否生成了相应的文件:/etc/drbd.conf ; /etc/init.d/drbd ; 以及./drbd/drbd.ko,同时系统应该至少多了以下两个命令:drbdadm和drbdsetup 6) 加载安装drbd模块 [iyunv@master ]#insmod drbd.ko 或者 modprobe drbd 7) 通过lsmod检查是否已经成功,如果有类似内容输出,则表示drbd安装成功了 [iyunv@master ]# lsmod |grep drbd drbd 271736 0 8) 创建硬件设备drbd(不知道这步是否多余,有些配置文件里说是要执行,有些没有,待验证) [iyunv@master ]# mknod /dev/drbd1 b147 0
1.1 DRBD的配置
DRBD运行时,会读取一个配置文件/etc/drbd.conf.这个文件里描述了DRBD设备与硬盘分区的映射关系,数据一旦写入磁盘并发送到网络中就认为完成了写入操作。
1. drbd.conf的配置参数说明
1) Protocol
Protocol A
收到接收确认就认为完成了写入操作。
Protocol B
收到写入确认就认为完成了写入操作。
Protocol C
2) global
global { usage-count yes; }
是否参加DRBD使用者统计,默认是yes
3) common
common { syncer { rate 1M; } }
设置主备节点同步时的网络速率最大值,单位是字节.
4) resource
一个DRBD设备(即:/dev/drbdX),叫做一个"资源"。里面包含一个DRBD设备的主备节点的的ip信息,底层存储设备名称,设备大小,meta信息存放方式,drbd对外提供的设备名等等。
resource r0 {
#使用协议C.表示收到远程主机的写入确认后,则认为写入完成.
protocol C;
net {
# 设置主备机之间通信使用的信息算法.
cram-hmac-alg sha1;
shared-secret "FooFunFactory";
}
# 每个主机的说明以"on"开头,后面是主机名.在后面的{}中为这个主机的配置.
on master {
# /dev/drbd1使用的磁盘分区是/dev/hdb1
device /dev/drbd1;
disk /dev/ hda2;
# 设置DRBD的监听端口,用于与另一台主机通信
address 192.168.2.124:7898;
meta-disk internal;
}
on slave{
device /dev/drbd1;
disk /dev/ hda2;
address 192.168.2.124:7898;
meta-disk internal;
}
}
2. 以下为测试时的完整配置
global {
usage-count yes;
}
common {
protocol C;
}
resource r0 {
on master.localdomain {
device /dev/drbd1;
disk /dev/hda2;
address 192.168.2.124:7789;
flexible-meta-disk internal;
}
on slave.localdomain {
device /dev/drbd1;
disk /dev/hda2;
address 192.168.2.125:7789;
meta-disk internal;
}
}
3. 双机两个节点的配置文件是一模一样的。DRBD源码目录下有个样本,里面说得比较详细。
1.1 启动1. 创建matadata 在启动DRBD之前,需要分别在两台主机的hdb1分区上,创建供DRBD记录信息的数据块.分别在两台主机上执行: [iyunv@master ]#drbdadm create-mdr0 [iyunv@slave ]#drbdadm create-mdr0 备注: 1) “r0”是在drbd.conf里定义的资源名称. 2) 当执行命令”drbdadm create-md r0”时,出现以下错误信息。 Device size would be truncated,which would corrupt data and resultin 'access beyond end of device'errors. You need to either * use external meta data(recommended) * shrink that filesystemfirst * zero out the device (destroy thefilesystem) Operation refused. Command 'drbdmeta 0 v08 /dev/xvdbinternal create-md' terminated with exit code 40 drbdadm create-md r0: exited withcode 40 解决办法:初始化磁盘文件格式,dd if=/dev/zero bs=1M count=1of=/dev/sdXYZ; sync [iyunv@master ]# dd if=/dev/zero bs=1M count=1of=/dev/hda3; sync 2. 启动DRBD,分别在两台主机上执行 [iyunv@master ]# /etc/init.d/drbdstart [iyunv@slave ]# /etc/init.d/drbdstart 备注: 如果在启动过程中找不到node时,查看是/dev/hda3是否是处于挂载状态,如果是,用umount命令取消挂载 3. 查看DRBD的状态,分别在两台主机上执行 [iyunv@slave drbd]# cat/proc/drbd version: 8.3.5(api:88/proto:86-91) GIT-hash:ded8cdf09b0efa1460e8ce7a72327c60ff2210fb build by root@slave,2010-06-10 09:20:19 1: cs:Connected ro:/Secondary /Secondaryds:UpToDate/UpToDate Cr---- ns:112262 nr:0 dw:7882 dr:110512 al:15 bm:7 lo:0 pe:0 ua:0 ap:0ep:1 wo:b oos:0 [iyunv@slave drbd]# cat/proc/drbd version: 8.3.5(api:88/proto:86-91) GIT-hash:ded8cdf09b0efa1460e8ce7a72327c60ff2210fb build by root@slave,2010-06-10 09:20:19 1: cs:Connected ro:Primary/Secondaryds:UpToDate/UpToDate C r---- ns:112262 nr:0 dw:7882 dr:110512al:15 bm:7 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0 可以看到目前2台机器都是备机状态(secondary状态,红色部分标记) 4. 激活主节点DRBD,此命令只在主机上执行 [iyunv@master ~]# drbdsetup /dev/drbd1 primary –o5. 再次在两台机器上执行cat /proc/drbd查看状态 [iyunv@slave drbd]# cat /proc/drbdversion: 8.3.5 (api:88/proto:86-91)GIT-hash: ded8cdf09b0efa1460e8ce7a72327c60ff2210fb build by root@slave, 2010-06-10 09:20:19 1: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r---- ns:112262 nr:0 dw:7882 dr:110512 al:15 bm:7 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0[iyunv@slave drbd]# cat /proc/drbdversion: 8.3.5 (api:88/proto:86-91)GIT-hash: ded8cdf09b0efa1460e8ce7a72327c60ff2210fb build by root@slave, 2010-06-10 09:20:19 1: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r---- ns:112262 nr:0 dw:7882 dr:110512 al:15 bm:7 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0可以看到目前2台机器都是主备状态(红色部分标记) 2 测试同步把主机上的DRBD设备挂载到一个目录上进行使用。备机的DRBD设备无法被挂载,因为它是用来接收主机数据的,由DRBD负责操作。 1. master 1) 把DRBD设备挂载到一个目录上 [iyunv@ master /]# cd /mnt[iyunv@ master mnt]# mkdir drbd1[iyunv@ master ]# mount /dev/drbd1 /mnt/drbd1[iyunv@master ~]# df -h 文件系统 容量 已用 可用 已用% 挂载点 /dev/hda1 29G 3.5G 24G 13% / tmpfs 988M 0 988M 0%/dev/shm /dev/drbd1 7.7G 419M 6.9G 6%/mnt/drbd1现在,我们在 2) 在drbd1目录里建立一个200M的文件 [iyunv@g105-1 /]# dd if=/dev/zero of=/mnt/drbd1/tempfile1.tmp bs=104857600 count=22. slave 1) 停止DRBD [iyunv@slave /]# /etc/init.d/drbdstop 2) 挂载hdb1 [iyunv@ slave ]# mount /dev/hdb1 /mnt/drbd1[iyunv@slave drbd1]# ls -hl 总计 401M -rw-r--r-- 1 rootroot 006-09 13:01 aa -rw-r--r-- 1 rootroot 006-09 13:18 bb -rw-r--r-- 1 rootroot 200M 06-09 13:24 cc.txt ?--------- ?? ? ? ? drbd1 drwx------ 2 rootroot 16K 06-09 12:58lost+found -rw-r--r-- 1 rootroot 006-09 13:18 ls -rw-r--r-- 1 rootroot 200M 06-09 13:21 tempfile1.tmp 可以看到,在主机g105-1上产生的文件tmpfile1.tmp,也完整的保存在备机g10slave的DRBD分区上。 这就是DRBD的网络RAID-1功能. 在主机上的任何操作,都会被同步到备机的相应磁盘分区上,达到数据备份的效果。 3) 测试完毕后请务必对slave解除挂载和重新启动,否则将导致同步停止 [iyunv@ slave ]# umount /dev/hdb1 /mnt/drbd1[iyunv@slave /]# /etc/init.d/drbdstart 3 注意点1. mount drbd设备以前必须把设备切换到primary状态。 2. 两个节点中,同一时刻只能有一台处于primary状态,另一台处于secondary状态。 3. 处于secondary状态的服务器上不能加载drbd设备。 4. 主备服务器同步的两个分区大小最好相同,这样不至于浪费磁盘空间,因为drbd磁盘镜像相当于网络raid 1。
|