DRBD的官网:http://www.drbd.org

下载地址:http://oss.linbit.com/drbd/

DRBD概念:

clip_p_w_picpath002

DRBD是由内核模块和相关脚本构成,用以构建高可用性的集群,其实现方式是通过网络来镜像整个设备,允许用户在远程机器上建立一个本地块设备的实时镜像,与心跳连接结合使用,可以把它看做是一种网络RAID1。目前DRBD每次只允许对一个节点进行读写访问,这对于通常的故障切换高可用性集群来说已经足够。

一个DRBD系统由两个或两个以上节点构成,与HA集群类似,也有主节点和备用节点之分。在主节点写入数据通过DRDB设备存储到主节点的磁盘中,同时,这个数据也会自动发送到备用节点相应的DRBD设备,最终写入备用节点的磁盘。

DRBD可以作为一个共享存储设备,不需要任何硬件投资,因为它在IP网络中运行,所以利用DRBD作为共享存储设备,可以节约很多成本,在价格上比专用的存储网络SAN经济很多。

DRDB的读写操作过程分析:

对于读操作, 都是使用"主用"的存储, 即本地的.

对于写操作, 问题有些复杂, 但是针对最简单的情况, 它的实现方式如下,

1. 接到写请求;

2. 把写请求发送给本地底层存储, 同时通过网络把写请求发送给对端的"次用"DRBD设备;

3. "次用"DRBD设备执行写请求, 把数据写到物理存储上.

4. "次用"DRBD在完成写操作后, 发送一个"确认"给"主用"DRDB

5. 这是, "主用"DRBD应已完成对本地硬盘的写, 返回给应用一个写操作完成确认.

也就是说, DRBD直到完成本地和远端的写操作, 才返回应用一个写完成.

当然, 这是DRBD最严格的一种实现. DRDB也可以有另两种相对松散的实现,

a. 主用DRBD在接到写请求后, 立刻返回写完成给应用.

b. 在次用DRBD的缓存收到写请求后, 立刻返回写完成给应用.

DRBD还支持同时向"主用"和"次用"设备的写操作, 实现就要复杂的多. 我的个人理解, 对于应用来说, 只面对主用设备, 在发生集群(clustering)切换之前, 应用是不直接访问次用设备的. 结构越简单, 可靠性越高.

DRBD协议:

A、数据一旦写入磁盘并发送到网络中就认为完成了写入操作。

B、收到远程节点接收确认就认为完成了写入操作。

C、收到远程节点写入确认就认为完成了写入操作。

DRBD设备的三个进程:

每个drbd设备会有三个进程:

drbd0_worker 是drbd0的主要进程,统一控制数据的写入和传出等的调度。

drbd0_asender是primary上drbd0的数据发送进程(数据先写入主节点后,然后asender进程发送数据到备用节点)

drbd0_receiver是secondary上drbd0的数据接收进程。

一、测试环境

server1 单独一块硬盘sdb作DRDB, 128.1.37.204

server2 单独一块硬盘sdb作DRDB 128.1.37.205

clip_p_w_picpath003

二、安装步骤:

#tar -zxvf drbd-8.3.10.tar.gz

#cd drbd-8.3.10

注意,DRBD需要内核模块支持,2.6.33后的Linux内核已内置DRBD的支持,在此版本前,安装时需要kernel-

devel包,同时编译drbd时要带上--with-km。

#./configure --prefix=/ --with-km

#make

#make install

#chkconfig --add drbd

检查DRBD是否安装成功:

lsmod | grep -i drbd

modprobe -l | grep drbd

安装完成后,在/sbin目录下会有如下文件: drbdadm、drbdmeta,drbdsetup命令,以及/etc/init.d/drbd启动脚本

-------------------------------

三、 DRBD配置

DRBD的配置文件位于/etc/drbd.conf

DRBD配置请参考:http://www.drbd.org/docs/install/

[root@drbd1 ~]#cat /etc/drbd.conf

#

# drbd.conf

#

# create by jackbillow@gmail.com at 2010-08-12

global {

# minor-count 64;

# dialog-refresh 5; # 5 seconds

# disable-ip-verification;

usage-count no;

#是否参加DRBD使用者统计,默认yes

}

common {

syncer { rate 200M; }

#设置主备节点同步时的网络速率最大值,单位是字节。

}

resource drbdtest {

#资源名字为r0. 在启动DRBD之前,你需要分别在两台主机的hdb1分区上,创建供DRBD记录信息的数据块,块设备名为r0

protocol C;

# 使用drbd的第三种同步协议,表示收到远程主机的写入确认后,则认为写入完成.

handlers {

pri-on-incon-degr "echo o > /proc/sysrq-trigger ; halt -f";

pri-lost-after-sb "echo o > /proc/sysrq-trigger ; halt -f";

local-io-error "echo o > /proc/sysrq-trigger ; halt -f";

fence-peer "/usr/lib64/heartbeat/drbd-peer-outdater -t 5";

pri-lost "echo pri-lost. Have a look at the log files. | mail -s 'DRBD Alert' root";

split-brain "/usr/lib/drbd/notify-split-brain.sh root";

out-of-sync "/usr/lib/drbd/notify-out-of-sync.sh root";

}

#上面是在进行数据传输过程中的加密设置,都是默认参数

net {

# timeout 60;

# connect-int 10;

# ping-int 10;

# max-buffers 2048;

# max-epoch-size 2048;

cram-hmac-alg "sha1"; //同步过程中的加密级别为sha1(还有crc,md5)

shared-secret "mydrbdtest"; //自定义同步过程中的加密密码,主备节点密码要一致

# DRBD同步时使用的验证方式和密码信息。

}

disk {

on-io-error detach;

fencing resource-only;

#使用dpod功能(drbd outdate-peer daemon)保证在数据不同步时不进行切换,一般会配合heartbeat进行使用。

}

startup {

wfc-timeout 120;

degr-wfc-timeout 120;

}

#定义超时的设置,此处为默认值、

device /dev/drbd0;

#定义drdb0的设备块的标识

on server1 {

#每个主机的说明以on开头,后面是hostname(uname -n),在后面的{}中为这个主机的配置。

disk /dev/sdb1;

#/dev/drbd0使用的磁盘分区是/dev/sda2,即要镜像的磁盘分区

address 128.1.37.204:7788; //IP为对应主机的ip,而不是对方主机的IP

#设置DRBD的监听端口,用于与另一台主机通信。

meta-disk internal; //定义drdb的元数据的存放方式

}

on server2 {

disk /dev/sdb1;

#/dev/drbd0使用的磁盘分区是/dev/sda2。

address 128.1.37.205:7788;

#设置DRBD的监听端口,用于与另一台主机通信。

meta-disk internal; #drbd的元数据存放方式。

}

}

将上面这个drbd.conf文件分别复制到两台主机的/etc目录下。

四、创建块设备

分别在两台主机的sdb1分区上,创建供DRBD记录信息的数据块.。

clip_p_w_picpath004

在两台主机上执行同样的命令,输入yes就可以了。

五、启动DRBD并检查状态

执行以下命令启动drbd,

#service drbd start

或是

#/etc/init.d/drbd start

clip_p_w_picpath005

可以看到在进程中已经有了drbd的两个进程:drbd0_worker、drbd0_receiver

下面我们来查看现在drbd的状态信息:

clip_p_w_picpath007

看到在状态显示secondary/unknown,表示为能跟另一台主机连接上,我们这里先停掉iptables

Service iptables stop

再次查看状态如下:

看到这里已经显示是secondary/secondary状态了,

clip_p_w_picpath008

对输出的含义解释如下:

ro表示角色信息,第一次启动drbd时,两个drbd节点默认都处于Secondary状态,

ds是磁盘状态信息,“Inconsistent/Inconsisten”,即为“不一致/不一致”状态,表示两个节点的磁盘数据处于不一致状态。

Ns表示网络发送的数据包信息。

Dw是磁盘写信息

Dr是磁盘读信息

4设置主节点

由于默认没有主次节点之分,因而需要设置两个主机的主次节点,选择需要设置为主节点的主机,然后执行如下命令:

[root@drbd1 ~]#drbdsetup /dev/drbd1 primary –o

或者执行下面命令也是可以的

[root@drbd1 ~]#drbdadm -- --overwrite-data-of-peer primary all

第一次执行完此命令后,在后面如果需要设置哪个是主节点时,就可以使用另外一个命令:

[root@drbd1 ~]#/sbin/drbdadm primary r0或者/sbin/drbdadm primary all

再次查看drbd状态,

clip_p_w_picpath009

可以看到现在状态已经是primary/secondary,而且磁盘信息是upTodat/Inconsistent(实时/不一致),而且已经开始同步两台机器对应磁盘的数据

过了一会,我们再次查看drbd状态,如下:

clip_p_w_picpath010

此时的状态信息就是primary/secondary,磁盘信息是UpToDate/UpToDate,说明已经同步完成了。

六、主备节点切换测试:

1、主用节点挂掉:

此时在备用节点执行以下命令:

#drbdsetup /dev/drbd0 primary -o

clip_p_w_picpath011

可以看到在执行命令前后的状态变化。

2、正常切换主备节点:

在server1卸载磁盘分区,然后执行

[root@drbd1 ~]#drbdadm secondary all

如果不执行这个命令,直接在备用节点执行切换到主节点的命令,会报错:

2: State change failed: (-1) Multiple primaries not allowed by config

Command 'drbdsetup 2 primary' terminated with exit code 11

接着,在备用节点执行

[root@drbd2 ~]#drbdadm primary all

最后在备用节点挂载磁盘分区即可:

[root@drbd2 ~]#mount /dev/drbd2 /mnt

七、注意事项:

1、 mount drbd设备以前必须把设备切换到primary状态

2、 两个节点中,同一个时刻只能有一台处于primary状态,另一台处于secondary状态

3、 处于secondary状态的服务器上不能加载drbd设备。

4、 主备服务器同步的两个分区大小最好相同,这样不至于浪费磁盘空间,因为drbd磁盘相当于网络raid1