# corosync / pacemaker 기반의 DB이중화

### 시작하는 말

안녕하세요, 고니 입니다.  
기존에 작성했던 컨텐츠들 업데이트를 하면서 문서의 리팩토링(Refactoring)을 진행해보려고 합니다.

DB이중화를 구현하는 방식은 여러가지 방식이 있을껀데, 여전히 고민되고, 24시간내내 무결성을 검증할 수가 없는것 같습니다.  
그 중에 [maxscale기반의 DB 이중화 운영](http://igoni.kr/books/4-dbms/page/maxscale-db "maxscale기반의 DB 이중화 운영")도 있겠지만, 또 다른 방식인 DB자체는 Active / Standby 형태로 운영할 수 있는 방법을 구축 / 운영해보았습니다.

<table border="1" id="bkmrk-perplexity%EC%97%90%EC%84%9C-%EC%83%9D%EC%84%B1%ED%95%9C-ai%EC%9D%B4" style="border-collapse: collapse; width: 100%; border-width: 1px;"><colgroup><col style="width: 99.881%;"></col></colgroup><tbody><tr><td>[![image.png](http://igoni.kr/uploads/images/gallery/2025-06/scaled-1680-/6yFimage.png)](http://igoni.kr/uploads/images/gallery/2025-06/6yFimage.png)

</td></tr><tr><td class="align-right">perplexity에서 생성한 AI이미지</td></tr></tbody></table>

### 시스템 구성방법  


<table border="1" id="bkmrk-corosync-%26-packermak" style="border-collapse: collapse; width: 100%; height: 454.391px;"><colgroup><col style="width: 99.881%;"></col></colgroup><tbody><tr style="height: 407.797px;"><td style="height: 407.797px;"><div drawio-diagram="8599"><img src="http://igoni.kr/uploads/images/drawio/2024-08/drawing-3-1725039044.png" alt=""/></div>

</td></tr><tr style="height: 46.5938px;"><td style="height: 46.5938px;">Corosync &amp; pacemaker로 서버간 상태 확인 / 서비스 전환 역활을 수행하고

Mysql을 DB데이터 동기화를 담당하게 됩니다. Failover / Failback 상태에도 데이터 유지를 위해 양쪽 replication 구성을 추천합니다

\* 단방향 replication 구성시 failover 수행시 failback 절차가 좀 복잡해질수 있습니다

</td></tr></tbody></table>

### 설치 &amp; 구성하기 

설치에 대한 자세해내 사항은 : [corosync / pacemaker를 이용한 HA구성](http://igoni.kr/books/2-open-infra/page/corosync-pacemaker-ha "corosync / pacemaker를 이용한 HA구성") 여기를 참고하셔도 됩니다.

1. #### 패키지 설치하기
    
    ```bash
    $> yum install corosync pacemaker -y
    ```
2. #### Mysql 서버간 health check를 위한 스크립트 구성
    
    ```bash
    $> vi /etc/init.d/db_check
    #!/bin/bash
    
    case "$1" in
     "start")
       echo "start"
     ;;
     "stop")
       echo "stop"
     ;;
     # mysql에 구성된 read-only계정(서비스 상태 확인용) 생성해서 localhost 접속하여 현재시간 - select now() 쿼리 실행
     "status")
      mysql --connect-timeout 2 -u monitor -p'모니터 계정패스워드' -h localhost -Nse 'select now()'
      result_code=$?
    
      #비정상 응답일 경우 로그를 남기고 DB VIP를 상대방 IP로 이전
      if [[ $result_code -eq 1 ]]
      then
       echo "[$(date +%Y-%m-%d-%H:%M:%S)] DB Connection Error" >> /var/log/db_check
       pcs resource move DB_GROUP {{ 상대방IP }}
      fi
     ;;
     *)
       echo "start|stop|status"
       exit 1
     ;;
    esac
    ```
3. #### DB이중화를 위한 HA resource 구성
    
    ```bash
    $> pcs cluster setup db_ha {{ DB1_IP }} {{ DB2_IP }} --force
    $> pcs cluster start --all
    $> pcs property set stonith-enabled=false
    $> pcs property set no-quorum-policy=ignore
    $> pcs resource defaults update resource-stickiness=100
    $> pcs resource create DB_CHECK service:db_check op status timeout=10s interval=10s --group DB_GROUP
    $> pcs resource create DB_VIP  ocf:heartbeat:IPaddr2 ip={{ DB_VIP }} cidr_netmask=32 op monitor interval=10s --group DB_GROUP
    ```
4. #### 구성정보 확인
    
    ```bash
    # crm_mon -1
    Stack: classic openais (with plugin)
    Current DC: TEST-DB#1 (version 1.1.18-3.el6-bfe4e80420) - partition with quorum
    Last updated: Wed Dec 18 18:29:46 2019
    Last change: Mon Sep  2 19:26:34 2019 by root via crm_resource on TEST-DB#1
    
    2 nodes configured (2 expected votes)
    5 resources configured
    
    Online: [ TEST-DB#1 TEST-DB#2 ]
    
    Active resources:
    
     Resource Group: DB_GROUP
         DB_CHECK        (ocf::heartbeat:Filesystem):    Started TEST-DB#1
         DB_VIP          (ocf::heartbeat:IPaddr2):       Started TEST-DB#1
    ```

### *Reference*

- *[https://docs.redhat.com/ko/documentation/red\_hat\_enterprise\_linux/8/html/configuring\_and\_managing\_high\_availability\_clusters/con\_pacemaker-overview-overview-of-high-availability](https://docs.redhat.com/ko/documentation/red_hat_enterprise_linux/8/html/configuring_and_managing_high_availability_clusters/con_pacemaker-overview-overview-of-high-availability)*
- *[https://tech.osci.kr/%EA%B8%B0%EC%B4%88%EB%B6%80%ED%84%B0-%EC%8B%9C%EC%9E%91%ED%95%98%EB%8A%94-linux-pacemaker%EC%9D%98-%EC%9D%B4%ED%95%B4/](https://tech.osci.kr/%EA%B8%B0%EC%B4%88%EB%B6%80%ED%84%B0-%EC%8B%9C%EC%9E%91%ED%95%98%EB%8A%94-linux-pacemaker%EC%9D%98-%EC%9D%B4%ED%95%B4/)*