当前位置: 澳门新濠3559 > 操作系统 > 正文

角色、模式和数据同步协议, 2.2 drbd复制协议模

时间:2019-12-08 05:50来源:操作系统
1.drbd简介 drbd是 通过网络(tcp连接)在不同服务器之间实现基于block级别进行数据实时同步的软件 。类似于inotify+rsync,只不过inotify+rsync是按文件级别来同步的,而drbd是工作在文件系统下

1.drbd简介

drbd是通过网络(tcp连接)在不同服务器之间实现基于block级别进行数据实时同步的软件。类似于inotify+rsync,只不过inotify+rsync是按文件级别来同步的,而drbd是工作在文件系统下层的,实现的是block同步和拷贝,效率相对较高。且inotify+rsync是通过监控事件来实现实时同步的,而drbd则跟普通写入磁盘的过程一样,只不过多了一条写入网卡的分支路线。

如下图,此处只是简单的示意图。更具体的原理图见下文。

澳门新濠3559 1

drbd只能在分区上、LVM逻辑卷上或整块磁盘上实现,不能在某一个目录上实现。

drbd支持同步、半同步、异步三种数据同步的方式。

drbd支持脑裂(brain split)通知和自动恢复。

drbd(一):简介和安装,drbd简介安装

本文目录:
1.drbd简介
2.drbd工作原理和术语说明
 2.1 drbd工作原理
 2.2 drbd复制协议模型
 2.3 drbd设备的概念
 2.4 drbd资源角色
 2.5 drbd工作模式
 2.6 drbd分区说明
3.drbd部署实验
 3.1 实验环境和部署前的准备
 3.2 yum安装drbd
 3.3 编译安装drbd

简介

什么是DRBD

DRBD (Distributed Replicated Block Device,分布式复制块设备) 是由内核模块和相关脚本构成,用以构建高可用性的集群。其实现方式是通过网络来镜像整个设备。可以看做是一种网络RAID1
Distributed Replicated Block Device(DRBD)是一种基于软件的,无共享,复制的存储解决方案,在服务器之间的对块设备(硬盘,分区,逻辑卷等)进行镜像。DRBD工作在内核 当中的,类似于一种驱动模块。DRBD工作的位置在文件系统的buffer cache和磁盘调度器之间,通过tcp/ip发给另外一台主机到对方的tcp/ip最终发送给对方的drbd,再由对方的drbd存储在本地对应磁盘 上,类似于一个网络RAID-1功能。在高可用(HA)中使用DRBD功能,可以代替使用一个共享盘阵。本地(主节点)与远程主机(备节点)的数据可以保 证实时同步。当本地系统出现故障时,远程主机上还会保留有一份相同的数据,可以继续使用。DRBD的架构如下图

澳门新濠3559 2

Paste_Image.png

简单说一下DRBD主要功能,DRBD 负责接收数据,把数据写到本地磁盘,然后通过网络将同样的数据发送给另一个主机,另一个主机再将数据存到自己的磁盘中。

Distributed Replicated Block Device(DRBD)是一种基于软件的,无共享,复制的存储解决方案,在服务器之间的对块设备(硬盘,分区,逻辑卷等)进行镜像。DRBD工作在内核 当中的,类似于一种驱动模块。DRBD工作的位置在文件系统的buffer cache和磁盘调度器之间,通过tcp/ip发给另外一台主机到对方的tcp/ip最终发送给对方的drbd,再由对方的drbd存储在本地对应磁盘 上,类似于一个网络RAID-1功能。在高可用(HA)中使用DRBD功能,可以代替使用一个共享盘阵。本地(主节点)与远程主机(备节点)的数据可以保 证实时同步。当本地系统出现故障时,远程主机上还会保留有一份相同的数据,可以继续使用。DRBD的架构如下图

2.drbd工作原理和术语说明

drbd的核心功能是通过Linux内核模块实现的。特别地,操作系统中的虚拟块设备(virtual block device)中有它的驱动,因此drbd几乎处于操作系统I/O堆栈的"最底部"。这使得它非常具有弹性,可以很容易地为服务提供高可用性。

但注意,drbd处于文件系统之下的层次,不能实现文件系统层次的功能,例如检查文件是否损坏、为文件系统提供高可用等。但它是基于block的,可以做块设备检查、同步的完整性检查等。

1.drbd简介

drbd是通过网络(tcp连接)在不同服务器之间实现基于block级别进行数据实时同步的软件。类似于inotify+rsync,只不过inotify+rsync是按文件级别来同步的,而drbd是工作在文件系统下层的,实现的是block同步和拷贝,效率相对较高。且inotify+rsync是通过监控事件来实现实时同步的,而drbd则跟普通写入磁盘的过程一样,只不过多了一条写入网卡的分支路线。

如下图,此处只是简单的示意图。更具体的原理图见下文。

澳门新濠3559 3

drbd只能在分区上、LVM逻辑卷上或整块磁盘上实现,不能在某一个目录上实现。

drbd支持同步、半同步、异步三种数据同步的方式。

drbd支持脑裂(brain split)通知和自动恢复。

DRBD 的工作原理

 每个设备(drbd 提供了不止一个设备)都有一个状态,可能是‘主’状态或者‘从’状态 在主节点上,应用程序应能运行和访问DRBD设备。每次写入都会发往本地磁盘设备和从节点设备中。从节点只能简单地把数据写入它的磁盘设备上。读取数据通常在本地进行。如果主节点发生故障,心跳(heartbeat或corosync)将会把从节点转换为主状态,并启动其上的应用程序。如果发生故障的节点恢复工作,它会成为新的从节点,而且必须使自己的内容与主节点的内容保持同步。当然,这些才做可能不会干扰到后台的服务

澳门新濠3559 4
底层设备支持
DRBD需要构建在底层设备之上,然后构建出一个块设备出来。对于用户来说,一个DRBD设备,就像是一块物理的磁盘,可以在上面内创建文件系统。DRBD所支持的底层设备有以下这些类:
1、一个磁盘,或者是磁盘的某一个分区;
2、一个soft raid 设备;
3、一个LVM的逻辑卷;
4、一个EVMS(Enterprise Volume Management System,企业卷管理系统)的卷;
5、其他任何的块设备。
配置简介
全局配置项(global)
基本上我们可以做的也就是配置usage-count是yes还是no了,usage-count参数其实只是为了让linbit公司收集目前drbd的使用情况。当drbd在安装和升级的时候会通过http协议发送信息到linbit公司的服务器上面。

2.1 drbd工作原理

drbd实现基于块级别的数据同步,其实现方式是通过tcp连接来镜像整个设备。

它有主备节点的概念。在主节点上,可以对drbd设备创建文件系统以供读取,甚至可以直接IO。在主节点写入的数据通过DRBD设备存储到主节点的磁盘设备中,同时,这个数据块也会通过网络传输到备节点对应的DRBD设备上,最终写入备用节点的磁盘设备上实现同步。在备用节点上,DRBD只是将数据从DRBD设备写入到备用节点的磁盘中,无法供外界读、写,之所以连读都提供,是为了维护缓存一致性(cache coherency)的问题。

现在大部分的高可用集群都会使用共享存储,在实时同步以及数据一致性角度而言,drbd能代替共享存储。而且,drbd可以配合高可用软件,实现高可用服务的切换而不会数据丢失,因为备节点和主节点数据是实时同步的,这样给用户的体验是更好的,但却节约了成本,其性能与稳定性方面也不错。

下图是drbd的原理图。

澳门新濠3559 5

对于正常的文件系统,写入数据的流程:buffer-->filesystem--> disk scheduler-->disk driver-->disk

而使用drbd时,流程是上图中的红色箭头。在filesystem的下一层加上drbd层,该层将写入的数据通过drbd发送到tcp套接字的send缓存(send buffer),再通过DMA的方式拷贝到网卡,由网卡发送到备节点。备节点的drbd设备从tcp套接字的recv缓存(recv buffer)中接收数据,然后从drbd设备读出数据并等待disk scheduler调度写入到磁盘中。

如果不理解或者理解的不清晰,可先阅读:不可不知的socket和TCP连接过程。

其中A/B/C是drbd复制的协议级别,如下"drbd复制模型"所述。

2.drbd工作原理和术语说明

drbd的核心功能是通过Linux内核模块实现的。特别地,操作系统中的虚拟块设备(virtual block device)中有它的驱动,因此drbd几乎处于操作系统I/O堆栈的"最底部"。这使得它非常具有弹性,可以很容易地为服务提供高可用性。

但注意,drbd处于文件系统之下的层次,不能实现文件系统层次的功能,例如检查文件是否损坏、为文件系统提供高可用等。但它是基于block的,可以做块设备检查、同步的完整性检查等。

底层设备支持

DRBD需要构建在底层设备之上,然后构建出一个块设备出来。对于用户来说,一个DRBD设备,就像是一块物理的磁盘,可以在上面内创建文件系统。DRBD所支持的底层设备有以下这些类:

  1. 一个磁盘,或者是磁盘的某一个分区;
  2. 一个soft raid 设备;
  3. 一个LVM的逻辑卷;
  4. 一个EVMS(Enterprise Volume Management System,企业卷管理系统)的卷;
  5. 其他任何的块设备。

公共配置项(common)
这里的common,指的是drbd所管理的多个资源之间的common。配置项里面主要是配置drbd的所有resource可以设置为相同的参数项,比如protocol,syncer等等。

2.2 drbd复制协议模型

上面drbd工作原理图中的A、B、C对应的是drbd的不同复制模型。复制模型指的是数据的写入执行到哪个过程就认为此次写操作已经完成。

drbd有三种复制协议:同步、半同步、异步。

A协议:异步复制(asynchronous),如上图A标识,指的是当数据写到本地磁盘上,并且复数据已经复制到tcp的send buffer缓冲区以后,此时就认为写入磁盘成功。此复制协议性能好,但可能会丢失一些最近的数据。

B协议:半同步复制(semi sync),也称为内存复制,如上图B标识,指的是数据已经写到本地磁盘上,并且已经被对方的tcp协议栈接收到(即写入到了对方的recv buffer中),此时就认为此次写操作成功。此复制协议性能较好,且只有当两节点都断电时才会丢失最近处于socket buffer中的数据。因此性能和数据可靠性介于协议A和C之间。

C协议:同步复制(sync),如上图C标识,指的是数据已经写入到本地磁盘,也已经写入到远程磁盘上,此时就认为此次写操作成功。此复制协议性能较差,但数据可靠性高。

C复制协议是drbd默认使用的协议。

2.1 drbd工作原理

drbd实现基于块级别的数据同步,其实现方式是通过tcp连接来镜像整个设备。

它有主备节点的概念。在主节点上,可以对drbd设备创建文件系统以供读取,甚至可以直接IO。在主节点写入的数据通过DRBD设备存储到主节点的磁盘设备中,同时,这个数据块也会通过网络传输到备节点对应的DRBD设备上,最终写入备用节点的磁盘设备上实现同步。在备用节点上,DRBD只是将数据从DRBD设备写入到备用节点的磁盘中,无法供外界读、写,之所以连读都提供,是为了维护缓存一致性(cache coherency)的问题。

现在大部分的高可用集群都会使用共享存储,在实时同步以及数据一致性角度而言,drbd能代替共享存储。而且,drbd可以配合高可用软件,实现高可用服务的切换而不会数据丢失,因为备节点和主节点数据是实时同步的,这样给用户的体验是更好的,但却节约了成本,其性能与稳定性方面也不错。

下图是drbd的原理图。

不可不知的socket和TCP连接过程。

其中A/B/C是drbd复制的协议级别,如下"drbd复制模型"所述。

配置简介

全局配置项(global)
澳门新濠3559,基本上我们可以做的也就是配置usage-count是yes还是no了,usage-count参数其实只是为了让linbit公司收集目前drbd的使用情况。当drbd在安装和升级的时候会通过http协议发送信息到linbit公司的服务器上面。

公共配置项(common)
这里的common,指的是drbd所管理的多个资源之间的common。配置项里面主要是配置drbd的所有resource可以设置为相同的参数项,比如protocol,syncer等等。
</b>
DRBD设备
DRBD的虚拟块设备。它有一个主设备号为147的设备,默认的它的次要号码编从0开始。在一组主机上,drbd的设备的设备名称为/dev/drbdN,这个N通常和他的次设备号一致。
</b>
资源配置项(resource)
resource 项中配置的是drbd所管理的所有资源,包括节点的ip信息,底层存储设备名称,设备大小,meta信息存放方式,drbd对外提供的设备名等等。每一个 resource中都需要配置在每一个节点的信息,而不是单独本节点的信息。并且资源名只能使用纯ascii码而且不能使用空白字符用于表示资源名称。实 际上,在drbd的整个集群中,每一个节点上面的drbd.conf文件需要是完全一致的。
另外,resource还有很多其他的内部配置项:
net:网络配置相关的内容,可以设置是否允许双主节点(allow-two-primaries)等。
startup:启动时候的相关设置,比如设置启动后谁作为primary(或者两者都是primary:become-primary-on both)
syncer: 同步相关的设置。可以设置“重新”同步(re-synchronization)速度(rate)设置,也可以设置是否在线校验节点之间的数据一致性 (verify-alg 检测算法有md5,sha1以及crc32等)。数据校验可能是一个比较重要的事情,在打开在线校验功能后,我们可以通过相关命令(drbdadm verify resource_name)来启动在线校验。在校验过程中,drbd会记录下节点之间不一致的block,但是不会阻塞任何行为,即使是在该不一致的 block上面的io请求。当不一致的block发生后,drbd就需要有re-synchronization动作,而syncer里面设置的rate 项,主要就是用于re-synchronization的时候,因为如果有大量不一致的数据的时候,我们不可能将所有带宽都分配给drbd做re- synchronization,这样会影响对外提提供服务。rate的设置和还需要考虑IO能力的影响。如果我们会有一个千兆网络出口,但是我们的磁盘 IO能力每秒只有50M,那么实际的处理能力就只有50M,一般来说,设置网络IO能力和磁盘IO能力中最小者的30%的带宽给re- synchronization是比较合适的(官方说明)。另外,drbd还提供了一个临时的rate更改命令,可以临时性的更改syncer的rate 值:
角色、模式和数据同步协议, 2.2 drbd复制协议模型。drbdsetup /dev/drbd0 syncer -r 100M
这样就临时的设置了re-synchronization的速度为100M。不过在re-synchronization结束之后,你需要通过
drbdadm adjust resource_name
来让drbd按照配置中的rate来工作。

DRBD设备

2.3 DRBD设备的概念

DRBD设备是操作系统中的一个虚拟块设备,在Linux上游内核中已经集成了DRBD的块设备模块和驱动。它的主设备号(major)为147,次设备号默认从0开始编号。

在一组主机上,drbd设备的设备名称为/dev/drbdN,这个N通常和它的次设备号一致。

DRBD需要构建在底层设备之上,然后构建出一个块设备出来。对于用户来说,一个DRBD设备,就像是一个分区,可以在上面创建文件系统。DRBD所支持的底层设备有以下这些类:

  • 1、磁盘或磁盘的某一个分区;
  • 2、软 raid 设备;
  • 3、LVM的逻辑卷;
  • 4、EVMS(企业卷管理系统,Enterprise Volume Management System);
  • 4、其他任何的块设备,甚至DRBD块设备自身也能成为另一个DRBD的底层设备。

2.2 drbd复制协议模型

上面drbd工作原理图中的A、B、C对应的是drbd的不同复制模型。复制模型指的是数据的写入执行到哪个过程就认为此次写操作已经完成。

drbd有三种复制协议:同步、半同步、异步。

A协议:异步复制(asynchronous),如上图A标识,指的是当数据写到本地磁盘上,并且复数据已经复制到tcp的send buffer缓冲区以后,此时就认为写入磁盘成功。此复制协议性能好,但可能会丢失一些最近的数据。

B协议:半同步复制(semi sync),也称为内存复制,如上图B标识,指的是数据已经写到本地磁盘上,并且已经被对方的tcp协议栈接收到(即写入到了对方的recv buffer中),此时就认为此次写操作成功。此复制协议性能较好,且只有当两节点都断电时才会丢失最近处于socket buffer中的数据。因此性能和数据可靠性介于协议A和C之间。

C协议:同步复制(sync),如上图C标识,指的是数据已经写入到本地磁盘,也已经写入到远程磁盘上,此时就认为此次写操作成功。此复制协议性能较差,但数据可靠性高。

C复制协议是drbd默认使用的协议。

角色、模式和数据同步协议

角色
在drbd构造的集群中,资源具有角色的概念,分别为primary和secondary。
所有设为primary的资源将不受限制进行读写操作。可以创建文件系统,可以使用裸设备,甚至直接io。所有设为secondary的设备中不能挂载,不能读写
模式
drbd也有drbd mode:单主模型(主从),双主模型(drbd只有在8.0以后的版本才支持双主模型)
在单主模型下drbd可以使用任意的文件系统
单在双主模型下只能使用集群文件系统,常用的开源的集群文件系统有:ocfs2和gfs2
数据同步协议
drbd有三种数据同步模式:同步异步半同步
异步:指的是当数据写到磁盘上,并且复制的数据已经被放到我们的tcp缓冲区并等待发送以后,就认为写入完成
半同步:指的是数据已经写到磁盘上,并且这些数据已经发送到对方内存缓冲区,对方的tcp已经收到数据,并宣布写入
同步:指的是主节点已写入,从节点磁盘也写入
</b>
drbd 的复制模型是靠protocol关键字来定义的:protocol A表示异步;protocol B表示半同步;protocol C表示同步,默认为protocol C。在同步模式下只有主、从节点上两块磁盘同时损害才会导致数据丢失。在半同步模式下只有主节点宕机,同时从节点异常停电才会导致数据丢失。
注意:drbd的主不会监控从的状态所以有可能会造成数据重传

DRBD的虚拟块设备。它有一个主设备号为147的设备,默认的它的次要号码编从0开始。在一组主机上,drbd的设备的设备名称为/dev/drbdN,这个N通常和他的次设备号一致。
资源配置项(resource)
resource 项中配置的是drbd所管理的所有资源,包括节点的ip信息,底层存储设备名称,设备大小,meta信息存放方式,drbd对外提供的设备名等等。每一个 resource中都需要配置在每一个节点的信息,而不是单独本节点的信息。并且资源名只能使用纯ascii码而且不能使用空白字符用于表示资源名称。实 际上,在drbd的整个集群中,每一个节点上面的drbd.conf文件需要是完全一致的。
另外,resource还有很多其他的内部配置项:
net:网络配置相关的内容,可以设置是否允许双主节点(allow-two-primaries)等。
startup:启动时候的相关设置,比如设置启动后谁作为primary(或者两者都是primary:become-primary-on both)
syncer: 同步相关的设置。可以设置“重新”同步(re-synchronization)速度(rate)设置,也可以设置是否在线校验节点之间的数据一致性 (verify-alg 检测算法有md5,sha1以及crc32等)。数据校验可能是一个比较重要的事情,在打开在线校验功能后,我们可以通过相关命令(drbdadm verify resource_name)来启动在线校验。在校验过程中,drbd会记录下节点之间不一致的block,但是不会阻塞任何行为,即使是在该不一致的 block上面的io请求。当不一致的block发生后,drbd就需要有re-synchronization动作,而syncer里面设置的rate 项,主要就是用于re-synchronization的时候,因为如果有大量不一致的数据的时候,我们不可能将所有带宽都分配给drbd做re- synchronization,这样会影响对外提提供服务。rate的设置和还需要考虑IO能力的影响。如果我们会有一个千兆网络出口,但是我们的磁盘 IO能力每秒只有50M,那么实际的处理能力就只有50M,一般来说,设置网络IO能力和磁盘IO能力中最小者的30%的带宽给re- synchronization是比较合适的(官方说明)。另外,drbd还提供了一个临时的rate更改命令,可以临时性的更改syncer的rate 值:

2.4 drbd资源角色

在drbd构造的集群中,资源具有角色的概念,分别为primary和secondary(主从的概念)。

所有primary的资源将不受限制进行读写操作,可以创建文件系统,可以使用裸设备,可以直接io。而所有secondary的设备中不能挂载,不能读、写。

2.3 DRBD设备的概念

DRBD设备是操作系统中的一个虚拟块设备,在Linux上游内核中已经集成了DRBD的块设备模块和驱动。它的主设备号(major)为147,次设备号默认从0开始编号。

在一组主机上,drbd设备的设备名称为/dev/drbdN,这个N通常和它的次设备号一致。

DRBD需要构建在底层设备之上,然后构建出一个块设备出来。对于用户来说,一个DRBD设备,就像是一个分区,可以在上面创建文件系统。DRBD所支持的底层设备有以下这些类:

  • 1、磁盘或磁盘的某一个分区;
  • 2、软 raid 设备;
  • 3、LVM的逻辑卷;
  • 4、EVMS(企业卷管理系统,Enterprise Volume Management System);
  • 4、其他任何的块设备,甚至DRBD块设备自身也能成为另一个DRBD的底层设备。

metadata

DRBD将数据的各种信息块保存在一个专用的区域里,这些metadata包括了
a,DRBD设备的大小
b,产生的标识
c,活动日志
d,快速同步的位图
metadata的存储方式有内部和外部两种方式,使用哪种配置都是在资源配置中定义的
内部meta data
内部metadata存放在同一块硬盘或分区的最后的位置上
优点:metadata和数据是紧密联系在一起的,如果硬盘损坏,metadata同样就没有了,同样在恢复的时候,metadata也会一起被恢复回来
缺点:metadata和数据在同一块硬盘上,对于写操作的吞吐量会带来负面的影响,因为应用程序的写请求会触发metadata的更新,这样写操作就会造成两次额外的磁头读写移动。
外部meta data
外部的metadata存放在和数据磁盘分开的独立的块设备上
优点:对于一些写操作可以对一些潜在的行为提供一些改进
缺点:metadata和数据不是联系在一起的,所以如果数据盘出现故障,在更换新盘的时候就需要认为的干预操作来进行现有node对心硬盘的同步了
如果硬盘上有数据,并且硬盘或者分区不支持扩展,或者现有的文件系统不支持shrinking,那就必须使用外部metadata这种方式了。
可以通过下面的命令来计算metadata需要占用的扇区数

drbdsetup /dev/drbd0 syncer -r 100M

2.5 drbd工作模式

  1. 主从模型master/slave(primary/secondary)
    这种机制在某一时刻只允许有一个主节点。主节点的作用是可以挂载使用,写入数据等;从节点只是作为主节点的镜像,是主节点的备份,且是不可见的。
    这样的工作机制的好处是可以有效的避免磁盘出现单点故障,而且数据不会错乱。

  2. 双主模型dula primary(primary/primary)
    所谓双主模型是2个节点都可以当做主节点来挂载使用。但会导致数据错乱。当第一个主节点对某一文件正在执行写操作,此时另一个节点也正在对同一文件执行写操作,这种情况会造成数据错乱,从而导致数据不能正常使用。

解决双主模型数据混乱的方案是:使用集群(分布式)文件系统,如gfs2。集群文件系统使用分布式文件锁管理器,当一个节点对文件加锁之后会通过某种机制来通知其他节点锁信息,从而实现文件锁共享。

也可以将两节点的不同drbd设备分别设置主从,从而实现双主模型。例如服务器A上的a分区(主)和服务器B上的a分区(从),同时服务器A上的b分区(从)和服务器B上的b分区(主)。

2.4 drbd资源角色

在drbd构造的集群中,资源具有角色的概念,分别为primary和secondary(主从的概念)。

所有primary的资源将不受限制进行读写操作,可以创建文件系统,可以使用裸设备,可以直接io。而所有secondary的设备中不能挂载,不能读、写。

split brain脑裂

split brain实际上是指在某种情况下,造成drbd的两个节点断开连接,都以primary的身份来运行。当drbd某primary节点连接对方节点准备 发送信息的时候如果发现对方也是primary状态,那么会立刻自行断开连接,并认定当前已经发生split brain了,这时候他会在系统日志中记录以下信息:“Split-Brain detected,dropping connection!”当发生split brain之后,如果查看连接状态,其中至少会有一个是StandAlone状态,另外一个可能也是StandAlone(如果是同时发现split brain状态),也有可能是WFConnection的状态。
如果我们在配置文件中配置了自动解决split brain(好像linbit不推荐这样做),drbd会自行解决split brain问题,可通过如下策略进行配置。
Discarding modifications made on the “younger” primary。在这种模式下,当网络重新建立连接并且发现了裂脑,DRBD会丢弃最后切换到主节点上的主机所修改的数据。
Discarding modifications made on the “older” primary. 在这种模式下,当网络重新建立连接并且发现了裂脑,DRBD丢弃首先切换到主节点上的主机后所修改的数据。
Discarding modifications on the primary with fewer changes.在这种模式下,当网络重新建立连接并且发现了裂脑,DRBD会比较两台主机之间修改的数据量,并丢弃修改数据量较少的主机上的所有数据。
Graceful recovery from split brain if one host has had no intermediate changes.在这种模式下,如果其中一个主机在脑裂期间并没有数据修改,DRBD会自动重新进行数据同步,并宣布脑裂问题已解决。(这种情况几乎不可 能存在)
注意:自动裂脑自动修复能不能被接受取决于个人应用。考虑 建立一个DRBD的例子库。在“丢弃修改比较少的主节点的修改”兴许对web应用好过数据库应用。与此相反,财务的数据库则是对于任何修改的丢失都是不能 容忍的,这就需要不管在什么情况下都需要手工修复裂脑问题。因此需要在启用裂脑自动修复前考虑你的应用情况。
如果没有配置 split brain自动解决方案,我们可以手动解决。首先我们必须要确定哪一边应该作为解决问题后的primary,一旦确定好这一点,那么我们同时也就确定接受 丢失在split brain之后另外一个节点上面所做的所有数据变更了。当这些确定下来后,我们就可以通过以下操作来恢复了:
</b>
1、首先在确定要作为secondary的节点上面切换成secondary并放弃该资源的数据:
drbdadm secondary resource_name
drbdadm — –discard-my-data connect resource_name
2、在要作为primary的节点重新连接secondary(如果这个节点当前的连接状态为WFConnection的话,可以省略)
drbdadm connect resource_name
当作完这些动作之后,从新的primary到secondary的re-synchnorisation会自动开始。

这样就临时的设置了re-synchronization的速度为100M。不过在re-synchronization结束之后,你需要通过

2.6 分区说明

drbd分为两种分区。其中一个分区是metadata区,用于存储元数据,给个1G就够了,2G就非常多了;另一种分区是数据区,这是drbd块设备的底层设备。因此,大多数情况下需要在drbd的两节点上创建两个分区,分别作为metadata区和data区。

注意,metadata区也可以和数据区在同一分区,这时metadata区称为"内部元数据区(Internal metadata)"。

关于分区有几点注意:

  1. 数据区创建完成后不能挂载。
  2. metadata分区创建完成后不能格式化,也就是不能创建文件系统(要交给drbd来处理)。
  3. 建议两边的数据分区大小给一样的,否则一端会浪费空间。如何解决此问题后文说明。

2.5 drbd工作模式

解决双主模型数据混乱的方案是:使用集群(分布式)文件系统,如gfs2。集群文件系统使用分布式文件锁管理器,当一个节点对文件加锁之后会通过某种机制来通知其他节点锁信息,从而实现文件锁共享。

也可以将两节点的不同drbd设备分别设置主从,从而实现双主模型。例如服务器A上的a分区(主)和服务器B上的a分区(从),同时服务器A上的b分区(从)和服务器B上的b分区(主)。

drbdadm adjust resource_name

3.drbd部署实验

绝大多数情况下,drbd都是两节点的,要么是主从工作模式(primary/secondary),要么是结合集群文件系统的主主模式(primary/primary)。很少情况下,可以添加一个第三节点,作为backup角色。

drbd节点最好部署在使用专门的网络环境下,节点之间可以使用直连模式、back-to-back模式或使用高速网卡。如果中间跨了交换机,建议加上Linux的网卡绑定功能(如不了解,请百度"bonding驱动")。不建议drbd节点之间跨路由器,这会严重影响性能。

drbd两节点之间的数据区应尽量差不多大小。

2.6 分区说明

drbd分为两种分区。其中一个分区是metadata区,用于存储元数据,给个1G就够了,2G就非常多了;另一种分区是数据区,这是drbd块设备的底层设备。因此,大多数情况下需要在drbd的两节点上创建两个分区,分别作为metadata区和data区。

注意,metadata区也可以和数据区在同一分区,这时metadata区称为"内部元数据区(Internal metadata)"。

关于分区有几点注意:

来让drbd按照配置中的rate来工作。 
角色、模式和数据同步协议

3.1 实验环境以及安装前的准备

drbd的实验环境:
A服务器上:
  管理IP:eth0 192.168.100.49
  数据同步IP:eth1 192.168.100.51
B服务器上:
  管理IP:eth0 192.168.100.50
  数据同步IP:eth1 192.168.100.52

操作系统均为CentOS 7.2,安装的drbd是8.4版。

  1. 修改主机名。因为drbd是基于主机名解析的。

    hostnamectl set-hostname drbd1.longshuai.com  # A服务器上配置
    hostnamectl set-hostname drbd2.longshuai.com  # B服务器上配置
    
  2. 修改hosts文件。最好将主机名配置成数据同步专用通道eth1的地址。
    A/B服务器上都配置

    192.168.100.51 node1.longshuai.com node1
    192.168.100.52 node2.longshuai.com node2
    
  3. 添加主机路由。

    route add -host 192.168.100.52 dev eth1  # A服务器上配置
    route add -host 192.168.100.51 dev eth1  # B服务器上配置
    
  4. 时间同步。

    ntpdate ntp1.aliyun.com     # A、B都执行
    
  5. 提供分区。
    分别在A/B服务器上添加一块硬盘,然后都分为两个区。注意,作为metadata的分区不要格式化,而用作data的分区格式化后不要挂载。
    此处实验分区为/dev/sdb1(metadata区)和/dev/sdb5(数据区)。

    # 在两节点上执行:
    # 磁盘热插
    for i in /sys/class/scsi_host/*;do echo "- - -" >$i/scan;done
    # 分区
    # 主分区(metadata区)/dev/sdb1:1G,扩展分区/dev/sdb2,逻辑分区(data区)/dev/sdb5:5G
    parted /dev/sdb mklabel msdos
    parted /dev/sdb mkpart p 1 1G
    parted /dev/sdb "mkpart e 1G -1"
    parted /dev/sdb mkpart l 1G 6G
    fdisk /dev/sdb
    mke2fs -t ext4 /dev/sdb5
    

3.drbd部署实验

绝大多数情况下,drbd都是两节点的,要么是主从工作模式(primary/secondary),要么是结合集群文件系统的主主模式(primary/primary)。很少情况下,可以添加一个第三节点,作为backup角色。

drbd节点最好部署在使用专门的网络环境下,节点之间可以使用直连模式、back-to-back模式或使用高速网卡。如果中间跨了交换机,建议加上Linux的网卡绑定功能(如不了解,请百度"bonding驱动")。不建议drbd节点之间跨路由器,这会严重影响性能。

drbd两节点之间的数据区应尽量差不多大小。

角色
在drbd构造的集群中,资源具有角色的概念,分别为primary和secondary。
所有设为primary的资源将不受限制进行读写操作。可以创建文件系统,可以使用裸设备,甚至直接io。所有设为secondary的设备中不能挂载,不能读写

3.2 yum安装drbd

drbd工具分为两部分:内核模块(kmod-drbd)和用户空间的管理工具(drbd-utils),其中内核模块已经整合到了2.6.33版本及以后版本的上游内核中。如果早于这个版本,则需要安装和管理工具相同版本的模块。

在elrepo源中,可以找到drbd的内核模块和管理工具。因此先配置elrepo源(此处配置清华大学镜像站的elrepo)。

cat /etc/yum.repos.d/elrepo.repo 

[elrepo]
name=elrepo
baseurl=https://mirrors.tuna.tsinghua.edu.cn/elrepo/archive/elrepo/el7/x86_64/
enable=1
gpgcheck=0

再安装drbd84-utils和对应版本的模块kmod-drbd84。安装后装载drbd模块。

yum -y install drbd84-utils kmod-drbd84

modprobe drbd

如果装载drbd模块时发现"not found",说明没有安装"kernel", yum -y install kernel 安装后重启系统即可。

要想开机加载drbd模块,则将其写入/etc/sysconfig/modules/目录下的"*.modules"文件中,如果是CentOS 6,则可以加入/etc/rc.d/rc.sysinit或/etc/rc.modules。

以下是/etc/sysconfig/modules/drbd.modules文件中的内容,配置后记得赋予x权限。

# drbd module exists?
/usr/sbin/modinfo -F filename drbd &>/dev/null
if [ "$?" -eq 0 ];then 
    /usr/sbin/modprobe drbd
fi

看看drbd84-utils提供了哪些工具:

[root@node1 ~]# rpm -ql drbd84-utils | grep bin
/usr/sbin/drbd-overview   # drbd资源信息查看工具,和cat /proc/drbd功能类似
/usr/sbin/drbdadm         # drbd主要的管理工具
/usr/sbin/drbdmeta        # drbd元数据区管理工具
/usr/sbin/drbdmon         # drbd资源状态监控工具
/usr/sbin/drbdsetup       # drbd更底层的管理工具,直接操作块设备

其中drbdadm是主要管理工具,可以给其传递一些模块化的命令来调用其他的drbd工具。例如drbdadm create-md将调用drbdmeta工具。

此外,还提供了/etc/ha.d/resource.d/drbddisk脚本,用于结合heartbeat使用,该脚本用于标记节点块设备为primary角色并进行文件系统的挂载。

3.1 实验环境以及安装前的准备

drbd的实验环境:
A服务器上:
  管理IP:eth0 192.168.100.49
  数据同步IP:eth1 192.168.100.51
B服务器上:
  管理IP:eth0 192.168.100.50
  数据同步IP:eth1 192.168.100.52

操作系统均为CentOS 7.2,安装的drbd是8.4版。

模式
drbd也有drbd mode:单主模型(主从),双主模型(drbd只有在8.0以后的版本才支持双主模型)
在单主模型下drbd可以使用任意的文件系统
单在双主模型下只能使用集群文件系统,常用的开源的集群文件系统有:ocfs2和gfs2

3.3 编译安装drbd

测试环境CentOS 6.6

安装相关程序:

yum -y install gcc make automake autoconf kernel-devel kernel-headers flex libxslt

如果发现更新了kernel版本,则需要重启系统。重启后需要重新配置路由,否则两端不能通信。

下载drbd-utils:wget
下载drbd软件:wget

  1. 先安装drbd-utils再安装drbd

    wget http://www.drbd.org/download/drbd/utils/drbd-utils-8.9.10.tar.gz
    tar xf drbd-utils-8.9.10.tar.gz 
    cd drbd-utils-8.9.10
    ./autogen.sh
    ./configure --prefix=/usr --localstatedir=/var --sysconfdir=/etc 
    make KDIR=/usr/src/kernels/2.6.32-504.el6.x86_64/
    make install
    
  2. 再安装drbd

    tar xf drbd-9.0.4-1.tar.gz
    cd drbd-9.0.4-1
    make KDIR=/usr/src/kernels/2.6.32-504.el6.x86_64/
    make install
    
  3. 最后加载drbd模块

    lsmod|grep drbd
    modprobe drbd
    lsmod|grep drbd
    drbd                  500374  0 
    libcrc32c               1246  2 drbd,btrfs
    

由于重启模块不自动加载,可以在/etc/sysconfig/modules/目录下新建一个*.modules文件,里面写入modprobe drbd,或者在/etc/rc.modules文件(可能不存在)中追加此行。当然,放入到rc.local也是一样的。

3.2 yum安装drbd

drbd工具分为两部分:内核模块(kmod-drbd)和用户空间的管理工具(drbd-utils),其中内核模块已经整合到了2.6.33版本及以后版本的上游内核中。如果早于这个版本,则需要安装和管理工具相同版本的模块。

在elrepo源中,可以找到drbd的内核模块和管理工具。因此先配置elrepo源(此处配置清华大学镜像站的elrepo)。

cat /etc/yum.repos.d/elrepo.repo 

[elrepo]
name=elrepo
baseurl=https://mirrors.tuna.tsinghua.edu.cn/elrepo/archive/elrepo/el7/x86_64/
enable=1
gpgcheck=0

再安装drbd84-utils和对应版本的模块kmod-drbd84。安装后装载drbd模块。

yum -y install drbd84-utils kmod-drbd84

modprobe drbd

如果装载drbd模块时发现"not found",说明没有安装"kernel-devel",yum安装下后重启系统即可。

看看drbd84-utils提供了哪些工具:

[root@node1 ~]# rpm -ql drbd84-utils | grep bin
/usr/sbin/drbd-overview   # drbd资源信息查看工具,和cat /proc/drbd功能类似
/usr/sbin/drbdadm         # drbd主要的管理工具
/usr/sbin/drbdmeta        # drbd元数据区管理工具
/usr/sbin/drbdmon         # drbd资源状态监控工具
/usr/sbin/drbdsetup       # drbd更底层的管理工具,直接操作块设备

其中drbdadm是主要管理工具,可以给其传递一些模块化的命令来调用其他的drbd工具。例如drbdadm create-md将调用drbdmeta工具。

此外,还提供了/etc/ha.d/resource.d/drbddisk脚本,用于结合heartbeat使用,该脚本用于标记节点块设备为primary角色并进行文件系统的挂载。

数据同步协议

3.3 编译安装drbd

测试环境CentOS 6.6

安装相关程序:

yum -y install gcc make automake autoconf kernel-devel kernel-headers flex libxslt

如果发现更新了kernel版本,则需要重启系统。重启后需要重新配置路由,否则两端不能通信。

下载drbd-utils:wget
下载drbd软件:wget

由于重启模块不自动加载,可以在/etc/sysconfig/modules/目录下新建一个*.modules文件,里面写入modprobe drbd,或者在/etc/rc.modules文件(可能不存在)中追加此行。当然,放入到rc.local也是一样的。

 

回到Linux系列文章大纲:

回到网站架构系列文章大纲:

回到数据库系列文章大纲:
转载请注明出处:

注:若您觉得这篇文章还不错请点击右下角推荐,您的支持能激发作者更大的写作热情,非常感谢!

本文目录: 1.drbd简介 2.drbd工作原理和术语说明 2.1 drbd工作原理 2.2 drbd复制协议模型 2.3 drbd设备的概念...

drbd有三种数据同步模式:同步,异步,半同步
异步:指的是当数据写到磁盘上,并且复制的数据已经被放到我们的tcp缓冲区并等待发送以后,就认为写入完成
半同步:指的是数据已经写到磁盘上,并且这些数据已经发送到对方内存缓冲区,对方的tcp已经收到数据,并宣布写入
同步:指的是主节点已写入,从节点磁盘也写入
drbd 的复制模型是靠protocol关键字来定义的:protocol A表示异步;protocol B表示半同步;protocol C表示同步,默认为protocol C。在同步模式下只有主、从节点上两块磁盘同时损害才会导致数据丢失。在半同步模式下只有主节点宕机,同时从节点异常停电才会导致数据丢失。
注意:drbd的主不会监控从的状态所以有可能会造成数据重传

metadata

DRBD将数据的各种信息块保存在一个专用的区域里,这些metadata包括了
a,DRBD设备的大小
b,产生的标识
c,活动日志
d,快速同步的位图
metadata的存储方式有内部和外部两种方式,使用哪种配置都是在资源配置中定义的
内部meta data
内部metadata存放在同一块硬盘或分区的最后的位置上
优点:metadata和数据是紧密联系在一起的,如果硬盘损坏,metadata同样就没有了,同样在恢复的时候,metadata也会一起被恢复回来
缺点:metadata和数据在同一块硬盘上,对于写操作的吞吐量会带来负面的影响,因为应用程序的写请求会触发metadata的更新,这样写操作就会造成两次额外的磁头读写移动。
外部meta data
外部的metadata存放在和数据磁盘分开的独立的块设备上
优点:对于一些写操作可以对一些潜在的行为提供一些改进
缺点:metadata和数据不是联系在一起的,所以如果数据盘出现故障,在更换新盘的时候就需要认为的干预操作来进行现有node对心硬盘的同步了
如果硬盘上有数据,并且硬盘或者分区不支持扩展,或者现有的文件系统不支持shrinking,那就必须使用外部metadata这种方式了。
可以通过下面的命令来计算metadata需要占用的扇区数
split brain脑裂
split brain实际上是指在某种情况下,造成drbd的两个节点断开连接,都以primary的身份来运行。当drbd某primary节点连接对方节点准备 发送信息的时候如果发现对方也是primary状态,那么会立刻自行断开连接,并认定当前已经发生split brain了,这时候他会在系统日志中记录以下信息:“Split-Brain detected,dropping connection!”当发生split brain之后,如果查看连接状态,其中至少会有一个是StandAlone状态,另外一个可能也是StandAlone(如果是同时发现split brain状态),也有可能是WFConnection的状态。
如果我们在配置文件中配置了自动解决split brain(好像linbit不推荐这样做),drbd会自行解决split brain问题,可通过如下策略进行配置。
Discarding modifications made on the “younger” primary。在这种模式下,当网络重新建立连接并且发现了裂脑,DRBD会丢弃最后切换到主节点上的主机所修改的数据。
Discarding modifications made on the “older” primary. 在这种模式下,当网络重新建立连接并且发现了裂脑,DRBD丢弃首先切换到主节点上的主机后所修改的数据。
Discarding modifications on the primary with fewer changes.在这种模式下,当网络重新建立连接并且发现了裂脑,DRBD会比较两台主机之间修改的数据量,并丢弃修改数据量较少的主机上的所有数据。
Graceful recovery from split brain if one host has had no intermediate changes.在这种模式下,如果其中一个主机在脑裂期间并没有数据修改,DRBD会自动重新进行数据同步,并宣布脑裂问题已解决。(这种情况几乎不可 能存在)
注意:自动裂脑自动修复能不能被接受取决于个人应用。考虑 建立一个DRBD的例子库。在“丢弃修改比较少的主节点的修改”兴许对web应用好过数据库应用。与此相反,财务的数据库则是对于任何修改的丢失都是不能 容忍的,这就需要不管在什么情况下都需要手工修复裂脑问题。因此需要在启用裂脑自动修复前考虑你的应用情况。
如果没有配置 split brain自动解决方案,我们可以手动解决。首先我们必须要确定哪一边应该作为解决问题后的primary,一旦确定好这一点,那么我们同时也就确定接受 丢失在split brain之后另外一个节点上面所做的所有数据变更了。当这些确定下来后,我们就可以通过以下操作来恢复了:
1、首先在确定要作为secondary的节点上面切换成secondary并放弃该资源的数据:
drbdadm secondary resource_name
drbdadm — –discard-my-data connect resource_name
2、在要作为primary的节点重新连接secondary(如果这个节点当前的连接状态为WFConnection的话,可以省略)
drbdadm connect resource_name
当作完这些动作之后,从新的primary到secondary的re-synchnorisation会自动开始。

 

参考至:

                

                

                

                

                

                

                

                 

编辑:操作系统 本文来源:角色、模式和数据同步协议, 2.2 drbd复制协议模

关键词: