drbd脑裂处理

标签: drbd | 发表时间:2014-06-27 09:03 | 作者:xmarker
出处:http://xmarker.blog.163.com
前面写过一篇关于使用drbd+corosync+pacemaker实现postgresql高可用的博客,其实drbd的对等节点如果不在线的话,即主节点的数据更改如果无法及时传送到备节点达到一定时间,会造成数据不一致,即使故障节点在长时间离线后恢复,drbd可能也不能正常同步了。或者另外一种情况,主备都在线,但心跳网络断了而出现脑裂,两个节点都认为自己是主节点,也会造成两个节点的数据不一致,这样需要人工干预,告诉drbd以哪个节点为主节点,或者在drbd配置脑裂的行为。下面是长时间备节点不在线后出现的情况:
备节点:

[root@pgtest4 ~]# cat /proc/drbd 
version: 8.4.4 (api:1/proto:86-101)
GIT-hash: 74402fecf24da8e5438171ee8c19e28627e1c98a build by root@pgtest4, 2014-06-08 16:39:23

 1: cs:StandAlone ro:Secondary/ Unknown ds:UpToDate/DUnknown   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:57596

cs(连接状态)出现standalone,即孤立的
ro(角色)对等节点为unknown(非正常状态),本地节点为secondary(从节点)
ds(磁盘状态)是uptodate/dunknown,也是本地节点为处于正在更新状态,而对等节点为unknown状态。
从以上可以看出,备节点发生了drbd脑裂,注意,drbd的脑裂和集群的脑裂是两个概念,而此时的集群状态是正常的:

[root@pgtest3 ~]# crm status
Last updated: Fri Jun 27 08:34:28 2014
Last change: Fri Jun 27 08:34:22 2014 via crm_attribute on pgtest4
Stack: classic openais (with plugin)
Current DC: pgtest3 - partition with quorum
Version: 1.1.8-7.el6-394e906
2 Nodes configured, 2 expected votes
5 Resources configured.


Node pgtest4: standby
Online: [ pgtest3 ]

 Master/Slave Set: ms_postgresql [postgresql]
     Masters: [ pgtest3 ]
     Stopped: [ postgresql:1 ]
 pgresource (lsb:postgresql): Started pgtest3
 pgstore (ocf::heartbeat:Filesystem): Started pgtest3
 vip (ocf::heartbeat:IPaddr): Started pgtest3
即使使用crm node standby命令也可以正常把集群资源转移到pgtest4备节点上,但两个节点的数据已经不一致了。

所以此时要非常小心,如果使用pgtest4而且又有新数据进来,就会和pgtest3的数据冲突了,将来必须以一份数据为主,要么pgtest3,要么pgtest4,但数据都会丢一些,下面手工进行同步,以pgtest3为主,重新同步:

[root@pgtest4 ~]# drbdadm secondary r0 #首先让drbd节点配置为从节点
[root@pgtest4 ~]# drbdadm connect --discard-my-data r0 #从主节点同步数据,并且discard自己的数据
[root@pgtest4 ~]# cat /proc/drbd 
version: 8.4.4 (api:1/proto:86-101)
GIT-hash: 74402fecf24da8e5438171ee8c19e28627e1c98a build by root@pgtest4, 2014-06-08 16:39:23

 1: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r-----
    ns:0 nr:79104 dw:79104 dr:0 al:0 bm:26 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

现在状态就变成connect的了,ro也变成Secondary/Primary的了,这时再切换节点并连接pg查看数据,数据已经是一致状态了。

因此使用drbd做高可用要特别注意的一点就是:尽量保证主备同时在线,如果备节点需要维护等而长期不在线,当在线时最好手工同步下数据,不过如果没有配置资源粘性的话,很有可能资源会自动往主节点上跑,因此建议设置资源粘性,让资源在飘到一个节点上后就不动了,配置方法如下:
crm(live)# configure
crm(live)configure# rsc_defaults resource-stickiness=100
crm(live)configure# verify
crm(live)configure# commit

另附drbd的状态含义:
一个资源可能有以下连接状态之一:
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:以本地节点为目标源的线上设备验证正在执行。

相关 [drbd] 推荐:

[转]DRBD 介绍

- - 小鸥的博客
Distributed Replicated Block Device(DRBD)是一个用软件实现的、无共享的、服务器之间 镜像 块设备内容的存储复制解决方案. 数据 镜像:实时、透明、同步(所有服务器都成功后返回)、异步(本地服务器成功后返回). DRBD的核心功能通过Linux的 内核实现,最接近系统的IO栈,但它不能神奇地添加上层的功能比如检测到EXT3文件系统的崩溃.

Linux下DRBD配置

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

drbd脑裂处理

- - x-marker的博客
前面写过一篇关于使用drbd+corosync+pacemaker实现postgresql高可用的博客,其实drbd的对等节点如果不在线的话,即主节点的数据更改如果无法及时传送到备节点达到一定时间,会造成数据不一致,即使故障节点在长时间离线后恢复,drbd可能也不能正常同步了. 或者另外一种情况,主备都在线,但心跳网络断了而出现脑裂,两个节点都认为自己是主节点,也会造成两个节点的数据不一致,这样需要人工干预,告诉drbd以哪个节点为主节点,或者在drbd配置脑裂的行为.

drbd+xfs+heartbeat+mysql实现高可用

- - C1G军火库
DRBD是一种块设备,可以被用于高可用(HA)之中.它类似于一个网络RAID-1功能.当你将数据写入本地 文件系统时,数据还将会被发送到网络中另一台主机上.以相同的形式记录在一个文件系统中. 本地(主节点)与远程主机(备节点)的数据可以保证实时同步.当本地系统出现故障时,远程主机上还会保留有一份相同的数据,可以继续使用.

pacemaker+corosync+drbd实现postgresql高可用

- - x-marker的博客
这种防守的优点是配置较为简单,流复制的备库还能提供一些查询服务,但备库提升为主库后,原来的主库需要使用regmgr重新生成主库,还要开启regmgr监控进程,因此故障只能切换一次,然后进行人工干预(虽然此步骤也可以写成脚本实现自动切换,但我感觉最好还是手工提升,避免来回切换造成数据丢失). 这两天实验了下centos6.4 x-64下的pacemaker+corosync+drbd来实现postgresql的高可用.

drbd性能测试及调优

- - x-marker的博客
今天在qq群里,有个哥们说千万不要用drbd做mysql的HA,说对性能影响非常大,drbd对性能有影响是肯定的,把数据通过网络发送给对端备库必定有性能损耗,而我正好有一套drbd,借此测试一把,看看drbd对性能的影响到底有多大,也给网友一个参考. 我测试的是一套两节点的drbd+pacemaker+corosync的mysqlHA高可用集群,主机都是普通的过时的pc机,内存2g,cpu 2核.

基于DRBD的高可用NFS解决方案分析

- - 忘我的追寻
之前对DRBD分析比较多,但是一直没有找到该怎么用他. 最近又在看NFS协议( RFC3530). 分析了NFS4对于的迁移、复制和服务端重启等场景的定义. DRBD提供块设备,其上是文件系统,而NFS在文件系统上层,二者结合可以构建一个高可用的文件共享解决方案. 关于DRBD,在之前的博客中有一些分析(tag: DRBD).

drbd+pacemaker实现数据库高可用的问题总结

- - x-marker的博客
前面的一篇文章记录下drbd+pacemaker+corosync实现postgresql数据库的高可用(参考 这里),经过一段时间的测试和测试环境使用,总结下遇到的问题. drbd脑裂是指当两个节点(假设只有两个节点)因为网络问题或某一个节点的主机故障等问题,造成数据不能实时同步,就会产生脑裂,drbd脑裂在drbd配置文件的net部分有三个场景,并分别有相应的自动处理策略:.