欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

DRBD详细解说及配置过程记录 有大用

 

一、DRBD介绍    

1
2
3
4
5
6
7
8
9
10
DRBD(Distributed ReplicatedBlock Device)是一种基于软件的,无共享,分布式块设备复制的存储解决方案,在服务器之间的对块设备(硬盘,分区,逻辑卷等)                                    
进行镜像。也就是说当某一个应用程序完成写操作后,它提交的数据不仅仅会保存在本地块设备上,DRBD也会将这份数据复制一份,通过网络传输到另一个节点的块设                                    
备上,这样,两个节点上的块设备上的数据将会保存一致,这就是镜像功能。                                    
  
DRBD是由内核模块和相关脚本而构成,用以构建高可用性的集群,其实现方式是通过网络来镜像整个设备。它允许用户在远程机器上建立一个本地块设备的实时镜像,                                    
与心跳连接结合使用,可以把它看作是一种网络RAID,它允许用户在远程机器上建立一个本地块设备的实时镜像。                                    
  
DRBD工作在内核当中,类似于一种驱动模块。DRBD工作的位置在文件系统的buffer cache和磁盘调度器之间,通过tcp/ip发给另外一台主机到对方的tcp/ip最终发送                                    
给对方的drbd,再由对方的drbd存储在本地对应磁盘 上,类似于一个网络RAID-1功能。在高可用(HA)中使用DRBD功能,可以代替使用一个共享盘阵。本地(主节点)                                    
与远程主机(备节点)的数据可以保 证实时同步。当本地系统出现故障时,远程主机上还会保留有一份相同的数据,可以继续使用。                                    

二、DRDB的工作原理    

DRBD是linux的内核的存储层中的一个分布式存储系统,可用使用DRBD在两台Linux服务器之间共享块设备,共享文件系统和数据。类似于一个网络RAID-1的功能,
其工作原理的架构图如下:

   

DRBD底层设备支持    

1
2
3
4
5
6
7
DRBD需要构建在底层设备之上,然后构建出一个块设备出来。对于用户来说,一个DRBD设备,就像是一块物理的磁盘,可以在上面内创建文件系统。                                    
DRBD所支持的底层设备有以下这些类:                                    
1)一个磁盘,或者是磁盘的某一个分区;                                    
2)一个soft raid 设备;                                    
3)一个LVM的逻辑卷;                                    
4)一个EVMS(Enterprise Volume Management System,企业卷管理系统)的卷;                                    
5)其他任何的块设备。                                    

DRBD工作原理    

1
2
3
4
DRBD是一种块设备,可以被用于高可用(HA)之中.它类似于一个网络RAID-1功能.当你将数据写入本地 文件系统时,数据还将会被发送到网络中另一台主机上.                                    
以相同的形式记录在一个文件系统中。 本地(主节点)与远程主机(备节点)的数据可以保证实时同步.当本地系统出现故障时,远程主机上还会 保留有一份相                                    
同的数据,可以继续使用.在高可用(HA)中使用DRBD功能,可以代替使用一个共享盘阵.因为数据同时存在于本地主机和远程主机上,切换时,远程主机只要使用                                    
它上面的那份备份数据,就可以继续进行服务了。                                    

DRBD是如何工作的(工作机制)    

1
2
3
4
5
6
7
8
(DRBD Primary)负责接收数据,把数据写到本地磁盘并发送给另一台主机(DRBD Secondary),另一个主机再将数据存到自己的磁盘中。                                    
目前,DRBD每次只允许对一个节点进行读写访问,但这对于通常的故障切换高可用集群来说已经足够用了。                                    
以后的版本将支持两个节点进行读写存取。                                    
 
DRBD协议说明                                    
1)数据一旦写入磁盘并发送到网络中就认为完成了写入操作。                                    
2)收到接收确认就认为完成了写入操作。                                    
3)收到写入确认就认为完成了写入操作。                                    

DRBD与HA的关系    

1
2
3
4
一个DRBD系统由两个节点构成,与HA集群类似,也有主节点和备用节点之分,在带有主要设备的节点上,应用程序和操作系统可以运行和访问DRBD设备(/dev/drbd*)。                                    
在主节点写入的数据通过DRBD设备存储到主节点的磁盘设备中,同时,这个数据也会自动发送到备用节点对应的DRBD设备,最终写入备用节点的磁盘设备上,在备用节点上,                                    
DRBD只是将数据从DRBD设备写入到备用节点的磁盘中。现在大部分的高可用性集群都会使用共享存储,而DRBD也可以作为一个共享存储设备,使用DRBD不需要太多的硬件的投资。                                    
因为它在TCP/IP网络中运行,所以,利用DRBD作为共享存储设备,要节约很多成本,因为价格要比专用的存储网络便宜很多;其性能与稳定性方面也不错                                    

三、DRBD的特性(基本功能)    

1
2
3
4
5
6
7
8
分布式复制块设备(DRBD技术)是一种基于软件的,无共享,复制的存储解决方案,在服务器之间的对块设备(硬盘,分区,逻辑卷等)进行镜像。                                    
 
DRBD镜像数据的特性:                                    
1)实时性:当某个应用程序完成对数据的修改时,复制功能立即发生                                    
2)透明性:应用程序的数据存储在镜像块设备上是独立透明的,他们的数据在两个节点上都保存一份,因此,无论哪一台服务器宕机,                                    
  都不会影响应用程序读取数据的操作,所以说是透明的。                                    
3)同步镜像和异步镜像:同步镜像表示当应用程序提交本地的写操作后,数据后会同步写到两个节点上去;异步镜像表示当应用程序提交写操作后,                                    
  只有当本地的节点上完成写操作后,另一个节点才可以完成写操作。                                    

四、DRBD的用户空间管理工具    

1
2
3
4
5
6
为了能够配置和管理drbd的资源,drbd提供了一些管理工具与内核模块进行通信:                                    
1)drbdadm:高级的DRBD程序管理套件工具。它从配置文件/etc/drbd.conf中获取所有配置参数。drbdadm为drbdsetup和drbdmeta两个命令充当程序的前端应用,                                    
   执行drbdadm实际是执行的drbdsetup和drbdeta两个命令。                                    
2)drbdsetup:drbdsetup可以让用户配置已经加载在内核中运行的DRBD模块,它是底层的DRBD程序管理套件工具。使用该命令时,所有的配置参数都需要直接在                                    
   命令行中定义,虽然命令很灵活,但是大大的降低了命令的简单易用性,因此很多的用户很少使用drbdsetup。                                    
3)drbdmeta:drbdmeta允许用户创建、转储、还原和修改drbd的元数据结构。这个命令也是用户极少用到。                                    

五、DRBD的模式    

1
2
3
4
5
6
7
8
9
10
11
12
13
14
DRBD有2中模式,一种是DRBD的主从模式,另一种是DRBD的双主模式                                    
1)DRBD的主从模式                                    
这种模式下,其中一个节点作为主节点,另一个节点作为从节点。其中主节点可以执行读、写操作;从节点不可以挂载文件系统,因此,也不可以执行读写操作。                                    
在这种模式下,资源在任何时间只能存储在主节点上。这种模式可用在任何的文件系统上(EXT3、EXT4、XFS等等)。默认这种模式下,一旦主节点发生故障,从                                    
节点需要手工将资源进行转移,且主节点变成从节点和从节点变成主节点需要手动进行切换。不能自动进行转移,因此比较麻烦。                                    
 
为了解决手动将资源和节点进行转移,可以将DRBD做成高可用集群的资源代理(RA),这样一旦其中的一个节点宕机,资源会自动转移到另一个节点,从而保证服                                    
务的连续性。                                    
 
2)DRBD的双主模式                                    
这是DRBD8.0之后的新特性                                    
在双主模式下,任何资源在任何特定的时间都存在两个主节点。这种模式需要一个共享的集群文件系统,利用分布式的锁机制进行管理,如GFS和OCFS2。                                    
部署双主模式时,DRBD可以是负载均衡的集群,这就需要从两个并发的主节点中选取一个首选的访问数据。这种模式默认是禁用的,如果要是用的话必须在配置文                                    
件中进行声明。                                    

六、DRBD的同步协议    

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
DRBD的复制功能就是将应用程序提交的数据一份保存在本地节点,一份复制传输保存在另一个节点上。但是DRBD需要对传输的数据进行确认以便保证另一个节点的                                    
写操作完成,就需要用到DRBD的同步协议,DRBD同步协议有三种:                                    
1)协议A:异步复制协议                                    
一旦本地磁盘写入已经完成,数据包已在发送队列中,则写被认为是完成的。在一个节点发生故障时,可能发生数据丢失,因为被写入到远程节点上的数据可能仍在发送队列。                                    
尽管,在故障转移节点上的数据是一致的,但没有及时更新。这通常是用于地理上分开的节点。<br>                                    
数据在本地完成写操作且数据已经发送到TCP/IP协议栈的队列中,则认为写操作完成。如果本地节点的写操作完成,此时本地节点发生故障,而数据还处在TCP/IP队列中,                                    
则数据不会发送到对端节点上。因此,两个节点的数据将不会保持一致。这种协议虽然高效,但是并不能保证数据的可靠性。                                    
 
2)协议B:内存同步(半同步)复制协议                                    
一旦本地磁盘写入已完成且复制数据包达到了对等节点则认为写在主节点上被认为是完成的。数据丢失可能发生在参加的两个节点同时故障的情况下,因为在传输中的数据                                    
可能不会被提交到磁盘<br>                                    
数据在本地完成写操作且数据已到达对端节点则认为写操作完成。如果两个节点同时发生故障,即使数据到达对端节点,这种方式同样也会导致在对端节点和本地                                    
节点的数据不一致现象,也不具有可靠性。                                    
 
3)协议C:同步复制协议                                    
只有在本地和远程节点的磁盘已经确认了写操作完成,写才被认为完成。没有任何数据丢失,所以这是一个群集节点的流行模式,但I / O吞吐量依赖于网络带宽。                                    
只有当本地节点的磁盘和对端节点的磁盘都完成了写操作,才认为写操作完成。这是集群流行的一种方式,应用也是最多的,这种方式虽然不高效,但是最可靠。                                    
 
以上三种协议中,一般使用协议C,但选择C协议将影响流量,从而影响网络时延。为了数据可靠性,在生产环境使用时须慎重选项使用哪一种协议。                                    

七、DRBD的资源    

1
2
3
4
5
在DRBD中,资源是所有可复制移动存储设备的总称,它包括:                                    
1)资源名称:资源名称可以是除了空白字符以外的任意ASCII码字符                                    
2)DRBD设备:DRBD的虚拟块设备。在双方节点上,DRBD设备的设备文件命名方式;一般为/dev/drbdN,其主设备号147,N是次设备号                                    
3)磁盘配置:DRBD内部应用需要本地数据副本,元数据。在双方节点上,为各自提供的存储设备。                                    
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
----------全局配置项(global)----------                                    
基本上我们可以做的也就是配置usage-count是yes还是no了,usage-count参数其实只是为了让linbit公司收集目前drbd的使用情况。当drbd在安装和升级的时候会通过http                                    
协议发送信息到linbit公司的服务器上面。                                    
 
----------公共配置项(common)----------                                    
这里的common,指的是drbd所管理的多个资源之间的common。配置项里面主要是配置drbd的所有resource可以设置为相同的参数项,比如protocol,syncer等等。                                    
 
----------DRBD设备----------                                    
DRBD的虚拟块设备。它有一个主设备号为147的设备,默认的它的次要号码编从0开始。在一组主机上,drbd的设备的设备名称为/dev/drbdN,这个N通常和他的次设备号一致。                                    
 
资源配置项(resource)                                    
resource 项中配置的是drbd所管理的所有资源,包括节点的ip信息,底层存储设备名称,设备大小,meta信息存放方式,drbd对外提供的设备名等等。每一个 resource中都需要配置在每一个节点的信息,而不是单独本节点的信息。并且资源名只能使用纯ascii码而且不能使用空白字符用于表示资源名称。实 际上,在drbd的整个集群中,每一个节点上面的drbd.conf文件需要是完全一致的。                                    
另外,resource还有很多其他的内部配置项:                                    
1)net:网络配置相关的内容,可以设置是否允许双主节点(allow-two-primaries)等。                                    
2)startup:启动时候的相关设置,比如设置启动后谁作为primary(或者两者都是primary:become-primary-on both)                                    
3)syncer: 同步相关的设置。可以设置“重新”同步(re-synchronization)速度(rate)设置,也可以设置是否在线校验节点之间的数据一致性 (verify-alg 检测算法有md5,sha1以及crc32等)。数据校验可能是一个比较重要的事情,在打开在线校验功能后,我们可以通过相关命令(drbdadm verify resource_name)来启动在线校验。在校验过程中,drbd会记录下节点之间不一致的block,但是不会阻塞任何行为,即使是在该不一致的 block上面的io请求。当不一致的block发生后,drbd就需要有re-synchronization动作,而syncer里面设置的rate 项,主要就是用于re-synchronization的时候,因为如果有大量不一致的数据的时候,我们不可能将所有带宽都分配给drbd做re- synchronization,这样会影响对外提提供服务。rate的设置和还需要考虑IO能力的影响。如果我们会有一个千兆网络出口,但是我们的磁盘 IO能力每秒只有50M,那么实际的处理能力就只有50M,一般来说,设置网络IO能力和磁盘IO能力中最小者的30%的带宽给re- synchronization是比较合适的(官方说明)。另外,drbd还提供了一个临时的rate更改命令,可以临时性的更改syncer的rate 值:                                    
4)drbdsetup /dev/drbd0 syncer -r 100M                                    
这样就临时的设置了re-synchronization的速度为100M。不过在re-synchronization结束之后,需要通过 drbdadm adjust resource_name 来让drbd按照配置中的rate来工作。                                    
 
----------角色----------                                    
在drbd构造的集群中,资源具有角色的概念,分别为primary和secondary。                                    
所有设为primary的资源将不受限制进行读写操作。可以创建文件系统,可以使用裸设备,甚至直接io。所有设为secondary的设备中不能挂载,不能读写。                                    
 
----------数据同步协议----------                                    
drbd有三种数据同步模式:同步,异步,半同步                                    
1)异步:指的是当数据写到磁盘上,并且复制的数据已经被放到我们的tcp缓冲区并等待发送以后,就认为写入完成                                    
2)半同步:指的是数据已经写到磁盘上,并且这些数据已经发送到对方内存缓冲区,对方的tcp已经收到数据,并宣布写入                                    
3)同步:指的是主节点已写入,从节点磁盘也写入                                    
 
drbd 的复制模型是靠protocol关键字来定义的:                                    
protocol A表示异步;                                    
protocol B表示半同步;                                    
protocol C表示同步,                                    
 
默认为protocol C。在同步模式下只有主、从节点上两块磁盘同时损害才会导致数据丢失。在半同步模式下只有主节点宕机,同时从节点异常停电才会导致数据丢失。                                    
注意:drbd的主不会监控从的状态所以有可能会造成数据重传                                    
 
-----------------------------------metadata----------------------------------                                    
DRBD将数据的各种信息块保存在一个专用的区域里,这些metadata包括了                                    
1)DRBD设备的大小                                    
2)产生的标识                                    
3)活动日志                                    
4)快速同步的位图                                    
metadata的存储方式有内部和外部两种方式,使用哪种配置都是在资源配置中定义的                                    
内部meta data                                    
内部metadata存放在同一块硬盘或分区的最后的位置上                                    
优点:metadata和数据是紧密联系在一起的,如果硬盘损坏,metadata同样就没有了,同样在恢复的时候,metadata也会一起被恢复回来                                    
缺点:metadata和数据在同一块硬盘上,对于写操作的吞吐量会带来负面的影响,因为应用程序的写请求会触发metadata的更新,这样写操作就会造成两次额外的磁头读写移动。                                    
外部meta data                                    
外部的metadata存放在和数据磁盘分开的独立的块设备上                                    
优点:对于一些写操作可以对一些潜在的行为提供一些改进                                    
缺点:metadata和数据不是联系在一起的,所以如果数据盘出现故障,在更换新盘的时候就需要认为的干预操作来进行现有node对心硬盘的同步了                                    
如果硬盘上有数据,并且硬盘或者分区不支持扩展,或者现有的文件系统不支持shrinking,那就必须使用外部metadata这种方式了。                                    
可以通过下面的命令来计算metadata需要占用的扇区数                                    
 
---------------------------------------------split brain脑裂---------------------------------------------                                    
split brain实际上是指在某种情况下,造成drbd的两个节点断开连接,都以primary的身份来运行。当drbd某primary节点连接对方节点准备 发送信息的时候如果发现对方                                    
也是primary状态,那么会立刻自行断开连接,并认定当前已经发生split brain了,这时候他会在系统日志中记录以下信息:                                    
"Split-Brain detected,dropping connection!"                                    
当发生split brain之后,如果查看连接状态,其中至少会有一个是StandAlone状态,另外一个可能也是StandAlone(如果是同时发现split brain状态),也有可能是                                    
WFConnection的状态。                                    
 
如果在配置文件中配置了自动解决split brain(好像linbit不推荐这样做),drbd会自行解决split brain问题,可通过如下策略进行配置。                                    
1)Discarding modifications made on the “younger” primary。在这种模式下,当网络重新建立连接并且发现了裂脑,DRBD会丢弃最后切换到主节点上的主机所修改的数据。                                    
2)Discarding modifications made on the “older” primary. 在这种模式下,当网络重新建立连接并且发现了裂脑,DRBD丢弃首先切换到主节点上的主机后所修改的数据。                                    
3)Discarding modifications on the primary with fewer changes.在这种模式下,当网络重新建立连接并且发现了裂脑,DRBD会比较两台主机之间修改的数据量,并丢弃修                                    
改数据量较少的主机上的所有数据。                                    
4)Graceful recovery from split brain if one host has had no intermediate changes.在这种模式下,如果其中一个主机在脑裂期间并没有数据修改,DRBD会自动重新进                                    
行数据同步,并宣布脑裂问题已解决。(这种情况几乎不可 能存在)                                    
 
特别注意:                                    
自动裂脑自动修复能不能被接受取决于个人应用。考虑 建立一个DRBD的例子库。在“丢弃修改比较少的主节点的修改”兴许对web应用好过数据库应用。与此相反,财务的数据库                                    
则是对于任何修改的丢失都是不能 容忍的,这就需要不管在什么情况下都需要手工修复裂脑问题。因此需要在启用裂脑自动修复前考虑你的应用情况。                                    
如果没有配置 split brain自动解决方案,我们可以手动解决。首先我们必须要确定哪一边应该作为解决问题后的primary,一旦确定好这一点,那么我们同时也就确定接受丢失                                    
split brain之后另外一个节点上面所做的所有数据变更了。当这些确定下来后,就可以通过以下操作来恢复了:                                    
1)首先在确定要作为secondary的节点上面切换成secondary并放弃该资源的数据:                                    
drbdadm secondary resource_name                                    
drbdadm — –discard-my-data connect resource_name                                    
2)在要作为primary的节点重新连接secondary(如果这个节点当前的连接状态为WFConnection的话,可以省略)                                    
drbdadm connect resource_name                                    
 
当作完这些动作之后,从新的primary到secondary的re-synchnorisation会自动开始。                                    

九、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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
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的默认中进行继承而无须定义。                                    
  
DRBD配置文件                                    
[root@huanqiu ~]# cat /etc/drbd.d/global_common.conf                                    
global {                                    
 usage-count yes;         //是否参加DRBD使用者统计,默认是参加                                    
 # minor-count dialog-refresh disable-ip-verification  //这里是global可以使用的参数                                    
 #minor-count:32         //从(设备)个数,取值范围1~255,默认值为32。该选项设定了允许定义的resource个数,当要定义的resource超过了此选项的设定时,需要重新载入DRBD内核模块。                                    
 #disable-ip-verification:no   //是否禁用ip检查                                    
   
}                                    
common {                                    
 protocol C;      //指定复制协议,复制协议共有三种,为协议A,B,C,默认协议为协议C                                    
 handlers {       //该配置段用来定义一系列处理器,用来回应特定事件。                                    
  # These are EXAMPLE handlers only.                                    
  # They may have severe implications,                                    
  # like hard resetting the node under certain circumstances.                                    
  # Be careful when chosing your poison.                                    
  # 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 {    //#DRBD同步时使用的验证方式和密码。该配置段用来更加精细地调节DRBD属性,它作用于配置节点在启动或重启时。常用选项有:                                    
  # wfc-timeout degr-wfc-timeout outdated-wfc-timeout wait-after-sb                                    
  wfc-timeout:  //该选项设定一个时间值,单位是秒。在启用DRBD块时,初始化脚本DRBD会阻塞启动进程的运行,直到对等节点的出现。该选项就是用来限制这个等待时间的,默认为0,即不限制,永远等待。                                    
  degr-wfc-timeout:  //该选项也设定一个时间值,单位为秒。也是用于限制等待时间,只是作用的情形不同:它作用于一个降级集群(即那些只剩下一个节点的集群)在重启时的等待时间。                                    
  outdated-wfc-timeout:  //同上,也是用来设定等待时间,单位为秒。它用于设定等待过期节点的时间                                    
 }                                    
 disk {                                    
  # on-io-error fencing use-bmbv no-disk-barrier no-disk-flushes   //这里是disk段内可以定义的参数                                    
  # no-disk-drain no-md-flushes max-bio-bvecs                      //这里是disk段内可以定义的参数                                    
  on-io-error: detach      //选项:此选项设定了一个策略,如果底层设备向上层设备报告发生I/O错误,将按照该策略进行处理。有效的策略包括:                                    
    detach      //发生I/O错误的节点将放弃底层设备,以diskless mode继续工作。在diskless mode下,只要还有网络连接,DRBD将从secondary node读写数据,而不需要failover(故障转移)。该策略会导致一定的损失,但好处也很明显,DRBD服务不会中断。官方推荐和默认策略。                                    
    pass_on       //把I/O错误报告给上层设备。如果错误发生在primary节点,把它报告给文件系统,由上层设备处理这些错误(例如,它会导致文件系统以只读方式重新挂载),它可能会导致DRBD停止提供服务;如果发生在secondary节点,则忽略该错误(因为secondary节点没有上层设备可以报告)。该策略曾经是默认策略,但现在已被detach所取代。                                    
    call-local-io-error   //调用预定义的本地local-io-error脚本进行处理。该策略需要在resource(或common)配置段的handlers部分,预定义一个相应的local-io-error命令调用。该策略完全由管理员通过local-io-error命令(或脚本)调用来控制如何处理I/O错误。                                    
  fencing:               //该选项设定一个策略来避免split brain的状况。有效的策略包括:                                    
    dont-care:  //默认策略。不采取任何隔离措施。                                    
    resource-only:   //在此策略下,如果一个节点处于split brain状态,它将尝试隔离对端节点的磁盘。这个操作通过调用fence-peer处理器来实现。fence-peer处理器将通过其它通信路径到达对等节点,并在这个对等节点上调用DRBDadm outdate res命令                                    
    resource-and-stonith:   //在此策略下,如果一个节点处于split brain状态,它将停止I/O操作,并调用fence-peer处理器。处理器通过其它通信路径到达对等节点,并在这个对等节点上调用DRBDadm outdate res命令。如果无法到达对等节点,它将向对等端发送关机命令。一旦问题解决,I/O操作将重新进行。如果处理器失败,你可以使用resume-io命令来重新开始I/O操作。                                    
    
 }                                    
 net {        //该配置段用来精细地调节DRBD的属性,网络相关的属性。常用的选项有:                                    
  # sndbuf-size rcvbuf-size timeout connect-int ping-int ping-timeout max-buffers     //这里是net段内可以定义的参数                                    
  # max-epoch-size ko-count allow-two-primaries cram-hmac-alg shared-secret      //这里是net段内可以定义的参数                                    
  # after-sb-0pri after-sb-1pri after-sb-2pri data-integrity-alg no-tcp-cork      //这里是net段内可以定义的参数                                    
  sndbuf-size:     //该选项用来调节TCP send buffer的大小,DRBD 8.2.7以前的版本,默认值为0,意味着自动调节大小;新版本的DRBD的默认值为128KiB。高吞吐量的网络(例如专用的千兆网卡,或负载均衡中绑定的连接)中,增加到512K比较合适,或者可以更高,但是最好不要超过2M。                                    
  timeout:        //该选项设定一个时间值,单位为0.1秒。如果搭档节点没有在此时间内发来应答包,那么就认为搭档节点已经死亡,因此将断开这次TCP/IP连接。默认值为60,即6秒。该选项的值必须小于connect-int和ping-int的值。                                    
  connect-int:     //如果无法立即连接上远程DRBD设备,系统将断续尝试连接。该选项设定的就是两次尝试间隔时间。单位为秒,默认值为10秒。                                    
  ping-timeout:    //该选项设定一个时间值,单位是0.1秒。如果对端节点没有在此时间内应答keep-alive包,它将被认为已经死亡。默认值是500ms。                                    
  max-buffers:     //该选项设定一个由DRBD分配的最大请求数,单位是页面大小(PAGE_SIZE),大多数系统中,页面大小为4KB。这些buffer用来存储那些即将写入磁盘的数据。最小值为32(即128KB)。这个值大一点好。                                    
  max-epoch-size:    //该选项设定了两次write barriers之间最大的数据块数。如果选项的值小于10,将影响系统性能。大一点好                                    
  ko-count:     //该选项设定一个值,把该选项设定的值 乘以 timeout设定的值,得到一个数字N,如果secondary节点没有在此时间内完成单次写请求,它将从集群中被移除(即,primary node进入StandAlong模式)。取值范围0~200,默认值为0,即禁用该功能。                                    
  allow-two-primaries:   //这个是DRBD8.0及以后版本才支持的新特性,允许一个集群中有两个primary node。该模式需要特定文件系统的支撑,目前只有OCFS2和GFS可以,传统的ext3、ext4、xfs等都不行!                                    
  cram-hmac-alg:    //该选项可以用来指定HMAC算法来启用对端节点授权。DRBD强烈建议启用对端点授权机制。可以指定/proc/crypto文件中识别的任一算法。必须在此指定算法,以明确启用对端节点授权机制,实现数据加密传输。                                    
  shared-secret:    //该选项用来设定在对端节点授权中使用的密码,最长64个字符。                                    
  data-integrity-alg:   //该选项设定内核支持的一个算法,用于网络上的用户数据的一致性校验。通常的数据一致性校验,由TCP/IP头中所包含的16位校验和来进行,而该选项可以使用内核所支持的任一算法。该功能默认关闭。                                    
 }                                    
 syncer {       //该配置段用来更加精细地调节服务的同步进程。常用选项有                                    
  # rate after al-extents use-rle cpu-mask verify-alg csums-alg                                    
  rate:    //设置同步时的速率,默认为250KB。默认的单位是KB/sec,也允许使用K、M和G,如40M。注意:syncer中的速率是以bytes,而不是bits来设定的。配置文件中的这个选项设置的速率是永久性的,但可使用下列命令临时地改变rate的值:DRBDsetup /dev/DRBDN syncer -r 100M。如果想重新恢复成drbd.conf配置文件中设定的速率,执行如下命令: DRBDadm adjust resource                                    
  verify-alg:    //该选项指定一个用于在线校验的算法,内核一般都会支持md5、sha1和crc32c校验算法。在线校验默认关闭,必须在此选项设定参数,以明确启用在线设备校验。DRBD支持在线设备校验,它以一种高效的方式对不同节点的数据进行一致性校验。在线校验会影响CPU负载和使用,但影响比较轻微。DRBD 8.2.5及以后版本支持此功能。一旦启用了该功能,你就可以使用下列命令进行一个在线校验: DRBDadm verify resource。该命令对指定的resource进行检验,如果检测到有数据块没有同步,它会标记这些块,并往内核日志中写入一条信息。这个过程不会影响正在使用该设备的程序。                                    
                    如果检测到未同步的块,当检验结束后,你就可以如下命令重新同步它们:DRBDadm disconnect resource   or   DRBDadm connetc resource                                    
 }                                    
}                                    
  
common段是用来定义共享的资源参数,以减少资源定义的重复性。common段是非必须的。resource段一般为DRBD上每一个节点来定义其资源参数的。                                    
资源配置文件详解                                     
    
[root@huanqiu ~]# cat /etc/drbd.d/web.res                                    
resource web {       //web为资源名称                                    
 on ha1.xsl.com {                       //on后面为节点的名称,有几个节点就有几个on段,这里是定义节点ha1.xsl.com上的资源                                    
  device   /dev/DRBD0;       //定义DRBD虚拟块设备,这个设备事先不要格式化。                                    
  disk /dev/sda6;        //定义存储磁盘为/dev/sda6,该分区创建完成之后就行了,不要进行格式化操作                                    
  address 192.168.108.199:7789;      //定义DRBD监听的地址和端口,以便和对端进行通信                                    
  meta-disk  internal;       //该参数有2个选项:internal和externally,其中internal表示将元数据和数据存储在同一个磁盘上;而externally表示将元数据和数据分开存储,元数据被放在另一个磁盘上。                                    
 }                                    
 on ha2.xsl.com {        //这里是定义节点ha2.xsl.com上的资源                                    
  device /dev/DRBD0;                                    
  disk /dev/sda6;                                    
  address 192.168.108.201:7789;                                    
  meta-disk internal;                                    
 }                                    
}                                    

----------------------------------------------------------------------------------------------------------------------------------------    

十、Centos下DRBD的安装记录(主从模式)
DRBD(Distributed Replicated Block Device) 可以理解为它其实就是个网络RAID-1,两台服务器间就算某台因断电或者宕机也不会对数据有任何影响,
而真正的热切换可以通过Keepalived或Heartbeat方案解决,不需要人工干预。废话不多说了,下面记录下在centos下安装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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
1)服务器信息(centos6.8)                                    
192.168.1.151   主服务器     主机名:Primary                                     
192.168.1.152   备服务器     主机名:Secondary                                    
-------------------------------------------------------------------------------------------------------------------------                                    
2)两台机器的防火墙要相互允许访问。最好是关闭selinux和iptables防火墙(两台机器同样操作)                                    
[root@Primary ~]# setenforce 0             //临时性关闭;永久关闭的话,需要修改/etc/sysconfig/selinux的SELINUX为disabled                                    
[root@Primary ~]# /etc/init.d/iptables stop                                    
-------------------------------------------------------------------------------------------------------------------------                                    
3)设置hosts文件(两台机器同样操作)                                    
[root@Primary drbd-8.4.3]# vim /etc/hosts                                    
......                                    
192.168.1.151 Primary                                    
192.168.1.152 Secondary                                    
-------------------------------------------------------------------------------------------------------------------------                                    
4)两台机器同步时间                                    
[root@Primary ~]# yum install -y netpdate                                    
[root@Primary ~]# ntpdate -u asia.pool.ntp.org                                    
-------------------------------------------------------------------------------------------------------------------------                                    
5)DRBD的安装配置(两台机器上同样操作)                                    
这里采用yum方式安装                                    
    
[root@Primary ~]# rpm -ivh http://www.elrepo.org/elrepo-release-6-6.el6.elrepo.noarch.rpm                                    
[root@Primary ~]# yum -y install drbd83-utils kmod-drbd83                                    
   
注意:上面是centos6的安装方式,如果是centos7,则安装方式如下:                                    
# rpm -ivh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm                                    
# yum install -y drbd84-utils kmod-drbd84                                    
   
加载模块:                                    
[root@Primary ~]# modprobe drbd                                    
查看模块是否已加上                                    
[root@Primary ~]# lsmod |grep drbd                                    
drbd                  332493  0                                    
-------------------------------------------------------------------------------------------------------------------------                                    
6)DRBD配置(两台机器上同样操作)                                    
[root@Primary ~]# 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";                                    
    
[root@Primary ~]# cp /etc/drbd.d/global_common.conf /etc/drbd.d/global_common.conf.bak                                    
[root@Primary ~]# vim /etc/drbd.d/global_common.conf                                    
global {                                    
  usage-count yes;                                    
  # minor-count dialog-refresh disable-ip-verification                                    
}                                    
   
common {                                    
  protocol C;                                    
   
  handlers {                                    
    # These are EXAMPLE handlers only.                                    
    # They may have severe implications,                                    
    # like hard resetting the node under certain circumstances.                                    
    # Be careful when chosing your poison.                                    
   
    # 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          240;                                    
        degr-wfc-timeout     240;                                    
        outdated-wfc-timeout 240;                                    
  }                                    
   
  disk {                                    
        on-io-error detach;                                    
  }                                    
   
  net {                                    
        cram-hmac-alg md5;                                    
        shared-secret "testdrbd";                                    
  }                                    
   
  syncer {                                    
        rate 30M;                                    
  }                                    
}                                    
    
[root@Primary ~]# vim /etc/drbd.d/r0.res                                    
resource r0 {                                    
on Primary {                                    
  device     /dev/drbd0;           //这是Primary机器上的DRBD虚拟块设备,事先不要格式化                                    
  disk       /dev/vdd1;                                    
  address    192.168.1.151:7898;                                    
  meta-disk  internal;                                    
 }                                    
on Secondary {                                    
  device     /dev/drbd0;          //这是Secondary机器上的DRBD虚拟块设备,事先不要格式化                                    
  disk       /dev/vde1;                                    
  address    192.168.1.152:7898;     //DRBD监听的地址和端口。端口可以自己定义                                    
  meta-disk  internal;                                    
 }                                    
}                                    
-------------------------------------------------------------------------------------------------------------------------                                    
7)在两台机器上添加DRBD磁盘                                    
   
在Primary机器上添加一块10G的硬盘作为DRBD,分区为/dev/vdd1,不做格式化,并在本地系统创建/data目录,不做挂载操作。                                    
[root@Primary ~]# fdisk -l                                    
......                                    
[root@Primary ~]# fdisk /dev/vdd                                          
依次输入"n->p->1->1->回车->w"                                    //分区创建后,再次使用"fdisk /dev/vdd",输入p,即可查看到创建的分区,比如/dev/vdd1                                    
   
在Secondary机器上添加一块10G的硬盘作为DRBD,分区为/dev/vde1,不做格式化,并在本地系统创建/data目录,不做挂载操作。                                    
[root@Secondary ~]# fdisk -l                                    
......                                    
[root@Secondary ~]# fdisk /dev/vde                                          
依次输入"n->p->1->1->回车->w"                                    
-------------------------------------------------------------------------------------------------------------------------                                    
8)在两台机器上分别创建DRBD设备并激活r0资源(下面操作在两台机器上都要执行)                                    
   
[root@Primary ~]# mknod /dev/drbd0 b 147 0                                    
mknod: `/dev/drbd0': File exists                                    
   
[root@Primary ~]# drbdadm create-md r0                                    
Writing meta data...                                    
initializing activity log                                    
NOT initialized bitmap                                    
New drbd meta data block successfully created.                                    
   
再次输入该命令进行激活r0资源                                    
[root@Primary ~]# drbdadm create-md r0                                    
You want me to create a v08 style flexible-size internal meta data block.                                    
There appears to be a v08 flexible-size internal meta data block                                    
already in place on /dev/vdd1 at byte offset 10737340416                                    
Do you really want to overwrite the existing v08 meta-data?                                    
[need to type 'yes' to confirm] yes                                  //这里输入"yes"                                    
Writing meta data...                                    
initializing activity log                                    
NOT initialized bitmap                                    
New drbd meta data block successfully created.                                    
   
启动drbd服务(注意:需要主从共同启动方能生效)                                    
[root@Primary ~]# /etc/init.d/drbd start                                    
Starting DRBD resources: [ d(r0) s(r0) n(r0) ]....                                    
[root@Primary ~]# ps -ef|grep drbd                                    
root      5174     2  0 02:25 ?        00:00:00 [drbd0_worker]                                    
root      5193     2  0 02:25 ?        00:00:00 [drbd0_receiver]                                    
root      5207     2  0 02:25 ?        00:00:00 [drbd0_asender]                                    
root      5211 18667  0 02:25 pts/0    00:00:00 grep --color drbd                                    
   
查看状态(两台机器上都执行查看)                                    
[root@Primary ~]# cat /proc/drbd                                    
version: 8.3.16 (api:88/proto:86-97)                                    
GIT-hash: a798fa7e274428a357657fb52f0ecf40192c1985 build by phil@Build64R6, 2014-11-24 14:51:37                                    
 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:10485332                                    
   
或者                                    
[root@Primary ~]# /etc/init.d/drbd status                                    
drbd driver loaded OK; device status:                                    
version: 8.3.16 (api:88/proto:86-97)                                    
GIT-hash: a798fa7e274428a357657fb52f0ecf40192c1985 build by phil@Build64R6, 2014-11-24 14:51:37                                    
m:res  cs         ro                   ds                         p  mounted  fstype                                    
0:r0   Connected  Secondary/Secondary  Inconsistent/Inconsistent  C                                    
   
由上面两台主机的DRBD状态查看结果里的ro:Secondary/Secondary表示两台主机的状态都是备机状态,ds是磁盘状态,显示的状态内容为“不一致”,这是因为DRBD无法判断哪一方为主机,                                    
应以哪一方的磁盘数据作为标准。                                    
   
-------------------------------------------------------------------------------------------------------------------------                                    
9)接着将Primary主机配置为DRBD的主节点                                    
[root@Primary ~]# drbdsetup /dev/drbd0 primary --force                                    
   
分别查看主从DRBD状态:                                    
[root@Primary ~]# /etc/init.d/drbd status                                    
drbd driver loaded OK; device status:                                    
version: 8.3.16 (api:88/proto:86-97)                                    
GIT-hash: a798fa7e274428a357657fb52f0ecf40192c1985 build by phil@Build64R6, 2014-11-24 14:51:37                                    
m:res  cs          ro                 ds                     p  mounted  fstype                                    
...    sync'ed:    1.5%               (10096/10236)M                                    
0:r0   SyncSource  Primary/Secondary  UpToDate/Inconsistent  C                                    
   
[root@Secondary ~]# /etc/init.d/drbd status                                    
drbd driver loaded OK; device status:                                    
version: 8.3.16 (api:88/proto:86-97)                                    
GIT-hash: a798fa7e274428a357657fb52f0ecf40192c1985 build by phil@Build64R6, 2014-11-24 14:51:37                                    
m:res  cs          ro                 ds                     p  mounted  fstype                                    
...    sync'ed:    12.5%              (8960/10236)M                                    
0:r0   SyncTarget  Secondary/Primary  Inconsistent/UpToDate  C                                    
   
ro在主从服务器上分别显示 Primary/Secondary和Secondary/Primary                                    
ds显示UpToDate/UpToDate 表示主从配置成功                                    
-------------------------------------------------------------------------------------------------------------------------                                    
10)挂载DRBD  (Primary主节点机器上操作)                                    
从上面Primary主节点的DRBD状态上看到mounted和fstype参数为空,所以这步开始挂载DRBD到系统目录                                    
   
先格式化/dev/drbd0                                    
[root@Primary ~]# mkfs.ext4 /dev/drbd0                                    
   
创建挂载目录,然后执行DRBD挂载                                    
[root@Primary ~]# mkdir /data                                    
[root@Primary ~]# mount /dev/drbd0 /data                                    
[root@Primary ~]# df -h                                    
Filesystem            Size  Used Avail Use% Mounted on                                    
/dev/mapper/VolGroup00-LogVol00                                    
                      156G   36G  112G  25% /                                    
tmpfs                 2.9G     0  2.9G   0% /dev/shm                                    
/dev/vda1             190M   98M   83M  55% /boot                                    
/dev/drbd0            9.8G   23M  9.2G   1% /data                                    
   
特别注意:                                    
Secondary节点上不允许对DRBD设备进行任何操作,包括只读,所有的读写操作只能在Primary节点上进行。                                    
只有当Primary节点挂掉时,Secondary节点才能提升为Primary节点                                    
-------------------------------------------------------------------------------------------------------------------------                                    
11)DRBD主备故障切换测试                                    
   
模拟Primary节点发生故障,Secondary接管并提升为Primary                                    
   
下面是在Primary主节点上操作记录:                                    
[root@Primary ~]# cd /data                                    
[root@Primary data]# touch wangshibo wangshibo1 wangshibo2 wangshibo3                                    
[root@Primary data]# cd ../                                    
[root@Primary /]# umount /data                                    
   
[root@Primary /]# drbdsetup /dev/drbd0 secondary              //将Primary主机设置为DRBD的备节点。在实际生产环境中,直接在Secondary主机上提权(即设置为主节点)即可。                                    
[root@Primary /]# /etc/init.d/drbd status                                    
drbd driver loaded OK; device status:                                    
version: 8.3.16 (api:88/proto:86-97)                                    
GIT-hash: a798fa7e274428a357657fb52f0ecf40192c1985 build by phil@Build64R6, 2014-11-24 14:51:37                                    
m:res  cs         ro                   ds                 p  mounted  fstype                                    
0:r0   Connected  Secondary/Secondary  UpToDate/UpToDate  C                                    
   
注意:这里实际生产环境若Primary主节点宕机,在Secondary状态信息中ro的值会显示为Secondary/Unknown,只需要进行DRBD提权操作即可。                                    
   
下面是在Secondary 备份节点上操作记录:                                    
先进行提权操作,即将Secondary手动升级为DRBD的主节点                                    
[root@Secondary ~]# drbdsetup /dev/drbd0 primary                                    
[root@Secondary ~]# /etc/init.d/drbd status                                    
drbd driver loaded OK; device status:                                    
version: 8.3.16 (api:88/proto:86-97)                                    
GIT-hash: a798fa7e274428a357657fb52f0ecf40192c1985 build by phil@Build64R6, 2014-11-24 14:51:37                                    
m:res  cs         ro                 ds                 p  mounted  fstype                                    
0:r0   Connected  Primary/Secondary  UpToDate/UpToDate  C                                    
   
然后挂载DRBD                                    
[root@Secondary ~]# mkdir /data                                    
[root@Secondary ~]# mount /dev/drbd0 /data                                    
[root@Secondary ~]# df -h                                    
Filesystem            Size  Used Avail Use% Mounted on                                    
/dev/mapper/VolGroup00-LogVol00                                    
                      156G   13G  135G   9% /                                    
tmpfs                 2.9G     0  2.9G   0% /dev/shm                                    
/dev/vda1             190M   89M   92M  50% /boot                                    
/dev/vdd              9.8G   23M  9.2G   1% /data2                                    
/dev/drbd0            9.8G   23M  9.2G   1% /data                                    
   
发现DRBD挂载目录下已经有了之前在远程Primary主机上写入的内容                                    
[root@Secondary ~]# cd /data                                    
[root@Secondary data]# ls                                    
wangshibo  wangshibo1  wangshibo2  wangshibo3                                    
   
[root@Secondary ~]# /etc/init.d/drbd status                                    
drbd driver loaded OK; device status:                                    
version: 8.3.16 (api:88/proto:86-97)                                    
GIT-hash: a798fa7e274428a357657fb52f0ecf40192c1985 build by phil@Build64R6, 2014-11-24 14:51:37                                    
m:res  cs         ro                 ds                 p  mounted  fstype                                    
0:r0   Connected  Primary/Secondary  UpToDate/UpToDate  C  /data    ext4                                    
  
在Secondary节点上继续写入数据                                    
[root@Secondary data]# touch huanqiu huanqiu1 huanqiu2 huanqiu3                                    
  
然后模拟Secondary节点故障,Primary节点再提权升级为DRBD主节点(操作同上,此处省略.......)                                    
 
最后,使用命令fdisk -l查看本机磁盘情况,可以发现DRBD的磁盘/dev/drbd0                                    
[root@Secondary ~]# fdisk -l                                    
.......                                    
.......                                    
Disk /dev/drbd0: 10.7 GB, 10736979968 bytes                                    
255 heads, 63 sectors/track, 1305 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                                    

到此,DRBD的主从环境的部署工作已经完成。不过上面是记录的是主备手动切换,至于保证DRBD主从结构的智能切换,实现高可用,还需里用到Keepalived或Heartbeat来实现了(会在DRBD主端挂掉的情况下,自动切换从端为主端并自动挂载/data分区)    

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
----------------------------------------------------------------------------------------------------------------------------------                                    
最后说一下"Split-Brain"(脑裂)的情况:                                    
  
假设把Primary主机的的eth0设备宕掉,然后直接在Secondary主机上进行提权升级为DRBD的主节点,并且mount挂载DRBD,这时会发现之前在Primary主机上写入的数据文件确实同步过来了。                                    
接着再把Primary主机的eth0设备恢复,看看有没有自动恢复 主从关系。经过查看,发现DRBD检测出了Split-Brain的状况,也就是两个节点都处于standalone状态,                                    
故障描述如下:Split-Brain detected,dropping connection! 这就是传说中的“脑裂”。                                    
  
DRBD官方推荐的手动恢复方案:                                    
  
1)Secondary主机上的操作                                    
# drbdadm secondary r0                                    
# drbdadm disconnect all                                    
# drbdadm --discard-my-data connect r0            //或者"drbdadm  --  --discard-my-data  connect r0"                                    
  
2)Primary主机上的操作                                    
# drbdadm disconnect all                                    
# drbdadm connect r0                                    
# drbdsetup /dev/drbd0 primary                                    
----------------------------------------------------------------------------------------------------------------------------------                                    
 
另外,还可以使用下面的命令查看DRBD状态:                                    
[root@Primary ~]# drbd-overview                                    
  0:r0  Connected Primary/Secondary UpToDate/UpToDate C r----- /data ext4 9.8G 23M 9.2G 1%                                    
 
[root@Secondary ~]# drbd-overview                                    
  0:r0  Connected Secondary/Primary UpToDate/UpToDate C r-----                                    
*************** 当你发现自己的才华撑不起野心时,就请安静下来学习吧!***************


来自  https://www.cnblogs.com/kevingrace/p/5740940.html



drbd配置参数

2013/06/26 16:00
阅读数 400
用户手册:
语法及详解参数:
官方示例:

 

drbd及其配置文件中的相关名词:

failover:失效转移。通俗地说,即当A无法为客户服务时,系统能够自动地切换,使B能够及时地顶上继续为客户提供服务,且客户感觉不到这个为他提供服务的对象已经更换。(注:来自百度百科。)
 
diskless mode:无盘模式。在此模式下,节点放弃自己的底层设备,转而通过网络到远程节点上去读写数据。
 
peer:对等端,在两个NameNode的环境下,指另外一个NameNode
 
stonith:Shoot The Other Node In The Head的简写,爆其它节点的头!它是避免split brain的一个措施,若发生split brain,则一个node会发出指令让另一个node关机,避免两台node都浮动成primary。但这个功能本身也有一定的风险。
 
fence- peer:drbd有一个机制,当复制连接被中断时它将隔离对等节点。drbd为这个机制定义一个接口,而与heartbeat绑定的drbd- peer-outdater helper就是个通过此接口来实现此机制的工具。但是我们可以很轻松地实施我们自己的peer fencing helper程序,而实施我们自己的peer fencing程序的前提条件之一就是,必须在handlers配置段中定义fence-peer处理器!
 
StandAlong mode:即节点无法与其它节点进行通信的状态。
 
write barriers:日志文件系统中的一种保护机制,用来保持数据的一致性。
日 志文件系统在磁盘的专门区域维护着一个日志。当文件系统发觉到元数据的变化时,它将首先把这些变化写入日志,而不是立刻去更改元数据。当这些变化信息(事 件信息)写入日志后,文件系统将向日志中添加一个“提交报告”来表明文元数据的更改是合法的。只有当“提交报告”写入日志后,内核才会真正对元数据进行写 操作。
在 写“提交报告”以前,必须完全保证事件信息已经写入了日志。仅仅如此还不够,与此同时驱动器还维护了一个巨大的内部caches,而且为了更好的性能表 现,它会重新对操作进行排序,所以在写“提交报告”之前,文件系统必须明确地指导磁盘来获取所有的日志数据,并存入介质。如果“提交报告”先于事件信息写 入日志,日志将被损坏!
内核的I/O子系统通过使用barriers来实现上述功能。大体来说,一个barrier生成后,它将禁止其后的所有数据块的写入,直到该barrier之前的数据块写入被提交到介质。
注意:ext3和ext4文件系统默认不使用barriers,管理员必须明确启用它们才能使用该功能。而且,并非所有文件系统都支持barrier。
 
meta data:DRBD在专门的区域存储关于数据的各种各样的信息,这些信息就是metadata,它包括如下信息:
1、 DRBD设备的空间大小
2、 Generation Identifier(GI)
3、 Activity Log(AL)
4、 quick-sync bitmap
这些metadata有两种存储方式:internallyexternally。存储方式是在每个resource配置段中指定的。这两种存储方式各有优缺点。
Internal metadata:
一个resource被配置成使用internal metadata,意味着DRBD把它的metadata,和实际生产数据存储于相同的底层物理设备中。该存储方式是在设备的最后位置留出一个区域来存储metadata。
该存储方式的优点是:因为metadata是和实际生产数据紧密联系在一起的,如果发生了硬盘损坏,不需要管理员做额外的工作,因为metadata会随实际生产数据的丢失而丢失,同样会随着生产数据的恢复而恢复。
它的缺点在于:如果底层设备只有一块物理硬盘(和RAID相反),这种存储方式对写操作的吞吐量有负面影响,因为应用程序的写操作请求会触发DRBD的metadata的更新。如果metadata存储于硬盘的同一块盘片上,那么,写操作会导致额外的两次磁头读写移动。
要 注意的是:如果你打算在已有数据的底层设备中使用internal metadata,需要计算并留出DRBD的metadata所占的空间大小,并采取一些特殊的操作,否则很有可能会破坏掉原有的数据!至于需要什么样的 特殊操作,可以参考本条目末尾的链接文章。我要说的是,最好不要这样做!
external metadata:
该存储方式比较简单,就是把metadata存储于一个和生产数据分开的专门的设备块中。
它的优点:对某些写操作,提供某些潜在的改进。
缺点:因为metadata和生产数据是分开的,如果发生了硬盘损坏,在更换硬盘后,需要管理员进行人工干预,从其它存活的节点向刚替换的硬盘进行完全的数据同步。
什么时候应该使用exteranl的存储方式:设备中已经存有数据,而该设备不支持扩展(如LVM),也不支持收缩(shrinking)。
如果计算DRBD的元数据所需要的确切空间:

   注:图片来自drbd官网。

Cs是磁盘的扇区数,Ms也是使用扇区数来描述的,要转化成MB,除以2048即可。
扇区数可以使用公式echo $(( $(blockdev --getsize64  device) / 512))来计算。
  

drbd配置文件:

drbd安装完成后,会自动创建一个配置文件/etc/drbd.conf,内容为空,但你可以找到一个模板文件/usr/share/doc/drbd.../drbd.conf,该模板文件只有两个include语句。
为什么模板文件如此简洁?
drbd 的配置文件分成三个部分:global、common和resource。这三部分虽然可以全部写入一个/etc/drbd.conf文件中,但是按照官 方惯例,这三部分是分开的:/etc/drbd.d目录下的global_common.conf文件包含global和common配置段,而目录下的 每个.res文件包含一个resource配置段。
 
关于global 配置段:
如果所有配置段都在同一个drbd.conf文件中,则该配置必须放在最顶端。
常用选项:
minor-count:从(设备)个数,取值范围1~255,默认值为32。该选项设定了允许定义的resource个数,当要定义的resource超过了此选项的设定时,需要重新载入drbd内核模块。
dialog-refresh timetime取值0,或任一正数。默认值为1。我没理解官方对该选项的解释。很少见到此选项被启用。
disable-ip-verification:是否禁用ip检查
usage-count:是否参加用户统计,合法参数为yes、no或ask
根据官方示例的说法,一般只配置usage-count选项即可。不过,说实话,drbd的官方文档确实挺操蛋,有些地方说的比较含糊。当然,也有我水平有限的原因。
 
  关于common 配置段:
该配置段不是必须的,但可以用来设定多个resource共有的选项,以减少重复性工作。该配置段中又包含如下配置段:disk、net、startup、syncer和handlers。
 
disk配置段:
该配置段用来精细地调节drbd底层存储的属性。译者注:这是一个非常重要的配置段,如果底层设备(磁盘)发生了错误或损坏,该配置段将按照设定的策略发生作用。
常用选项:
on-io-error选项:此选项设定了一个策略,如果底层设备向上层设备报告发生I/O错误,将按照该策略进行处理。有效的策略包括:
 pass_on: 把I/O错误报告给上层设备。如果错误发生在primary节点,把它报告给文件系统,由上层设备处理这些错误(例如,它会导致文件系统以只读方式重新挂 载),它可能会导致drbd停止提供服务;如果发生在secondary节点,则忽略该错误(因为secondary节点没有上层设备可以报告)。该策略 曾经是默认策略,但现在已被detach所取代。
  call- local-io-error:调用预定义的本地local-io-error脚本进行处理。该策略需要在resource配置段的handlers部 分,预定义一个相应的local-io-error命令调用。该策略完全由管理员通过local-io-error命令(或脚本)调用来控制如何处理 I/O错误。

 detach: 发生I/O错误的节点将放弃底层设备,以diskless mode继续工作。在diskless mode下,只要还有网络连接,drbd将从secondary node读写数据,而不需要failover。该策略会导致一定的损失,但好处也很明显,drbd服务不会中断。官方推荐和默认策略。

译者注:如果使用detach策略来处理底层I/O错误,该策略会不会报告错误给管理员,以便管理员手动更换此节点的磁盘呢? handler处理器部分应该会有这方面的内容。
 
fencing选项:该选项设定一个策略来避免split brain的状况。有效的策略包括:
dont-care:默认策略。不采取任何隔离措施。
resource- only:在此策略下,如果一个节点处于split brain状态,它将尝试隔离对等端的磁盘。这个操作通过调用fence-peer处理器来实现。fence-peer处理器将通过其它通信路径到达对等 节点,并在这个对等节点上调用drbdadm outdate res命令。
 resource- and-stonith:在此策略下,如果一个节点处于split brain状态,它将停止I/O操作,并调用fence-peer处理器。处理器通过其它通信路径到达对等节点,并在这个对等节点上调用drbdadm outdate res命令。如果无法到达对等节点,它将向对等端发送关机命令。一旦问题解决,I/O操作将重新进行。如果处理器失败,你可以使用resume-io命令 来重新开始I/O操作。
 
net配置段:
该配置段用来精细地调节drbd的属性,网络相关的属性。常用的选项有: 
sndbuf- size:该选项用来调节TCP send buffer的大小,drbd 8.2.7以前的版本,默认值为0,意味着自动调节大小;新版本的drbd的默认值为128KiB。高吞吐量的网络(例如专用的千兆网卡,或负载均衡中绑 定的连接)中,增加到512K比较合适,或者可以更高,但是最好不要超过2M。
timeout:该选项设定一个时间值,单位为0.1秒。如果搭档节点没有在此时间内发来应答包,那么就认为搭档节点已经死亡,因此将断开这次TCP/IP连接。默认值为60,即6秒。该选项的值必须小于connect-int和ping-int的值。
connect-int:如果无法立即连接上远程DRBD设备,系统将断续尝试连接。该选项设定的就是两次尝试间隔时间。单位为秒,默认值为10秒。
ping-int:该选项设定一个时间值,单位为秒。如果连接到远程DRBD设备的TCP/IP的空闲时间超过此值,系统将生成一个keep-alive包来检测对等节点是否还存活。默认值为10秒。
ping-timeout:该选项设定一个时间值,单位是0.1秒。如果对等端没有在此时间内应答keep-alive包,它将被认为已经死亡。默认值是500ms。
max-buffers:该选项设定一个由drbd分配的最大请求数,单位是页面大小(PAGE_SIZE),大多数系统中,页面大小为4KB。这些buffer用来存储那些即将写入磁盘的数据。最小值为32(即128KB)。这个值大一点好。
max-epoch-size:该选项设定了两次write barriers之间最大的数据块数。如果选项的值小于10,将影响系统性能。大一点好。
 
用 户手册的另外一部分也提到了max-buffers和max-epoch-size,跟drbd.conf部分的解释稍有不同:drbd.conf的帮助 文档中说,max-buffers设定的是最大请求数,max-epoch-size设定的是最高的数据块数;而这部分的帮助文档说,这两个选项影响的是 secondary节点写操作的性能,max-buffers设定的是最大的buffers数,这些buffers是drbd系统是为即将写入磁盘的数据 而分配的;max-epoch-size设定的是两次write barrier之间所允许的最大请求数。
多数情况下,这两个选项应该并行地设置,而且两个选项的值应该保持一致。两个选项的默认值都是2048,在大多数合理的高性能硬件RAID控制器中,把它们设定为8000比较好。
两个部分的解释结合起来看,max-buffers设定的是最大的数据块数,max-epoch-size设定的是所能请求的最大块数。
 
ko- count:该选项设定一个值,把该选项设定的值 乘以 timeout设定的值,得到一个数字N,如果secondary节点没有在此时间内完成单次写请求,它将从集群中被移除(即,primary node进入StandAlong模式)。取值范围0~200,默认值为0,即禁用该功能。
allow-two-primaries:这个是drbd8.0及以后版本才支持的新特性,允许一个集群中有两个primary node。该模式需要特定文件系统的支撑,目前只有OCFS2和GFS可以,传统的ext3、ext4、xfs等都不行!
cram-hmac-alg:该选项可以用来指定HMAC算法来启用对等节点授权。drbd强烈建议启用对等节点授权机制。可以指定/proc/crypto文件中识别的任一算法。必须在此指定算法,以明确启用对等节点授权机制。
shared-secret:该选项用来设定在对待节点授权中使用的密码,最长64个字符。
data-integrity-alg:该选项设定内核支持的一个算法,用于网络上的用户数据的一致性校验。通常的数据一致性校验,由TCP/IP头中所包含的16位校验和来进行,而该选项可以使用内核所支持的任一算法。该功能默认关闭。
 
另外,还有after-sb-0pri, after-sb-1pri, after-sb-2pri这三个选项,split brian有关。
 
startup 配置段:
该配置段用来更加精细地调节drbd属性,它作用于配置节点在启动或重启时。

译者注:我曾试过不配置此部分,在首次启用第二个节点的DRBD块设备时,遇到了一个问题:它一直在等待有一个对等节点出现,而迟迟不肯启动,必须手动让它停止等待。如下: 

 常用选项有:
 wfc-timeout:该选项设定一个时间值,单位是秒。在启用DRBD块时,初始化脚本drbd会阻塞启动进程的运行,直到对等节点的出现。该选项就是用来限制这个等待时间的,默认为0,即不限制,永远等待。
 degr-wfc-timeout:该选项也设定一个时间值,单位为秒。也是用于限制等待时间,只是作用的情形不同:它作用于一个降级集群(即那些只剩下一个节点的集群)在重启时的等待时间。
 outdated-wfc-timeout:同上,也是用来设定等待时间,单位为秒。它用于设定等待过期节点的时间。
 
syncer 配置段:
该配置段用来更加精细地调节服务的同步进程。
常用选项有:
 rate:设置同步时的速率,默认为250KB。默认的单位是KB/sec,也允许使用K、M和G,如40M。注意:syncer中的速率是以bytes,而不是bits来设定的。
配置文件中的这个选项设置的速率是永久性的,但可使用下列命令临时地改变rate的值:
drbdsetup /dev/drbdnum syncer -r 100M
把上述命令中红色的num替换成你的drbd设备的从设备号。只能在所有节点的其中一个节点上运行此命令。
如果想重新恢复成drbd.conf配置文件中设定的速率,执行如下命令: 
drbdadm adjust resource
 
官方提示:速率的设定,最好设为有效可用带宽的30%。所谓有效可用带宽,是指网络带宽和磁盘读写速度中的最小者。有两个示例:
如果I/O子系统所能维持的读写速度为180MB/s,而千兆网络所能维持的网络吞吐速度为110MB/s,那么有效可用带宽为110MB/s,该选项的推荐值为110 x 0.3 = 33MB/s。
如果I/O速度为80MB/s,而网络连接速度可达千兆,那么有效可用带宽为80MB/s,推荐的rate速率应该为80 x 0.3 = 24MB/s
 
 al- extents:该选项用来设定hot area(即active set)的块数,取值范围是7~3843,默认为127,每个块标志4M大小的底层存储(即底层设备)。DRBD会自动检测host area,如果主节点意外地从集群中断开,当该节点重新加入集群时,hot area所覆盖的区域必须被重新同步。hot area的每次变化,实际上都是对metadata区域的写操作,因此,该选项的值越大,重新同步的时间越长,但需要更新的meta-data也越少。
而 用户手册的另外一部分提到,al-extents调整的是Activity Log的大小。如果使用DRBD设备的应用程序的写操作比较密集,那么,一般建议使用较大的Activity Log(active set),否则metadata频繁的更新操作会影响到写操作的性能。建议值:3389。
 
 verify- alg:该选项指定一个用于在线校验的算法,内核一般都会支持md5、sha1和crc32c校验算法。在线校验默认关闭,必须在此选项设定参数,以明确 启用在线设备校验。DRBD支持在线设备校验,它以一种高效的方式对不同节点的数据进行一致性校验。在线校验会影响CPU负载和使用,但影响比较轻微。 drbd 8.2.5及以后版本支持此功能。
一旦启用了该功能,你就可以使用下列命令进行一个在线校验: 
drbdadm verify resource
 
该命令对指定的resource进行检验,如果检测到有数据块没有同步,它会标记这些块,并往内核日志中写入一条信息。这个过程不会影响正在使用该设备的程序。
如果检测到未同步的块,当检验结束后,你就可以如下命令重新同步它们:
drbdadm disconnect resource
drbdadm connetc resource
 
可以安排一个cron任务来自动执行在线校验,如:
42 0 * * 0 root /sbin/drbdadm verify resource
 
如果开启了所有资源的在线检验,可以使用如下命令:
42 0 * * 0 root /sbin/drbdadm verify all
 
 csums- alg:该选项指定一个校验算法,用来标志数据块。如果不启用该选项,rsync会从source发送所有的数据块到destination;而如果启用 了此选项,那么rsync将只交换那些校验值不同的数据块,当网络带宽有限时,此选项非常有用。而且,在重启一个崩溃的primary节点时,该选项会降 低CPU带宽的占用。
 
handlers:
该配置段用来定义一系列处理器,用来回应特定事件。

来自   https://my.oschina.net/amoshuang/blog/140612

普通分类: