一、什么是DRBD

1、简介

Distributed Replicated Block Device(DRBD)是一个用软件实现的、无共享的、服务器之间镜像块设备内容的存储复制解决方案。

数据镜像:实时、透明、同步(所有服务器都成功后返回)、异步(本地服务器成功后返回) DRBD的核心功能通过Linux的内核实现,最接近系统的IO栈,但它不能神奇地添加上层的功能比如检测到EXT3文件系统的崩溃。 DRBD的位置处于文件系统以下,比文件系统更加靠近操作系统内核及IO栈。

在DRBD中,资源是特指某复制的存储设备的所有方面。包括资源名称、DRBD设备(/dev/drbdm,这里m是设备最小号,最大号可到147)、磁盘配置(使本地数据可以为DRBD所用)、网络配置(与对方通信) 每个资源有个角色,是Primary或Secondary,下面简称“主”和“备” 。

  • 主角色的DRBD设备可以不受限制的读和写,比如创建和映射文件系统、对于块设备的raw或直接IO访问。

  • 备角色的DRBD设备接受来自对方的所有修改,但是不能被应用程序读写,甚至只读也不行。 角色也可以改变。

2、使用DRBD工具

  • drbdadm:高级管理工具,管理/etc/drbd.conf,向drbdsetup和drbdmeta发送指令,

  • drbdsetup:配置装载进kernel的DRBD模块,平时很少直接用

  • drbdmeta:管理META数据结构,平时很少直接用。

3、复制模式

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

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

  • 协议C:同步复制协议。本地和对方写成功确认后返回。如果双机掉电或磁盘同时损坏,则数据可能丢失。一般用协议C。选择协议将影响流量,从而影响网络时延。

4、DRBD结构图

5、工作原理

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

6、DRBD与HA 集群

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

7、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的默认中进行继承而无须定义。

8、DRBD 资源 举例

  • Resource name:可以是除了空白字符的任意的ACSII码字符

  • DRBD device:在双方节点上,此DRBD设备的设备文件;一般为/dev/drbdN,其主设备号147

  • Disk configuration:在双方节点上,各自提供的存储设备

  • Nerwork configuration:双方数据同步时所使用的网络属性

案例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
resource web { #资源名为“web”
on node1.example.com { #设置节点cluster1  
device    /dev/drbd0;   #指出drbd的标示名  
disk      /dev/sda6;      #指出作为drbd的设备
address   192.168.1.9:7789; #指定ip和端口号
meta-disk internal;   #网络通信属性,指定drbd的元数据在本机  
}  
on node2.example.com {  
device    /dev/drbd0;  
disk      /dev/sda6;  
address   192.168.1.10:7789;  
meta-disk internal;  
}  
}

9、DRBD 配置步骤

  • 安装drbd

  • 配置资源文件(定义资料名称,磁盘,节点信息,同步限制等)

  • 将drbd加入到系统服务chkconfig --add drbd

  • 初始化资源组drbdadm create-md resource_name

  • 启动服务 service drbd start

  • 设置primary主机,并同步数据

  • 分区、格式化/dev/drbd*

  • 一个节点进行挂载

  • 查看状态

二、DRBD简单安装使用

说明:演示中我是学着使用ansible来安装drbd的,下面就是我的ansible关于Host Inventory文件中的定义:

1
2
3
4
5
6
7
8
# vim /etc/ansible/hosts
[drbd]
node1
node2
[node1]
node1
[node2]
node2

1、实验环境

2、安装epel源

1
2
3
4
5
6
[root@Director ~]# ansible drbd -m shell -a "wget http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm -P /tmp"
[root@Director ~]# ansible drbd -m shell -a "rpm -ivh /tmp/epel-release-6-8.noarch.rpm"
[root@Director ~]# ansible drbd -m shell -a "rpm -ivh /tmp/epel-release-6-8.noarch.rpm"
[root@Director ~]# ansible drbd -m shell -a "rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6"
[root@Director ~]# ansible drbd -m shell -a "rpm -ivh http://elrepo.org/elrepo-release-6-5.el6.elrepo.noarch.rpm"
[root@Director ~]# ansible drbd -m shell -a "yum list "

3、安装DRBD

1
[root@Director ~]# ansible drbd -m shell -a "yum -y install drbd84 kmod-drbd84"

查看一下配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@Director ~]# ansible drbd -m shell -a "ls -l /etc/drbd.conf"
node2 | success | rc=0 >>
-rw-r--r-- 1 root root 133 Apr 10 04:19 /etc/drbd.conf
node1 | success | rc=0 >>
-rw-r--r-- 1 root root 133 Apr 10 04:19 /etc/drbd.conf
[root@Director ~]# ansible drbd -m shell -a "ls -l /etc/drbd.d/*"
node2 | success | rc=0 >>
-rw-r--r-- 1 root root 2062 Apr 10 04:19 /etc/drbd.d/global_common.conf
node1 | success | rc=0 >>
-rw-r--r-- 1 root root 2062 Apr 10 04:19 /etc/drbd.d/global_common.conf

4、配置DRBD

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
[root@Director ~]# scp -p root@node1:/etc/drbd.d/global_common.conf ./
[root@Director ~]# vim global_common.conf 
global {  
usage-count no; #让linbit公司收集目前drbd的使用情况,yes为参加,我们这里不参加设置为no  
# minor-count dialog-refresh disable-ip-verification  
}
common {
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";  
# fence-peer "/usr/lib/drbd/crm-fence-peer.sh";  
# split-brain "/usr/lib/drbd/notify-split-brain.sh root";  
# out-of-sync "/usr/lib/drbd/notify-out-of-sync.sh root";  
# before-resync-target "/usr/lib/drbd/snapshot-resync-target-lvm.sh -p 15 -- -c 16k";  
# after-resync-target /usr/lib/drbd/unsnapshot-resync-target-lvm.sh;  
}
startup {
# wfc-timeout degr-wfc-timeout outdated-wfc-timeout wait-after-sb  
}
options {
# cpu-mask on-no-data-accessible  
}
disk {
# size max-bio-bvecs on-io-error fencing disk-barrier disk-flushes  
# disk-drain md-flushes resync-rate resync-after al-extents  
# c-plan-ahead c-delay-target c-fill-target c-max-rate  
# c-min-rate disk-timeout  
on-io-error detach; #同步错误的做法是分离  
}
net {
# protocol timeout max-epoch-size max-buffers unplug-watermark  
# connect-int ping-int sndbuf-size rcvbuf-size ko-count  
# allow-two-primaries cram-hmac-alg shared-secret after-sb-0pri  
# after-sb-1pri after-sb-2pri always-asbp rr-conflict  
# ping-timeout data-integrity-alg tcp-cork on-congestion  
# congestion-fill congestion-extents csums-alg verify-alg  
# use-rle  
cram-hmac-alg "sha1"; #设置加密算法sha1  
shared-secret "mydrbdlab"; #设置加密key  
}  
}
[root@Director ~]# scp -p global_common.conf root@node1:/etc/drbd.d/global_common.conf
[root@Director ~]# scp -p global_common.conf root@node2:/etc/drbd.d/global_common.conf

增加资源:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@Director ~]# vim web.res
resource web {
on node1{  
device    /dev/drbd0;  
disk      /dev/sdb3;
address   192.168.1.9:7789;    
meta-disk internal;  
}  
on node2 {          
device    /dev/drbd0;  
disk      /dev/sdb3;
address   192.168.1.10:7789;
meta-disk internal;  
}  
}

注意:还需要在node1和node2手动创建磁盘分区,建议要是做实验就将磁盘空间弄小点。 若不识别磁盘试试用此命令partx -a /dev/sdb。

将资源文件复制到node1和node2上:

1
2
3
4
5
6
7
[root@Director ~]# ansible drbd -m copy -a "src=/root/web.res dest=/etc/drbd.d/"
[root@Director ~]# ansible drbd -m shell -a "ls -l /etc/drbd.d/web.res"
node1 | success | rc=0 >>
-rw-r--r-- 1 root root 291 Sep  7 20:28 /etc/drbd.d/web.res
node2 | success | rc=0 >>
-rw-r--r-- 1 root root 291 Sep  7 20:28 /etc/drbd.d/web.res

node1与node2上初始化资源:

1
2
3
4
5
6
7
8
9
[root@Director ~]# ansible drbd -m shell -a "drbdadm create-md web"
node2 | success | rc=0 >>
initializing activity log
Writing meta data...
New drbd meta data block successfully created.NOT initializing bitmap
node1 | success | rc=0 >>
initializing activity log
Writing meta data...
New drbd meta data block successfully created.NOT initializing bitmap

node1与node2上启动DRBD服务:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@Director ~]# ansible drbd -m shell -a "/etc/init.d/drbd start"
node1 | success | rc=0 >>
Starting DRBD resources: [
create res: web
prepare disk: web
adjust disk: web
adjust net: web
]
node2 | success | rc=0 >>
Starting DRBD resources: [
create res: web
prepare disk: web
adjust disk: web
adjust net: web
]

查看一下启动状态:

1
2
3
4
5
6
[root@Director ~]# ansible drbd -m shell -a "drbd-overview"
node2 | success | rc=0 >>
0:web/0  Connected Secondary/Secondary Inconsistent/Inconsistent 
node1 | success | rc=0 >>
0:web/0  Connected Secondary/Secondary Inconsistent/Inconsistent

从上面的信息中可以看出此时两个节点均处于Secondary状态。于是,我们接下来将其中一个节点设置为Primary。

设置node1为Primary:

1
2
3
4
5
6
7
8
9
[root@Director ~]# ansible node1 -m shell -a "drbdadm primary --force web"
[root@Director ~]# watch -n1 'ansible drbd -m shell -a "drbd-overview"'
Every 1.0s: ansible drbd -m shell -a "drbd-overview"         Mon Sep  7 20:28:37 2015
node1 | success | rc=0 >>
0:web/0  SyncSource Primary/Secondary UpToDate/Inconsistent
[===>................] sync'ed: 21.5% (1656176/2104408)K
node2 | success | rc=0 >>
0:web/0  SyncTarget Secondary/Primary Inconsistent/UpToDate
[===>................] sync'ed: 21.5% (1656176/2104408)K

两者需要一段时间的初始化,初始化时间根据磁盘大小和硬件配置相关:

1
2
3
4
5
6
[root@Director ~]# ansible drbd -m shell -a "drbd-overview"
node2 | success | rc=0 >>
0:web/0  Connected Secondary/Primary UpToDate/UpToDate 
node1 | success | rc=0 >>
0:web/0  Connected Primary/Secondary UpToDate/UpToDate

node1格式化并挂载 :

1
2
3
4
5
6
7
8
[root@Director ~]# ansible node1 -m shell -a "mke2fs -j /dev/drbd0"
node1 | success | rc=0 >>
mke2fs 1.41.12 (17-May-2010)
[root@Director ~]# ansible node1 -m shell -a "mkdir /drbd"
node1 | success | rc=0 >>
[root@Director ~]# ansible node1 -m shell -a "mount /dev/drbd0 /drbd"
node1 | success | rc=0 >>

将drbd目录中写入文件,下面好做测试:

1
2
3
4
5
[root@Director ~]# ansible node1 -m copy -a "src=/etc/issue dest=/drbd"
[root@Director ~]# ansible node1 -m shell -a "cat /drbd/issue"
node1 | success | rc=0 >>
CentOS release 6.6 (Final)
Kernel \r on an \m

切换Primary和Secondary节点:

说明:对主Primary/Secondary模型的drbd服务来讲,在某个时刻只能有一个节点为Primary,因此,要切换两个节点的角色,只能在先将原有的Primary节点设置为Secondary后,才能原来的Secondary节点设置为Primary。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
[root@Director ~]# ansible node1 -m shell -a "umount /drbd"
node1 | success | rc=0 >>
[root@Director ~]# ansible node1 -m shell -a "drbdadm secondary web"
node1 | success | rc=0 >>
[root@Director ~]# ansible drbd -m shell -a "drbd-overview"
node1 | success | rc=0 >>
0:web/0  Connected Secondary/Secondary UpToDate/UpToDate 
node2 | success | rc=0 >>
0:web/0  Connected Secondary/Secondary UpToDate/UpToDate 
[root@Director ~]# ansible node2 -m shell -a "drbdadm primary web"
node2 | success | rc=0 >>
[root@Director ~]# ansible drbd -m shell -a "drbd-overview"
node1 | success | rc=0 >>
0:web/0  Connected Secondary/Primary UpToDate/UpToDate 
node2 | success | rc=0 >>
0:web/0  Connected Primary/Secondary UpToDate/UpToDate 
[root@Director ~]# ansible node2 -m shell -a "mkdir /drbd"
node2 | success | rc=0 >>
[root@Director ~]# ansible node2 -m shell -a "mount /dev/drbd0 /drbd"
node2 | success | rc=0 >>
[root@Director ~]# ansible node2 -m shell -a "cat /drbd/issue"
node2 | success | rc=0 >>
CentOS release 6.6 (Final)
Kernel \r on an \m

三、DRBD 双主模式配置示例

drbd 8.4中第一次设置某节点成为主节点的命令

1
[root@node ~]# drbdadm primary --force resource

配置资源双主模型的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
resource mydrbd {
net {
protocol C;  
allow-two-primaries yes;  
}
startup {
become-primary-on both;  
}
disk {
fencing resource-and-stonith;  
}
handlers {
# Make sure the other node is confirmed  
# dead after this!  
outdate-peer "/sbin/kill-other-node.sh";  
}
on node1.magedu.com {
device  /dev/drbd0;  
disk    /dev/vg0/mydrbd;  
address 192.168.1.9:7789;  
meta-disk       internal;  
}
on node2.magedu.com {
device  /dev/drbd0;  
disk    /dev/vg0/mydrbd;  
address 192.168.1.10:7789;  
meta-disk       internal;  
}  
}

本文出自 “粗茶淡饭” 博客,请务必保留此出处http://cuchadanfan.blog.51cto.com/9940284/1695852

转载于:https://blog.51cto.com/lucifer119/1734624

Linux下DRBD配置相关推荐

  1. linux下SVN配置笔记(转)

    linux下SVN配置笔记  李群林 转载了 皋军 的博文  [查看原文][转载时间:2012-09-20 10:40] 关键字: linux下svn配置笔记  一.安装SVN默认安装到/usr/lo ...

  2. Linux下VNC配置多个桌面和修改密码 不会当系统重启vnc失效

    1:vncserver 2:iptables -I INPUT -p tcp --dport 5901 -j ACCEPT   客户端方式 3:iptables -I INPUT -p tcp --d ...

  3. linux下dhcp配置(一)

    LINUX下DHCP配置(一) 挂载 mkdir –p /mnt/cdrom mount /dev/cdrom /mnt/cdrom cd /mnt/cdrom/Server ll dhcp* 安装 ...

  4. Linux 下安装配置C/C++开发环境 Code::Blocks

    Linux 下安装配置C开发环境Code::Blocks 一.提前的话 要说C语言和Linux的关系大家应该都不会陌生,Linux系统内核就是用C语言开发的,所以所有的Linux系统下面 都会有C的编 ...

  5. linux下安装配置redis服务

    2019独角兽企业重金招聘Python工程师标准>>> linux下安装配置redis服务 2016年03月25日 15:39:31 coding_everyday 阅读数:3530 ...

  6. (转)yi_meng linux 下 ifcfg-eth0 配置 以及ifconfig、ifup、ifdown区别

    linux 下 ifcfg-eth0 配置 以及ifconfig.ifup.ifdown区别 原文:https://www.cnblogs.com/yi-meng/p/3214471.html 这3个 ...

  7. linux服务配置大全 fedora 8 ftp 百度文库,Linux下VSFTP配置全攻略

    Linux下VSFTP配置全攻略 [日期:2007-10-05] 来源:Linux公社 作者:Linuxidc [字体:大 中 小] 4]如果要以系统中存在的普通用户登入FTP,也没有什么可以设置的, ...

  8. Linux下安装配置vsftpd

    Linux下安装配置vsftpd 安装vsftpd服务器 yum -y install vsftpd 可以使用rpm -qa vsftpd命令确认是否安装好vsftpd服务器. vsftpd.conf ...

  9. Linux配置nginx打开报404,Linux下Nginx配置404页面的方法

    Linux下Nginx配置404页面很多设置后返回状态码是200,而不是404状态码,所以那样的404页面设置是不正确的,今天分享下Linux下Nginx配置404页面设置方法. 1.创建自己的404 ...

最新文章

  1. 蓝桥杯--2012--取球游戏
  2. Python之tkinter:动态演示调用python库的tkinter带你进入GUI世界(Button展示图片事件)
  3. EF optimize the perfermance
  4. 2020中级财管(押题班)
  5. [转载] 七龙珠第一部——第130话 悟空的敌人竟是悟空
  6. 手把手教你如何下载大厂页面的字体——开发
  7. android自定义View学习(一)----创建一个视图类
  8. 处理quartz 异常 Couldn‘t retrieve trigger: No record found for selection of Trigger with key:
  9. Python Scrapy 爬虫框架实例(一)
  10. 微信小程序手动获取自己位置wx.chooseLocation
  11. 解决CRMEB跨域问题
  12. BZOJ 2759 一个动态树好题(Link-Cut Tree+数学)
  13. MySQL业务账号需要哪些权限_MySQL 日常运维业务账号权限的控制
  14. Signing for ‘xxx‘ requires a development team.
  15. proteus——555 PWM 发生器
  16. Pytorch1.1.0 入门 自定义op(python)
  17. 目标检测经典论文——Fast R-CNN论文翻译(中英文对照版):Fast R-CNN(Ross Girshick, Microsoft Research(微软研究院))
  18. router-view添加key解决同一路由复用相同组件
  19. php选择星座,PHP日期得到星座
  20. Java应用性能优化!宁波java培训班地址

热门文章

  1. js如何在当前页面加载springmvc返回的页面_手写SpringMVC学习
  2. 云计算机具体应用场景,云计算的定义、类型及应用场景
  3. yang模型中rpc_领域驱动模型(DDD)设计讲解
  4. 用计算机玩游戏最简单的方法,如何制作电脑简易命令小游戏
  5. Java final 关键字简述
  6. django与mysql实现增删_django与mysql实现简单的增删查改
  7. 跨域会报40几_总结一下跨域的几种情况
  8. 重装系统 linux启动windows系统文件在哪里,Win-Lin双系统重装Windows找回Linux启动
  9. lol新服务器怎么发信息,《英雄联盟手游》国服新消息 最新玩法发布
  10. 基于VMware Workstation创建虚拟机,以Ubuntu16.04为例