Distributed Replicated Block Device (DRBD)是基于块设备在不同的高可用服务器对之间同步和镜像数据的软件,通过它可以实现在网络中的两台服务器之间基于块设备级别的实时或异步镜像或同步复制,类似于rsync+inotify这样的系统架构项目软件。只不过drbd是基于文件系统底层的,即block层级的同步,而rsync+inotify是在文件系统之上的实际物理文件同步。所以dbrd效率更高。
块设备可以是磁盘分区,LVM逻辑卷,或整块磁盘。
DRBD是linux的内核的存储层中的一个分布式存储系统,可用使用DRBD在两台Linux服务器之间共享块设备,共享文件系统和数据。类似于一个网络RAID-1的功能,在基于DBRD的高可用(HA)两台服务器主机上,当我们将数据写入到本地磁盘系统时,数据还会被实时的发送到网络中的另一台主机上并以相同的形式记录在另一个磁盘系统中,使得本地(主节点)与远程主机(备节点)的数据保持实时数据同步。这时,如果本地系统(主节点)出现故障,那么远程主机(备节点)上还会保留有一份和主节点相同的数据备份可以继续使用,不但数据不会丢失,还会提升访问数据的用户的体验。更多详细请查看dbrd官方网站http://www.dbrd.org/
drbd工作原理图:
协议A:
异步复制协议。一旦本地磁盘写入已经完成,数据包已在发送队列中,则写被认为是完成的。在一个节点发生故障时,可能发生数据丢失,因为被写入到远程节点上的数据可能仍在发送队列。尽管,在故障转移节点上的数据是一致的,但没有及时更新。这通常是用于地理上分开的节点
协议B:
内存同步(半同步)复制协议。一旦本地磁盘写入已完成且复制数据包达到了对等节点则认为写在主节点上被认为是完成的。数据丢失可能发生在参加的两个节点同时故障的情况下,因为在传输中的数据可能不会被提交到磁盘。
协议C:
同步复制协议。只有在本地和远程节点的磁盘已经确认了写操作完成,写才被认为完成。没有任何数据丢失,所以这是一个群集节点的流行模式,但I / O吞吐量依赖于网络带宽。
一般使用协议C,但选择C协议将影响流量,从而影响网络时延。为了数据可靠性,我们在生产环境使用时须慎重选项使用哪一种协议。
生产场景中drbd常用于基于高可用服务器之间的数据同步解决方案。
例如:heartbeat+drbd+nfs/mfs/gfs,heartbeat+drbd+mysql/oracle等。实际上drbd可以配合任意需要数据同步的所有服务的应用场景。
(1)rsync(sersync,inotify,lsyncd)
(2)scp
(3)nc
(4)nfs(网络文件系统)
(5)union双机同步
(6)csync2多机同步
(7)软件的自身同步机制(mysql,oracle,mongdb,ttserver,redis..)文件放到数据库,同步到从库,再把文件拿出来。
(8)Drbd
业务需求可以结合前面配置的heartbeat来搭建dbrd服务,hearbeat的安装和部署我前面的文章已经写了。主服务器为heartrbeat-1-130,从服务器为heartbeat-1-129。
(1)Drbd服务通过直连线或以太网实时互相数据同步。
(2)两台存储服务器互相备份,正常情况下两端各提供一个主分区供NFS使用。
(3)存储服务器之间,存储服务和交换机之间都是双千兆网卡绑定。
(4)应用服务器通过NFS访问存储。
CentOS-6.8-x86_64
主服务器A:
主机名:heartbeat-1-130
eth0网卡地址:192.168.1.130(管理IP)
eth1网卡地址:10.0.10.4 (心跳IP)
从服务器B:
主机名:heartbeat-1-129
eth0网卡地址:192.168.1.129(管理IP)
eth1网卡地址:10.0.10.5(心跳IP)
虚拟VIP:
虚拟VIP在主服务器heartbeat-1-130上
VIP:192.168.1.131
需要修改主机名,关闭防火墙和selinux这些准备工作和heartbeat一样,我前面的安装heartbeat的文章有讲,这里就不讲了。就用安装heartbeat的那两台机器,主服务器heartbeat-1-130,从服务器heartbeat-1-129。
Drbd是基于分区的磁盘逻辑卷的,没有可用的分区肯定不行。我们先把heartbeat-1-130和heartbeat-1-129两个虚拟机关机,然后在主节点heartbeat-1-130上添加一块1g的硬盘,在从节点heartbeat-1-129上添加一块2g的硬盘。添加硬盘就不演示了,然后启动两台机器。
(1)创建分区(以从节点为例)
[root@heartbeat-1-129 ~]# fdisk /dev/sdb
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0xd3ee6f66.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won‘t be recoverable.
Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)
WARNING: DOS-compatible mode is deprecated. It‘s strongly recommended to
switch off the mode (command ‘c‘) and change display units to
sectors (command ‘u‘).
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-261, default 1):
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-261, default 261): +1536M
Command (m for help): p
Disk /dev/sdb: 2147 MB, 2147483648 bytes
255 heads, 63 sectors/track, 261 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xd3ee6f66
Device Boot Start End Blocks Id System
/dev/sdb1 1 197 1582371 83 Linux
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 2
First cylinder (198-261, default 198):
Using default value 198
Last cylinder, +cylinders or +size{K,M,G} (198-261, default 261):
Using default value 261
Command (m for help): p
Disk /dev/sdb: 2147 MB, 2147483648 bytes
255 heads, 63 sectors/track, 261 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xd3ee6f66
Device Boot Start End Blocks Id System
/dev/sdb1 1 197 1582371 83 Linux
/dev/sdb2 198 261 514080 83 Linux
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
[root@heartbeat-1-129 ~]# partprobe
Warning: WARNING: the kernel failed to re-read the partition table on /dev/sda (设备或资源忙). As a result, it may not reflect all of your changes until after reboot.
Warning: 无法以读写方式打开 /dev/sr0 (只读文件系统)。/dev/sr0 已按照只读方式打开。
Warning: 无法以读写方式打开 /dev/sr0 (只读文件系统)。/dev/sr0 已按照只读方式打开。
Error: 无效的分区表 - /dev/sr0 出现递归分区。
[root@heartbeat-1-129 ~]# fdisk -l
Disk /dev/sda: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0007ed95
Device Boot Start End Blocks Id System
/dev/sda1 * 1 64 512000 83 Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2 64261120458496 8e Linux LVM
Disk /dev/sdb: 2147 MB, 2147483648 bytes
255 heads, 63 sectors/track, 261 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xd3ee6f66
Device Boot Start End Blocks Id System
/dev/sdb1 1 197 1582371 83 Linux
/dev/sdb2 198 261 514080 83 Linux
(2)格式化/dev/sdb1,注意/dev/sdb2不要格式化
[root@heartbeat-1-130 ~]# mkfs.ext4 /dev/sdb1
mke2fs 1.41.12 (17-May-2010)
文件系统标签=
操作系统:Linux
块大小=1024 (log=0)
分块大小=1024 (log=0)
…省略…
正在写入inode表: 完成
Creating journal (8192 blocks): 完成
Writing superblocks and filesystem accounting information: 完成
This filesystem will be automatically checked every 24 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
扩展:当硬盘数据超过两T的时候,fdisk就用不了了,这是我们就要用parted这个命令。
parted非交互分区
[root@localhost ~]# parted /dev/sdb mklabel gpt
警告: The existing disk label on /dev/sdb will be destroyed and all data on this disk will be lost. Do you want to continue?
是/Yes/否/No? yes
[root@localhost ~]# parted /dev/sdb mkpart primary 0G 2G
[root@localhost ~]# parted -s /dev/sdb print
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 5369MB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Number Start End SizeFile system Name 标志
1 1049kB 2000MB 1999MB primary
提示:
a.这里的meta data分区一定不能格式化建立文件系统。
b.格式化分好的分区现在不能直接挂在(mount)。
c.生产环境DRBD meta data分区一般可设为1-2G。
d.检查meta data分区正常可用的方法 。
[root@heartbeat-1-130 ~]# mount /dev/sdb2 /mnt
mount: you must specify the filesystem type
出现上面结果说明meta data分区分的是对的。
DRDB软件可以编译安装也可以下载包含的源yum安装,本次事件采用编译安装的方式。
(1)下载drbd软件(两台机器都要操作)
可以在官网上下载http://oss.linbit.com/drbd/。
(2)安装gcc和gcc-c++
[root@heartbeat-1-130 tools]# yum install gcc gcc-c++ -y
除了安装gcc和gcc-c++还需要安装其他的一些依赖包,为了防止编译发生错误,最好提前安装上,下面是我在编译的时候需要安装的包。
yum install dpkg dpkg-dev dpkg-devel gcc gcc-c++ git rpm-build kernel-devel kernel-headers flex -y
(3)编译drbd
[root@heartbeat-1-130 tools]# pwd
/home/linzhongniao/tools
[root@heartbeat-1-130 tools]# export LC_ALL=C
[root@heartbeat-1-130 tools]# ls
drbd-8.4.4.tar.gz
[root@heartbeat-1-130 tools]# tar –xf drbd-8.4.4.tar.gz
[root@heartbeat-1-130 tools]# cd drbd-8.4.4
[root@heartbeat-1-129 drbd-8.4.4]# ./configure --prefix=/usr/local/drbd8.4.4 --with-km --with-heartbeat --sysconfdir=/etc/
(4)编译出现的问题
出现下面问题yum安装dpkg、dpkg-dev、dpkg-devel再编译
checking for udevinfo... false
configure: WARNING: No dpkg-buildpackage found, building Debian packages is disabled.
出现下面问题yum安装flex,重新编译
configure: error: Cannot build utils without flex, either install flex or pass the --without-utils option.
(5)加载内核
a.先查找内核源码
[root@heartbeat-1-130 drbd-8.4.4]# ls -ld /usr/src/kernels/$(uname -r)/
ls: 无法访问/usr/src/kernels/2.6.32-642.el6.x86_64/: 没有那个文件或目录
没有内核源码文件路径yum安装kernel-devel kernel-headers在查看就有了
[root@heartbeat-1-130 drbd-8.4.4]# ls -ld /usr/src/kernels/$(uname -r)/
drwxr-xr-x 22 root root 4096 3月 5 05:55 /usr/src/kernels/2.6.32-696.20.1.el6.x86_64/
如果uname –r命令显示的系统内核和在/usr/src/kernels/下查找的系统内核不一样怎么办呢,很简单升级系统内核,重启系统后再查看内核就一样了。
[root@heartbeat-1-130 drbd-8.4.4]# ls -ld /usr/src/kernels/2.6.32-696.20.1.el6.x86_64/
drwxr-xr-x 22 root root 4096 Mar 6 19:24 /usr/src/kernels/2.6.32-696.20.1.el6.x86_64/
[root@heartbeat-1-130 drbd-8.4.4]# uname -r
2.6.32-642.el6.x86_64
[root@heartbeat-1-130 drbd-8.4.4]# yum -y install kernel
[root@heartbeat-1-130 ~]# uname -r
2.6.32-696.20.1.el6.x86_64
b. 加载系统内核
[root@heartbeat-1-129 drbd-8.4.4]# make KDIR=/usr/src/kernels/$(uname -r)/
[root@heartbeat-1-129 drbd-8.4.4]# echo $?
0
(6)安装drbd
[root@heartbeat-1-129 drbd-8.4.4]# make install
echo $?为零安装成功
比较重要的是下面标黄的部分,,我们还用部署heartbeat的那个环境,heartbeat的环境部署前面文章有,这里就不再演示了。
这个DRBD模块在重启电脑之后就会失效不会自动加载到系统内核中,我们可以放在/etc/rc.local里生效,让它开机生效。生产中是不需要放在/etc/rc.local里面的,不让自动启动,自动启动会导致一些不必要的问题。用lsmod |grep drbd查看有这个内容了就说明内核加载完成。
[root@heartbeat-1-130 drbd-8.4.4]# lsmod |grep drbd
[root@heartbeat-1-130 drbd-8.4.4]# mo
modinfo modutil mountmount.nfsmountpoint mount.tmpfs
modprobe more mount.cifs mount.nfs4 mountstats
[root@heartbeat-1-130 drbd-8.4.4]# modprobe drbd
[root@heartbeat-1-130 drbd-8.4.4]# lsmod |grep drbd
drbd 327370 0
libcrc32c 1246 1 drbd
[root@heartbeat-1-130 drbd-8.4.4]# echo ‘modprobe drbd‘ >>/etc/rc.local
[root@heartbeat-1-130 drbd-8.4.4]# tail -1 /etc/rc.local
modprobe drbd
(1)配置DRBD的配置文件
DRBD的配置文件在我们编译的时候指定的那个路径,/etc/下。
[root@heartbeat-1-130 etc]# pwd
/etc
[root@heartbeat-1-130 etc]# cat drbd.conf
global {
usage-count no;
}
common {
syncer {
# wfc-timeout degr-wfc-timeout outdated-wfc-timeout wait-after-sb
rate 1000M;
verify-alg crc32c;
}
}
resource data {
protocol C;
disk {
on-io-error detach;
}
on heartbeat-1-130 {
device /dev/drbd0;
disk /dev/sdb1;
address 10.0.10.4:7788;
meta-disk /dev/sdb2[0];
}
on heartbeat-1-129 {
device /dev/drbd0;
disk /dev/sdb1;
address 10.0.10.5:7788;
meta-disk /dev/sdb2[0];
}
}
(2)配置文件参数说明
global {
usage-count no;
}
前三行是你全局配置,一般网站都会同居开源网站的安装量,usage-count的值等于no,就是不允许官方统计。
common {
syncer {
# wfc-timeout degr-wfc-timeout outdated-wfc-timeout wait-after-sb
rate 1000M;
verify-alg crc32c;
}
}
Common段里面设置了同步的速度比如1000M,crc32c是一个算法
resource data {
protocol C;
disk {
on-io-error detach;
}
on heartbeat-1-130 {
device /dev/drbd0;
disk /dev/sdb1;
address 10.0.10.4:7788;
meta-disk /dev/sdb2[0];
}
on heartbeat-1-129 {
device /dev/drbd0;
disk /dev/sdb1;
address 10.0.10.5:7788;
meta-disk /dev/sdb2[0];
}
}
上面resource段是drbd的资源,protocol C是一个实时同步数据的协议,用A或B都是异步同步或半同步,这样会导致数据的丢失,除非业务需求数据不总要并发要求高的情况下。disk表示一个磁盘出现io错误怎么处理。resource后面的data是drbd的资源,注意这里resource可以有多个资源,比如说再想增加一个资源,我们可以把resource这段复制一个就好了,需要修改的有resource后面的资源名称以及disk、meta-disk和同步的地址的端口号,例如7788。这里on heartbeat-1-130的on后面跟的是机器名,注意这里的机器名必须是uname –n返回的结果,device表示drbd的设备,disk表示drbd0对应本机器的第一个分区,address这里的地址是一个同步的地址,meta-disk是meta设备的数据分区对应本机器的第二个分区,0是meta 设备的一个格式。
两台机器都要操作以heartbeat-1-130为例
初始化资源,注意我们初始的资源就是drbd.conf里resource后面的data。
[root@heartbeat-1-130 drbd-8.4.4]# drbdadm create-md data
Writing meta data...
initializing activity log
NOT initializing bitmap
New drbd meta data block successfully created.
drbdadm up data
drbdadm up 跟的是resource设置的资源data,也可以指定所有资源drbdadm up all。
[root@heartbeat-1-130 ~]# drbdadm up data
/usr/local/drbd8.4.4/var/run/drbd: No such file or directory
/usr/local/drbd8.4.4/var/run/drbd: No such file or directory
我们看有错误提示/usr/local/drbd8.4.4/var/run/drbd: No such file or directory
这个目录找不到centos6版本以上需要有这个目录,好我们就创建一个这个目录再启动drbd。
[root@heartbeat-1-130 ~]# mkdir -p /usr/local/drbd8.4.4/var/run/drbd
[root@heartbeat-1-130 ~]# drbdadm up data
[root@heartbeat-1-130 ~]# cat /proc/drbd
version: 8.4.4 (api:1/proto:86-101)
GIT-hash: 74402fecf24da8e5438171ee8c19e28627e1c98a build by root@heartbeat-1-130, 2018-03-06 21:32:41
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:f oos:795188
这里显示ro:Secondary/Secondary ds:Inconsistent/Inconsistent是正确的都是从,处于无主(primary)的状态。
说明:
1.如果为空硬盘。可以随意执行操作不需要考虑数据。
2.如果两边数据不一样(要特别注意同步数据的方向,否则可能丢失数据)。
注意:在主服务器上操作我们的主服务器是heartbeat-1-130
(1)同步数据
[root@heartbeat-1-130 ~]# drbdadm -- --overwrite-data-of-peer primary data
[root@heartbeat-1-130 ~]# cat /proc/drbd
GIT-hash: 74402fecf24da8e5438171ee8c19e28627e1c98a build by root@heartbeat-1-130, 2018-03-06 21:32:41
0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r-----
ns:344064 nr:0 dw:0 dr:344724 al:0 bm:21 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:451124
[=======>............] sync‘ed: 43.6% (451124/795188)K
finish: 0:00:10 speed: 43,008 (43,008) K/sec
[root@heartbeat-1-130 ~]# cat /proc/drbd
version: 8.4.4 (api:1/proto:86-101)
GIT-hash: 74402fecf24da8e5438171ee8c19e28627e1c98a build by root@heartbeat-1-130, 2018-03-06 21:32:41
0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
ns:795186 nr:0 dw:0 dr:795846 al:0 bm:49 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
(2)参数说明
以主节点为例
cs:Connected:Connected是连接的状态,用zabbix做监控主要看Connected。
ro:Primary/Secondary: Primary是主,Secondary是从;也就是说本地是主对端是从。
ds:UpToDate/UpToDate:UpToDate是两边都更新完成。
cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C r-----
解决方法:
1.检查两台物理网络连接或者IP及主机路由是否正确。
2.停止iptables防火墙。
3.还可能是发生列脑导致的结果。
可以尝试用下面的方法解决
在从节点slave上操作:
drbdadm Secondary data
drbdadm -- --discard-my-data connect data ---> 丢弃本端数据进行连接
在主节点上操作
通过查看cat/proc/drbd状态,如果不是WFConnection状态,则需要手动连接
drbdadm connect data
cat /proc/drbd查看两端状态
(1)创建DRBD文件系统
[root@heartbeat-1-130 ~]# mkdir /data
[root@heartbeat-1-130 ~]# mkfs.ext3 /dev/drbd0
mke2fs 1.41.12 (17-May-2010)
文件系统标签=
操作系统:Linux
块大小=4096 (log=2)
分块大小=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
49728 inodes, 198796 blocks
9939 blocks (5.00%) reserved for the super user
第一个数据块=0
Maximum filesystem blocks=205520896
7 block groups
32768 blocks per group, 32768 fragments per group
7104 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840
正在写入inode表: 完成
Creating journal (4096 blocks): 完成
Writing superblocks and filesystem accounting information: 完成
This filesystem will be automatically checked every 24 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
[root@heartbeat-1-130 ~]# tune2fs -c 0 -i 0 /dev/drbd0
tune2fs 1.41.12 (17-May-2010)
Setting maximal mount count to -1
Setting interval between checks to 0 seconds
[root@heartbeat-1-130 ~]# mount /dev/drbd0 /data
(2)测试备节点数据同步情况
先在主节点的DRBD文件系统中插入数据,我们插入个20个文件
[root@heartbeat-1-130 data]# touch ‘seq 10‘
[root@heartbeat-1-130 data]# ls
1 10 2 3 4 5 6 7 8 9 lost+found
[root@heartbeat-1-130 data]# touch `seq 10 20`
查看备节点的数据同步情况,需要先挂载DRBD存储设备,我们看数据已经同步过来了。
[root@heartbeat-1-129 ~]# mount /dev/sdb1 /mnt
mount: you must specify the filesystem type
[root@heartbeat-1-129 ~]# drbdadm down data
[root@heartbeat-1-129 ~]# mount /dev/sdb1 /mnt
[root@heartbeat-1-129 ~]# ll /mnt/
总用量 16
-rw-r--r-- 1 root root 0 3月 7 00:41 1
-rw-r--r-- 1 root root 0 3月 7 00:43 10
-rw-r--r-- 1 root root 0 3月 7 00:43 11
-rw-r--r-- 1 root root 0 3月 7 00:43 12
-rw-r--r-- 1 root root 0 3月 7 00:43 13
-rw-r--r-- 1 root root 0 3月 7 00:43 14
-rw-r--r-- 1 root root 0 3月 7 00:43 15
-rw-r--r-- 1 root root 0 3月 7 00:43 16
-rw-r--r-- 1 root root 0 3月 7 00:43 17
-rw-r--r-- 1 root root 0 3月 7 00:43 18
-rw-r--r-- 1 root root 0 3月 7 00:43 19
-rw-r--r-- 1 root root 0 3月 7 00:41 2
-rw-r--r-- 1 root root 0 3月 7 00:43 20
-rw-r--r-- 1 root root 0 3月 7 00:41 3
-rw-r--r-- 1 root root 0 3月 7 00:41 4
-rw-r--r-- 1 root root 0 3月 7 00:41 5
-rw-r--r-- 1 root root 0 3月 7 00:41 6
-rw-r--r-- 1 root root 0 3月 7 00:41 7
-rw-r--r-- 1 root root 0 3月 7 00:41 8
-rw-r--r-- 1 root root 0 3月 7 00:41 9
drwx------ 2 root root 16384 3月 7 00:38 lost+found
Mysql DBA 高级运维学习笔记-MySQL高可用工具drbd实战
原文地址:http://blog.51cto.com/10642812/2083582