一DRBD原理介绍

  DRBD其实就是通过网络来实现块设备的数据镜像同步的一款开源Cluster软件也被俗称为网络RAID1。DRBD介于文件系统与磁盘介质之间通过捕获上层文件系统的所有IO操作然后调用内核中的IO模块来读写底层的磁盘介质。当DRBD捕获到文件系统的写操作之后会在进行本地的磁盘写操作的同时以TCP/IP协议将通过本地主机的网络设备NIC将IO传递至远程主机的网络设备。当远程主机的DRBD监听到传递过来的IO信息之后会立即将该数据写入到该DRBD所维护的磁盘设备。至此,整个IO才做完成。

       DRBD是一个用软件实现的、无共享的、服务器之间镜像块设备内容的存储复制解决方案。 DRBD Logo数据镜像实时、透明、同步所有服务器都成功后返回、异步本地服务器成功后返回。DBRD的核心功能通过Linux的内核实现最接近系统的IO栈但它不能神奇地添加上层的功能比如检测到EXT3文件系统的崩溃。DBRD的位置处于文件系统以下比文件系统更加靠近操作系统内核及IO栈。

       DRBD是工作在系统内核空间而不是用户空间它直接复制的是二进制数据这是它速度快的根本原因。

0_1310868447iG0G.gif

       +---io-----+

       |文件系统|

       +--------+

            |

            V

       +----------+

       |   块设备层|

       | /dev/drbd1|

       +----------+nic  wrete

        |            TCP/IP

        |            |

  调用内核IO模块写    DRBD监听有IO是写入到drbd维护的磁盘设备

        |            |

        V            V

  +----------+  +-----------+

  |  本地硬盘   |   | 远程主机硬盘 |

  | (/dev/hdb1)  |   | (/dev/hdb1)  |

  +----------+  +-----------+

DRBD 复制模式

  • 协议A异步复制协议。本地写成功后立即返回数据放在发送buffer中可能丢失。

  • 协议B内存同步半同步复制协议。本地写成功并将数据发送到对方后立即返回如果双机掉电数据可能丢失。

  • 协议C同步复制协议。本地和对方写成功确认后返回。如果双机掉电或磁盘同时损坏则数据可能丢失。

三种级别的选择可以通过DRBD的通用配置部分的protocal。

   对比上面三种复制模式C模式可以保证不论出现任何异常都能够保证两端数据的一致性。而如果使用B模式则可能当远程主机突然断电之后将丢失部分还没有完全写入磁盘的信息且本地与远程的数据出现一定的不一致情况。当我们使用A复制模式的话可能存在的风险就要更大了。只要本地网络设备突然无法正常工作包括主机断电),就会丢失将写入远程主机的数据造成数据不一致现象。


底层设备支持

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

1、一个磁盘或者是磁盘的某一个分区

2、一个soft raid 设备

3、一个LVM的逻辑卷

4、一个EVMSEnterprise Volume Management System企业卷管理系统的卷

5、其他任何的块设备


重要的特性

DRBD之所以能够得到广泛的采用甚至被MySQL官方写入文档手册作为官方推荐的高可用方案之一主要是其各种高可靠特性以及稳定性的缘故。下面介绍一下DRBD所具备的一些比较重要的特性

1、非常丰富的配置选项可以适应我们的应用场景中的情况。无论是可靠性级别与性能的平衡还是数据安全性方面无论是本地磁盘还是网络存储设备无论是希望异常自动解决还是希望手动控制等等都可以通过简单的配置文件就可以解决。当然丰富的配置在带来极大的灵活性的同时也要求使用者需要对他有足够的了解才行否则在那么多配置参数中也很难决策该如何配置。幸好DRBD在默认情况下的各项参数实际上就已经满足了大多数典型需求了并不需要我们每一项参数都设置才能运行

2、对于节点之间出现数据不一致现象DRBD可以通过一定的规则进行重新同步。而且可以通过相关参数配置让DRBD在固定时间点进行数据的校验比对来确定数据是否一致并对不一致的数据进行标记。同时还可以选择是DRBD自行解决不一致问题还是由我们手工决定如何同步

3、在运行过程中如果出现异常导致一端crash并不会影响另一端的正常工作。出现异常之后的所有数据变更都会被记录到相关的日志文件中。当crash节点正常恢复之后可以自动同步这段时间变更过的数据。为了不影响新数据的正常同步还可以设定恢复过程中的速度以确保网络和其他设备不会出现性能问题

4、多种文件系统类型的支持。DRBD除了能够支持各种常规的文件系统之外还可以支持GFSOCFS2等分布式文件系统。而且在使用分布式文件系统的时候还可以实现各结带你同时提供所有IO操作。

5、提供对LVM的支持。DRBD既可以使用由LVM提供的逻辑设备也可以将自己对外提供的设备成为LVM的物理设备这极大的方便的运维人员对存储设备的管理。

6、所有IO操作能够绝对的保证IO顺序。这也是对于数据库来说非常重要的一个特性尤其是一些对数据一致性要求非常苛刻的数据库软件来说。

7、可以支持多种传输协议从DRBD8.2.7开始DRBD开始支持Ipv4IPv6以及SuperSockets来进行数据传输。

8、支持Three-Way复制。从DRBD8.3.0开始DRBD可以支持三个节点之间的复制了有点类似于级联复制的特性。


drbd设备的三个进程

每个drbd设备会有三个进程

drbd0_worker是drbd0的主要进程

drbd0_asender是primary上drbd0的数据发送进程

drbd0_receiver是secondary上drbd0的数据接收进程


DRBD与HA 集群

      大部分现行高可用性集群如惠普、IBM、Dell使用的是共享存储器因此存储器连接多个节点用共享的SCSI 总线或光纤通道就可以做到。DRBD 也可以作为一个共享的设备但是它并不需要任何不常见的硬件。它在IP 网络中运行而且在价格上IP 网络要比专用的存储网络经济的多。目前DRBD 每次只允许对一个节点进行读写访问这对于通常的故障切换高可用性集群来讲已经足够用了。现在的版本将支持两个节点同时进行读写存取。这很有用比如对GFS 来讲就是如此。兼容性DRBD可以在IDE、SCSI 分区和整个驱动器之上运行但不能在回路模块设备上运行。如果您硬要这样做它就会发生死锁。DRBD 也不能在回送网络设备中运行。因为它同样会发生死锁所有请求都会被发送设备占用发送流程也会阻塞在sock_sendmsg中。有时接收线程正从网络中提取数据块并试图把它放在高速缓存器中但系统却要把一些数据块从高速缓存器中取到磁盘中。这种情况往往会在接收器的环境下发生因为所有的请求都已经被接收器块占用了。

二DRBD实例

步骤

  1. 安装drbd

  2. 配置资源文件定义资料名称磁盘节点信息同步限制等

  3. 初始化资源组drbdadm create-md resource_name

  4. 启动服务 service drbd start

  5. 设置primary主机并同步数据

  6. 分区、格式化/dev/drbd*

  7. 一个节点进行挂载

  8. 查看状态

安装环境

虚拟机os


[root@centos2-fuwenchao dev]# lsb_release -a
LSB Version:    :base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-noarch:printing-4.0-amd64:printing-4.0-noarch
Distributor ID: CentOS
Description:    CentOS release 6.4 (Final)
Release:        6.4
Codename:       Final

hostname

[root@centos2-fuwenchao dev]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
10.13.2.115 centos-fuwenchao  node1
10.13.2.116 centos2-fuwenchao  node2

拓扑图


133458376.jpg


安装

安装epel源node1node2执行相同操作


wget http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm -ivh epel-release-6-8.noarch.rpm
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
rpm -ivh http://elrepo.org/elrepo-release-6-5.el6.elrepo.noarch.rpm


安装DRBDnode1node2执行相同操作

说明drbd共有两部分组成内核模块和用户空间的管理工具。其中drbd内核模块代码已经整合进Linux内核2.6.33以后的版本中因此如果您的内核版本高于此版本的话你只需要安装管理工具即可否则您需要同时安装内核模块和管理工具两个软件包并且此两者的版本号一定要保持对应。CentOS 6.4的内核版本是2.6.32-358.el6.x86_64所以还提安装内核模块。

yum -y install drbd84 kmod-drbd84

配置文件

ll /etc/drbd.conf /etc/drbd.d/

drbd配置文件是分为模块化的drbd.conf是主配置文件其它模块配置文件在/etc/drbd.d/下

/etc/drbd.conf文件中包含了/etc/drbd.d/

[root@centos2-fuwenchao dev]# cat /etc/drbd.conf
# You can find an example in  /usr/share/doc/drbd.../drbd.conf.example
include "drbd.d/global_common.conf";
include "drbd.d/*.res";

global_common.conf为全局配置文件以res结尾的为资源文件每一个.res的文件用于定义一个资源。

[root@centos-fuwenchao drbd.d]# cat global_common.conf
global {
    usage-count no;
    # 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";
    }
    startup {
        wfc-timeout 120;
        degr-wfc-timeout 120;
    }
    options {
    }
    disk {
        on-io-error detach;
    }
    net {
        cram-hmac-alg "sha1";
        shared-secret "mydrbdlab";
    }
}


[root@centos-fuwenchao drbd.d]# cat web.res
resource web {
  on centos-fuwenchao {
    device    /dev/drbd0;
    disk      /dev/sda3;
    address   10.13.2.115:7789;
    meta-disk internal;
  }
  on centos2-fuwenchao {
    device    /dev/drbd0;
    disk      /dev/sda3;
    address   10.13.2.116:7789;
    meta-disk internal;
  }
}

主备服务器同步的两个分区大小最好相同

DRBD的启动

在启动DRBD之前,你需要分别在两台主机的hdb1分区上,创建供DRBD记录信息的数据块.分别在
两台主机上执行:

[root@centos2-fuwenchao dev]# drbdadm create-md web #web为我们的资源名称


就在一切你以为进展顺利时苍天呀大地呀问题出现了执行上面的语句的时候一直没有反应硬着头皮找官方文档

http://www.drbd.org/users-guide/s-first-time-up.html

没发现解决方案

看看启动状态

[root@centos-fuwenchao ~]# service drbd status
drbd driver loaded OK; device status:
version: 8.4.4 (api:1/proto:86-101)
GIT-hash: 599f286440bd633d15d5ff985204aff4bccffadd build by phil@Build64R6, 2013-10-14 15:33:06
m:res  cs         ro                   ds                 p  mounted  fstype
1:web  Connected  Secondary/Secondary  Diskless/Diskless  C
[root@centos-fuwenchao ~]# drbdadm create-md web
^C
[root@centos-fuwenchao ~]# drbd-overview
  1:web/0  Connected Secondary/Secondary Diskless/Diskless C r-----
[root@centos-fuwenchao ~]# cat /proc/drbd
version: 8.4.4 (api:1/proto:86-101)
GIT-hash: 599f286440bd633d15d5ff985204aff4bccffadd build by phil@Build64R6, 2013-10-14 15:33:06
 1: cs:Connected ro:Secondary/Secondary ds:Diskless/Diskless 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:b oos:0

diskless应该就是没有找到磁盘或者是磁盘不可用之类的意思吧

接着

[root@centos-fuwenchao ~]# ll /dev/drbd*
brw-rw----. 1 root disk 147, 0 Nov 22 09:53 /dev/drbd0
/dev/drbd:
total 0
drwxr-xr-x. 2 root root 60 Nov 22 09:53 by-disk
drwxr-xr-x. 2 root root 60 Nov 22 09:53 by-res


共享存储块找到了我想没找到映射磁盘应该就是执行drbdadm create-md web是不成功元信息没有写入磁盘导致无法使用共享快的原因吧

内核模块是否加载

[root@centos2-fuwenchao drbd.d]# lsmod |grep drbd
drbd                  333755  3
libcrc32c               1246  1 drbd

嘀嘀~~~~~~~~~~~~~~~~~几个小时之后j_0002.gif

解决方案如下

在官方文档中有如下一句话

Create device metadata. This step must be completed only on initial device creation. It initializes DRBD’s metadata

大概意思就是执行drbdadm create-md命令必要条件是该磁盘设备或者是分区需要时设备为初始设备

好吧按如上思路执行如下

[root@centos2-fuwenchao drbd.d]# df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/sda3             15118728   1451256  12899472  11% /
tmpfs                   506272     21744    484528   5% /dev/shm
/dev/sda1               495844     32651    437593   7% /boot
/dev/sda2            73786976294837660512 73786976294803874760  33785752 100% /datas
[root@centos2-fuwenchao drbd.d]# umount /datas/
[root@centos2-fuwenchao drbd.d]# df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/sda3             15118728   1451256  12899472  11% /
tmpfs                   506272     21744    484528   5% /dev/shm
/dev/sda1               495844     32651    437593   7% /boot
[root@centos2-fuwenchao drbd.d]# dd if=/dev/zero bs=512 count=512 of=/dev/sda2
512+0 records in
512+0 records out
262144 bytes (262 kB) copied, 0.250106 s, 1.0 MB/s
[root@centos2-fuwenchao drbd.d]# cat /proc/drbd^C
[root@centos2-fuwenchao drbd.d]# drbdadm create-md web
Writing meta data...
initializing activity log
NOT initializing bitmap
New drbd meta data block successfully created.
[root@centos2-fuwenchao drbd.d]#

OK完美解决

注意事项

  1. 主备服务器同步的两个分区大小最好相同

  2. 开始同步两个节点的磁盘需要一定时间在同步完成前不要重启否则会重新同步。

  3. 挂载之前一定要先切换当前节点为主节点

  4. 两个节点中同一时刻只能有一台处于primary状态另一台处于secondary状态。

  5. 处于从节点secondary状态的服务器不能加载drbd块设备

  6. 将主节点切换为从节点之前要先卸载

  7. 一台机切换为主节点之前要确保另一台机已切换为从节点

  8. mount drbd设备以前必须把设备切换到primary状态。

  9. 两个节点中同一时刻只能有一台处于primary状态另一台处于secondary状态。

  10. 处于secondary状态的服务器上不能加载drbd设备。

  11. 主备服务器同步的两个分区大小最好相同,这样不至于浪费磁盘空间,因为drbd磁盘镜像相当于网络raid 1

        我们这里指定两台主机的镜像的分区分别为/dev/sdf1和/dev/sdb1, 这两个分区大小都为10G


在DRBD设备上创建文件系统之前必须先设置DRBD设备。只能通过/dev/drbd<n>设备而非原始设备操纵用户数据因为DRBD使用原始设备的最后128MB储存元数据。确保仅在/dev/drbd<n>设备上创建文件系统而不在原始设备上创建。

例如如果原始设备大小为1024MB则DRBD设备仅有896MB可用于数据128MB隐藏并保留用于元数据。任何访问896MB和1024MB之间的空间的尝试都会失败因为它不可用于用户数据。

主机上的DRBD设备挂载到一个目录上进行使用.备机的DRBD设备无法被挂载,因为它是用来接收主机数据的,由DRBD负责操作