一、原理
1. DRBD(Distributed Replicated Block Device)是一种块设备(分布式复制块设备),可以被用于高可用(HA)之中.它类似于一个网络RAID-1功能.当你将数据写入本地文件系统时,数 据还将会被发送到网络中另一台主机上.以相同的形式记录在一个文件系统中.
本地(主节点)与远程主机(备节点)的数据可以保证实时同步.当本地系统出现故障时,远程主机上还会保留有一份相同的数据,可以继续使用.
在高可用(HA)中使用DRBD功能,可以代替使用一个共享盘阵.因为数据同时存在于本地主机和远程主机上,切换时,远程主机只要使用它上面的那份备份数据,就可以继续进行服务了.
2. DRBD 实际上是一种块设备的实现,主要被用于Linux平台下的高可用(HA)方案之中。他是有内核 模块和相关程序而组成,通过网络通信来同步镜像整个设备,有点类似于一个网络RAID的功能。也就是说当你将数据写入本地的DRBD设备上的文件系统 时, 数据会同时被发送到网络中的另外一台主机之上,并以完全相同的形式记录在一个文件系统中(实际上文件系统的创建也是由DRBD的同步来实现的)。本地节点 (主机)与远程节点(主机)的数据可以保证实时的同步,并保证IO的一致性。所以当本地节点的主机出现故障时,远程节点的主机上还会保留有一份完全相同的 数据,可以继续使用,以达到高可用的目的。
3.DRBD的主要应用DRBD的工作原理如下图:
+----------+
| 文件系统 |
+----------+
|
V
+-------------+
| 块设备层 |
| (/dev/drbd1)|
+-------------+
| |
| |
V V
+------------+ +-------------+
| 本地硬盘 | | 远程主机硬盘|
| (/dev/hdb1)| | (/dev/hdb1) |
+------------+ +-------------+
==========================================================
二、测试
注意:你需要为本地主机和远程主机,指定一个DRBD使用的硬盘分区.这两个分区的大小建议相同.
我们指定两台主机的/dev/sda3 分区作为DRBD的使用的分区.这两个分区大小都为11G.
*注意! 在没有建立drbd资源时,切不可提前格式化硬盘!
##############################################################
系统环境:Centos5.4 x86_64 [ 2.6.18-164.el5]
master(主机):IP地址:192.168.1.60 镜像分区:/dev/sda3,11GB
slave (备机):IP地址:192.168.1.61 镜像分区:/dev/sda3,11GB
软件环境:
Centos自带RPM包:
kernel-headers-2.6.18-164.el5
kernel-devel-2.6.18-164.el5
安装flex的rpm包,否则drbd不能编译过去
flex-2.5.4a-41.fc6
需另下载的软件包:
drbd-8.3.6.tar.gz http://oss.linbit.com/drbd/8.3/drbd-8.3.6.tar.gz
http://oss.linbit.com/drbd/
http://www.drbd.org/download/packages/
##############################################################
1.安装内核开发环境(kernel-headers、kernel-devel)
yum install kernel-devel kernel-headers
2.安装drbd软件包
tar -zxvf drbd-8.3.6.tar.gz
cd drbd-8.3.6
./configure --prefix=/usr/local/drbd --with-km
make
make install
ln -s /usr/local/drbd/etc/drbd.conf /etc/drbd.conf
ln -s /usr/local/drbd/etc/rc.d/init.d/drbd /etc/init.d/drbd
chkconfig --add drbd
chkconfig --level 35 drbd on
执行之后:
drbd.ko被安装到/lib/modules/$KernelVersion/kernel/drivers/block下.
drbd相关工具(drbdadm,drbdsetup)被安装到/sbin下.
并会在/etc/init.d/下建立drbd启动脚本.
=================================================================
3.调整drbd服务脚本
vi /etc/init.d/drbd //在服务脚本的start)部分添加模块加载语句
……
case "$1" in
start)
insmod /lib/modules/2.6.18-164.el5/kernel/drivers/block/drbd.ko
……
cat > /etc/drbd.conf <<EOF
global { usage-count yes; }
common {
# 使用协议C.表示收到远程主机的写入确认后,则认为写入完成
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 master {
device /dev/drbd0;
disk /dev/sda3;
address 192.168.1.60:7801;
}
on slave {
device /dev/drbd0;
disk /dev/sda3;
address 192.168.1.62:7801;
}
}
EOF
三.建立drbd设备,启动drbd服务(master,slave)
1.建立md设备
在启动DRBD之前,你需要分别在两台主机的sdc1分区上,创建供DRBD记录信息的数据块.
注意:如果你在这步之前已经给/dev/sda3格式化的话,这里会报错,并且无法继续,抱错内容如下:
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
注:如果出现上面的情况要注意卸载文件系统,否则drbd不成功
# 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服务程序
# /etc/init.d/drbd start
3. 确认drbd状态
# cat /proc/drbd
version: 8.3.6 (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 表示两个节点都处于辅助(从)状态
四.初始化Primary机(master)
1. 设为主导状态(同步发起端)
# drbdsetup /dev/drbd0 primary -o
# cat /proc/drbd
version: 8.3.6 (api:88/proto:86-91)
GIT-hash: f3606c47cc6fcf6b3f086e425cb34af8b7a81bbf build by root@master, 2010-07-12 15:36:10
0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r----
ns:54400 nr:0 dw:0 dr:54400 al:0 bm:3 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:10668620
[>....................] sync'ed: 0.6% (10416/10468)M
finish: 0:47:37 speed: 3,728 (3,200) K/sec
-------如需降级为备机,可执行
umount /dev/drbd0
drbdadm secondary r0
五.验证磁盘镜像结果
1. master主节点
mkfs.ext3 /dev/drbd0 //此操作只要主的上进行即可
mkdir /data
mount -o rw /dev/drbd0 /data
2.slave备节点
mkdir /data
测试:
方法1)
master主节点
mount /dev/drbd0 /data
ls /etc/ > /data/master
接下来你需要将DRBD的主从机互换一下.
可以执行下面的操作:
在主机上,先要卸载掉DRBD设备.
umount /data
drbdadm secondary r0
现在,两台主机都是"备机"需要把备节点升为主节点
drbdadm primary r0
mount /dev/drbd0 /data
ls /data
方法2)
master主节点
mount /dev/drbd0 /data
ls /etc/ > /data/master
slave备节点
service drbd stop
mount /dev/sda3 /data
这只是简单的测试 下面再测试一下 ha+drbd+mysql 并对ha mysql进行监控