# corosync / pacemaker 기반의 DB이중화 ### 시작하는 말 안녕하세요, 고니 입니다. 기존에 작성했던 컨텐츠들 업데이트를 하면서 문서의 리팩토링(Refactoring)을 진행해보려고 합니다. DB이중화를 구현하는 방식은 여러가지 방식이 있을껀데, 여전히 고민되고, 24시간내내 무결성을 검증할 수가 없는것 같습니다. 그 중에 [maxscale기반의 DB 이중화 운영](http://igoni.kr/books/4-dbms/page/maxscale-db "maxscale기반의 DB 이중화 운영")도 있겠지만, 또 다른 방식인 DB자체는 Active / Standby 형태로 운영할 수 있는 방법을 구축 / 운영해보았습니다.
[![image.png](http://igoni.kr/uploads/images/gallery/2025-06/scaled-1680-/6yFimage.png)](http://igoni.kr/uploads/images/gallery/2025-06/6yFimage.png)
perplexity에서 생성한 AI이미지
### 시스템 구성방법
Corosync & pacemaker로 서버간 상태 확인 / 서비스 전환 역활을 수행하고 Mysql을 DB데이터 동기화를 담당하게 됩니다. Failover / Failback 상태에도 데이터 유지를 위해 양쪽 replication 구성을 추천합니다 \* 단방향 replication 구성시 failover 수행시 failback 절차가 좀 복잡해질수 있습니다
### 설치 & 구성하기 설치에 대한 자세해내 사항은 : [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/)*