1.drbd简介

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

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

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

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

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

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

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

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

2.1 drbd工作原理

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

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

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

下图是drbd的原理图。

对于正常的文件系统,写入数据的流程: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.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.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.4 drbd资源角色

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

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

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.6 分区说明

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

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

关于分区有几点注意:

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

3.drbd部署实验

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

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

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

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.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.3 编译安装drbd

测试环境CentOS 6.6

安装相关程序:

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

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

下载drbd-utils:wget http://www.drbd.org/download/drbd/utils/drbd-utils-8.9.10.tar.gz
下载drbd软件:wget http://www.drbd.org/download/drbd/9.0/drbd-9.0.4-1.tar.gz

  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也是一样的。

drbd(一):简介和安装的更多相关文章

  1. Node.js 教程 01 - 简介、安装及配置

    系列目录: Node.js 教程 01 - 简介.安装及配置 Node.js 教程 02 - 经典的Hello World Node.js 教程 03 - 创建HTTP服务器 Node.js 教程 0 ...

  2. Java Gradle入门指南之简介、安装与任务管理

        这是一篇Java Gradle入门级的随笔,主要介绍Gradle的安装与基本语法,这些内容是理解和创建build.gradle的基础,关于Gradle各种插件的使用将会在其他随笔中介绍.    ...

  3. 细细品味Storm_Storm简介及安装

    Storm是由专业数据分析公司BackType开发的一个分布式实时数据处理软件,可以简单.高效.可靠地处理大量的数据流.Twitter在2011年7月收购该公司,并于2011年9月底正式将Storm项 ...

  4. VMware vSphere 5.1 简介与安装

    虚拟化系列-VMware vSphere 5.1 简介与安装  标签: 虚拟化 esxi5.1 VMware vSphere 5.1 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 . ...

  5. Nutch搜索引擎(第2期)_ Solr简介及安装

    1.Solr简介 Solr是一个高性能,采用Java5开发,基于Lucene的全文搜索服务器.同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置.可扩展并对查询性能进行了优化 ...

  6. Node.js的简介和安装

    一.Node.js的简介和安装 a)       什么是Node.js? Node.js是一个开发平台 让JavaScript运行在服务器端的开发平台 ---简单点说就是用JavaScript写服务器 ...

  7. Nutch之简介与安装

    初学Nutch之简介与安装 初学Nutch之简介与安装   1.Nutch简介 Nutch是一个由Java实 现的,开放源代码(open-source)的web搜索引擎.主要用于收集网页数据,然后对其 ...

  8. Nutch搜索引擎Solr简介及安装

    Nutch搜索引擎(第2期)_ Solr简介及安装   1.Solr简介 Solr是一个高性能,采用Java5开发,基于Lucene的全文搜索服务器.同时对其进行了扩展,提供了比Lucene更为丰富的 ...

  9. DNN简介以及安装

    开源框架DNN简介以及安装 donetnuke 是一款免费的开源cms框架,目前也有收费版,不过免费版也可以适应大家大部分的需求.我前些阵子是老板让我在20天内,做好一个官网并且发布,并且指定使用dn ...

  10. Grant简介以及安装

    Grant简介以及安装 1.   安装Grunt-cli需要使用npm,全局安装  命令:npm install –g grunt-cli(可能会涉及权限问题) 注意,安装grunt-cli并不等于安 ...

随机推荐

  1. javax.servlet.JspTagException:Illegal use of <when>-style tag without <choose >as its di

    1.错误描述 javax.servlet.JspTagException:Illegal use of <when>-style tag without <choose >as ...

  2. java.lang.NullPointerException: No FileItemFactory has been set.

    1.错误描述 java.lang.NullPointerException: No FileItemFactory has been set. at org.apache.commons.fileup ...

  3. 启动就加载(三)initializingbean实现afterPropertiesSet方法

    TransactionTemplate,就直接以TransactionTemplate为入口开始学习. TransactionTemplate的源码如下: public class Transacti ...

  4. C# 高效字符串连接 StringBuilder介绍

    在介绍StringBuilder之前,必须要先了解string的特性. string在.NET中属于基本数据类型,也是基本数据类型中唯一的引用类型.字符串可以声明为常量,但它却放在了堆中. 一:不可改 ...

  5. 描述一下Spring框架的作用和优点?

    Spring框架的作用和优点如下: 1.Spring是一个开源的轻量级的应用开发框架,其目的是用于简化企业级应用程序开发,减少侵入: 2.Spring提供的IOC和AOP应用,可以将组建的耦合度降低至 ...

  6. LCT总结(LCT,Splay)

    概念.性质简述 LCT(Link-Cut Tree),就是动态树的一种,用来维护一片森林的信息,滋磁的操作可多啦! 动态连边.删边 合并两棵树.分离一棵树(跟上面不是一毛一样吗) 动态维护连通性 维护 ...

  7. 【Luogu3041】视频游戏的连击(AC自动机,动态规划)

    题面链接 题解 首先构建出AC自动机 然后在AC自动机上面跑DP 转移很显然从Trie树的节点跳到他的儿子节点 但是要注意一个问题, 在计算的时候,每一个节点加入后能够 造成的贡献 要加上他的子串的贡 ...

  8. BZOJ第1页养成计划

    嗯,用这篇博客当一个目录,方便自己和学弟(妹?)们查阅.不定期更新. BZOJ1000   BZOJ1001   BZOJ1002   BZOJ1003   BZOJ1004   BZOJ1005   ...

  9. angular路由详解一(基础知识)

    本人原来是iOS开发,没想到工作后,离iOS开发原来越远,走上了前端的坑.一路走来,也没有向别人一样遇到一个技术上的师傅,无奈只能一个人苦苦摸索.如今又开始填angular的坑了.闲话不扯了.(本人学 ...

  10. asp.net mvc 5 关闭xss过滤

    在控制器方法的头部添加        [ValidateInput(false)] 如果向mvc服务端提交带html标签的内容就会导致校验失败异常,从而得不到想要的结果,关闭的方法是在相应方法头部添加 ...