본문 바로가기

엔지니어/Linux

drbd split brain 스플릿 브레인 처리

728x90
반응형

DRBD 에서 split brain 상태가 되었을때 다음과 같이 처리를 할 수 있다.
사실 split brain 상태를 만들기위해 랜선을 수차례 뽑았다 연결을 하여 만들었다. 

아래처럼 cs 상태가 StandAlone 으로 보이면 Split brain 상태가 된다.
이때 처리 방법은 slave 쪽의 데이터를 포기하고 primary 쪽의 데이터와 다시 동기화를 하는 것이다.
실제 처리 하는 과정을 살펴보자.

stor01은 기존에 primary 노드로 사용을 하고 있던 장비로 현재 StandAlone 상태로 돌고 있다.

stor01:~# cat /proc/drbd
version: 8.3.0 (api:88/proto:86-89)
GIT-hash: 9ba8b93e24d842f0dd3fb1f9b90e8348ddb95829 build by root@stor01, 2009-01-02 10:08:59
 0: cs:StandAlone ro:Primary/Unknown ds:UpToDate/DUnknown   r---
    ns:5405948 nr:0 dw:150414192 dr:996595504 al:37948 bm:559 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:140180
 1: cs:StandAlone ro:Primary/Unknown ds:UpToDate/DUnknown   r---
    ns:0 nr:0 dw:0 dr:36148328 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0

stor02 서버는 기존에 Secondary 로 돌고 잇다가 StandAlone 상태로 현재 돌고 있다.
stor02:~# cat /proc/drbd
version: 8.3.0 (api:88/proto:86-89)
GIT-hash: 9ba8b93e24d842f0dd3fb1f9b90e8348ddb95829 build by root@stor02, 2009-01-02 10:09:38
 0: cs:StandAlone ro:Secondary/Unknown ds:UpToDate/DUnknown   r---
    ns:0 nr:5405948 dw:150302972 dr:976818256 al:137 bm:751 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
 1: cs:StandAlone ro:Secondary/Unknown ds:UpToDate/DUnknown   r---
    ns:0 nr:0 dw:0 dr:36148640 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0

stor02 에서 DRBD resource 이름을 확인한다.
stor02:~# drbdadm status
<drbd-status version="8.3.0" api="88">
<resources config_file="/etc/drbd.conf">
<resource minor="0" name="bigdisk" cs="StandAlone" ro1="Secondary" ro2="Unknown" ds1="UpToDate" ds2="DUnknown" />
<resource minor="1" name="smalldisk" cs="StandAlone" ro1="Secondary" ro2="Unknown" ds1="UpToDate" ds2="DUnknown" />
</resources>
</drbd-status>

만약 해당 resource 가 secondary 상태가 아니라면 아래 처럼 secondary 상태로 만들어 준다.
stor02:~# drbdadm secondary smalldisk

아래 명령이 가장 중요한 것으로 현재 서버 즉 stor02 서버에서 smalldisk resource 의 데이터를 포기하고 primary 서버의 데이터와 다시 동기화를 하겠다는 명령이다. 만약 원본 데이터가 stor02가 더 최신의 데이터가 있는 상태였다면 날리게 되는 것이다. 주의해서 명령을 날려야 한다. 
stor02:~# drbdadm -- --discard-my-data connect smalldisk

위 명령을 실행하고 나면 상태가 WFConnection 상태가 된다.
즉 primary 로 부터 데이터를 받아 들일 준비가 된 것으로 기다리고 있다는 것이다.
stor02:~# cat /proc/drbd
version: 8.3.0 (api:88/proto:86-89)
GIT-hash: 9ba8b93e24d842f0dd3fb1f9b90e8348ddb95829 build by root@stor02, 2009-01-02 10:09:38
 0: cs:StandAlone ro:Secondary/Unknown ds:UpToDate/DUnknown   r---
    ns:0 nr:5405948 dw:150302972 dr:976818256 al:137 bm:751 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
 1: cs:WFConnection ro:Secondary/Unknown ds:UpToDate/DUnknown C r---
    ns:0 nr:0 dw:0 dr:36148640 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0


stor01 primary 서버에서는 해당 resource 에 다시 연결만 해 주면 된다.
stor01:~# drbdadm connect smalldisk

위 명령이 실행 되고 나면 아래처럼 cs 상태가 Connected 로 되고 Primary/Secondary 가 UpToDate 상태가 된다.
stor01:~# cat /proc/drbd
version: 8.3.0 (api:88/proto:86-89)
GIT-hash: 9ba8b93e24d842f0dd3fb1f9b90e8348ddb95829 build by root@stor01, 2009-01-02 10:08:59
 0: cs:StandAlone ro:Primary/Unknown ds:UpToDate/DUnknown   r---
    ns:5405948 nr:0 dw:150414696 dr:996595552 al:37948 bm:559 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:140300
 1: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r---
    ns:0 nr:0 dw:0 dr:36148328 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0


이 서버는 DRBD 볼륨이 두개 있어서 한개 더 작업을 해야 한다.
이제 두번째 DRBD 볼륨을 정상화 시켜 보자.

먼저 stor02 secondary 서버에서 작업을 먼저 한다.
stor02:~# cat /proc/drbd
version: 8.3.0 (api:88/proto:86-89)
GIT-hash: 9ba8b93e24d842f0dd3fb1f9b90e8348ddb95829 build by root@stor02, 2009-01-02 10:09:38
 0: cs:StandAlone ro:Secondary/Unknown ds:UpToDate/DUnknown   r---
    ns:0 nr:5405948 dw:150302972 dr:976818256 al:137 bm:751 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
 1: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r---
    ns:0 nr:0 dw:0 dr:36148640 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
stor02:~# drbdadm -- --discard-my-data connect bigdisk
stor02:~# cat /proc/drbd
version: 8.3.0 (api:88/proto:86-89)
GIT-hash: 9ba8b93e24d842f0dd3fb1f9b90e8348ddb95829 build by root@stor02, 2009-01-02 10:09:38
 0: cs:WFConnection ro:Secondary/Unknown ds:UpToDate/DUnknown C r---
    ns:0 nr:0 dw:150302972 dr:976818256 al:137 bm:751 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
 1: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r---
    ns:0 nr:0 dw:0 dr:36148640 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0

stor01 primary 서버에서 connect 를 시켜 준다.
데이터 양이 많은 경우 동기화 되는 모습을 볼 수 도 있다.
stor01:~# cat /proc/drbd
version: 8.3.0 (api:88/proto:86-89)
GIT-hash: 9ba8b93e24d842f0dd3fb1f9b90e8348ddb95829 build by root@stor01,          2009-01-02 10:08:59
 0: cs:StandAlone ro:Primary/Unknown ds:UpToDate/DUnknown   r---
    ns:5405948 nr:0 dw:150417472 dr:996596012 al:37948 bm:559 lo:0 pe:0 u         a:0 ap:0 ep:1 wo:b oos:141336
 1: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r---
    ns:0 nr:0 dw:0 dr:36148328 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oo         s:0
stor01:~# drbdadm connect bigdisk
stor01:~# cat /proc/drbd
version: 8.3.0 (api:88/proto:86-89)
GIT-hash: 9ba8b93e24d842f0dd3fb1f9b90e8348ddb95829 build by root@stor01,          2009-01-02 10:08:59
 0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r---
    ns:74556 nr:0 dw:150417472 dr:996733412 al:37948 bm:600 lo:1 pe:47 ua         :2081 ap:0 ep:1 wo:b oos:68272
        [=========>..........] sync'ed: 54.3% (68272/141336)K
        finish: 0:00:03 speed: 18,264 (18,264) K/sec
 1: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C rap-
    ns:0 nr:0 dw:0 dr:36148328 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oo         s:0
stor01:~# cat /proc/drbd
version: 8.3.0 (api:88/proto:86-89)
GIT-hash: 9ba8b93e24d842f0dd3fb1f9b90e8348ddb95829 build by root@stor01,          2009-01-02 10:08:59
 0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r---
    ns:141352 nr:0 dw:150417488 dr:996737356 al:37948 bm:691 lo:0 pe:0 ua         :0 ap:0 ep:1 wo:b oos:0
 1: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r---
    ns:0 nr:0 dw:0 dr:36148328 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oo         s:0



drbd 상태 확인

[root@mysql_01 ~]# drbd-overview

**  정상 커넥션인 경우

0:sktdrbd  Connected Primary/Secondary UpToDate/UpToDate C r----- /MYSQL/DATA ext3 9.9G 3.7G 5.8G 39%


Case1. DRBD 커넥션이 끊어진 상태이지만 link down 및 drbd crash 상태는 아닌 경우 (정상리부팅)

[root@mysql_01 ~]# drbd-overview

0:sktdrbd  WFConnection Primary/Unknown UpToDate/DUnknown C r----- /MYSQL/DATA ext3 9.9G 3.7G 5.8G 39%

[root@mysql_02 ~]# drbd-overview

  0:sktdrbd  StandAlone Secondary/Unknown UpToDate/DUnknown r-----


** 해결방법 : StandAlone 상태인 DB에서 아래 명령어 실행cat 

[root@mysql_02 ~]# drbdadm connect all

[root@mysql_02 ~]# drbd-overview

  0:sktdrbd  Connected Secondary/Primary UpToDate/UpToDate C r-----


Case2. 모든 DB가 StandAlone 인 경우 (Split-brain은 아닌 상황)

[root@mysql_01 ~]# drbd-overview

  0:sktdrbd  StandAlone Primary/Unknown UpToDate/DUnknown r----- /MYSQL/DATA ext3 9.9G 3.7G 5.8G 39%

[root@mysql_02 ~]# drbd-overview

  0:sktdrbd  StandAlone Secondary/Unknown UpToDate/DUnknown r-----


** 해결방법 

1. 모든 DB에서 아래 명령어 실행

[root@mysql_01 ~]# drbdadm connect all

[root@mysql_01 ~]# drbd-overview

  0:sktdrbd  WFConnection Primary/Unknown UpToDate/DUnknown C r----- /MYSQL/DATA ext3 9.9G 3.7G 5.8G 39%

[root@mysql_02 ~]# drbdadm connect all

[root@mysql_02 ~]# drbd-overview

  0:sktdrbd  Connected Secondary/Primary UpToDate/UpToDate C r-----



Case3. Split-brain 현상일 경우

#Split-brain: DRBD(또는 다른 이중화 솔루션)으로 데이터가 싱크되는 중에 외부요인으로 인하여 두 데이터가 다르게 되어 데이터 싱크가 실패된 경우를 말함

현상: 위의 drbdadm connect all 명령어로도 StandAlone 인 상태로 나옴

해결방법

** Secondary의 데이터를 모두 지우고 다시 싱크를 해야 한다.

1. 모든 DB에서 drbdadm disconnect all 실행

2. Secondary DB에서 아래 명령어 실행하여 Data delete

drbdadm -- --discard-my-data connect all

3. 모든 DB에서 drbdadm connect all

--> 이 경우 Secondary DB의 Data를 지우게 되므로 주의 요망

heartbeat 상태 확인

**  정상 커넥션인 경우

[root@mysql_01 ~]# crm_mon

Defaulting to one-shot mode

You need to have curses available at compile time to enable console mode


============

Last updated: Mon Nov 26 10:56:40 2012

Current DC: mysql_02 (bad978b4-0686-4335-b49e-f6edb0f50e44)

2 Nodes configured.

1 Resources configured.

============


Node: mysql_01 (ad6f9cc8-6269-4ad6-bcce-ad4c074821e4): online

Node: mysql_02 (bad978b4-0686-4335-b49e-f6edb0f50e44): online


Resource Group: group_1

    IPaddr_200_200_200_209      (heartbeat::ocf:IPaddr):        Started mysql_01

    IPaddr_172_18_79_209        (heartbeat::ocf:IPaddr):        Started mysql_01

    drbddisk_3  (heartbeat:drbddisk):   Started mysql_01

    Filesystem_4        (heartbeat::ocf:Filesystem):    Started mysql_01

    mysql_5     (heartbeat::ocf:mysql): Started mysql_01




Case1. mysql 정지 및 재기동 명령어

[root@mysql_01 ~]# crm_resource -r mysql_5 -p target_role -v stopped

[root@mysql_01 ~]# crm_mon

Defaulting to one-shot mode

You need to have curses available at compile time to enable console mode



============

Last updated: Mon Nov 26 10:58:19 2012

Current DC: mysql_02 (bad978b4-0686-4335-b49e-f6edb0f50e44)

2 Nodes configured.

1 Resources configured.

============


Node: mysql_01 (ad6f9cc8-6269-4ad6-bcce-ad4c074821e4): online

Node: mysql_02 (bad978b4-0686-4335-b49e-f6edb0f50e44): online


Resource Group: group_1

    IPaddr_200_200_200_209      (heartbeat::ocf:IPaddr):        Started mysql_01

    IPaddr_172_18_79_209        (heartbeat::ocf:IPaddr):        Started mysql_01

    drbddisk_3  (heartbeat:drbddisk):   Started mysql_01

    Filesystem_4        (heartbeat::ocf:Filesystem):    Started mysql_01

    mysql_5     (heartbeat::ocf:mysql): Stopped


** mysql 재기동

[root@mysql_01 ~]# crm_resource -r mysql_5 -p target_role -v started

[root@mysql_01 ~]# crm_mon

Defaulting to one-shot mode

You need to have curses available at compile time to enable console mode



============

Last updated: Mon Nov 26 10:59:33 2012

Current DC: mysql_02 (bad978b4-0686-4335-b49e-f6edb0f50e44)

2 Nodes configured.

1 Resources configured.

============


Node: mysql_01 (ad6f9cc8-6269-4ad6-bcce-ad4c074821e4): online

Node: mysql_02 (bad978b4-0686-4335-b49e-f6edb0f50e44): online


Resource Group: group_1

    IPaddr_200_200_200_209      (heartbeat::ocf:IPaddr):        Started mysql_01

    IPaddr_172_18_79_209        (heartbeat::ocf:IPaddr):        Started mysql_01

    drbddisk_3  (heartbeat:drbddisk):   Started mysql_01

    Filesystem_4        (heartbeat::ocf:Filesystem):    Started mysql_01

    mysql_5     (heartbeat::ocf:mysql): Started mysql_01


Case2. Heartbeat 절체 시 mysql 기동 실패 (에러메시지가 발생시)

[root@mysql_01 ~]# crm_mon

Defaulting to one-shot mode

You need to have curses available at compile time to enable console mode


============

Last updated: Mon Nov 26 11:01:18 2012

Current DC: mysql_02 (bad978b4-0686-4335-b49e-f6edb0f50e44)

2 Nodes configured.

1 Resources configured.

============

Node: mysql_01 (ad6f9cc8-6269-4ad6-bcce-ad4c074821e4): online

Node: mysql_02 (bad978b4-0686-4335-b49e-f6edb0f50e44): online


Resource Group: group_1

    IPaddr_200_200_200_209      (heartbeat::ocf:IPaddr):        Started mysql_01

    IPaddr_172_18_79_209        (heartbeat::ocf:IPaddr):        Started mysql_01

    drbddisk_3  (heartbeat:drbddisk):   Stopped

    Filesystem_4        (heartbeat::ocf:Filesystem):    Stopped

    mysql_5     (heartbeat::ocf:mysql): Stopped


Failed actions:

    mysql_5_start_0 (node=mysql_01, call=38, rc=-2): Timed Out


해결방법

[root@mysql_01 ~]# crm_resource -H mysql_01 -r mysql_5 -C  //에러메시지 삭제

[root@mysql_01 ~]# crm_mon

Defaulting to one-shot mode

You need to have curses available at compile time to enable console mode


============

Last updated: Mon Nov 26 11:02:23 2012

Current DC: mysql_02 (bad978b4-0686-4335-b49e-f6edb0f50e44)

2 Nodes configured.

1 Resources configured.

============


Node: mysql_01 (ad6f9cc8-6269-4ad6-bcce-ad4c074821e4): online

Node: mysql_02 (bad978b4-0686-4335-b49e-f6edb0f50e44): online


Resource Group: group_1

    IPaddr_200_200_200_209      (heartbeat::ocf:IPaddr):        Started mysql_01

    IPaddr_172_18_79_209        (heartbeat::ocf:IPaddr):        Started mysql_01

    drbddisk_3  (heartbeat:drbddisk):   Started mysql_01

    Filesystem_4        (heartbeat::ocf:Filesystem):    Started mysql_01

    mysql_5     (heartbeat::ocf:mysql): Started mysql_01



Case3. Heartbeat 절체 시 mysql 기동 실패 (에러메시지를 삭제하여도 계속 DB 기동 실패)

=> 이 경우 DB를 싱글모드로 기동 시킨 후 DB 리커버리를 시도한 후 다시 H/B을 기동하여 DB정상화 시도

[root@mysql_01 ~]# /etc/init.d/heartbeat stop 또는 killall heartbeat 

(heartbeat이 정상적으로 stop되지 않을 경우 강제로 heartbeat 관련 데몬을 kill)

[root@mysql_01 ~]# drbdadm primary all 

 [root@mysql_01 ~]# mount /dev/drbd0 /MYSQL_DATA

[root@mysql_01 ~]# /MYSQL/mysql/bin/mysqld_safe --user=mysql&

(InnoDB가 자동으로 recovery 시도 후 DB 정상 기동 확인)

[root@mysql_01 ~]# /MYSQL/mysql/bin/mysqladmin -uroot -p shutdown

[root@mysql_01 ~]# umount /MYSQL_DATA

[root@mysql_01 ~]# drbdadm secondary all

[root@mysql_01 ~]# /etc/init.d/heartbeat start


출처
http://danuri.tistory.com/entry/DRBD-split-brain-처리하기 [어흥]

출처: http://yaruki0318.tistory.com/entry/DRBDHB-기본-트러블슈팅 [IT Japan]

반응형