DRBD实现文件同步详解

一、简单介绍

????Distributed Replicated Block Device(DRBD)是一个用软件实现的、无共享的、服务器之间镜像块设备内容的存储复制解决方案。其核心功能通过Linux的内核实现,比文件系统更加靠近操作系统内核及IO栈。DRBD是由内核模块和相关脚本而构成,用以构建高可用性的集群。可以理解为网络RAID1.

复制原理

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

?

1、复制方式

单主模式 任何特定时间范围内,集群只存在一个主节点,可用于任何文件系统上,包括ext3、ext4等

双主模式 任何特定时间范围内,集群存在两个主节点,不过这种模式需要借助一个共享的文件系统,如GFS和MFS等

2、复制协议

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

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

协议C:同步复制协议。本地和对方写成功确认后返回。如果双机掉电或磁盘同时损坏,则数据可能丢失。对网络依赖比较大。?

配置工具

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

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

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

配置文件

????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的默认中进行继承而无须定义。各个对等节点之间需要进行数据通信,所以需要配置主机互信机制。

????资源角色有primary、secondary两种。primary可以进行不受限制的读和写操作,可用来创建和挂载文件系统、初始化I/O的块设备。secondary接收所有来自对等节点的更新,不能被应用也不能被读写访问。主要目的是保持缓冲及数据一致性。

人工干预和管理程序的自动聚类算法都可以改变资源的角色。资源可以由被变换为主,以及主到备。

?

脑裂通知和自动恢复

????split brain实际上是指在某种情况下,造成drbd的两个节点断开连接,都以primary的身份来运行。当drbd某primary节点连接对方节点准备发送信息的时候如果发现对方也是primary状态,那么会立刻自行断开连接,并认定当前已经发生split brain了,这时候他会在系统日志中记录以下信息:“Split-Brain detected,dropping connection!”当发生split brain之后,如果查看连接状态,其中至少会有一个是StandAlone状态,另外一个可能也是StandAlone(如果是同时发现split brain状态),也有可能是WFConnection的状态。

?

drbd 脑裂主要在 net 配置,有以下关键字:

after-sb-0pri:裂脑已经被探测到,但是现在没有节点处于主角色,对于这个选项, drbd 有以下关键字:

????disconnect:

????????不需要自动恢复,仅仅是调用裂脑处理程序的脚本(如果配置了),断开连接并出在断开模式。

????discard-younger-primary:

????????放弃和回滚最后成为主的上面所做的修改。

????discard-least-changes:

????????放弃和回滚,变动比较少的主机上的修改。

????discard-zero-changes:

????????如果任何节点都没有发生任何变化,仅仅申请在一个节点上做出继续修改即可。

?

????after-sb-1pri:裂脑已经被探测到,现有有一个节点处于主角色,对于这个选项, drbd 有以下关键字:

????disconnect:和 after-sb-0pri 一样, 调用裂脑处理程序的脚本(如果配置了),断开连接并出在断开模式。

????consensus:和 after-sb-0pri 中同样的修复策略。 如果利用这些策略裂脑危害能选择,那就能自动解决。 否则,同样断开指定的动作。

????call-pri-lost-after-sb:和 after-sb-0pri 中同样的修复策略。如果利用这些策略裂脑危害能选择,就在受危害的节点上调用

????pri-lost-after-sb 程序。这个程序必须确认在 handlers 中配置,并考虑到从集群中移除该节点。

????discard-secondary:不管哪个主机只要处于次角色,都是裂脑的危害者。

????after-sb-2pri:在两个节点都处于主角色时,裂脑被发现。次选项使用和after-sb-1pri同样的关键字,丢弃次节点并达成共识。

二、配置过程

1、修改主机名

[[email protected]?~]#?cat?/etc/hosts
127.0.0.1???localhost?localhost.localdomain?localhost4?localhost4.localdomain4
::1?????????localhost?localhost.localdomain?localhost6?localhost6.localdomain6
192.168.221.161?MidApp
192.168.221.160?DB

2、配置两台机器的互信机制

[[email protected]?~]#?ssh-keygen?
Generating?public/private?rsa?key?pair.
Enter?file?in?which?to?save?the?key?(/root/.ssh/id_rsa):?
Enter?passphrase?(empty?for?no?passphrase):?
Enter?same?passphrase?again:?
Your?identification?has?been?saved?in?/root/.ssh/id_rsa.
Your?public?key?has?been?saved?in?/root/.ssh/id_rsa.pub.
The?key?fingerprint?is:
0c:39:e2:6d:cf:02:b9:94:7b:1f:b7:6f:b1:49:3d:[email protected]
The?key‘s?randomart?image?is:
+--[?RSA?2048]----+
|?????????????????|
|???????.?????????|
|????.?+??????????|
|???.?=?+??????.??|
|????*?o?S????o?.?|
|???.?=?o????E?o??|
|????o?o?+?..?+?.?|
|?????.?o?o?.+????|
|????????.?.o.????|
+-----------------+
[[email protected]?pgsql]#?ssh-copy-id?192.168.221.160
[email protected]‘s?password:?
Now?try?logging?into?the?machine,?with?"ssh?‘192.168.221.160‘",?and?check?in:
?
??.ssh/authorized_keys
?
to?make?sure?we?haven‘t?added?extra?keys?that?you?weren‘t?expecting.
?
[[email protected]?pgsql]#?ssh?DB
The?authenticity?of?host?‘db?(192.168.221.160)‘?can‘t?be?established.
RSA?key?fingerprint?is?3c:83:03:dc:63:6e:f3:e1:db:db:43:fc:c3:03:19:c2.
Are?you?sure?you?want?to?continue?connecting?(yes/no)??yes
Warning:?Permanently?added?‘db‘?(RSA)?to?the?list?of?known?hosts.
Last?login:?Mon?Dec??4?20:00:47?2017?from?172.30.25.29

3、设置时钟同步

[[email protected]?~]#?crontab?-l
*/5?*?*?*?*?ntpdate?cn.pool.ntp.org

4、安装DRBD程序包

yum?install?-y?glibc?
rpm?--import?https://www.elrepo.org/RPM-GPG-KEY-elrepo.org?
rpm?-Uvh?http://www.elrepo.org/elrepo-release-6-8.el6.elrepo.noarch.rpm
yum?install?-y?kmod-drbd84?drbd84-utils

若遇到下面问题,要安装nss

[[email protected]?~]#?rpm?--import?https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
curl:?(35)?SSL?connect?error
error:?https://www.elrepo.org/RPM-GPG-KEY-elrepo.org:?import?read?failed(2).
[[email protected]?pgsql]#?yum?update?nss

注:前4步,两个节点做相同操作

5、修改全局配置文件

[[email protected]?~]#?cat?/etc/drbd.d/global_common.conf?
?
global?{
usage-count?no;
}
?
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";
split-brain?"/usr/lib/drbd/notify-split-brain.sh?root";
}
?
startup?{
#?wfc-timeout?degr-wfc-timeout?outdated-wfc-timeout?wait-after-sb
}
?
options?{
#?cpu-mask?on-no-data-accessible
}
?
disk?{
on-io-error?detach;?#配置I/O错误处理策略为分离
}
?
net?{
after-sb-0pri?discard-zero-changes;#如果任何节点都没有发生任何变化,仅仅申请在一个节点上做出继续修改即可
after-sb-1pri?discard-secondary;
after-sb-2pri?disconnect;
}
syncer?{
????????rate?1024M;????#设置主备节点同步时的网络速率
????}
}

6、创建资源配置文件

[[email protected]?~]#?cat?/etc/drbd.d/mysql.res?
resource?mysql?{
protocol?C;
meta-disk?internal;
device?/dev/drbd1;#相关的块设备需命名为/dev/drbdm,其中m是设备的次要号码
syncer?{
verify-alg?sha1;#支持复制传输数据完整性验证(MD5、SHA-1、CRC-32C)
}
net?{
allow-two-primaries;
}
on?MidApp?{
disk?/dev/sdb1;?#在node1创建的分区
address?192.168.221.161:7789;
}
on?DB?{
disk?/dev/sdb1;?#在node2创建的分区
address?192.168.221.160:7789;
}
}

7、把配置文件拷贝到另一台机器

scp?-rp??/etc/drbd.d/*?DB:/etc/drbd.d/

8、提前添加一块硬盘,创建分区

[[email protected]?~]#?fdisk?/dev/sdb?
Device?contains?neither?a?valid?DOS?partition?table,?nor?Sun,?SGI?or?OSF?disklabel
Building?a?new?DOS?disklabel?with?disk?identifier?0xa2f4da2f.
Changes?will?remain?in?memory?only,?until?you?decide?to?write?them.
After?that,?of?course,?the?previous?content?won‘t?be?recoverable.
?
Warning:?invalid?flag?0x0000?of?partition?table?4?will?be?corrected?by?w(rite)
?
WARNING:?DOS-compatible?mode?is?deprecated.?It‘s?strongly?recommended?to
?????????switch?off?the?mode?(command?‘c‘)?and?change?display?units?to
?????????sectors?(command?‘u‘).
?
Command?(m?for?help):?n
Command?action
???e???extended
???p???primary?partition?(1-4)
p
Partition?number?(1-4):?1
First?cylinder?(1-261,?default?1):?
Using?default?value?1
Last?cylinder,?+cylinders?or?+size{K,M,G}?(1-261,?default?261):?
Using?default?value?261
Command?(m?for?help):?p
?
Disk?/dev/sdb:?2147?MB,?2147483648?bytes
255?heads,?63?sectors/track,?261?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:?0xa2f4da2f
?
???Device?Boot??????Start?????????End??????Blocks???Id??System
/dev/sdb1???????????????1?????????261?????2096451???83??Linux
?
Command?(m?for?help):?w
The?partition?table?has?been?altered!
?
Calling?ioctl()?to?re-read?partition?table.
Syncing?disks.
You?have?new?mail?in?/var/spool/mail/root

9、在161机器上启动DRBD

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

10、内核加载DRBD模块

[[email protected]?~]#?modprobe?drbd
[[email protected]?~]#?drbdadm?up?mysql
[[email protected]?~]#??lsmod?|?grep?drbd
drbd??????????????????374888??2?
libcrc32c???????????????1246??1?drbd

11、让161机器为primary节点

[[email protected]?~]#?drbdadm?--?--force?primary?mysql

12、让160机器同样操作

[[email protected]?~]#?drbdadm?create-md?mysql
[[email protected]?~]#?modprobe?drbd
[[email protected]?~]#?drbdadm?up?mysql

?

13、创建一个/mydata目录

mkdir?-p?/mydata

14、格式化设备并挂载

[[email protected]?~]#?mkfs.ext4?/dev/drbd1
mke2fs?1.41.12?(17-May-2010)
Filesystem?label=
OS?type:?Linux
Block?size=4096?(log=2)
Fragment?size=4096?(log=2)
Stride=0?blocks,?Stripe?width=0?blocks
131072?inodes,?524087?blocks
26204?blocks?(5.00%)?reserved?for?the?super?user
First?data?block=0
Maximum?filesystem?blocks=536870912
16?block?groups
32768?blocks?per?group,?32768?fragments?per?group
8192?inodes?per?group
Superblock?backups?stored?on?blocks:?
32768,?98304,?163840,?229376,?294912
?
Writing?inode?tables:?done????????????????????????????
Creating?journal?(8192?blocks):?done
Writing?superblocks?and?filesystem?accounting?information:?done
?
This?filesystem?will?be?automatically?checked?every?27?mounts?or
180?days,?whichever?comes?first.??Use?tune2fs?-c?or?-i?to?override.
You?have?new?mail?in?/var/spool/mail/root
[[email protected]?~]#?mount?/dev/drbd1?/mydata
[[email protected]?~]#?df?-h
Filesystem??????Size??Used?Avail?Use%?Mounted?on
/dev/sda2????????18G???12G??4.6G??73%?/
tmpfs???????????491M???72K??491M???1%?/dev/shm
/dev/sda1???????283M???59M??209M??23%?/boot
/dev/drbd1??????2.0G??3.0M??1.9G???1%?/mydata

15、查看状态

[[email protected]?~]#?drbd-overview?
?1:mysql/0??Connected?Primary/Secondary?UpToDate/UpToDate?/mydata?ext4?2.0G?3.0M?1.9G?1%

?也可以通过下面方式查看

[[email protected]?~]#?cat?/proc/drbd?
version:?8.4.9-1?(api:1/proto:86-101)
GIT-hash:[email protected]ld64R6,?2016-12-13?18:38:15
?1:?cs:Connected?ro:Primary/Secondary?ds:UpToDate/UpToDate?C?r-----
????ns:2162724?nr:120?dw:66496?dr:2098842?al:25?bm:0?lo:0?pe:0?ua:0?ap:0?ep:1?wo:f?oos:0

16、写入测试数据

[[email protected]?~]#?echo?"123"?>?/mydata/test.txt?
[[email protected]?~]#?cat?/mydata/test.txt?
123

17、将161机器解除挂载,并降级为secondary

[[email protected]?~]#?umount?/mydata
[[email protected]?~]#?drbdadm?secondary?mysql?
[[email protected]?~]#?drbd-overview?
?1:mysql/0??Connected?Secondary/Secondary?UpToDate/UpToDate

注:在单主模式下的DRBD,两个节点同时处于连接状态,任何一个节点都可以在特定的时间内变成主;但两个节点中只能一为主,如果已经有一个主,需先降级才可能升级

?

18、将160节点升为primary节点,并挂载

[[email protected]?~]#?drbdadm?primary?mysql
[[email protected]?~]#?mount?/dev/drbd1?/mydata/

19、查看状态

[[email protected]?~]#?drbd-overview
?1:mysql/0??Connected?Primary/Secondary?UpToDate/UpToDate?/mydata?ext4?2.0G?3.0M?1.9G?1%?
[[email protected]?~]#?df?-h
Filesystem??????Size??Used?Avail?Use%?Mounted?on
/dev/sda3????????36G???22G???12G??66%?/
tmpfs???????????774M???72K??774M???1%?/dev/shm
/dev/sda1???????283M???69M??200M??26%?/boot
/dev/drbd1??????2.0G??3.0M??1.9G???1%?/mydata

20、验证数据

[[email protected]?~]#?cat?/mydata/test.txt?
123

至此,DRBD环境搭建完成!

?

?

?

时间: 2024-10-03 22:51:56

DRBD实现文件同步详解的相关文章

远程文件同步详解(Remote File Sync)

1. 远程文件同步的常见方式: 1.cron + rsync 优点: 简单 缺点:定时执行,实时性比较差:另外,rsync同步数据时,需要扫描所有文件后进行比对,进行差量传输.如果文件数量达到了百万甚至千万量级,扫描所有文件将是非常耗时的.远程对比时发送所有的文件树or目录树属性,而且正在发生变化的往往是其中很少的一部分,这是非常低效的方式. 2. inotify + rsync 优点:比较简单 缺点:每个变更文件都使用了rsync.而每一次rsync都要建立SSH链接,这个其实是比较费时间的.

磁盘及文件系统管理详解---急需加强

磁盘管理: 机械式硬盘 U盘.光盘.软盘.硬件.磁带 MBR:Master Boot Record 主引导记录 ln [-s -v] SRC DEST:创建链接文件,默认硬链接 -s:创建软连接 -v:显示过程 硬链接: 1.只能对文件创建,不能应用于目录 2.不能跨文件系统 3.创建硬链接会增加文件被链接的次数 符号链接(软连接): 1.可以应用于目录 2.可以跨文件系统 3.不会增加被链接文件的链接次数 4.其大小为指定的路径所包含的字符个数 du -s -h df:显示整个磁盘分区使用情况

C++文件读写详解(ofstream,ifstream,fstream)

c++bufferiosiostreamfilestream 目录(?)[+] 在看C++编程思想中,每个练习基本都是使用ofstream,ifstream,fstream,以前粗略知道其用法和含义,在看了几位大牛的博文后,进行整理和总结: 这里主要是讨论fstream的内容: [java] view plaincopyprint? #include <fstream> ofstream         //文件写操作 内存写入存储设备 ifstream         //文件读操作,存储设

Windows DIB文件操作详解-4.使用DIB Section

前面讲了为了提高DIB的显示性能和效率,我们将DIB转换成DDB,但是这又遇到一个问题,如果我想操作DIB的数据的话,显然是不能使用DDB:一是因为DIB转DDB时发生了颜色转换,再就是DDB无法直接提取指定像素点的数据.那么我们怎么办呢,Windows使用一种折中的方式来达到这一目标(既提高了显示效率和性能,又可以直接操作像素点). 1.DIB Section存储和显示 Windows使用DIB块(DIB Section)来存储DIB数据,其内存结构示意图如下 其实,和我们自己读入DIB数据到

Linux文件权限详解

在Linux中的每一个文件或目录都包含有访问权限,这些访问权限决定了谁能访问和如何访问这些文件和目录. 通过设定权限可以从以下三种访问方式限制访问权限:只允许用户自己访问:允许一个预先指定的用户组中的用户访问:允许系统中的任何用户访问.同时,用户能够控制一个给定的文件或目录的访问程度.一个文件活目录可能有读.写及执行权限.当创建一个文件时,系统会自动地赋予文件所有者读和写的权限,这样可以允许所有者能够显示文件内容和修改文件.文件所有者可以将这些权限改变为任何他想指定的权限.一个文件也许只有读权限

RPM安装包-Spec文件参数详解与示例分析

spec文件是整个RPM包建立过程的中心,它的作用就如同编译程序时的Makefile文件. 1.Spec文件参数 spec文件包含建立一个RPM包必需的信息,包括哪些文件是包的一部分以及它们安装在哪个目录下.这个文件一般分为如下的几节: (1) Preamle(序言) 序言包含用户请求包的信息时所显示的内容.它可以包含包的功能描述.包的软件版本.版权信息和所属的包组等.Summary 是一行关于该软件包的描述,Name 是该软件包的基名,Version 是该软件的版本号,Release 是 RP

Windows DIB文件操作详解-1.DIB的读入、保存和显示

DIB(设备无关位图)是存储在磁盘上的位图文件,可以从磁盘读到内存中或从内存保存到磁盘上,它的磁盘文件结构是标准化的,在Linux.Unix及Windows上都可以以同样效果显示.位图是最接近硬件的图像格式,Windows显示的核心是位图,它的SDK API专门提供了一组用于操作DIB文件的函数.但是由于这样或那样的原因,高效合理的使用这些DIB API是需要了解不少历史和使用背景的,在这里我抽茧剥丝介绍和演示DIB的使用,相信对你更好的使用DIB文件有帮助,由于DIB函数比较多,这里分为三部分

Android.mk 文件语法详解

转:http://blog.sina.com.cn/s/blog_602f8770010148ce.html ===================================================================================== 0. Android.mk简介: Android.mk文件用来告知NDK Build 系统关于Source的信息. Android.mk将是GNU Makefile的一部分,且将被Build System解析一次或多次

Windows DIB文件操作详解-5.DIB和调色板

Windows调色板是256色显卡时期的产物,现在显卡最少也是16bit的了,所以调色板基本上是用不到了的. 但是下面几种情况还是需要去使用和了解调色板: 1.在新显卡上保证256色兼容模式的正常运行 2.在256色显卡或低于256色显卡老机器上运行程序或在一些工业控制场合(为了节约成本可能采用256色显卡或低于256色显卡)运行程序 3.操作DIB的指定像素点数据 1.调色板是什么 同样采用下面一张图 如上图,我们可以调色板分为如下几种: 1.DIB文件中的调色板 2.内存中创建的逻辑调色板对