DRBD详解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DRBD详解相关的知识,希望对你有一定的参考价值。

第1章:DRBD介绍

1.1 什么是DRBD

Distributed Replicated Block Device(DRBD)是基于块设备在不同的高可用服务器对之间同步和镜像数据的软件,通过它可以实现在网络中的两台服务器之间基于块设备级别的实时或异步镜像或同步复制,其实就是类似于rsync+inotify(sersync)这样的架构项目软件。只不过DRBD是基于文件系统底层的,即block层级同步,而rsync是在文件系统之上的实际物理文件同步,因此DRBD效率更高、效果更好。相当于网络中的RAID1功能

       提示:上面提到的块设备可以是磁盘分区、LVM逻辑卷、或整块磁盘等,DRBD的同步不能基于目录

       官方介绍:http://drbd.linbit.com/home/what-is-drbd/

DRBD有以下几个特点

q  DRBD是一种块设备

q  可用于高可用集群中(HA)

q  通过网络实现块设备数据实时镜像

q  类似于一个网络的raid-1

工作特点:

q  DRBD工作在内核空间,它镜像复制的是二进制数据,这也是它速度快的根本原因

q  DRBD至少需要两个节点来工作。

1.2 DRBD的工作原理

 

       从上图我们可以清晰的看出drbd是以主从(Primary/Secondary)方式工作的,这点原理与mysql的主从复制的架构有些相似。主节点上的drbd提升为Primary并负责接收写入数据,当数据到达drbd模块时,一份继续往下走写入到本地磁盘实现数据的持久化,同时并将接收到的要写入的数据发送一分到本地的drbd设备上通过tcp传到另外一台主机的drbd设备上(Secondary node),另一台主机上的对应的drbd设备再将接收到的数据存入到自己的磁盘当中。这里与mysql的基于通过二进制日志完成数据的复制的确很相似,但是也有一些不同之处。比如:mysql的从节点不能写但是可以读,但是drbd的从节点是不能读、不能挂载。

   因此,drbd对同一设备块每次只允许对主节点进行读、写操作,从节点不能写也不能读。这样感觉是不是对主机有资源浪费,的确HA架构中为了提供冗余能力是有资源浪费,但是你可以对上图的两台主机建立两个drbd资源并互为主从,这样两台机器都能利用起来,但是配置起来就复杂了。但是话又说回来,用drbd作为廉价的共享存储设备,要节约很多成本,因为价格要比专用的存储网络便宜很多,其性能与稳定性方面也还不错。

 

宕机接管原理图

 

1.3 DRBD同步模式

       DRBD同步模式有实时同步模式和异步同步模式,DRBD有3种复制协议,分别是A、B、C协议

q  协议A<异步>

即异步复制协议。当本地磁盘写入完成,并且拷贝数据包进入本地TCP发送缓冲区里后,就认为在主节点的本地写操作完成。这种模式,在发生强制故障转移的时候可能发生数据丢失的现象。协议A常用在长距离复制环境中。当它和DRBD代理结合使用的时候,它成为一个有效的灾难恢复解决方案。

q  协议B<异步>

即内存同步(半同步)复制协议。当本地磁盘写入发生,并且拷贝数据包到达对等层节点时,就认为在主节点中的本地写操作完成。正常情况下,在故障转移事件中,写入的数据不会丢失。然而,如果节点同时停电,主节点的数据存储将发生不可逆的损坏,大部分最近在主节点中写入完成的数据可能会丢失。

q  协议C<实时>

即实时同步复制协议。只有当本地磁盘和远程磁盘都确认写入完成时,就认为在主节点的本地写操作完成。结果,即使一个节点崩溃,也不会丢失任何数据。唯一丢失数据的可能是两个节点同时崩溃。

到目前为止,协议C是安装DRBD是最常使用的复制协议。选择协议将影响流量,从而影响网络延时

对于使用A、B协议要考虑丢失数据的风险,当数据写在缓冲区里面,没有真正写在磁盘上,系统崩溃会导致数据丢失,有些带电池的硬盘控制器,不但自带电池而且自带缓存,会在系统意外断电或崩溃后将最后的数据写入磁盘,这类控制器一般使用disk flush,从而保证性能的前提下提高数据安全性。

1.4 DRBD生产应用模式与企业应用场景

q  单主模式:即主备模式,典型的高可用性方案

q  复主模式:需要采用共享的cluster文件系统,如GFS、OCFS2,用于需要从2个或多个节点并发访问数据的场合,需要特别配置

生产场景中drbd常用于基于高可用服务器之间的数据同步解决方案。如:heartbeat+drbd+nfs/mfs/gfs,heartbeat+drbd+mysql/oracle等,实际上drbd可以配合任意需要数据同步的所有服务的应用场景

1.5 相关数据同步工具

rsync(实时同步工具sersync,inotify,lsyncd)

scp/sftp

nc

搭建http/ftp/svn

nfs(网络文件系统)

union 双机同步

csync2 多机同步

软件自身同步机制(mysql,redis,oracle,ttserver,mongdb)

drbd

1.6 DRBD脑裂

       当心跳线路出现暂时性故障时,会导致两端都各自提升为Primary。当两端再次连通的时候,需要手工处理这种情况。

裂脑是一个因所有集群节点网络中断后产生的一种状态,可能原因有集群管理器的介入,热内错误,此时两个节点都会提升为主,这是一个潜在的非常有害的状态,这意味着数据的修改写到一端但是没有及时同步到对端,这样可能两端都会产生不同的数据,导致数据无法被合并
一种为自动处理方式,/etc/drbd.conf

Net{
Net:网络配置相关的内容,可以设置是否允许双主节点(allow-two-primaries)等
After-sb-0pri disconnect;
After-sb-1pri disconnect;
After-sb-2pri disconnect;
rr-conflict disconnect;
}
手动解决裂脑方法
1.在从节点slave node2上做如下操作
drbdadm secondary data
Drbdadm -- -- discard-my-data connect data <-放弃本地更新的数据再进行连接
2.在主节点master  node1 上,通过cat /proc/drbd查看状态,如果不是WFConnection
Drbdadm connect data
提示:此处的data为DRBD的一个resource,可以理解一个同步的实例 

第2章:部署DRBD服务需求描述

2.1 业务需求描述

假设有两台服务器node1、node2,ip分别为192.168.1.24/192.168.1.25

配置目标:两台服务器配置好drbd服务后,实现在node1上/dev/sdb分区上写入数据,数据会实时同步到node2上,一旦服务器node1机器宕机或硬盘损坏导致数据不可用,node2机器上的数据此时是node1机器上的一个完整备份。当然不光是是完整备份,还可以瞬间接替损坏数据或宕机的node1机器,实现数据的异机实时同步,从而达到数据高可用无业务影响的目的。

       本实验模式为DRBD主备模式,即应用时只在主的一端写入数据,备的一端仅处于数据热备状态。备节点的drbd分区是不可见的,也就是处于非活动状态,不能人为写入数据。

多drbd分区主主的双向同步模式,实际生产环境,也可以配置成主主模式,即只在主的一端一个分区写入数据,备的一端仅处于数据同步热备状态,而在备端的另外一个分区可以做为主,原来主的一端的新分区作为备。

2.2 DRBD部署结构图

 

 

l  DRBD服务通过直连线或以太网实现数据实时互相同步

l  两台存储服务器互相备份,正常情况下两端各提供一个主分区供NFS使用

l  存储服务器之间、存储服务器和交换机之间都是千兆网卡(bonding)

l  应用服务器通过NFS访问存储

提示:

在生产环境中,一般drbd服务不是孤立使用的,而是结合一些软件使用。如NFS、MFS等,NFS或MFS利用drbd的特性进行两台数据服务器间数据实时同步,再加上高可用工具Heartbeat,就可以实现共享存储服务器的高可用性。此时Heartbeat会通过串口线或直连线对存储服务器做健康检查,同时控制DRBD、NFS、VIP等资源动态切换,在一端服务器故障时,进行资源的自动转移。确保达到业务高可用的目的

2.3 DRBD服务网卡及IP资源配置

实验环境需要添加一块网卡和一块磁盘,系统使用centos6.7 x86_64

名称

接口

IP

用途

Node1(master)

eth0

192.168.1.24

外网管理IP,用于WAN数据转发

 

eth1

10.25.25.16

用于服务器间心跳连接以及数据同步(直连)

Node2  (slave)

eth0

192.168.1.25

外网管理IP,用于WAN数据转发

 

eth1

10.25.25.17

用于服务器间心跳连接以及数据同步(直连)

生产环境一般心跳连接和数据同步分两个网卡处理,网卡配置与heartbeat一样

第3章 部署DRBD

3.1 常规准备

l  iptables配置

l  selinux 关闭

l  配置主机名hosts

3.2 添加心跳主机路由

[[email protected] ~]# /sbin/route add -host 10.25.25.17 dev eth1

[[email protected] ~]# echo ‘/sbin/route add -host 10.25.25.17 dev eth1‘ >>/etc/rc.local

 

[[email protected] ~]# /sbin/route add -host 10.25.25.16 dev eth1

[[email protected] ~]# echo ‘/sbin/route add -host 10.25.25.16 dev eth1‘ >>/etc/rc.local

可以通过route –n查看

3.3 对磁盘进行分区

q  给虚拟机添加硬盘

 

 

[[email protected] ~]# fdisk –l

Disk /dev/sdb: 5368 MB, 5368709120 bytes

255 heads, 63 sectors/track, 652 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk identifier: 0x00000000

[[email protected] ~]# fdisk -l

Disk /dev/sdb: 5905 MB, 5905580032 bytes

255 heads, 63 sectors/track, 717 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk identifier: 0x00000000

q  对磁盘进行分区

分区规范

Device

Mount point

预期大小

作用

/dev/sdb1

Meta data 分区

1-2G

存放drbd同步状态信息

/dev/sdb2

/data

其他所有空间

存放数据文件

注意:

meat data分区不能建立格式化文件系统

分好的分区不能现在就挂载

生产环境drbd meta data分区一般大小1-2G,也可以不单独分区和数据分区一起使用

Bash
[[email protected] ~]# yum install parted –y    安装磁盘分区工具
[[email protected] ~]# yum install parted –y
Bash
[[email protected] ~]# parted /dev/sdb
GNU Parted 2.1
Using /dev/sdb
Welcome to GNU Parted! Type ‘help‘ to view a list of commands.
(parted) mklabel
New disk label type? gpt                                                 
(parted) p                                                               
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 5369MB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
 
Number  Start  End  Size  File system  Name  Flags
(parted) mkpart
Partition name?  []? meta_data                                           
File system type?  [ext2]?                                               
Start? 1                                                                  
End? 1000M  
(parted) mkpart
Partition name?  []? data                                                
File system type?  [ext2]?
Start? 1000M
End? -1                                                                   
(parted) p                                                               
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 5369MB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
 
Number  Start   End     Size    File system  Name       Flags
 1      17.4kB  1000MB  1000MB               meta_data
 2      1000MB  5368MB  4367MB               data

也可以无交互分区

Bash
parted /dev/sdb  mklabel gpt yes
 parted /dev/sdb  mkpart primary ext4 0 1000  ignore
 parted /dev/sdb  mkpart primary ext4 1001 -1  Yes ignore
 parted /dev/sdb  p

node2也按此方法创建分区

Bash
[[email protected] ~]# mkfs.ext4 /dev/sdb2  格式化分区
[[email protected] ~]# mkfs.ext4 /dev/sdb2
[[email protected] ~]# mkdir /meta_data
[[email protected] ~]# mkdir /data
[[email protected] ~]# mkdir /meta_data
[[email protected] ~]# mkdir /data

q  检查meta分区是否正常

Bash
[[email protected] ~]# mount /dev/sdb1 /meta_data/
mount: you must specify the filesystem type
[[email protected] ~]# mount /dev/sdb1 /meta_data/  无文件系统
mount: you must specify the filesystem type

3.4 安装DRBD

q  源码安装

Bash
[[email protected] ~]# yum install kernel-devel kernel-headers –y 安装内核相关包
[[email protected] drbd-9.0.1-1]# ls -ld /usr/src/kernels/$(uname -r) 查看内核源码包
drwxr-xr-x 22 root root 4096 Apr  9 16:35 /usr/src/kernels/2.6.32-573.22.1.el6.x86_64
[[email protected] ~]# wget http://www.drbd.org/download/drbd/9.0/drbd-9.0.1-1.tar.gz
[[email protected] ~]# tar -xf drbd-9.0.1-1.tar.gz
[[email protected] ~]# cd drbd-9.0.1-1
[[email protected] drbd-9.0.1-1]# ./configure --prefix=/usr/local/drbd --with-km --with-heartbeat --syscon\=/etc/  8.4.5之前的版本要./configure,之后的直接make就行
[[email protected] drbd-9.0.1-1]# make KDIR=/usr/src/kernels/$(uname -r)/  编译
[[email protected] drbd-9.0.1-1]# echo $? 检查是否有错
0
[[email protected] drbd-9.0.1-1]# make install  安装
[[email protected] drbd-9.0.1-1]# echo $?
0
[[email protected] drbd-9.0.1-1]# ls /lib/modules/$(uname -r)/updates 安装成功会生成drbd.ko文件
drbd.ko  drbd_transport_tcp.ko

 

q  yum安装,生产环境使用

Bash
[[email protected] ~]# yum install kernel-devel kernel-headers –y
[[email protected] ~]# rpm -Uvh http://www.elrepo.org/elrepo-release-6-6.el6.elrepo.noarch.rpm
[[email protected] ~]# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
[[email protected] ~]# yum install drbd kmod-drbd84 –y
[[email protected] ~]# rpm -qa drbd84-utils kmod-drbd84
drbd84-utils-8.9.5-1.el6.elrepo.x86_64
kmod-drbd84-8.4.7-1_1.el6.elrepo.x86_64

node2也这样安装就行

3.5 理顺数据/data各配置列表

主机名称

Node1.cn

Node2.cn

管理IP

eth0 192.168.1.24

eth0 192.168.1.25

DRBD管理名称

Data

data

DRBD挂载目录

/data

/data

DRBD逻辑设备

/dev/drbd0/

/dev/drbd0/

对接IP

 

eth1 10.25.25.16/24

eth1 10.25.25.17/24

DRBD存储设备

/dev/sdb2

/dev/sdb2

DRBD meta 设备

/dev/sdb1[0]

/dev/sdb1[0]

NFS导出目录

/data

/data

NFS虚拟IP

192.168.1.16

192.168.1.17

灰底部分都是heartbeat控制的

3.6 配置DRBD

3.6.1 加载DRBD模块到内核<2台服务器都要操作>

Bash
[[email protected] ~]# lsmod | grep drbd
[[email protected] ~]# modprobe drbd
[[email protected] ~]# lsmod | grep drbd
drbd                  466379  0
libcrc32c               1246  1 drbd
[[email protected] ~]# echo "modprobe drbd" >> /etc/rc.local

或者使用下面方法

Bash
[[email protected] ~]# echo "modprobe drbd" >> /etc/sysconfig/modules/drbd.modules
[[email protected] ~]# chmod 755 /etc/sysconfig/modules/drbd.modules

提示:让DRBD模块加载到内核不是必须的

3.6.2 编辑DRBD核心配置文件/etc/drbd.conf

[[email protected] ~]# 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";  #资源配置文件

我们实验比较简单配置就全部写到drbd.conf,不过还是推荐分开写配置

3.6.3 编辑全局配置/etc/drbd.d/global_common.conf

Bash
[[email protected] ~]# vim /etc/drbd.d/global_common.conf
global {
        usage-count no; #是否参加DRBD 使用者统计,默认参加
}
 
common {
        protocol C; #使用DRBD 的第三种同步协议(A B C),大多数用C,表示收到远程主机的写入确认后认为写入完成
        startup {
                wfc-timeout          120; #在启用DRBD块时,初始化脚本drbd会阻塞启动进程的运行,直到对等节点的出现。该选项就是用来限制这个等待时间的,默认为0,即不限制,永远等待
                degr-wfc-timeout     120; #也是用于限制等待时间,只是作用的情形不同:它作用于一个降级集群(即那些只剩下一个节点的集群)在重启时的等待时间。
                outdated-wfc-timeout 120;
        }
        disk {
                on-io-error detach; #策略:发生I/O错误的节点将放弃底层设备,以diskless mode继续工作
                            resync-rate 30M; #设置主用节点和备用节点同步时的网络速率最大值,单位是字节
                            no-disk-flushes;  #直接写入磁盘
                no-md-flushes;
                            al-extents 517;
        }
        net {
                            sndbuf-size 512k;
                timeout 60; #如果搭档节点没有在此时间内发来应答包,那么就认为搭档节点已经死亡
                connect-int 10; #如果无法立即连接上远程DRBD设备,系统将断续尝试连接
                ping-int 10; #如果连接到远程DRBD设备的TCP/IP的空闲时间超过此值,系统将生成一个keep-alive包来检测对等节点是否还存活
                max-buffers 2048; #该选项设定一个由drbd分配的最大请求数,单位是页面大小(PAGE_SIZE),大多数系统中,页面大小为4KB。这些buffer用来存储那些即将写入磁盘的数据。最小值为32(即128KB)。这个值大一点好。
                max-epoch-size 2048; #该选项设定了两次write barriers之间最大的数据块数。如果选项的值小于10,将影响系统性能。大一点好
                            unplug-watermark 1024;
                cram-hmac-alg sha1 ; #该选项设定内核支持的一个算法,用于网络上的用户数据的一致性校验。通常的数据一致性校验,由TCP/IP头中所包含的16位校验和来进行,而该选项可以使用内核所支持的任一算法。该功能默认关闭。
                shared-secret "drbd"; #用来设定在对待节点授权中使用的密码,最长64个字符
                            verify-alg sha1;
                after-sb-0pri disconnect;   #防止脑裂
                after-sb-1pri disconnect;
                after-sb-2pri disconnect;
                rr-conflict disconnect;
        }
}

注意:配置此文件一定要参考已有配置文件中的选项并对应

3.6.4 编辑资源配置文件/etc/drbd.d/r0.res<以res结尾就行>

Bash
[[email protected] ~]# vim /etc/drbd.d/r0.res
resource data {
on node1.cn {
  device     /dev/drbd0;
  disk       /dev/sdb2;
  address    192.168.1.24:7898;
  meta-disk  /dev/sdb1[0];
 }
on node2.cn {
  device     /dev/drbd0;
  disk       /dev/sdb2;
  address    192.168.1.25:7898;
  meta-disk  /dev/sdb1[0];
 }
}

3.6.5 拷贝配置文件到node2

Bash
[[email protected] ~]# cd /etc/drbd.d/
[[email protected] drbd.d]# scp global_common.conf r0.res 192.168.1.25:/etc/drbd.d/  #拷贝到node2

和配置heartbeat一样,两台机器配置一样,直接拷贝就行

3.7 应用DRBD资源

3.7.1 初始化DRBD的metadata

node1上初始化

Bash
[[email protected] ~]# drbdadm create-md data  #也可以不指定名字,直接all,all表示资源配置文件*.res所有的资源
initializing activity log
NOT initializing bitmap
Writing meta data...
New drbd meta data block successfully created.

node2上初始化

Bash
[[email protected] ~]# drbdadm create-md data
initializing activity log
NOT initializing bitmap
Writing meta data...
New drbd meta data block successfully created.

3.7.2 启动DRBD

方法一:/etc/init.d/drbd start

方法二:drbdadm up all  all表示启动所有资源,drbdadm down all 关闭资源

[[email protected] ~]# drbdadm up all #这个命令相当于:attach all、syncer all、connect all

[[email protected] ~]# drbdadm up all

3.7.3 查看DRBD启动后的状态

方法一:cat /proc/drbd

方法二:/etc/init.d/drbd status

方法三:drbd-overview

Bash
[[email protected] ~]# cat /proc/drbd
version: 8.4.7-1 (api:1/proto:86-101)
GIT-hash: 3a6a769340ef93b1ba2792c6461250790795db49 build by [email protected], 2016-01-12 13:27:11
 0: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C r-----
ns:0 nr:0 dw:0 dr:0 al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:4264704
Bash
[[email protected] ~]# cat /proc/drbd
version: 8.4.7-1 (api:1/proto:86-101)
GIT-hash: 3a6a769340ef93b1ba2792c6461250790795db49 build by [email protected], 2016-01-12 13:27:11
 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:4264704
cs:Connected ro:Secondary/Secondary 已经连接,两端都是从,表示当前无主(primary)的状态
Bash
[[email protected] ~]# drbd-overview
 0:data/0  Connected Primary/Secondary UpToDate/UpToDate
Bash
[[email protected] ~]# drbd-overview
 0:data/0  Connected Secondary/Primary UpToDate/UpToDate

3.7.4 将其中一台提升为主

Bash
[[email protected] ~]# drbdadm primary data
0: State change failed: (-2) Need access to UpToDate data #数据没有更新,不一致无法提升
Command ‘drbdsetup-84 primary 0‘ terminated with exit code 17

解决:同步drbd数据到对端server,使数据保持一致

注意:

       1、如果两端都是空硬盘,可以随意执行操作不用考虑数据

       2、如果两端已有数据,且不一样,要特别注意数据同步的方向,否则可能丢失数据

一个资源只能在一端执行同步数据到对端的命令

Bash
[[email protected] ~]# drbdadm -- --overwrite-data-of-peer primary data

说明:把本地做主,把本地数据快速拷贝到对端并覆盖

 

主节点node1状态:

Bash
[[email protected] ~]# cat /proc/drbd
version: 8.4.7-1 (api:1/proto:86-101)
GIT-hash: 3a6a769340ef93b1ba2792c6461250790795db49 build by [email protected], 2016-01-12 13:27:11
 0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
ns:4264960 nr:0 dw:0 dr:4265624 al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

备节点node2状态:

Bash
[[email protected] ~]# cat /proc/drbd
version: 8.4.7-1 (api:1/proto:86-101)
GIT-hash: 3a6a769340ef93b1ba2792c6461250790795db49 build by [email protected], 2016-01-12 13:27:11
 0: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r-----
ns:0 nr:4264960 dw:4264960 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

3.8 故障排错思路及脑裂恢复

1、检查服务器物理网络连接,IP、主机路由是否正确

2、停止iptables防火墙,或放行DRBD(简单的ip过滤就行,没必要端口过滤)

3、Secondary/Unknow这种状态还可能是脑裂问题导致

可以尝试下面方法解决:

q  在从节点slave上操作:

drbdadm Secondary data

drbdadm -- --discard-my-data connect data  ---> 丢弃本端数据进行连接

q  在主节点上操作

通过查看cat/proc/drbd状态,如果不是WFConnection状态,则需要手动连接

drbdadm connect data

4、如果初始配置不当,或配置好后进行其他意外处理等,如两端处于同步状态的meta信息不对

3.9 禁止DRBD开机自动启动(交由heartbeat控制)

DRBD与Heartbeat禁止开机启动是为了人工处理问题可控性更强

Bash
[[email protected] ~]# chkconfig --list drbd
drbd             0:off 1:off 2:on 3:on 4:on 5:on 6:off
[[email protected] ~]# chkconfig drbd off

 

3.10 挂载设备写入数据测试

[[email protected] ~]# mount /dev/sdb2 /data 不是直接挂载文件系统分区

mount: /dev/sdb2 already mounted or /data busy 被DRBD占用

挂载主node1

[[email protected] ~]# mount /dev/drbd0 /data

[[email protected] ~]# echo "Test DRBD" >/data/test.txt

[[email protected] ~]# cat /proc/drbd

version: 8.4.7-1 (api:1/proto:86-101)

GIT-hash: 3a6a769340ef93b1ba2792c6461250790795db49 build by [email protected], 2016-01-12 13:27:11

 0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----

    ns:4264992 nr:0 dw:32 dr:4265981 al:10 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

看看从node2能否挂载

[[email protected] ~]# mount /dev/drbd0 /data  无法挂载

mount: you must specify the filesystem type

[[email protected] ~]# mount /dev/sdb2 /data

mount: /dev/sdb2 already mounted or /data busy

从node2上查看数据

[[email protected] ~]# /etc/init.d/drbd stop  停止DRBD,或者使用drbdadm down data

Stopping all DRBD resources: .

[[email protected] ~]# mount /dev/sdb2 /data

[[email protected] ~]# cat /data/test.txt

Test DRBD

再次启动从node2的DRBD

[[email protected] ~]# /etc/init.d/drbd start

Starting DRBD resources: [

     create res: data

   prepare disk: data

    adjust disk: data:failed(attach:10)  报错

     adjust net: data

]

.

[[email protected] ~]# drbdadm up all

0: Failure: (104) Can not open backing device.

Command ‘drbdsetup-84 attach 0 /dev/sdb2 /dev/sdb1 0 --on-io-error=detach --resync-rate=30M‘ terminated with exit code 10

解决:

[[email protected] ~]# umount -lf /data  要先卸载

[[email protected] ~]# /etc/init.d/drbd start

Starting DRBD resources: [

]

.

[[email protected] ~]# cat /proc/drbd

version: 8.4.7-1 (api:1/proto:86-101)

GIT-hash: 3a6a769340ef93b1ba2792c6461250790795db49 build by [email protected], 2016-01-12 13:27:11

 0: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate 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:0

3.11 DRBD常见问题

l  问题1:DRBD依赖于内核模块,要手动加载modprobe drbd

l  问题2:命令drbdadm up all相当于下面3个命令的组合

drbdadm attach all、drbdadm syncer all、drbdadm connect all

l  问题3: 脑裂的问题

脑裂状态:ro:Secondary/Unknow

可以选择一台机器作为secondary,在该机器上执行

drbdadm secondary all

drbdadm disconnect all

drbdadm -- --discard-my-data connect all  à丢弃本端数据并连接

有时也需要在另一节点执行

drbdadm connect all

l  问题4: 挂载设备要挂载drbd的设备

[[email protected] ~]# mount /dev/drbd0 /data

[[email protected] ~]# drbd-overview

 0:data/0  Connected Primary/Secondary UpToDate/UpToDate /data ext4 3.9G 8.2M 3.7G 1%

l  问题5:drbd开机自动启动,启动drbd会报错

禁止drbd开机启动

l  问题6:drbd的单机启动正常状态

[[email protected] ~]# cat /proc/drbd

version: 8.4.7-1 (api:1/proto:86-101)

GIT-hash: 3a6a769340ef93b1ba2792c6461250790795db49 build by [email protected], 2016-01-12 13:27:11

 0: cs:WFConnection ro:Primary/Unknown ds:UpToDate/DUnknown C r-----

ns:4 nr:0 dw:4 dr:1109 al:1 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:d oos:0

l  问题7:can not open backing device

一般是系统分区已经挂载导致出现这种问题,mount /dev/sdb2 /data

3.12 drbd状态信息说明

[[email protected] ~]# cat /proc/drbd

version: 8.4.7-1 (api:1/proto:86-101)   #版本信息

GIT-hash: 3a6a769340ef93b1ba2792c6461250790795db49 build by [email protected], 2016-01-12 13:27:11  #build information

 0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----

#0表示第一个resource资源,且当前此资源处于主primary状态

C drbd复制协议

ns:4 nr:0 dw:4 dr:1157 al:1 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:d oos:0

3.12.1连接状态信息cs

cs(connection state):status of the network connection 连接状态

cs:Connected 可以通过drbdadm cstate all查看

[[email protected] ~]# drbdadm cstate all

Connected

连接状态说明:

StandAlone 独立的:网络配置不可用;资源还没有被连接或是被管理断开(使用 drbdadm disconnect 命令),或是由于出现认证失败或是脑裂的情况

Disconnecting 断开:断开只是临时状态,下一个状态是StandAlone独立的

Unconnected 悬空:是尝试连接前的临时状态,可能下一个状态为WFconnection和WFReportParams

Timeout 超时:与对等节点连接超时,也是临时状态,下一个状态为Unconected悬空

BrokerPipe:与对等节点连接丢失,也是临时状态,下一个状态为Unconected悬空

NetworkFailure:与对等节点推动连接后的临时状态,下一个状态为Unconected悬空

ProtocolError:与对等节点推动连接后的临时状态,下一个状态为Unconected悬空

TearDown 拆解:临时状态,对等节点关闭,下一个状态为Unconected悬空

WFConnection:等待和对等节点建立网络连接

WFReportParams:已经建立TCP连接,本节点等待从对等节点传来的第一个网络包

Connected 连接:DRBD已经建立连接,数据镜像现在可用,节点处于正常状态

StartingSyncS:完全同步,有管理员发起的刚刚开始同步,未来可能的状态为SyncSource或PausedSyncS

StartingSyncT:完全同步,有管理员发起的刚刚开始同步,下一状态为WFSyncUUID

WFBitMapS:部分同步刚刚开始,下一步可能的状态为SyncSource或PausedSyncS

WFBitMapT:部分同步刚刚开始,下一步可能的状态为WFSyncUUID

WFSyncUUID:同步即将开始,下一步可能的状态为SyncTarget或PausedSyncT

SyncSource:以本节点为同步源的同步正在进行

SyncTarget:以本节点为同步目标的同步正在进行

PausedSyncS:以本地节点是一个持续同步的源,但是目前同步已经暂停,可能是因为另外一个同步正在进行或是使用命令(drbdadm pause-sync)暂停了同步

PausedSyncT:以本地节点为持续同步的目标,但是目前同步已经暂停,这可以是因为另外一个同步正在进行或是使用命令(drbdadm pause-sync)暂停了同步

VerifyS:以本地节点为验证源的线上设备验证正在执行

VerifyT:以本地节点为验证目标的线上设备验证正在执行

3.12.2 角色信息ro

ro(roles) Roles of the node 节点角色

[[email protected] ~]# drbdadm role data

Primary/Secondary   左边为当前主机的状态

Parimary 主:资源目前为主,并且可能正在被读取或写入,如果不是双主只会出现在两个节点中的其中一个节点上

Secondary 次:资源目前为次,正常接收对等节点的更新

Unknown 未知:资源角色目前未知,本地的资源不会出现这种状态

3.12.3 磁盘状态信息ds

ds(disk states) State of the hard disk 磁盘状态

[[email protected] ~]# drbdadm dstate all

UpToDate/UpToDate  左边为当前主机的状态

Diskless 无盘:本地没有块设备分配给DRBD使用,这表示没有可用的设备,或者使用drbdadm命令手工分离或是底层的I/O错误导致自动分离

Attaching:读取无数据时候的瞬间状态

Failed 失败:本地块设备报告I/O错误的下一个状态,其下一个状态为Diskless无盘

Negotiating:在已经连接的DRBD设置进行Attach读取无数据前的瞬间状态

Inconsistent:数据是不一致的,在两个节点上(初始的完全同步前)这种状态出现后立即创建一个新的资源。此外,在同步期间(同步目标)在一个节点上出现这种状态

Outdated:数据资源是一致的,但是已经过时

DUnknown:当对等节点网络连接不可用时出现这种状态

Consistent:一个没有连接的节点数据一致,当建立连接时,它决定数据是UpToDate或是Outdated

UpToDate:一致的最新的数据状态,这个状态为正常状态

3.13 DRBD元数据存放模式

DRBD将数据的各种信息块保存在一个专用的区域里,这些metadata包括了

a,DRBD设备的大小

b,产生的标识

c,活动日志

d,快速同步的位图

metadata的存储方式有内部和外部两种方式,使用哪种配置都是在资源配置中定义的

l  内部meta data

内部meta data存放在同一块硬盘或分区的最后的位置上

优点:metadata和数据是紧密联系在一起的,如果硬盘损坏,metadata同样就没有了,同样在恢复的时候,metadata也会一起被恢复回来 
缺点:metadata和数据在同一块硬盘上,对于写操作的吞吐量会带来负面的影响,因为应用程序的写请求会触发metadata的更新,这样写操作就会造成两次额外的磁头读写移动

on node1.cn {

  device     /dev/drbd0;

  disk       /dev/sdb2;

  address    192.168.1.24:7898;

  meta-disk  internal;

 }

l  外部meta data

外部的metadata存放在和数据磁盘分开的独立的块设备上

优点:对于一些写操作可以对一些潜在的行为提供一些改进 
缺点:metadata和数据不是联系在一起的,所以如果数据盘出现故障,在更换新盘的时候就需要认为的干预操作来进行现有node对心硬盘的同步了

如果硬盘上有数据,并且硬盘或者分区不支持扩展,或者现有的文件系统不支持shrinking,那就必须使用外部metadata这种方式了

on node1.cn {

  device     /dev/drbd0;

  disk       /dev/sdb2;

  address    192.168.1.24:7898;

  meta-disk  /dev/sdb1[0];

 }

参考:http://www.wenzizone.cn/?p=280

第4章:管理DRBD

4.1 DRBD监控脚本<适用于zabbix,nagios>

Bash
#!/bin/sh
role=($(drbdadm role all|tr "/" "\n"))
dstate=($(drbdadm dstate all|tr "/" "\n"))
cstate=`drbdadm cstate all`
 
if [ "Primary" = "${role[0]}" ] && [ "Secondary" = "${role[1]}" ] &&    [ "UpToDate" = "${dstate[0]}" ] && [ "UpToDate" = "${dstate[1]}" ] &&    [ "Connected" = "$cstate" ] ;
  then
   echo "OK -MYSQL_DRBD_STATUS is ok !"
   exit 0
else
   echo "CRITICAL -MYSQL_DRBD_STATUS is CRITICAL !"
   exit 2
fi

4.2 DRBD管理工具

[[email protected] ~]# drbdadm –h 查看帮助

COMMANDS:

 attach                             disk-options                      

 detach                             connect                           

 net-options                        disconnect                        

 up                                 resource-options                  

 down                               primary                           

 secondary                          invalidate                        

 invalidate-remote                  outdate                           

 resize                             verify                            

 pause-sync                         resume-sync                       

 adjust                             adjust-with-progress              

 wait-connect                       wait-con-int                      

 role                               cstate                            

 dstate                             dump                              

 dump-xml                           create-md                         

 show-gi                            get-gi                            

 dump-md                            wipe-md                           

 apply-al                           hidden-commands                   

查看meta data

[[email protected] ~]# drbdadm detach data

[[email protected] ~]# drbdadm apply-al data

Marked additional 4096 KB as out-of-sync based on AL.

[[email protected] ~]# drbdadm dump-md data

# DRBD meta data dump

# 2016-04-12 15:36:13 +0800 [1460446573]

# node1.cn> drbdmeta 0 v08 /dev/sdb1 0 dump-md

#

 

version "v08";

 

# md_size_sect 262144

# md_offset 0

# al_offset 4096

# bm_offset 36864

 

uuid {

    0x071E73AE78DA0CA3; 0x0000000000000000; 0xAFB46290723E4CF1; 0xAFB36290723E4CF1;

    flags 0x00000000;

}

# al-extents 517;

la-size-sect 8529920;

bm-byte-per-bit 4096;

device-uuid 0xDEC6F3E849B99AC6;

la-peer-max-bio-size 1048576;

al-stripes 1;

al-stripe-size-4k 8;

# bm-bytes 135168;

bm {

   # at 0kB

    16 times 0xFFFFFFFFFFFFFFFF;

    16880 times 0x0000000000000000;

}

# bits-set 1024;

管理命令:drbdmeta

管理命令:drbdsetup

4.3 DRBD主主模式

主主模式首先需要采用共享的cluster文件系统,如GFS、MFS

4.3.1 修改drbd配置

[[email protected] ~]# vim /etc/drbd.d/global_common.conf

添加配置

 net {
    allow-two-primaries;
  }
  startup {
    become-primary-on both;
  }

[[email protected] ~]# scp /etc/drbd.d/global_common.conf 192.168.1.25:/etc/drbd.d/

再重启drbd服务

4.3.2 两端节点执行命令

[[email protected] ~]# drbdadm adjust all

[[email protected] ~]# drbdadm disconnect all

[[email protected] ~]# drbdadm connect all

[[email protected] ~]# cat /proc/drbd

version: 8.4.7-1 (api:1/proto:86-101)

GIT-hash: 3a6a769340ef93b1ba2792c6461250790795db49 build by [email protected], 2016-01-12 13:27:11

 0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----

ns:0 nr:0 dw:0 dr:4760 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:d oos:0

 

[[email protected] ~]# drbdadm primary all

[[email protected] ~]# cat /proc/drbd

version: 8.4.7-1 (api:1/proto:86-101)

GIT-hash: 3a6a769340ef93b1ba2792c6461250790795db49 build by [email protected], 2016-01-12 13:27:11

 0: cs:Connected ro:Primary/Primary ds:UpToDate

以上是关于DRBD详解的主要内容,如果未能解决你的问题,请参考以下文章

基于CentOS6.7的DRBD安装配置过程详解

DRBD实现文件同步详解

DRBD 高可用配置详解(转)

04-drbd的同步模式详解

drbd之学习路线

DRBD是什么意思?优缺点是什么?