一、简介:
近年来研发的软件级别的文件共享设备,简单说就是讲两台主机的磁盘块设备(大小相同),做成一个跨主机的raid1磁盘(磁盘镜像),文件间的复制通过tcp/ip协议进行。
分布式复制块设备,就是实现跨主机间的不同硬盘通过镜像连接起来,实现类似raid1的功能,数据的复制是在块级别上,而非文件级别.
DRBD就是通过在不同主机上使用相同的磁盘分区,然后启动一个drbd的内核模块,就可以实现drbd的功能,分布式文件系统的关键还是如何应对在多个用户针对同一个文件进行写操作时,应该如何保证文件不会崩溃。DRBD并不是真正意义上的狭义的分布式文件管理系统。
因此对于drbd模式,其工作方式是主从模式的,当有多个节点工作时,只能有一个节点处于主动状态,可以有写操作。
纵观数据和存储的发展,我们可以看到,最初的结合就是一台主机内通过ide线缆连接一个或多个磁盘,后来发展了不同的接口比如scsi、sata、sas等接口。后来由于磁盘的廉价和主机机箱空间的限制,出现的DAS的存储方式,实质上就是延长了ide线缆,这时通常使用专用的线缆连接。然后为了保证传输速率的提升、减少内核负载出现了光纤SAN设备,既提升了速度,减少了cpu负载又保证了磁盘的冗余,应为这时可以使用各种raid来对磁盘进行组合。但是光纤SAN 价格昂贵,又出现ipSAN ,减低成本,最廉价的应该就是DRBD了,实现的同样是存储的“分布式数据复制“功能。
以上说的都是物理形式的改变,对于逻辑上,是这样变化的。最初一个主机使用一个磁盘(独占),所以他的磁盘文件系统就是ext3、ntfs等单机文件系统。同样是随着磁盘的廉价,大量磁盘组建阵列,出现了多个主机共享一个存储空间的情况,最开始要求每个主机挂载的分区都不能相同,否则会造成多主机同时写入同一个文件会操作混乱和崩溃。于是产生了文件锁机制,这种锁是在主机的内核中管理的,目的就是可以多主机共享一个磁盘分区,并保证一个人写其他人不能同时写的情况,这种就是集群文件系统。
集群文件系统和高可用结合的原因,是因为分布式文件系统需要一个锁机制,这个锁机制默认是在节点的内核中完成的,为了降低节点的负担,出现了分布式锁管理器(DLM),专门用来管理”锁“,并将这种锁设定为资源,通过类似的crm进行管理,这个是管理锁的软件要求,并非全部,同时也要求磁盘分区的文件系统也要采用集群文件系统或者分布式文件系统。
二、DRBD是如何工作的呢?
(DRBD Primary)负责接收数据,把数据写到本地磁盘并发送给另一台主机(DRBD Secondary)。另一个主机再将数据存到自己的磁盘中。目前,DRBD每次只允许对一个节点进行读写访问,但这对于通常的故障切换高可用集群来说已经足够用了。有可能以后的版本支持两个节点进行读写存取。
三、DRBD与HA的关系
一个DRBD系统由两个节点构成,与HA集群类似,也有主节点和备用节点之分,在带有主要设备的节点上,应用程序和操作系统可以运行和访问DRBD设备(/dev/drbd*)。在主节点写入的数据通过DRBD设备存储到主节点的磁盘设备中,同时,这个数据也会自动发送到备用节点对应的DRBD设备,最终写入备用节点的磁盘设备上,在备用节点上,DRBD只是将数据从DRBD设备写入到备用节点的磁盘中。现在大部分的高可用性集群都会使用共享存储,而DRBD也可以作为一个共享存储设备,使用DRBD不需要太多的硬件的投资。因为它在TCP/IP网络中运行,所以,利用DRBD作为共享存储设备,要节约很多成本,因为价格要比专用的存储网络便宜很多;其性能与稳定性方面也不错
四、DRBD复制模式
协议A:
异步复制协议。一旦本地磁盘写入已经完成,数据包已在发送队列中,则写被认为是完成的。在一个节点发生故障时,可能发生数据丢失,因为被写入到远程节点上的数据可能仍在发送队列。尽管,在故障转移节点上的数据是一致的,但没有及时更新。这通常是用于地理上分开的节点
协议B:
内存同步(半同步)复制协议。一旦本地磁盘写入已完成且复制数据包达到了对等节点则认为写在主节点上被认为是完成的。数据丢失可能发生在参加的两个节点同时故障的情况下,因为在传输中的数据可能不会被提交到磁盘
协议C:
同步复制协议。只有在本地和远程节点的磁盘已经确认了写操作完成,写才被认为完成。没有任何数据丢失,所以这是一个群集节点的流行模式,但I / O吞吐量依赖于网络带宽一般使用协议C,但选择C协议将影响流量,从而影响网络时延。为了数据可靠性,我们在生产环境使用时须慎重选项使用哪一种协议
五、前提条件说明
(1)节点之间需要传递事务信息,节点之间识别节点是通过节点名称实现,所以需要DNS解析,将相应IP对应节点名称,但是如果依赖DNS服务器时,高可用集群服务又增大了风险,为了避免DNS服务器存在的隐患,配置解析时直接使用本地/etc/hosts配置文件定义
(2)节点名称必须要与‘uname–n’命令显示的名称一致
(3)高可用集群节点的管理,比如停止某一节点时,是不能在自身这个节点停止其服务,需要在一个运行正常的节点上停止其他节点;所以,提供ssh互信通信(配置每个节点基于密钥的方式与节点进行通信)
(4)时间需要同步
(5)两个节点上各有一个相同大小的磁盘或者分区(未格式化),并在内核中启用drbd功能。
集群文件系统(分布式文件系统)
GFS2:global file system
OCFS2:oracle file system
六、配置文件
global:全局配置属性
common:用于存放多个“组”中,属性相同的内容
drbd resource:每个组特有的资源属性,存放在/etc/drbd.d/目录下。
三、安装drbd,默认情况下就已经集成安装了heartbeat,pacemake资源管理工具,如果要使用rgmanager,需要使用--with-rgmanager参数。
rhel5,centos5:
用户层:drbd
内核层:kmod-drbd
rhel6,centos6:
用户层工具:drbd
内核层工具:drbd-kmdl
查看drbd状态信息:
cat /proc/drbd
Drbd-overview
对drbd资源进行升级和降级操作:
drbdadm primary resourcename
drbdadm secondaryresourcename
drbd的三种协议类型:
A:异步协议
B:半同步协议
C:默认协议,同步协议
1下载安装drbd-8.4,需要预装gcc、make,flex,glibc等组件
[[email protected] /etc/yum.repos.d]# wget http://oss.linbit.com/drbd/8.4/drbd-8.4.0.tar.gz
--2017-04-17 11:37:47-- http://oss.linbit.com/drbd/8.4/drbd-8.4.0.tar.gz
正在解析主机 oss.linbit.com... 212.69.161.111
正在连接 oss.linbit.com|212.69.161.111|:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:650733 (635K) [application/x-gzip]
2、编译安装,如果要启用内核模块加载方式,需要安装kernel-devel然后在make的时候添加KDIR=‘/usr/src/kernels/‘这样的参数,这里我用得是8.4.4.4版本,之前的8.4版本安装不上去,晕。
[[email protected] ~/drbd-8.4.4/drbd]# yum -y install gcc flex wget make kernel-devel kernel-headers Git libxslt rpm-build automake autoconf
[[email protected] ~/drbd-8.4.4]# ./configure --prefix=/usr/local/drbd --sysconfdir=/etc/drbd --with-km
[[email protected] ~/drbd-8.4.4]# make KDIR="/usr/src/kernels/`uname -r`/"
[[email protected] ~/drbd-8.4.4]#make install
[[email protected] ~/drbd-8.4.4]# cd drbd //进入drbd子目录
[[email protected] ~/drbd-8.4.4/drbd]# cp drbd.ko /lib/modules/`uname -r`/kernel/lib/ //复制drbd.ko 到内核模块目录。
[[email protected] ~/drbd-8.4.4/drbd]# depmod //创建模块依赖关系列表
[[email protected] ~/drbd-8.4.4/drbd]# cp /usr/local/drbd/etc/rc.d/init.d/drbd /etc/rc.d/init.d/ //复制启动脚本到init.d目录
[[email protected] ~/drbd-8.4.4/drbd]# modprobe drbd //加载drbd模块到内核
[[email protected] ~/drbd-8.4.4/drbd]# lsmod |grep drbd //查看加载的内核
drbd 327018 0
libcrc32c 1246 2 drbd,ip_vs
3、指定drbd要使用的磁盘资源,我这里是挂载一个磁盘,然后给他们创建相同的分区即可。
4、配置global_common.conf文件。
[[email protected] /etc/drbd/drbd.d]# vi global_common.conf
global {
usage-count yes;
# minor-count dialog-refresh disable-ip-verification
}
common {
protocol C; 数据同步写入方式。
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";
# fence-peer "/usr/lib/drbd/crm-fence-peer.sh";
# split-brain "/usr/lib/drbd/notify-split-brain.sh root";
# out-of-sync "/usr/lib/drbd/notify-out-of-sync.sh root";
# before-resync-target "/usr/lib/drbd/snapshot-resync-target-lvm.sh -p 15 -- -c 16k";
# after-resync-target /usr/lib/drbd/unsnapshot-resync-target-lvm.sh;
}
startup { ##设定启动阶段的超时时间
# wfc-timeout degr-wfc-timeout outdated-wfc-timeout wait-after-sb
wfc-timeout 120;
degr-wfc-timeout 120;
}
options { ##设定CPU的
# cpu-mask on-no-data-accessible
}
disk { ##磁盘相关的全局配置
# size max-bio-bvecs on-io-error fencing disk-barrier disk-flushes
# disk-drain md-flushes resync-rate resync-after al-extents
# c-plan-ahead c-delay-target c-fill-target c-max-rate
# c-min-rate disk-timeout
on-io-error detach;
}
net { ##网络相关的设置及认证信息。
# protocol timeout max-epoch-size max-buffers unplug-watermark
# connect-int ping-int sndbuf-size rcvbuf-size ko-count
# allow-two-primaries cram-hmac-alg shared-secret after-sb-0pri
# after-sb-1pri after-sb-2pri always-asbp rr-conflict
# ping-timeout data-integrity-alg tcp-cork on-congestion
# congestion-fill congestion-extents csums-alg verify-alg
# use-rle
cram-hmac-alg “sha1”;
shared-secret “mypasswd”;
}
syncer {
rate 1000M;
}
}
~
5、定义一个资源,首先要在/etc/drbd.d/目录下创建一个.res结尾的文件。
[[email protected] /etc/drbd/drbd.d]# vi web.res
resource web {
on node5.dtedu.com {
device /dev/drbd0; 定义DRBD虚拟块设备,这个设备不要事先不要格式化
disk /dev/sdb1; 定义存储磁盘为/dev/sda6,该分区创建完成之后就行了,不要进行格式化操作
address 10.40.0.225:7789; 定义DRBD监听的地址和端口,以便和对端进行通信
meta-disk internal;}
on node6.dtedu.com {
device /dev/drbd0;
disk /dev/sdb1;
address 10.40.0.226:7789;
meta-disk internal;}
}
6、复制配置文件到其他节点上。
[[email protected] /etc/drbd/drbd.d]# scp ./* node6:/etc/drbd/drbd.d/
global_common.conf 100% 1816 1.8KB/s 00:00
web.res 100% 243 0.2KB/s 00:00
7、初始化资源,分别在两个节点上执行。资源名就是web.res中写道的web名称。
[[email protected] /etc/drbd/drbd.d]# drbdadm create-md web
--== Thank you for participating in the global usage survey ==--
The server's response is:
you are the 6948th user to install this version
Writing meta data...
initializing activity log
NOT initializing bitmap
New drbd meta data block successfully created.
8、启动服务,并查看启动状态
[[email protected] ~/drbd-8.4.4]# service drbd start
Starting DRBD resources: [
create res: web/usr/local/drbd/var/run/drbd: No such file or directory
prepare disk: web/usr/local/drbd/var/run/drbd: No such file or directory
adjust disk: web
adjust net: web
]
outdated-wfc-timeout has to be shorter than degr-wfc-timeout
outdated-wfc-timeout implicitly set to degr-wfc-timeout (120s)
.....
.....
***************************************************************
DRBD's startup script waits for the peer node(s) to appear.
- In case this node was already a degraded cluster before the
reboot the timeout is 120 seconds. [degr-wfc-timeout]
- If the peer was available before the reboot the timeout will
expire after 120 seconds. [wfc-timeout]
(These values are for resource 'web'; 0 sec -> wait forever)
To abort waiting enter 'yes' [ 11]: To abort waiting enter 'yes' [ -- ]:
.
[[email protected] ~]# cat /proc/drbd
version: 8.4.4 (api:1/proto:86-101)
GIT-hash: 74402fecf24da8e5438171ee8c19e28627e1c98a build by [email protected], 2017-04-17 16:24:37
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:104392
可以看到 ro:Secondary/Secondary都是secondary,需要设置一个为主的节点,并且ds:Inconsistent/Inconsistent数据状态也是未同步的。
9、在需要设置为主节点的服务器上运行以下命令,如果要将从节点变为主节点,需要先降级主节点,再升级从节点。(分别在各个节点上运行)
[[email protected] ~/drbd-8.4.4]# drbdadm primary --force web
[[email protected] ~/drbd-8.4.4]# watch -n 1 'cat /proc/drbd'
Every 1.0s: cat /proc/drbd Wed Apr 19 02:59:01 2017
version: 8.4.4 (api:1/proto:86-101)
GIT-hash: 74402fecf24da8e5438171ee8c19e28627e1c98a build by [email protected], 2017-04-19 01:44:43
0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
ns:104392 nr:0 dw:0 dr:105064 al:0 bm:7 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
[[email protected] ~/drbd-8.4.4]# drbdadm secondary web
[[email protected] ~/drbd-8.4.4]# drbd-overview
0:web/0 Connected Secondary/Primary UpToDate/UpToDate C r-----
[[email protected] ~]# drbd-overview
0:web/0 Connected Primary/Secondary UpToDate/UpToDate C r-----
[[email protected] ~]#
10、格式化主节点的分区,并挂载,这个格式化只在主节点进行即可,不用对从节点磁盘进行格式化,因为这个会自动进行。
[[email protected] ~/drbd-8.4.4]# mkfs.ext3 /dev/drbd0
mke2fs 1.41.12 (17-May-2010)
文件系统标签=
操作系统:Linux
块大小=1024 (log=0)
分块大小=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
26104 inodes, 104392 blocks
5219 blocks (5.00%) reserved for the super user
第一个数据块=1
Maximum filesystem blocks=67371008
13 block groups
8192 blocks per group, 8192 fragments per group
2008 inodes per group
Superblock backups stored on blocks:
8193, 24577, 40961, 57345, 73729
正在写入inode表: 完成
Creating journal (4096 blocks): 完成
Writing superblocks and filesystem accounting information: 完成
This filesystem will be automatically checked every 32 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
注意:drbd挂载上主磁盘的时候,如果主磁盘故障或者需要更改被磁盘到主磁盘状态,需要先umount磁盘,才能修改主从关系并重新挂载。这也就是说如果挂载的磁盘坏了,需要人工干预。
改变主从关系时出现以下错误,也是因为没有卸载磁盘。
0: State change failed: (-12) Device is held open by someone
drbd实现双主模型的条件:
1、使用高可用集群工具
2、资源使用集群文件系统
高可用集群一般配置规律:
1、关闭开机启动功能
2、实现高可用前确定单个服务(资源)启动、关闭正常,及手动切换正常。
3、关闭stonith,stonith-enabled=false()
4、关闭quorum no-quorum-policy=ignore
drbd+pacemaker实现高可用:
1、关闭stonith和quorum,关闭drbd服务,及关闭开机启动drbd服务。
crm configure property stonith-enabled=false
Crm configure property no-quorum-policy=ignore
[[email protected] ~]# service drbd stop
Stopping all DRBD resources: .
[[email protected] ~]# chkconfig drbd off
[[email protected] ~]#
2、定义drbd资源,可使用ocf:linbit(ocf:heartbeat已经过期),查看使用方法
[[email protected] ~]# pcs resource describe ocf:linbit:drbd
[[email protected] ~]# crm ra meta ocf:linbit:drbd
3、定义资源,需要首先在dbrd配置文件中创建资源,/etc/drbd/drbd.d/目录下。(需要在两个节点上都进行设置)
[[email protected] ~]# crm
crm(live)# configure
crm(live)configure# primitive mysql_drbd ocf:linbit:drbd params drbd_resource=web op monitor role=Master interval= timeout= op monitor role=Slave interval= timeout= op start timeout=240 op stop timeout=100
crm(live)configure# verify
crm(live)configure# commit
参数详解:
role=指明监控对象,通常是master、salve
interval=监控时间间隔,当只设置了参数没有给具体数值的时候,按照默认值设定。
timeout=监控联系超时时间
4、定义主从资源,并将内容提交。
crm(live)configure# master ms_mysql_drbd mysql_drbd meta master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify=true
crm(live)configure# verify
WARNING: web-store: specified timeout 30s for monitor is smaller than the advised 40
crm(live)configure# commit
crm(live)configure#
难点:通常只有主资源才可以定义主从模式。
master-max:定义可以提升为主状态(活动/master)的资源最大有几个,对于drbd来说是1个。
master-node-max:在单个物理节点上可以运行的最大主资源(master)数量。
clone-max:最大允许运行的副本数量(clone),这里需要说明一下,前面创建的primitive是不会实际运行的,运行的是它产生的副本,所以需要两个副本,一个master一个salve。
clone-node-max:一个物理节点最多运行多少个副本
notify:通知状态信息。
globally-unique:资源要求全局唯一。
5、查看资源状态
故障处理:
状态:
[[email protected] ~]# crm status
Stack: classic openais (with plugin)
Current DC: node5.dtedu.com (version 1.1.15-5.el6-e174ec8) - partition WITHOUT quorum
Last updated: Wed May 10 11:02:45 2017 Last change: Wed May 10 11:02:34 2017 by root via cibadmin on node5.dtedu.com
, 2 expected votes
2 nodes and 2 resources configured
Node node5.dtedu.com: standby
OFFLINE: [ node6.dtedu.com ]
Full list of resources:
Master/Slave Set: ms_mysql_drbd [mysql_drbd]
mysql_drbd (ocf::linbit:drbd): FAILED node5.dtedu.com (blocked)
Stopped: [ node6.dtedu.com ]
Failed Actions:
* mysql_drbd_stop_0 on node5.dtedu.com 'not configured' (6): call=6, status=complete, exitreason='none',
last-rc-change='Wed May 10 09:07:45 2017', queued=0ms, exec=24ms
1、
Node node5.dtedu.com: standby
OFFLINE: [ node6.dtedu.com ]
此类故障通常是说明两个节点之间没有进行连接通信,可以坚持iptables、getenforce、ntpdate、ssh互信、bindnetaddr(corosync配置文件的监听地址)。