1、数据镜像软件DRBD介绍
分布式块设备复制(Distributed Replicated Block Device),简称DRBD,它是一种基于软件的、基于网络的块复制存储解决方案,主要用于服务器之间的磁盘、分区、逻辑卷等进行数据镜像。当用户将数据写入本地磁盘时,还会将数据发送到网络中另一台主机的磁盘上,这样本地主机(主节点)与远程主机(备节点)的数据就可以保证实时同步,当本地主机出现问题,远程主机上还保留着一份相同的数据,可以继续使用,保证了数据的安全。
2、DRBD的基本功能
DRBD的核心功能就是数据的镜像,其实现方式是通过网络来镜像整个磁盘设备或磁盘分区,将一个节点的数据通过网络实时的传送到另一个远程节点,保证两个节点间数据的一致性,这有点类似于一个网络RAID1的功能。对于DRDB数据镜像来说,它具有如下特点:
实时性。当应用对磁盘数据有修改操作时,数据复制立即发生。
透明性。应用程序的数据存储在镜像设备上是透明和独立的。数据可以存储在基于网络的不同服务器上。
同步镜像。当本地应用申请写操作时,同时也在远程主机上开始进行写操作。
异步镜像。当本地写操作已经完成时,才开始对远程主机进行写操作。
3、drbd的结构示意图及工作原理
4、DRDB的安装与配置,操作系统centos6.7
其中,主备节点两块磁盘/dev/sdb是未经格式化的物理磁盘,大小均为20GB
[root@Master-drbd ~]# wget http://www.elrepo.org/elrepo-release-6-6.el6.elrepo.noarch.rpm
[root@Master-drbd ~]# wget http://www.elrepo.org/elrepo-release-6-6.el6.elrepo.noarch.rpm [root@Master-drbd ~]# rpm -ivh elrepo-release-6-6.el6.elrepo.noarch.rpm warning: elrepo-release-6-6.el6.elrepo.noarch.rpm: Header V4 DSA/SHA1 Signature, key ID baadae52: NOKEY Preparing... ########################################### [100%] 1:elrepo-release ########################################### [100%] [root@Master-drbd ~]# yum install drbd kmod-drbd84 -y [root@Master-drbd ~]# modprobe drdb [root@Master-drbd ~]# lsmod |grep -i drbd drbd 372759 0 libcrc32c 1246 1 drbd
5、DRBD有三个进程:
drbd0——worker:主进程
drbd0——asender:primary上drbd0的数据发送进程
drbd0——receiver;secondary上drbd0的数据接受进程
配置DRBD前需要注意几点:
mount drbd设备以前必须把设备切换到primary状态,两个节点中,同一时刻只能有一台处于primary状态,另一台处于secondary状态,处于secondary状态的服务器上不能加载drbd设备。主备服务器同步的两个分区大小最好相同,这样不至于浪费磁盘空间,因为drbd镜像相当于网络raid1.
主节点配置,备用节点也是一样的配置 [root@Master-drbd ~]# cat /etc/drbd.conf # You can find an example in /usr/share/doc/drbd.../drbd.conf.example #include "drbd.d/global_common.conf"; #include "drbd.d/*.res"; global { usage-count no; } common { syncer { rate 100M; verify-alg crc32c; } } ###primary for drbd1 resource data { protocol C; disk { on-io-error detach; } on Master-drbd { device /dev/drbd0; disk /dev/sdb; address 172.16.80.128:7788; #心跳地址 meta-disk internal; } on Slave-drbd { device /dev/drbd0; disk /dev/sdb; address 172.16.80.127:7788; meta-disk internal; }
6、DRBD的管理与维护
1.在两个节点执行
在启动DRBD之前,需要分别在两台主机的sdb分区上创建供DRBD记录信息的数据块.具体是分别在两台主机上执行:
[root@master-drbd ~]# drbdadm create-md r0 或者执行drbdadm create-md all
initializing activity log
NOT initializing bitmap
Writing meta data...
New drbd meta data block successfully created.
[root@slave-drbd ~]# drbdadm create-md data
2.在两个节点启动服务
接着在两个drbd节点启动DRBD服务,操作如下:
[root@Master-drbd ~]# /etc/init.d/drbd start
Starting DRBD resources: [
create res: data
prepare disk: data
adjust disk: data
adjust net: data
]
[root@slave-drbd ~]#/etc/init.d/drbd start
最好是在两个节点同时启动DRBD服务。
3.在任意节点查看节点状态
登录任意drbd节点,然后执行“cat /proc/drbd”命令,输出结果如下:
[root@Master-drbd ~]# cat /proc/drbd
version: 8.4.7-1 (api:1/proto:86-101)
GIT-hash: 3a6a769340ef93b1ba2792c6461250790795db49 build by mockbuild@Build64R6, 2016-01-12 13:27:11
0: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C r-----
ns:0 nr:0 dw:0 dr:0 al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:10485404
7、设置主节点的状态
由于默认没有主次节点之分,因此需要设置两个主机的主次节点。选择需要设置为主节点的主机,然后执行如下命令:
[root@Master-drbd ~]# drbdadm -- --overwrite-data-of-peer primary data [root@Master-drbd ~]# cat /proc/drbd version: 8.4.7-1 (api:1/proto:86-101) GIT-hash: 3a6a769340ef93b1ba2792c6461250790795db49 build by mockbuild@Build64R6, 2016-01-12 13:27:11 0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r----- ns:301056 nr:0 dw:0 dr:301728 al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:10184348 [>....................] sync'ed: 2.9% (9944/10236)M finish: 0:03:56 speed: 43,008 (43,008) K/sec [root@Master-drbd ~]# [root@Master-drbd ~]# cat /proc/drbd version: 8.4.7-1 (api:1/proto:86-101) GIT-hash: 3a6a769340ef93b1ba2792c6461250790795db49 build by mockbuild@Build64R6, 2016-01-12 13:27:11 0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r---n- ns:534152 nr:0 dw:0 dr:535200 al:8 bm:0 lo:0 pe:2 ua:1 ap:0 ep:1 wo:f oos:9952924 [>...................] sync'ed: 5.2% (9716/10236)M finish: 0:04:02 speed: 40,960 (40,960) K/sec [root@Master-drbd ~]# cat /proc/drbd version: 8.4.7-1 (api:1/proto:86-101) GIT-hash: 3a6a769340ef93b1ba2792c6461250790795db49 build by mockbuild@Build64R6, 2016-01-12 13:27:11 0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r----- ns:10485404 nr:0 dw:0 dr:10486076 al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0 [root@Master-drbd ~]# 第一次执行完此命令后,如果需要设置哪个是主节点,也可以使用另外一个命令: [root@master-drbd ~]#/sbin/drbdadm primary data或者/sbin/drbdadm primary all 执行此命令后,开始同步两台机器对应磁盘的数据:
8、挂载drbd设备
由于mount操作只能在主节点进行,因此只有设置了主节点后才能格式化磁盘分区,同时,在两个节点中,同一时刻只能有一台处于primary状态,另一台处于secondary状态,而处于secondary状态的节点上不能挂载DRBD设备,要在备用节点上挂载DRBD设备,必须停止备用节点的DRBD服务或将备用节点角色升级为主节点。
下面首先将DRBD设备格式化为ext4文件系统,然后在主节点挂载,操作如下:
[root@master-drbd ~]#mkfs.ext4 /dev/drbd0
[root@master-drbd ~]#mount /dev/drbd0 /data
完成挂载后,就可以在/data目录下写数据了,此目录下的数据会自动同步到备用节点上。
[root@Master-drbd ~]# mkfs.ext4 /dev/drbd0 mke2fs 1.41.12 (17-May-2010) Filesystem label= OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) Stride=0 blocks, Stripe width=0 blocks 655360 inodes, 2621351 blocks 131067 blocks (5.00%) reserved for the super user First data block=0 Maximum filesystem blocks=2684354560 80 block groups 32768 blocks per group, 32768 fragments per group 8192 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632 Writing inode tables: done Creating journal (32768 blocks): done Writing superblocks and filesystem accounting information: done This filesystem will be automatically checked every 20 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override. [root@Master-drbd ~]# mount /dev/drbd0 /data [root@Master-drbd ~]# [root@Master-drbd ~]# touch /data/{a,b,c,d,e} 创建5个测试文件 [root@Master-drbd ~]# ls /data/ a b c d e lost+found
9、主备切换
首先在主节点卸载磁盘分区: [root@ master-drbd /]# umount /data 然后执行: [root@master-drbd ~]#drbdadm secondary all 如果不执行这个命令,直接在备用节点执行切换到主节点的命令,会报如下错误: 2: State change failed: (-1) Multiple primaries not allowed by config Command 'drbdsetup 2 primary' terminated with exit code 11 此时查看master-drbd节点的DRBD状态,信息如下: [root@Master-drbd ~]# cat /proc/drbd version: 8.4.7-1 (api:1/proto:86-101) GIT-hash: 3a6a769340ef93b1ba2792c6461250790795db49 build by mockbuild@Build64R6, 2016-01-12 13:27:11 0: cs:Connected ro:Secondary/Secondary ds:UpToDate/UpToDate C r----- ns:10783236 nr:0 dw:297832 dr:10486805 al:90 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0 可以看到,两个节点都处于“Secondary”状态了,那么接下来就要指定一个主节点,在备用节点执行如下命令: [root@slave-drbd ~]#drbdadm primary all [root@Slave-drbd ~]# drbdadm primary all [root@Slave-drbd ~]# cat /proc/drbd version: 8.4.7-1 (api:1/proto:86-101) GIT-hash: 3a6a769340ef93b1ba2792c6461250790795db49 build by mockbuild@Build64R6, 2016-01-12 13:27:11 0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r----- ns:0 nr:10783236 dw:10783236 dr:672 al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0 至此,主备节点成功切换角色。最后在新的主节点挂载DRBD磁盘分区即可: [root@Slave-drbd ~]# mount /dev/drbd0 /data/ [root@Slave-drbd ~]# ls /data/ 可以看到之前在主节点上面创建的5个文件都有 a b c d e lost+found
我们这里进行的手动的切换,实际工作中应该要自动切换,配合高可用软件heartbeat 或者keepalived