DRBD(Distributed Replicated Block Device):叫做分布式复制块设备,这是一种基于软件,无共享,复制的解决方案。在服务器之间的块设备(包括硬盘、分区、逻辑卷)进行镜像。也就是说当某一个应用程序完成写操作后,它提交的数据不仅仅会保存在本地块设备上,DRBD也会将这份数据复制一份,通过网络传输到另一个节点的块设备上,这样,两个节点上的块设备上的数据将会保存一致,这就是镜像功能。
(DRBD Primary)负责接收数据,把数据写到本地磁盘并发送给另一台主机(DRBD Secondary)。另一个主机再将数据存到自己的磁盘中。目前,DRBD每次只允许对一个节点进行读写访问,但这对于通常的故障切换高可用集群来说已经足够用了。有可能以后的版本支持两个节点进行读写存取。
一般情况下文件写入磁盘的步骤是: 写操作 --> 文件系统 --> 内存缓存中 --> 磁盘调度器 --> 磁盘驱动器 --> 写入磁盘。而DRBD的工作机制如上图所示,数据经过buffer cache后有内核中的DRBD模块通过tcp/ip协议栈经过网卡和对方建立数据同步。更多关于企业集群运维管理系列的学习文章,请参阅:玩转企业集群运维管理专栏,本系列持续更新中。
一个DRBD系统由两个节点构成,与HA集群类似,也有主节点和备用节点之分,在带有主要设备的节点上,应用程序和操作系统可以运行和访问DRBD设备(/dev/drbd*)。在主节点写入的数据通过DRBD设备存储到主节点的磁盘设备中,同时,这个数据也会自动发送到备用节点对应的DRBD设备,最终写入备用节点的磁盘设备上,在备用节点上,DRBD只是将数据从DRBD设备写入到备用节点的磁盘中。
现在大部分的高可用性集群都会使用共享存储,而DRBD也可以作为一个共享存储设备,使用DRBD不需要太多的硬件的投资。因为它在TCP/IP网络中运行,所以,利用DRBD作为共享存储设备,要节约很多成本,因为价格要比专用的存储网络便宜很多;其性能与稳定性方面也不错
DRBD具有如下特性:
RAID1也是实现不同存储设备间的数据镜像备份的,不同的是RAID1各存储设备是连接一个RAID控制器接入到一台主机上的,而DRBD是通过网络实现不同节点主机存储设备数据的镜像备份。
为了能够配置和管理drbd的资源,drbd提供了一些管理工具与内核模块进行通信
drbdadm:高级的DRBD程序管理套件工具。它从配置文件/etc/drbd.conf中获取所有配置参数。drbdadm为drbdsetup和drbdmeta两个命令充当程序的前端应用,执行drbdadm实际是执行的drbdsetup和drbdeta两个命令。
drbdsetup:drbdsetup可以让用户配置已经加载在内核中运行的DRBD模块,它是底层的DRBD程序管理套件工具。使用该命令时,所有的配置参数都需要直接在命令行中定义,虽然命令很灵活,但是大大的降低了命令的简单易用性,因此很多的用户很少使用drbdsetup。
drbdmeta:drbdmeta允许用户创建、转储、还原和修改drbd的元数据结构。这个命令也是用户极少用到。
DRBD有2中模式,一种是DRBD的主从模式,另一种是DRBD的双主模式。
这种模式下,其中一个节点作为主节点,另一个节点作为从节点。其中主节点可以执行读、写操作;从节点不可以挂载文件系统,因此,也不可以执行读写操作。在这种模式下,资源在任何时间只能存储在主节点上。这种模式可用在任何的文件系统上(EXT3、EXT4、XFS等等)。默认这种模式下,一旦主节点发生故障,从节点需要手工将资源进行转移,且主节点变成从节点和从节点变成主节点需要手动进行切换。不能自动进行转移,因此比较麻烦。
为了解决手动将资源和节点进行转移,可以将DRBD做成高可用集群的资源代理(RA),这样一旦其中的一个节点宕机,资源会自动转移到另一个节点,从而保证服务的连续性。
这是DRBD8.0之后的新特性
在双主模式下,任何资源在任何特定的时间都存在两个主节点。这种模式需要一个共享的集群文件系统,利用分布式的锁机制进行管理,如GFS和OCFS2。部署双主模式时,DRBD可以是负载均衡的集群,这就需要从两个并发的主节点中选取一个首选的访问数据。这种模式默认是禁用的,如果要是用的话必须在配置文件中进行声明。
DRBD的复制功能就是将应用程序提交的数据一份保存在本地节点,一份复制传输保存在另一个节点上。但是DRBD需要对传输的数据进行确认以便保证另一个节点的写操作完成,就需要用到DRBD的同步协议,DRBD同步协议有三种:
协议A:数据在本地完成写操作且数据已经发送到TCP/IP协议栈的队列中,则认为写操作完成。如果本地节点的写操作完成,此时本地节点发生故障,而数据还处在TCP/IP队列中,则数据不会发送到对端节点上。因此,两个节点的数据将不会保持一致。这种协议虽然高效,但是并不能保证数据的可靠性。
协议B:数据在本地完成写操作且数据已到达对端节点则认为写操作完成。如果两个节点同时发生故障,即使数据到达对端节点,这种方式同样也会导致在对端节点和本地节点的数据不一致现象,也不具有可靠性。
协议C:只有当本地节点的磁盘和对端节点的磁盘都完成了写操作,才认为写操作完成。这是集群流行的一种方式,应用也是最多的,这种方式虽然不高效,但是最可靠。
DRBD的资源
在DRBD中,资源是所有可复制移动存储设备的总称,它包括:
DRBD将数据的各种信息块保存在一个专用的区域里,这些metadata包括了:
metadata的存储方式有内部和外部两种方式,使用哪种配置都是在资源配置中定义的。
⑴、修改node3、nide4的hosts文件,通过此文件解析到主机IP
⑵、ssh免密登入
[root@node3 ~]#ssh-keygen
#多次回车直到密钥创建完成
[root@node3 ~]#ssh-copy-id node4
⑶、设置两台服务器时钟服务器
[root@node3 ~]# crontab -l
*/5 * * * * ntpdate cn.pool.ntp.org #在node3
[root@node4 ~]# crontab -l
*/5 * * * * ntpdate cn.pool.ntp.org #在node4
⑷、关闭防火墙和SELINUX
[root@node3 ~]# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
[root@node3 ~]# rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
[root@node3 ~]# yum install -y kmod-drbd84 drbd84-utils
在两台虚拟机服务器上个各添加一块大小相同磁盘,重启虚拟机
[root@node3 ~]# 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";
#配置全局配置文件
[rootglob@node3 ~]# cat /etc/drbd.d/global_common.conf
global {
usage-count no;
# minor-count dialog-refresh disable-ip-verification
}
common {
protocol C; #使用DRBD的同步协议
handlers {
pri-on-incon-degr "/usr/lib/drbd/notify-pri-on-incon-degr.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f";
pri-lost-after-sb "/usr/lib/drbd/notify-pri-lost-after-sb.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f";
local-io-error "/usr/lib/drbd/notify-io-error.sh; /usr/lib/drbd/notify-emergency-shutdown.sh; echo o > /proc/sysrq-trigger ; halt -f";
}
startup {
}
options {
}
disk {
on-io-error detach;
}
net {
}
syncer {
rate 1024M;
}
##创建资源配置文件
cat /etc/drbd.d/mysql.res
resource mysql { #资源名称
protocol C; #使用协议
meta-disk internal;
device /dev/drbd1; #DRBD设备名称
syncer {
verify-alg sha1;# 加密算法
}
net {
allow-two-primaries;
}
on node3 {
disk /dev/sdb; drbd1使用的磁盘分区为"mysql",指定新加的磁盘
address 10.0.0.5:7789; #设置DRBD监听地址与端口
}
on node4 {
disk /dev/sdb;
address 10.0.0.6:7789;
}
}
##在node4也使用相同的配置
[root@node3 ~]# scp -p global_common.conf mysql.res
#node3、node4查看内核模块是否已经加载
[root@node3 ~]# lsmod | grep drbd
#没有则主动加载
[root@node3 ~]# modprobe drbd
#如果显示没有此模块是因为系统内核版本太低,不支持模块需要升级
#执行可以用 yum install kernel* 方式来更新
#也可以 yum kernel-devel kernel kernel-headers -y
##########################node4相同操作######################################
#创建资源
[root@node3 ~]# drbdadm create-md mysql
initializing activity log
initializing bitmap (160 KB) to all zero
Writing meta data...
New drbd meta data block successfully created.
#启动资源、指定本机为primary
[root@node3 ~]# drbdadm up mysql
[root@node3 ~]# drbdadm -- --force primary mysql
#node4
[root@node4 ~]# drbdadm create-md mysql
[root@node4 ~]# drbdadm up mysql
更多关于企业集群运维管理系列的学习文章,请参阅:玩转企业集群运维管理专栏,本系列持续更新中。
[root@nod4 ~]# drbdadm dstate mysql
#Inconsistent/Inconsistent
#本地和对等节点的硬盘有可能为下列状态之一:
#Diskless 无盘:本地没有块设备分配给DRBD使用,这表示没有可用的设备,或者使用drbdadm命令手工分离或是底层的I/O错误导致自动分离
#Attaching:读取无数据时候的瞬间状态
#Failed 失败:本地块设备报告I/O错误的下一个状态,其下一个状态为Diskless无盘
#Negotiating:在已经连接的DRBD设置进行Attach读取无数据前的瞬间状态
#Inconsistent:数据是不一致的,在两个节点上(初始的完全同步前)这种状态出现后立即创建一个新的资源。此外,在同步期间(同步目标)在一个节点上出现这种状态
#Outdated:数据资源是一致的,但是已经过时
#DUnknown:当对等节点网络连接不可用时出现这种状态
#Consistent:一个没有连接的节点数据一致,当建立连接时,它决定数据是UpToDate或是Outdated
#UpToDate:一致的最新的数据状态,这个状态为正常状态
[root@node3 ~]# mkfs.xfs /dev/drbd1
...
[root@node3 ~]# mkdir /data
[root@node3 ~]# mount /dev/drbd1 /data
##先在主从结点上创建一个文件,在从节点同样创建一个/data目录
[root@node3 data]# echo "11111" > 123.txt
[root@node4 /]#mkdir data
##先把主结点降为从结点(先卸载才能变为从):
[root@node3 etc]# umount /data/
[root@node3 etc]# drbdadm secondary mysql
[root@node3 etc]# drbd-overview
NOTE: drbd-overview will be deprecated soon.
Please consider using drbdtop.
1:mysql/0 Connected Secondary/Secondary UpToDate/UpToDate
##
[root@node4 ~]# drbdadm primary mysql
You have new mail in /var/spool/mail/root
[root@node4 ~]# drbd-overview
NOTE: drbd-overview will be deprecated soon.
Please consider using drbdtop.
1:mysql/0 Connected Primary/Secondary UpToDate/UpToDate
##然后我们挂载试一下:
[root@node3 ~]# mount /dev/drbd1 /data/
[root@node3 ~]# cat /data/123.txt
11111
到此为止drbd的一般搭建就完成了。
参考链接:https://blog.csdn.net/sj349781478/ article/details/77893474 https://blog.51cto.com /bluesrer/1977153