DRBD

描述

数据镜像App DRBD 先容

分布式块设备复制(Distributed Replicated Block Device),简称 DRBD,它是一种基于App的、基于网络的块复制存储解决方案,主要用于服务器之间的磁盘、分区、逻辑卷等进行数据镜像。当用户将数据写入本地磁盘时,还会将数据发送到网络中另一台主机的磁盘上,这样本地主机(主节点)与远程主机(备节点)的数据就可以保证实时同步,当本地主机出现问题,远程主机上还保留着一份相同的数据,可以继续使用,保证了数据的安全

DRBD 的基本功能

DRBD 的核心功能就是数据的镜像,其实现方式是通过网络来镜像整个磁盘设备或磁盘分区,将一个节点的数据通过网络实时的传送到另一个远程节点,保证两个节点间数据的一致性,这有点类似于一个网络 RAID1 的功能。对于 DRDB 数据镜像来说,它具有如下特点:

实时性。当应用对磁盘数据有修改操作时,数据复制马上发生。
透明性。应用程序的数据存储在镜像设备上是透明和独立的。数据可以存储在基于网络的不同服务器上。
同步镜像。当本地应用申请写操作时,同时也在远程主机上开始进行写操作。
异步镜像。当本地写操作已经完成时,才开始对远程主机进行写操作。

DRBD 的构成

DRBD 是 Linux 内核存储层中的一个分布式存储系统,具体来说有两部分构成,一个是内核模板,主要用于虚拟一个块设备;一个是用户空间管理程序,主要用于和 DRBD 内核模块通信,以管理 DRBD 资源,在 DRBD 中,资源主要包含 DRBD 设备、磁盘配置、网络配置等。

DRBD 设备在整个 DRBD 系统中位于物理块设备之上,文件系统之下,在文件系统和物理磁盘之间形成了一个中间层,当用户在主用节点的文件系统中写入数据时,数据被正式写入磁盘前会被 DRBD 系统截获,同时,DRBD 在捕捉到有磁盘写入的操作时,就会通知用户空间管理程序把这些数据复制一份,写入到远程主机的 DRBD 镜像,然后存入 DRBD 镜像所映射的远程主机磁盘。

drbd.png

DRBD 负责接收数据,把数据写到本地磁盘,然后发送给另一个主机。另一个主机再将数据存到自己的磁盘中。目前,DRBD 每次只允许对一个节点进行读写访问,这对于通常的故障切换高可用性集群来讲已经足够用了。以后的版本将支撑两个节点进行读写存取。

DRBD 的主要特性

DRBD 系统在实现数据镜像方面有很多有用的特性,大家可以根据自己的需要和应用环境,选择适合自己的功能特性。下面依次先容 DRBD 几个非常重要的应用特性。

  1. 单主模式这种是最经常使用的一种模式,主要用在高可用集群的数据存储方面,解决集群中数据共享的问题,在这种模式下,集群中只有一个主节点可以对数据进行读写操作,可以用在这种模式下的文件系统有 ext3、ext4、xfs 等。

  2. 双主模式这种模式只能在 DRBD8.0 以后的版本中使用,主要用在负载均衡集群中,解决数据共享和一致性问题,在这种模式下,集群中存在两个主节点,由于两个主节点都有可能对数据进行并发的读写操作,因此单一的文件系统就无法满足需求了,此时就需要共享的集群文件系统来解决并发读写问题。常用在这个模式下的文件系统有 GFS、OCFS2 等,通过集群文件系统的分布式锁机制就可以解决集群中两个主节点同时操作数据的问题。

复制模式
DRBD 提供了三种不同的复制方式,分别是:

协议 A,只要本地磁盘写入已经完成,数据包已经在发送队列中,则认为一个写操作过程已经完成。
这种方式在远程节点故障或者网络故障时,可能造成数据丢失,因为要写入到远程节点的数据可能还在发送队列中。

协议 B,只要本地磁盘写入已经完成,并且数据包已经到达远程节点,则认为一个写操作过程已经完成。
这种方式在远程节点发生故障时,可能造成数据丢失。

协议 C,只有本地和远程节点的磁盘已经都确认了写操作完成,写认为一个写操作过程已经完成。
这种方式没有任何数据丢失,就目前而言应用最多、最广泛的就是协议 C,但在此方式下磁盘的 I/O 吞吐量依赖于网络带宽。建议在网络带宽较好的情况下使用这种方式。

安装与配置

系统环境:CentOS 6

安装yum源

到http://www.elrepo.org/上找到系统对应的
rpm -Uvi [...]

安装gcc,make,如果系统没有装
yum install gcc make*

安装DRBD
  1. 安装drbd的系统内核支撑
#yum install kernel-devel kernel kernel-headers flex
  1. 安装
#yum -y install drbd83-utils kmod-drbd83
配置DRBD

大家在/etc/drbd.d下面创建一个mydb.res文件。下面是两台DRBD主机节点配置文件的简单示例
resource "mydb" { #资源名字为mydb
protocol C; #使用DRBD的第三种同步协议,表示收到远程主机的写入确认后认为写入完成

net {
cram-hmac-alg "sha1"; #DRBD同步时使用的验证方式
shared-secret "passwd";
}

syncer { #数据同步传输控制
rate 200M; #最大同步速率,下面两个是辅助参数
al-extents 257;
on-no-data-accessible io-error;
}

disk { #处理发生数据不同步的问题,新的版本已不使用
on-io-error detach;
fencing resource-only;
}

startup { #启动时的参数设置
wfc-timeout 30; #等待30s服务启动
outdated-wfc-timeout 20;
degr-wfc-timeout 30;
}

on join { #主机名
device /dev/drbd0; #drbd的块设备名
disk /dev/sdb1;
address 192.168.99.131:7788; #drbd的监听端口,用于主机通信
meta-disk internal; #元数据的存放方式(默认)
}

on jinbo {
device /dev/drbd0;
disk /dev/sdb1;
address 192.168.99.132:7788;
meta-disk internal;
}
}

DRBD的管理与维护

启动DRBD

1.在两个节点上实行
在启动DRBD之前,需要分别在两台主机的分区上创建供DRBD记录信息的数据块,具体是分别在两台主机上实行:

#drbdadm create-md mydb  或者实行  drbdadm create-md all

2. 在两个节点上启动服务
[root@jinbo ~]# /etc/init.d/drbd start
[root@join ~]# /etc/init.d/drbd start

drbdadm up all/mydb all表示启动所有资源,drbdadm down all 关闭资源。
与drbdadm connect/disconnect all/mydb一样

3.在任意节点上查看节点状态
登陆任意drbd节点,然后实行“cat /proc/drbd”命令,输出结果如下:
[root@jinbo drbd.d]# cat /proc/drbd
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:20964116

对输出的含义说明如下(常见的):
cs连接状态:
StandAlone 独立的:网络配置不可用。资源还没有被连接或者被管理员断开(使用drbdadm disconnect 命令),或者是由于认证失败或者是脑裂的情况。
Disconnecting 断开:断开只是临时状态,下一个状态将是StandAlone独立的。
Unconnected 悬空:是尝试连接前的临时状态,可能的下一个状态为WFconnection 和 WFReportParams
Timeout 超时:与对等节点连接超时,也是临时状态
WFConnection 等待和对等节点建立网络连接
WFReportParams:已经建立TCP连接,本节点等待从对等节点传来的第一个网络包
Connected 正常连接
SyncSource:以本节点为同步源的同步正在进行
SyncTarget:以本节点为同步目标的同步正在进行

ro:即roles,本地节点和远程节点的角色,第一次启动drbd时,两个drbd节点默认都处于Secondary状态。
ds:即disk states,本地和远程节点的硬盘状态,“Inconsistent/Inconsistent”即“不一致/不一致状态”,表示两个节点的磁盘数据处于不一致状态
C:表示所使用的协议时C

以下六个表示的是I/O状态标记
r或s : 表示I/O操作正在进行, s表示I/O挂起,正常r
-或a : a表示延迟后再同步
-或p : p表示因为对等层启动同步挂起而引起的数据再同步的情况
-或u : u表示因为本地启动同步挂起而引起的数据再同步的情况
-或d,b,n,a : d表示因为drbd内部原因引起的I/O阻塞,类似一种过渡磁盘状态;b表示备用设备I/O正在阻塞;n表示网络套接字的阻塞;a表示同时发生I/O设备阻塞和网络阻塞
-或s : s表示当挂起更新的活动日志时的标记。

以下的标记表示的是性能指标(主要前面的4项)
ns: 即network send,表示通过网络发送到对等节点的数据量,单位是kbyte
nr: 即network receive,表示通过网络接收来自对等节点的数据量
dw: 即disk write,表示写到本地资产的网络数据
dr: 即disk read,表示从本地磁盘读出的网络数据

4. 设置主节点
由于默认没有主次节点之分,因此需要设置两个主机的主次节点。选择需要设置为主节点的主机,然后实行如下命令:
**[root@jinbo ~]#drbdsetup /dev/drbd0 primary -o ** #建议使用这条指令
也可以实行下面的命令:
[root@jinbo ~]# drbdadm --overwrite-data-of-peer primary all

第一次实行上面指令后,如果需要设置哪个为主节点,也可以使用另外的一个命令:
[root@jinbo ~]# /sbin/drbdadm primary mydb 或者 /sbin/drbdadm primary all
-->开始数据同步

如果第一次设置主备节点使用"/sbin/drbdadm primary mydb"命令,那么会提示你如下错误:
0:State change failed:(-2) Need access to UpToDate data
Command '/sbin/drbdsetup 0 primary' terminated with exit code 17
只要第一次实行上面的命令成功,以后就可以用“/sbin/drbdadm primary mydb”切换主节点了。

5. 挂载DRBD设备
[root@jinbo ~]# mkfs.ext4 /dev/drbd0
[root@jinbo ~]# mount /dev/drbd0 /data/

由于mount操作只能在主节点进行,因此只有设置了主节点后才能格式化磁盘分区,同时,在两个节点中,同一时刻只能有一台处于primary,另一台处于secondary状态,而处于secondary状态的节点上不能挂载DRBD设备,要在备用节点上挂载DRBD设备,请往下看~

DRBD主备节点切换

在系统维护得时候,或者在高可用集群中,当主节点出现故障时,就需要将主备节点得角色互换。主备节点切换有两种方式,分别是停止drbd服务切换和正常切换。

1. 停止DRBD服务切换

关闭主节点服务,此时挂载的DRBD分区就自动在主节点卸载了,操作如下:
[root@master-drbd /]#/etc/init.d/drbd stop
Stopping all DRBD resources:

然后查看备用节点的DRBD状态:
[root@slave-drbd ~]#cat /proc/drbd
从输出可以看到,现在的主节点的状态变为"unknown",接着在备用节点实行切换命令:
[root@slave-drbd ~]#drbdadm primary all #此命令会报错
因此,必须在备用节点实行如下命令:

[root@slave-drbd ~]#drbdadm /dev/drbd0 primary -o
或者
[root@slave-drbd ~]#drbdadm --overwrite-data-of-peer primary all

现在就正常切换了,接着查看此节点的状态。可以看出,原来的备用节点已经处于primary状态,而原来的主节点由于DRBD服务未启动,还处于Unknown状态,在原来的主节点服务启动后,会自动变为Secondary状态,无需在原来的主节点上再次实行切换到备用节点的命令
最后,在新的主节点上挂载DRBD设备完成主备节点的切换

2. 正常切换
  首先在主节点卸载磁盘分区:
[root@master-drbd /]#umount /data
   然后实行:
[root@master-drbd /]#drbdadm secondary mydb
   此时查看DRBD的状态
[root@master-drbd /]#cat /proc/drbd
   可以看到,两个节点都处于“Secondary”状态了,那么接下来就要指定一个主节点

在备用节点上实行如下命令:
[root@slave-drbd ~]#drbdadm primary all
[root@slave-drbd ~]#cat /proc/drbd
    至此,主备节点成功切换角色。最后在新的主节点上挂载DRBD磁盘即可

脑裂的处理

drbd的对等节点如果不在线的话,即主节点的数据更改如果无法及时传送到备节点达到一定时间,会造成数据不一致,即使故障节点离线后恢复,drbd可能也不能正常同步了。或者另外一种情况,主备都在线,但心跳网络断了而出现脑裂,两个节点都认为自己是主节点,也会造成两个节点的数据不一致,这样需要人工干预,告诉drbd以哪个节点为主节点,或者在dbrd配置脑裂的行为。下面是长时间备节点不在线后出现的情况:

查看备用节点的状态:
[root@slave-drbd ~]#cat /proc/drbd
1:cs:StandAlone ro:Secondary/Unknown ds:UpToDate/Unknown 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:57596

cs(连接状态),孤立的
ro(角色)
ds(磁盘状态)是uptodate/unknown,本地节点处于正在更新状态,而对等节点为unknown状态。 从以上可以看出,备节点发生了drbd脑裂。

发生脑裂后,需要认为确认哪个节点有最新的数据,那么就以哪个节点为主,比如发生脑裂后,主节点master-drbd数据最新,那么就以master-drbd节点数据为准,然后进行恢复和手动同步。

手动恢复脑裂
步奏如下:

  1. 在slave-drbd从节点上设置为从节点,并丢弃资源数据
#drbdadm secondary mydb   #首先让此drbd节点为从节点
#drbdadm disconnect mydb   #关闭主从连接,如果提示需要关闭的话
#drbdadm --discard-my-data connect mydb  #从节点同步数据,并且discard自己的数据
  1. 在master-drbd主节点上手动连接资源
    [root@master-drbd /]#drbdadm connect mydb

这样,就解决了脑裂的问题,主从节点又开始同步数据了

推荐阅读更多精彩内容

  • 一、DRBD概况 DRBD的全称为:Distributed ReplicatedBlock Device(DRBD...
    浅色的嗥啸阅读 1,010评论 0赞 4
  • 概况 什么是DRBD DRBD (Distributed Replicated Block Device,分布式复...
    Lisong阅读 773评论 0赞 0
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 103,672评论 13赞 125
  • DRBD(分布式同步块设备)配置安装 准备工作 两台服务器时间同步,关闭iptables和selinux,分别设置...
    素白流殇阅读 208评论 0赞 0
  • 安装配置(node1/node2上操作) 1、准备: 两个节点node1和node2均按照centos6.5系统,...
    宇信智臻sy阅读 1,094评论 1赞 1