DRBD介绍
DRBD是一个用软件实现的、无共享的、服务器之间镜像块设备内容的存储复制解决方案。 DRBD Logo数据镜像:实时、透明、同步(所有服务器都成功后返回)、异步(本地服务器成功后返回)。DBRD的核心功能通过Linux的内核实现,最接近系统的IO栈,但它不能神奇地添加上层的功能比如检测到EXT3文件系统的崩溃。DBRD的位置处于文件系统以下,比文件系统更加靠近操作系统内核及IO栈。
DRBD编译安装
安装所需依赖:
- yum -y install gcc kernel-devel kernel-headers flex
开始安装drbd,下载地址:http://oss.linbit.com/drbd/
安装用户空间工具:
- cd /tmp
- wget http://oss.linbit.com/drbd/8.4/drbd-8.4.1.tar.gz
- tar xzf drbd-8.4.1.tar.gz
- cd drbd-8.4.1
- ./configure --prefix=/usr/local/drbd --with-km
- make KDIR=/usr/src/kernels/2.6.18-274.18.1.el5-i686/
- make install
- mkdir -p /usr/local/drbd/var/run/drbd
- cp /usr/local/drbd/etc/rc.d/init.d/drbd /etc/rc.d/init.d
- chkconfig --add drbd
- chkconfig drbd on
安装drbd模块:
- cd drbd
- make clean
- make KDIR=/usr/src/kernels/2.6.18-274.18.1.el5-i686/
- cp drbd.ko /lib/modules/`uname -r`/kernel/lib/
- depmod
注:usr/src/kernels/2.6.18-274.18.1.el5-i686/这个内核源码树路径需要根据自己的系统修改。
DRBD配置
建立分区
假如现在有第二块硬盘hdb,两个node都要分区。
- #fdisk /dev/hdb //准备为 hdb 建立分区
- The number of cylinders for this disk is set to 20805.
- There is nothing wrong with that, but this is larger than 1024,
- and could in certain setups cause problems with:
- 1) software that runs at boot time (e.g., old versions of LILO)
- 2) booting and partitioning software from other OSs
- (e.g., DOS FDISK, OS/2 FDISK)
- Command (m for help): n //键入 n 表示要建立分区
- Command action
- e extended
- p primary partition (1-4)
- p //键入 p 表示建立主要分区
- Partition number (1-4): 1 //键入 1 为此主要分区代号
- First cylinder (1-20805, default 1): //开始磁柱值,按下 enter 即可
- Using default value 1
- Last cylinder or +size or +sizeM or +sizeK (1-20805, default 20805): //结束磁柱值,按下 enter 即可
- Using default value 20805
- Command (m for help): w //键入 w 表示确定执行刚才设定
- The partition table has been altered!
- Calling ioctl() to re-read partition table.
- Syncing disks.
- [root@node1 yum.repos.d]# partprobe //使刚才的 partition table 变更生效
建立分区完成后使用指令 fdisk -l 确定 partition talbe 状态
- #fdisk -l
- Disk /dev/hda: 21.4 GB, 21474754560 bytes
- 255 heads, 63 sectors/track, 2610 cylinders
- Units = cylinders of 16065 * 512 = 8225280 bytes
- Device Boot Start End Blocks Id System
- /dev/hda1 * 1 13 104391 83 Linux
- /dev/hda2 14 2610 20860402+ 8e Linux LVM
- Disk /dev/hdb: 10.7 GB, 10737377280 bytes
- 16 heads, 63 sectors/track, 20805 cylinders
- Units = cylinders of 1008 * 512 = 516096 bytes
- Device Boot Start End Blocks Id System
- /dev/hdb1 1 20805 10485688+ 83 Linux
建立分区完成后请建立 /db 目录。 (Node1 及 Node2 都必须建立)
- #mkdir /db
建立drbd配置文件
主要定义两块global和resource。
- vi /usr/local/drbd/etc/drbd.conf
写入:
- include "drbd.d/global_common.conf";
- include "drbd.d/*.res";
- vi /usr/local/drbd/etc/drbd.d/global_common.conf
写入:
- global {
- usage-count yes;
- }
- common {
- net {
- protocol C;
- }
- }
- vi /usr/local/drbd/etc/drbd.d/r0.res
写入:
- resource r0 {
- on node1 {
- device /dev/drbd1;
- disk /dev/hdb1;
- address 192.168.1.101:7789;
- meta-disk internal;
- }
- on node2 {
- device /dev/drbd1;
- disk /dev/hdb1;
- address 192.168.1.103:7789;
- meta-disk internal;
- }
- }
设置hostname
根据上面的resource配置文件,需要对192.168.1.101和192.168.1.103分别设置hostname为node1和node2,设置方法如下:
- vi /etc/sysconfig/network
修改HOSTNAME为node1
- vi /etc/hosts
填入:
- 192.168.1.101 node1
- 192.168.1.103 node2
使node1 hostnmae临时生效
- hostname node1
node2机器设置类似。
设置resource
以下操作需要在node1和node2操作。
- #modprobe drbd //载入 drbd 模块
- #lsmod|grep drbd //确认 drbd 模块是否载入
- drbd 228528 0
- #dd if=/dev/zero of=/dev/hdb1 bs=1M count=100 //把一些资料塞到 hdb 內 (否则 create-md 时有可能会出现错误)
- #drbdadm create-md r0 //建立 drbd resource
- #drbdadm up r0 //启动 resource r0
查看node1和node2的状态应该类似下面的:
- cat /proc/drbd
- version: 8.4.1 (api:1/proto:86-100)
- GIT-hash: 91b4c048c1a0e06777b5f65d312b38d47abaea80 build by root@localhost.localdomain, 2012-02-12 06:05:36
- m:res cs ro ds p mounted fstype
- 0:r0 Connected Secondary/Secondary Inconsistent/Inconsistent C
表明现在已经启动服务,但还没有设置同步(即需要设置Primary Node)
设置Primary Node
以下操作仅在node1执行。
设置node1为primary node:
- drbdadm primary --force r0
再次查看node1的状态:
- #cat /proc/drbd
- version: 8.4.1 (api:1/proto:86-100)
- GIT-hash: 91b4c048c1a0e06777b5f65d312b38d47abaea80 build by root@localhost.localdomain, 2012-02-12 06:47:37
- 1: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
- ns:52892 nr:0 dw:0 dr:52892 al:0 bm:10 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
我们看到状态已经变成Primary/Secondary,即设置primary node成功。
创建DRBD文件系统
以下操作仅在node1执行。
上面已经完成了/dev/drbd1的初始化,现在来把/dev/drbd1格式化成ext3格式的文件系统。
- #mkfs.ext3 /dev/drbd1
然后将/dev/drbd1挂载到之前创建的/db目录。
- #mount /dev/drbd1 /db
现在你只要把数据写入/db目录,drbd即会立刻把数据同步到备机192.168.1.103的/dev/hdb1分区上。
drbd同步测试
当在备机node2启动drbd时,它是无法挂载/dev/hdb1分区的,我们可以尝试写些数据到node1的目录/db上,然后停止node2的drbd。
- drbdadm down r0
之后就可以把node2的/dev/hdb1挂载到目录/db
- mount -t ext3 /dev/hdb1 /db
我们就可以查看node2的/db目录是否有node1的数据。
手动切换主备机
我们可以把node1改变为备机,而node2改变为主机。
在node1上操作:
- umount /dev/drbd1
- drbdadm secondary r0
在node2上操作:
- drbdadm primary r0
此时应该已经切换成功
特别注意:
一定要在配置文件中添加以下两个参数,否则将会导致服务启动时无限期等待。
startup{
wfc-timeout 120;
degr-wfc-timeout 120;
}
如下一个配置实例:
global { usage-count no; }
common { syncer { rate 200M; } }
resource r0 {
protocol C;
net {
cram-hmac-alg sha1;
shared-secret "MySQL_HA";
}
disk{
on-io-error detach;
fencing resource-only;
}
startup{
wfc-timeout 120;
degr-wfc-timeout 120;
}
on mysql-n1 {
device /dev/drbd0;
disk /dev/sdb1;
address 10.0.17.155:7898;
meta-disk internal;
}
on mysql-n2 {
device /dev/drbd0;
disk /dev/sdb1;
address 10.0.17.156:7898;
meta-disk internal;
}
}
设置primary节点&mkfs
[root@mysql-n1 ~]# drbdadm primary all(报错,执行下面操作)
0: State change failed: (-2) Need access to UpToDate data
Command 'drbdsetup 0 primary' terminated with exit code 17
[root@mysql-n1 ~]# drbdadm -- --overwrite-data-of-peer primary all
[root@mysql-n1 ~]# mkfs.ext3 /dev/drbd0
查看drbd的状态
[root@mysql-n1 ~]# cat /proc/drbd
version: 8.3.13 (api:88/proto:86-96)
GIT-hash: 83ca112086600faacab2f157bc5a9324f7bd7f77 build by
mockbuild@builder10.centos.org, 2012-05-07 11:56:36
0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r-----
ns:5043196 nr:0 dw:0 dr:5051264 al:0 bm:307 lo:1 pe:5 ua:64 ap:0 ep:1 wo:b
oos:15921556
[===>................] sync'ed: 24.1% (15548/20472)M
finish: 0:02:02 speed: 129,304 (126,064) K/sec
其中:ro是角色信息:Primary/Secondary(代表这个是主节点)
Secondary/Primary(代表这个是副节点)
ds是磁盘状态:UpToDate/Inconsistent(正在同步,数据还没有一致)
UpToDate/UpToDate (同步完成,数据一致)
ns是网络传输的数据包:以K为字节
dw是磁盘写操作
dr是磁盘读操作
挂载DRBD分区到/data目录下
[root@mysql-n1 ~]# mkdir /data
[root@mysql-n1 ~]# mount /dev/drbd0 /data
[root@mysql-n1 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 37G 4.5G 31G 13% /
tmpfs 502M 0 502M 0% /dev/shm
/dev/drbd0 20G 173M 19G 1% /data
注:DRBD的英文全称就是Distributed Replicated Block Device(分布式块设备复制),
Secondary节点的/dev/drbdX是不能进行挂载
其它的描述
more /proc/drbd
version: 8.2.1 (api:86/proto:86-87)
GIT-hash: 318925802fc2638479ad090b73d7af45503dd184 build by root@test-105, 2010-01-11 17:35:20
1: cs:Connected st:Secondary/Primary ds:UpToDate/UpToDate C r---
ns:0 nr:1645688 dw:1645688 dr:0 al:0 bm:88 lo:0 pe:0 ua:0 ap:0
resync: used:0/31 hits:29120 misses:88 starving:0 dirty:0 changed:88
act_log: used:0/127 hits:0 misses:0 starving:0 dirty:0 changed:0
Field 说明 值:
cs 连接状态 出现的值:
o Unconfigured:设备在等待配置。
o Unconnected:连接模块时的过渡状态。
o WFConnection:设备等待另一测的配置。
o WFReportParams:过渡状态,等待新TCP 连接的第一个数据包时。.
o SyncingAll:正将主节点的所有模块复制到次级节点上。.
o SyncingQuick:通过复制已被更新的模块(因为现在次级节点已经离开了集群)来更新次级节点。
o Connected:一切正常。
o Timeout:过渡状态。
st 状态(设备的作用) 可能的值为:
o 本地/远程一级状态
o 二级状态
o 未知(这不是一种作用)
ns 网络发送 模块号码
nr 网络接收 模块号码
dw 磁盘写入 模块号码
dr 磁盘读取 模块号码
of 运行中(过时的)模块号码
pe 待解决的 模块号码
ua 未答复的 模块号码(最好为0)
安装过程中可能遇到的一些问题
1、create-md的时候总是出现下面的问题
注:mds1在create-md的时候总是出现下面的问题,
[root@mds1 ~]# drbdadm create-md r0
md_offset 2023411712
al_offset 2023378944
bm_offset 2023313408
Found ext3 filesystem which uses 1975992 kB
current configuration leaves usable 1975892 kB
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 0 v08 /dev/sda3 internal create-md' terminated with exit code 40
drbdadm create-md r0: exited with code 40