镜像技术DRBD
推荐 原创缥缈孤鸿一pmhong 博主文章分类:其他 ©著作权
©著作权归作者所有:来自51CTO博客作者缥缈孤鸿一pmhong的原创作品,请联系作者获取转载授权,否则将追究法律责任
对于一些中小型的企业来说,欲购买共享存储的设备压力还是挺大的。在承受不起那么昂贵的成本的情况下,DRBD可以发挥一定的作用,其实他就类似于基于网络的raid1,在各个主机的磁盘上都有一个完整的备份,所以在单台机器宕机的情况下,并不会对业务造成太大影响。
我在做实验之前,在理解上有一个误区,这里提出来,给大家提下醒:
一开始,我以为DRBD是这样的,局域网内每台服务器的磁盘上都有一份完全一样的数据,每台服务器挂载各自的硬盘,通过DRBD,实现数据同步。
但是,我在下面做实验的时候发现从节点没办法挂载相关的DRBD设备(/dev/drbd1),也就是说,只有主服务器上的DRBD设备能够提供读写,而从服务器上的设备根本都没办法使用,但是它上面有数据,而且跟主服务器是同步的。
这就说明了,我之前的理解是错误的。实际上,用到DRBD的时候,通常会用在HeartBeat+NFS+DRBD 类似于这样的架构中,DRBD只是提供数据的冗余。这次先不介绍那么多,下次实验再做。
【实验拓扑】
【实验环境】
virtual box
centos 6.4 最小化
【实验步骤】
1、配置主机名
[root@localhost ~]# vim /etc/sysconfig/network
HOSTNAME=node1
[root@localhost ~]# vim /etc/hosts
192.168.56.120 node1
192.168.56.121 node2
[root@localhost ~]# hostname node1
===============================
[root@localhost ~]# vim /etc/sysconfig/network
HOSTNAME=node2
[root@localhost ~]# vim /etc/hosts
192.168.56.120 node1
192.168.56.121 node2
[root@localhost ~]# hostname node2
2、添加需要同步的硬盘
3、建立分区
[root@node1 ~]# fdisk -cu /dev/sdb
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 ~]# partprobe //使刚才的 partition table 变更生效
注意:这里只对新添加的硬盘做分区,不进行格式化,也不挂载
建立分区完成后请建立 /db 目录
[root@node1 drbd]# mkdir /db
4、安装DRBD
节点一和节点二接下来的配置上是完全一样的,这里只记录node1的步骤,node2按照node1操作。
[root@node1 ~]# yum -y install kernel-devel kernel-headers flex wget gcc gcc-c++ make
[root@node1 src]# wget http://oss.linbit.com/drbd/8.4/drbd-8.4.3.tar.gz
[root@node1 src]# tar xf drbd-8.4.3.tar.gz
[root@node1 src]# cd drbd-8.4.3
[root@node1 drbd-8.4.3]# ./configure --prefix=/usr/local/drbd --with-km
[root@node1 drbd-8.4.3]# make KDIR=/usr/src/kernels/2.6.32-358.14.1.el6.i686/
[root@node1 drbd-8.4.3]# make install
[root@node1 drbd-8.4.3]# mkdir -p /usr/local/drbd/var/run/drbd
[root@node1 drbd-8.4.3]# cp /usr/local/drbd/etc/rc.d/init.d/drbd /etc/rc.d/init.d/
[root@node1 drbd-8.4.3]# chkconfig --add drbd
[root@node1 drbd-8.4.3]# chkconfig drbd on
按照drbd模块
[root@node1 drbd-8.4.3]# cd /usr/src/drbd-8.4.3/drbd
[root@node1 drbd]# make clean
[root@node1 drbd]# make KDIR=/usr/src/kernels/2.6.32-358.14.1.el6.i686/
[root@node1 drbd]# cp drbd.ko /lib/modules/`uname -r`/kernel/lib/
[root@node1 drbd]# depmod
5、配置drbd
主要定义两块global和resource
[root@node1 drbd]# vim /usr/local/drbd/etc/drbd.conf
include "drbd.d/global_common.conf";
include "drbd.d/*.res";
主配置文件内容已经写好,无需修改,其实这个配置文件也只是将global和resource文件引用进来。
[root@node1 drbd]# vim /usr/local/drbd/etc/drbd.d/global_common.conf
global {
usage-count yes;
}
common {
net {
protocol C;
}
}
[root@node1 drbd]# vim /usr/local/drbd/etc/drbd.d/r0.res
resource r0 {
on node1 {
device /dev/drbd1;
disk /dev/sdb1;
address 192.168.56.120:7789;
meta-disk internal;
}
on node2 {
device /dev/drbd1;
disk /dev/sdb1;
address 192.168.56.121:7789;
meta-disk internal;
}
}
[root@node1 drbd]# modprobe drbd//载入drbd 模块
[root@node1 drbd]# lsmod |grep drbd//确认drbd模块是否载入
drbd 292339 0
[root@node1 drbd]# dd if=/dev/zero of=/dev/sdb1 bs=1M count=100 //为新建的硬盘创建一些资料(否则create-md会报错)
[root@node1 drbd]# drbdadm create-md r0 //建立drbd resource
[root@node1 drbd]# drbdadm up r0 //启动resource r0
查看node1和node2的状态应该类似下面的:
[root@node1 drbd]# cat /proc/drbd
version: 8.4.3 (api:1/proto:86-101)
GIT-hash: 89a294209144b68adb3ee85a73221f964d3ee515 build by root@node1, 2013-07-2
1: cs:Connected ro:Secondary/Secondaryds: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:f oos:1047484
表明现在已经启动服务,而且两个节点都是从节点(Secondary),还没有设置同步(即需要设置Primary Node)
以下操作仅在node1执行
设置node1为primary node:
[root@node1 drbd]# drbdadm primary --force r0
再次查看node1的状态:
[root@node1 drbd]# cat /proc/drbd
version: 8.4.3 (api:1/proto:86-101)
GIT-hash: 89a294209144b68adb3ee85a73221f964d3ee515 build by root@node1, 2013-07-29 08:48:43
1: cs:SyncSource ro:Primary/Secondaryds:UpToDate/Inconsistent C r---n-
ns:172600 nr:0 dw:0 dr:173720 al:0 bm:10 lo:0 pe:3 ua:1 ap:0 ep:1 wo:f oos:877500
我们看到状态已经变成Primary/Secondary,即设置primary node成功
创建DRBD文件系统(以下操作仅在node1执行)
将/dev/drbd1 格式化为ext3格式的文件系统并挂载到我们创建的/db目录下
[root@node1 ~]# mkfs.ext3 /dev/drbd1
[root@node1 ~]# mount /dev/drbd1 /db/
[root@node1 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root
6.5G 903M 5.2G 15% /
tmpfs 250M 0 250M 0% /dev/shm
/dev/sda1 485M 30M 430M 7% /boot
/dev/drbd1 1007M 18M 939M 2% /db
现在,只要往/db目录写入数据,drbd就会立刻把数据同步到备用机192.168.56.121上了
[root@node1 ~]# echo "test DRBD" > /db/test.txt
6、测试同步
当备机node2启动drbd时,/dev/sdb1是无法挂载的,如果要做同步的测试,我们可以在node1的/db/目录写入数据,然后停掉node2的drbd。
[root@node2 drbd]# mount -t ext3 /dev/sdb1 /db
mount: /dev/sdb1 already mounted or /db busy //没有停掉node2的drbd是没办法挂载sdb1的
[root@node2 drbd]# drbdadm down r0
[root@node2 drbd]# mount -t ext3 /dev/sdb1 /db
[root@node2 drbd]# cat /db/test.txt
test DRBD
可以看到node1上面的数据已经同步过来
如果需要手动切换主备,可以这样做:
[root@node1 ~]# umount /dev/drbd1
[root@node1 ~]# drbdadm secondary r0
[root@node2 drbd]# drbdadm primary r0
[root@node1 ~]# cat /proc/drbd
version: 8.4.3 (api:1/proto:86-101)
GIT-hash: 89a294209144b68adb3ee85a73221f964d3ee515 build by root@node1, 2013-07-29 08:48:43
1: cs:Connected ro:Secondary/Primaryds:UpToDate/UpToDate C r-----
ns:1080932 nr:0 dw:33460 dr:1049250 al:14 bm:67 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
可以看到已经成功切换了!
至此实验完成!
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
01-docker技术概述、容器管理命令、镜像管理命令
docker管理命令、容器管理命令
docker kylin linux