玩转企业集群运维管理系列(十六):DRBD 配置文件与运维管理

2023-12-19 18:49:32 浏览数 (1)

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

全局配置项(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的基本操作

如何查看drbd 状态
代码语言:javascript复制
drbd-overview

各个字段根据本机实际准,释义如下:

代码语言:javascript复制
0:test1/0            #drbd盘id
Connected            #连接状态
Primary/Secondary    #本地盘角色/对端盘角色
UpToDate/UpToDate    #本地同步状态/对端盘同步状态
/data/test           #挂载点(盘被挂载才会显示)
xfs                  #文件系统(盘被挂载才会显示)
4.1T                 #总容量(盘被挂载才会显示)
485G                 #已用容量(盘被挂载才会显示)
3.7T                 #剩余容量(盘被挂载才会显示)
12%                  #使用率(盘被挂载才会显示)
内核查看
代码语言:javascript复制
root@sr01n02:~# cat /proc/drbd 
version: 8.4.11-1 (api:1/proto:86-101)
GIT-hash: 66145a308421e9c124ec391a7848ac20203bb03c build by root@c165, 2019-08-19 15:26:38
0: cs:Connected ro:Primary/Secondary ds:UpToDate/Diskless A r-----
ns:1607893187 nr:0 dw:865871622 dr:1018289021 al:19682555 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:204143444
1: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate A r-----
ns:0 nr:438102284 dw:2129640104 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:d oos:0

参数说明

代码语言:javascript复制
cs  #connect state  
ro  #表示角色信息  
ds  #磁盘状态信息Inconsistent/UpToDate  
ns/nr  #网络发送/接收的数据包信息  
dw/dr  #设备读写信息
查看资源连接状态
代码语言:javascript复制
drbdadm cstate  资源名

资源连接状态;因为情况不同,表现的状态不一样可能是以下的一种:

代码语言:javascript复制
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  #以本地节点为验证目标的线上设备验证正在执行。

查看硬盘状态

代码语言:javascript复制
drbdadm dstate 资源名  

本地和对等节点的硬盘有可能为下列状态之一:

代码语言:javascript复制
Diskless 无盘  #本地没有块设备分配给DRBD使用,这表示没有可用的设备,或者使用drbdadm命令手工分离或是底层的I/O错误导致自动分离。 
Attaching  #读取无数据时候的瞬间状态。  
Failed 失败  #本地块设备报告I/O错误的下一个状态,其下一个状态为Diskless无盘。  
Negotiating  #在已经连接的DRBD设置进行Attach读取无数据前的瞬间状态。  
Inconsistent  #数据是不一致的,在两个节点上(初始的完全同步前)这种状态出现后立即创建一个新的资源。此外,在同步期间(同步目标)在一个节点上出现这种状态。  
Outdated  #数据资源是一致的,但是已经过时。  
DUnknown  #当对等节点网络连接不可用时出现这种状态。  
Consistent  #一个没有连接的节点数据一致,当建立连接时,它决定数据是UpToDate或是Outdated。 
UpToDate  #一致的最新的数据状态,这个状态为正常状态。

DRBD 常见故障处理

Unconfigured状态的处理
代码语言:javascript复制
root@test01:~# drbd-overview 
 0:test01/0  WFConnection Primary/Unknown   UpToDate/DUnknown /data/test xfs 4.1T 322G 3.8T 8% 
 1:test02/0  Connected    Secondary/Primary UpToDate/UpToDate

root@test02:~# drbd-overview 
 0:test02/0  Connected    Primary/Secondary UpToDate/UpToDate /data/test xfs 4.1T 485G 3.7T 12% 
 1:test01/0  Unconfigured .     .

可以看到02上的从盘状态为Unconfigured,这说明该盘处于down的状态,可以用 “drbdadm up 盘id” 命令来修改状态,执行。

代码语言:javascript复制
root@test02:~# drbdadm up test01

之后用drbd-overview 再次查看状态是否为同步状态。

主、备盘角色正确,主盘WFConnection,备盘StandAlone 状态的处理
代码语言:javascript复制
root@r01n02:~#drbd-overview 
   0:s01n02/0  SyncSource Primary/Secondary UpToDate/Inconsistent C      r----- /data xfs 19T 209G 18T 2% 
  [==========>.........] sync'ed: 57.9% (8120/19272)Mfinish: 0:03:57 speed: 34,976 (25,716) K/sec
   1:s01n03/0  StandAlone Secondary/Unknown UpToDate/DUnknown     r-----
 
 root@r01n03:~#drbd-overview 
   0:s01n03/0  WFConnection Primary/Unknown   UpToDate/DUnknown     C r----- /data xfs 19T 107G 19T 1% 
   1:s01n02/0  SyncTarget   Secondary/Primary Inconsistent/UpToDate C r----- 
  [===========>........] sync'ed: 62.3% (7272/19272)Mfinish: 0:03:31 speed: 35,224 (26,144) want: 71,720 K/sec

可以看到sr01n03/0 这组盘没有同步,主盘角色为Primary,备盘角色为Secondary,说明主、备盘角色是正确的,不需要调整,这时只要丢弃备盘中的数据即可使之同步。示例如下

代码语言:javascript复制
root@s1r01n02:~#drbdadm connect --discard-my-data s1r01n03
主、备盘角色不正确的处理

主、备盘角色不正确有以下几种情况,修改盘角色之前,需要先将盘卸载掉。

主备盘都为Primary/Unknown ,处理方法,将备盘状态修改正确。

代码语言:javascript复制
root@备盘节点:~# drbdadm secondary 备盘id

主备盘都为Secondary/Unknown ,处理方法,将主盘状态修改正确。

代码语言:javascript复制
root@主盘节点:~# drbdadm primary --force 主盘id

主盘状态为Secondary/Unknown,备盘状态为Primary/Unknown ,这种情况要保证备盘数据都已经迁移走,先调整主盘角色为Primary,再调整备盘角色为Secondary。

代码语言:javascript复制
root@主盘节点:~# drbdadm primary --force 主盘id
root@备盘节点:~# drbdadm secondary 备盘id
drbd盘修改状态失败,提示Device is held open by someone 或 busy 的处理
代码语言:javascript复制
root@test01:~# drbdadm secondary test02
 1: State change failed: (-12) Device is held open by someone
 Command 'drbdsetup-84 secondary 1' terminated with exit code 11

先看是否有进程占用盘

代码语言:javascript复制
lsof /dev/drbd1
Diskless 状态的处理
代码语言:javascript复制
 root@s01n02:~#drbd-overview 
   0:s01n02/0  Connected Primary/Secondary UpToDate/Diskless C r----- data/ xfs 19T 205G 18T 2% 
   1:s01n03/0  Connected Secondary/Primary UpToDate/Diskless C r----- 

diskless原因通常是磁盘故障/raid卡故障,或者是操作系统kernel panic引起的,任何操作都会hang,所以无法远程重启,必须现场手工重启硬件。

挂载故障盘
代码语言:javascript复制
root@test03:~# drbd-overview  
0:test03/0 WFConnection Primary/Unknown UpToDate/DUnknown /data xfs 19T 459G 18T 3%  
1:test02/0 StandAlone Secondary/Unknown UpToDate/DUnknown

test02 故障 挂载drbd1:

代码语言:javascript复制
drbdadm primary --force test02 # 将这块drbd1设置为primary才能挂载  
mount /dev/drbd1 /path
drbd 同步加速

如果开启了限速,可手动加速

代码语言:javascript复制
drbdadm disk-options --c-plan-ahead=0 --resync-rate=250M <resource_id>

split brain脑裂问题

split brain实际上是指在某种情况下,造成drbd的两个节点断开连接,都以primary的身份来运行。当drbd某primary节点连接对方节点准备 发送信息的时候如果发现对方也是primary状态,那么会立刻自行断开连接,并认定当前已经发生split brain了,这时候他会在系统日志中记录以下信息:

代码语言:javascript复制
"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并放弃该资源的数据:
代码语言:javascript复制
drbdadm secondary resource_name
drbdadm — –discard-my-data connect resource_name
  • 2)在要作为primary的节点重新连接secondary(如果这个节点当前的连接状态为WFConnection的话,可以省略)
代码语言:javascript复制
drbdadm connect resource_name

当作完这些动作之后,从新的primary到secondary的re-synchnorisation会自动开始。

参考链接:https://blog.csdn.net/weixin_41499498/ article/details/122348656 https://www.cnblogs.com /motorao/p/14410582.html https://www.cnblogs.com /xingxingdiandian/articles/14372650.html

0 人点赞