DRBD详解
一.DRBD是什么
DRBD的全称为:Distributed Replicated Block Device(DRBD)分布式复制块设备,是一种基于软件的,无共享,复制的存储解决方案,在服务器之间对块设备进行镜像。DRBD是由内核模块和相关脚本而构成,用以构建高可用性集群。其实现方式是通过网络来镜像整个设备。你可以把它看作是一种网络RAID,它允许用户在远程机器上建立一个本地块设备的实时镜像。
二.DRBD工作流程
每个设备(drbd提供了不止一个设备)都有一个状态,可能是主状态或从状态。在主节点上,应用程序应能运行和访问drbd设备(/dev/drbd*)。主节点写入的数据通过DRBD设备存储到本地的磁盘设备中(读取数据通常在本地进行),同时这个数据也会自动发送到从节点对应的DRBD设备,最终写入从节点的磁盘设备上(从节点只能简单地把数据写入它的磁盘设备上)。
如果主节点发生故障,心跳(heartbeat或corosync)将会把从节点转换到主状态,并启动其上的应用程序。(如果您将它和无日志FS 一起使用,则需要运行fsck)。如果发生故障的节点恢复了,它就会成为新的从节点,而且使自己的内容与主节点的内容保持同步。
三.DRBD的工作原理
DRBD是linux内核的存储层中的一个分布式存储系统,使用DRBD在两台Linux服务器之间共享块设备,共享文件系统和数据。类似于一个网络RAID-1的功能;
四.DRBD的复制模式
DRBD提供了三种不同的复制方式:
协议A:异步复制协议,一旦本地磁盘写入已经完成,且数据包已在发送队列中,则写入被认为是完成的,但在一个节点发生故障时,可能会发生数据丢失。因为虽然节点故障了,但被写入到远程节点上的数据可能仍在发送队列中,尽管在故障转移节点上的数据是一致的,但没有及时更新。这通常是用于地理上分开的节点。
简而言之:数据一旦写入本地磁盘并发送到网络中就认为完成了写入操作;
协议B:内存同步(半同步)复制协议,一旦本地磁盘写入已完成且复制数据包达到了从节点,则认为写入在主节点上是完成的。
数据丢失可能发生在两个节点同时故障的情况下,因为在传输中的数据可能不会被提交到磁盘。
简而言之:收到从节点的接收确认就认为完成了写入操作;
协议C:同步复制协议,只有在本地和从节点的磁盘已经确认了写操作完成,写才被认为完成。没有任何数据丢失,所以这是一个群集节点的流行模式,但I/O吞吐量依赖于网络带宽。
简而言之:收到写入确认就认为完成了写入操作;
五.DRBD用户空间管理工具
为了能够管理和配置DRBD的资源,DRBD配备了一些管理工具与内核模块进行通信:
drbdadm:高层的DRBD程序管理套件工具。它从配置文件/etc/drbd.conf(/etc/drbd.d/)中获取所有配置参数。
它为drbdsetup和drbdmeta两个命令充当程序的前端应用,执行drbdadm实际是执行的drbdsetup和drbdeta两个命令。
drbdsetup:可以让用户配置已经加载在内核中运行的DRBD模块,它是底层的DRBD程序管理套件工具。
使用该命令时,所有的配置参数都需要直接在命令行中定义,虽然命令和灵活,但是大大的降低了命令的简单易用性,因此很多的用户很少使用debdsetup;
drbdmeta:允许用户创建、转储、还原和修改drbd的原数据结构(管理META数据结构)。这个命令用户极少用到。
六.DRBD的配置文件
DRBD的主配置文件为/etc/drbd.conf;
为了管理的便捷性,目前通常会将些配置文件分成多个部分,且都保存至/etc/drbd.d目录中,主配置文件中仅使用include指令将这些配置文件片断整合起来。
通常,/etc/drbd.d目录中的配置文件为global_common.conf和所有以.res结尾的文件。其中global_common.conf中主要定义global段和common段,而每一个.res的文件用于定义一个资源。
在配置文件中,global段仅能出现一次,且如果所有的配置信息都保存至同一个配置文件中而不分开为多个文件的话,global段必须位于配置文件的最开始处。目前global段中可以定义的参数仅有minor-count, dialog-refresh, disable-ip-verification和usage-count。
common段则用于定义被每一个资源默认继承的参数,可以在资源定义中使用的参数都可以在common段中定义。实际应用中,common段并非必须,但建议将多个资源共享的参数定义为common段中的参数以降低配置文件的复杂度。
resource段则用于定义drbd资源,每个资源通常定义在一个单独的位于/etc/drbd.d目录中的以.res结尾的文件中。资源在定义时必须为其命名,名字可以由非空白的ASCII字符组成。每一个资源段的定义中至少要包含两个host子段,以定义此资源关联至的节点,其它参数均可以从common段或drbd的默认中进行继承而无须定义。
七.资源
1.资源分类:
在DRBD中资源是所有可复制移动存储设备的总称,通常包括:
资源名(resource name):可以指定除了空格外任意的us-ascii字符;
DRBD设备(DRBDdevice):DRBD的虚拟块设备。它有一个主设备号(标示设备类型)为147的设备,默认它的次设备号(标示同一种设备类型下的不同设备)从0开始。相关的块设备需命名为/dev/drbd*,其中*是设备的次设备号。简单地说就是此DRBD设备的设备文件;
磁盘配置(Disk configuration):DRBD内部应用需要本地数据副本,元数据(在双方节点上,各自提供的存储设备);
网络配置(Net configuration):各个对等节点间需要进行数据通信(双方数据同步时所使用的网络属性);
2.资源角色:
在DRBD中,每个节点都有自己的角色,比如主或者备。
这里属于主,备的选择不是随意的。主和备的概念是依赖与存储的可用性的,而主动和被动,反应的是一个应用的可用性。通常情况下在高可用环境中主节点也往往是活动的节点,但是这不是必须的。
在主DRBD设备中可以进行不受限制的读和写的操作,它可用来创建和挂载文件系统、初始化或者是直接I/O的快设备等等。
在次DRBD设备中,接收所有来自对等节点的更新,但是与此同时也就完全拒绝了访问。它即不能被应用也不能被读写访问。次节点不能被读写访问是为了保持缓冲一致性,这就意味着次节点是不可能以任何形式被访问的。
人工干预和管理程序的自动聚类算法都可以改变资源的角色。资源从次节点变为主节点为升级,而相反操作则成为降级。
八.DRBD特点
1.单主模式(主/从)
在单主模式下,任何资源在任何特定的时间,集群中只存在一个主节点上。正是因为这样,在集群中只能有一个节点可以随时操作数据,这种模式可用在任何的文件系统上(EXT3、EXT4、XFS等等);
部署DRBD单主节点模式可保证集群的高可用性(fail-over遇故障转移的能力)。
2.双主模式(主/主)
这是DRBD8.0之后的新特性。
在双主模式下,任何资源在任何特定的时间,集群中都存在两个主节点上。由于双方数据存在并发的可能性,这种模式需要一个共享的集群文件系统,利用分布式的锁机制进行管理,如GFS和OCFS2。
部署双主模式时,DRBD是负载均衡的集群,这就需要从两个并发的主节点中选取一个首选的访问数据。这种模式默认是禁用的,如果要是用的话必须在配置文件中进行声明。
3.多复制传输
这个特性在DRBD8.2.7及以后的版本中可用。
DRBD的复制和同步框架套接字层支持多个级别的传输:
IPv4中的TCP协议:这是规范的实施方式,也是DRBD默认使用的,可用于任何开启IPv4协议的系统上。
IPv6的TCP协议:当配置使用标准的TCP套接字用于复制和同步时,DRBD还可使用IPv6的网络协议。虽然是不同于IPv4,但是这是和使用IPv4的相当的。
超级套接字:超级套接字取代TCP/IP的单一堆栈,单片,高效和RDMA能够用套接字实现。DRBD可使用该延迟较低的套接字类型。超级套接字目前必须运行由单一供应商(Dolphin互联解决方案)提供的特定硬件设备上。
4.高效同步
(重新)同步不同于从设备上复制。复制发生于任何对主节点资源进行写操作时,同步则往往伴随写操作,它则影响到整个设备。
不管什么理由,主节点失败、次节点失效还是复制链接被中断,只要复制链接被中断同步就是必须的。在这个意义上同步是有效的,DRBD不同步修改块而保持块的顺序写,而维持它的线性秩序,这将会导致如下后果:
同步速度很快,因为这几个连续的写操作发生一次块的同步。
为保持块同步在自然磁盘上的区块分布,同步也是伴随着磁盘磁道的寻找。
数据的不一致性,因为在同步的过程中,数据在备用节点上部分过时或者部分被更新,这种数据状态更称为数据不一致性。
补充:
DRBD包含两个主要的部分:内核中的驱动代码和用户空间的管理工具;如果使用的Linux内核版本号小于2.6.33,那么就必须安装内核模块包(drbd-kmdl)和用户管理包(drbd),而且,在centos6里需要安装的是drbd 以及drbd-kmdl 的rpm包,在centos5里安装的是drbd和kmod-drbd,其中版本号一定要和内核的版本完全相符;如果内核版本号大于等于2.6.33那么只需要安装用户管理包即可,因为在2.6.33版本及以后的Linux已经将DRBD整合进了内核;
以下是Linux内核版本号和DRBD版本对照表:
Linux-release DRBD-release
2.6.33 8.3.7
2.6.34 8.3.7
2.6.35 8.3.8
2.6.36 8.3.8.1
2.6.37 8.3.9
2.6.38 8.3.9
2.6.39 8.3.10
3.0 - 3.4 8.3.11
3.5 - 3.7 8.3.13
3.8 & 3.9 8.4.2
3.10 8.4.3
使用uname -a可以查看内核版本号
官方帮助文档:
参考资料: