MariaDB Galera Cluster + MaxScale 고가용성 DB 구축
동기식 멀티 마스터 복제와 지능형 프록시를 조합한 무중단 데이터베이스 인프라 구축기
서비스 운영 환경에서 데이터베이스 장애는 전체 시스템 다운으로 직결된다. 단일 DB 서버에 의존하면 해당 서버가 죽는 순간 모든 서비스가 멈춘다. 이를 해결하기 위해 MariaDB Galera Cluster(멀티 마스터 동기 복제)와 MaxScale(데이터베이스 프록시)을 조합한 고가용성 아키텍처를 구성했다.
아키텍처
| Application (WAS 1 / 2 / 3) | ||
| ▼ | ||
| JDBC Sequential Failover | ||
| ▼ | ||
| MaxScale 172.20.17.7:23306 |
MaxScale 172.20.18.7:23306 |
MaxScale 172.20.19.7:23306 |
| ▼ | ||
| R/W Split Router — Write→Master, Read→Slave 분산 | ||
| ▼ | ||
| Galera Node 1 db01 · 172.20.17.10 |
Galera Node 2 db02 · 172.20.18.10 |
Galera Node 3 db03 · 172.20.19.10 |
| ◄────── 동기 복제 (Synchronous) ──────► | ||
핵심 포인트: 애플리케이션은 Galera 노드에 직접 접속하지 않는다. 반드시 MaxScale을 경유한다.
1. Galera Cluster 구성
1-1. Galera Cluster란?
MariaDB Galera Cluster는 동기식 멀티 마스터 복제를 제공하는 클러스터 솔루션이다. 모든 노드에서 읽기/쓰기가 가능하며, 하나의 노드에서 커밋된 데이터는 즉시 다른 노드에도 반영된다.
| 항목 | 일반 Replication | Galera Cluster ✓ |
|---|---|---|
| 복제 방식 | 비동기 (Async) | 동기 (Synchronous) |
| 쓰기 노드 | Master 1대 | 모든 노드 쓰기 가능 |
| 데이터 정합성 | 지연 발생 가능 | 모든 노드 동일 보장 |
| 노드 장애 시 | 수동 Failover | 자동 Failover |
| 충돌 해결 | 없음 | Certification-based |
1-2. 서버 구성
| 노드 | IP | 역할 | 상태 |
|---|---|---|---|
| db01 | 172.20.17.10:13306 | SLAVE | SYNCED |
| db02 | 172.20.18.10:13306 | MASTER | SYNCED |
| db03 | 172.20.19.10:13306 | SLAVE | SYNCED |
|
11.8.6
MariaDB Version
|
3
Cluster Size
|
16
Slave Threads
|
Master/Slave 역할 자동 선출: 모든 Galera 노드는 쓰기가 가능하지만, MaxScale의 galeramon이 하나를 Master로 선출하여 쓰기를 집중시킨다. Master 장애 시 다른 노드가 자동으로 Master로 승격된다.
1-3. 주요 Galera 설정
# 클러스터 기본 설정
wsrep_cluster_name = server_make_cluster
wsrep_cluster_address = gcomm://172.20.17.10,172.20.18.10,172.20.19.10
wsrep_node_name = db01 # 각 노드별 변경
wsrep_node_address = 172.20.17.10 # 각 노드별 변경
wsrep_sst_method = mariabackup # 풀 동기화 방식
wsrep_slave_threads = 16 # 병렬 복제 스레드
wsrep_on = ON
1-4. 주요 Provider 옵션
| 옵션 | 값 | 설명 |
|---|---|---|
| gcache.size | 2G | Galera 캐시 크기 (IST 증분 동기화용) |
| gcache.page_size | 128M | 페이지 파일 크기 |
| gcs.fc_limit | 256 | Flow Control 임계값 |
| cert.optimistic_pa | yes | 낙관적 병렬 적용 |
| pc.recovery | true | 자동 복구 활성화 |
2. MaxScale 구성
2-1. MaxScale이란?
MariaDB MaxScale은 데이터베이스 앞단에 위치하는 지능형 프록시다. 애플리케이션은 MaxScale에 접속하고, MaxScale이 쿼리 유형에 따라 적절한 노드로 라우팅한다.
2-2. MaxScale 서버 구성
| MaxScale | IP | 리스닝 포트 | 관리 포트 | 버전 |
|---|---|---|---|---|
| PRX-1 | 172.20.17.7 | 23306 | 8989 | 2.5.29 |
| PRX-2 | 172.20.18.7 | 23306 | 8989 | 2.5.29 |
| PRX-3 | 172.20.19.7 | 23306 | 8989 | 2.5.29 |
2-3. MaxScale 설정 (maxscale.cnf)
# ── 서버 정의 ──
[db01]
type = server
address = 172.20.17.10
port = 13306
protocol = MariaDBBackend
[db02] address = 172.20.18.10
[db03] address = 172.20.19.10
# ── Galera 모니터 ──
[Galera-Monitor]
module = galeramon
servers = db01, db02, db03
monitor_interval = 3000 # 3초마다 상태 체크
use_priority = true # 우선순위 기반 Master 선출
available_when_donor = true # SST 중에도 쿼리 허용
# ── Read/Write Split 서비스 ──
[RW-Split-Service]
router = readwritesplit
max_slave_connections = 100% # 모든 Slave에 읽기 분산
max_slave_replication_lag = 3 # 복제 지연 3초 초과 시 제외
master_accept_reads = true # Master에서도 읽기 허용
causal_reads = true # 인과적 읽기 보장
# ── 리스너 (포트 23306) ──
[RW-Split-Listener]
service = RW-Split-Service
port = 23306
2-4. 라우팅 동작
| 쿼리 유형 | 라우팅 대상 | 기준 |
|---|---|---|
| SELECT | Slave (db01, db03) | LEAST_CURRENT_OPERATIONS |
| INSERT / UPDATE / DELETE | Master (db02) | 단일 Master 집중 |
| 트랜잭션 내 SELECT | Master (db02) | 트랜잭션 내 일관성 보장 |
2-5. 쿼리 분산 통계 (운영 데이터)
db01 SLAVE Read 1,298,204
db02 MASTER Read 1,090,803 / Write 237,967
db03 SLAVE Read 1,021,124
Read Write
2-6. MaxScale 상태 확인
$ maxctrl list servers
┌────────┬──────────────┬───────┬─────────────┬─────────────────────────┐
│ Server │ Address │ Port │ Connections │ State │
├────────┼──────────────┼───────┼─────────────┼─────────────────────────┤
│ db01 │ 172.20.17.10 │ 13306 │ 250 │ Slave, Synced, Running │
│ db02 │ 172.20.18.10 │ 13306 │ 250 │ Master, Synced, Running │
│ db03 │ 172.20.19.10 │ 13306 │ 250 │ Slave, Synced, Running │
└────────┴──────────────┴───────┴─────────────┴─────────────────────────┘
3. 애플리케이션 연결 (JDBC)
MaxScale 3대에 대해 Sequential Failover로 접속한다. 첫 번째 MaxScale이 죽으면 자동으로 두 번째로 넘어간다.
# application.yml (Spring Boot)
spring:
datasource:
url: jdbc:mariadb:sequential://172.20.17.7:23306,172.20.18.7:23306,172.20.19.7:23306/my_database
username: app_user
password: app_password
sequential:// 프로토콜: 리스트 순서대로 접속을 시도하며, 첫 번째 성공한 서버를 사용한다. 해당 서버가 응답하지 않으면 다음 서버로 자동 Failover된다.
4. 장애 시나리오별 동작
⚡ Galera Slave 노드 1대 장애
db01 DOWN → MaxScale이 3초 내 감지
→ db01 제외, db02(Master) + db03(Slave)로 계속 서비스
→ db01 복구 시 자동 IST(증분 동기화)로 클러스터 재합류
서비스 영향: 없음🔥 Galera Master (db02) 장애
db02 DOWN → MaxScale galeramon이 감지
→ db01 또는 db03 중 하나를 새 Master로 자동 선출
→ Write 쿼리가 새 Master로 자동 전환
서비스 영향: 순간적 Write 지연 (3초 이내)🔌 MaxScale 1대 장애
PRX-1 DOWN → JDBC sequential://가 PRX-2로 자동 Failover
→ 재연결 후 정상 서비스
서비스 영향: 재연결 시간 (1-2초)5. 운영 명령어
# ── Galera 상태 확인 ──
mysql -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
mysql -e "SHOW STATUS LIKE 'wsrep_local_state_comment'"
mysql -e "SHOW STATUS LIKE 'wsrep_cluster_status'"
# ── MaxScale 상태 확인 ──
maxctrl list servers
maxctrl list services
maxctrl list monitors
# ── 유지보수 모드 ──
maxctrl set server db01 maintenance # 트래픽 제외
maxctrl clear server db01 maintenance # 해제
정리
| 계층 | 구성 | 역할 |
|---|---|---|
| Application | WAS 3대 | JDBC Sequential Failover |
| Proxy | MaxScale 3대 (.7) | Read/Write Split, Failover |
| Database | Galera 3대 (.10) | 동기 복제, 멀티 마스터 |
이 구성으로 단일 장애점(SPOF)이 없는 데이터베이스 인프라를 운영하고 있다. 어느 계층에서든 1대가 죽어도 서비스는 중단 없이 계속된다.
MariaDB 11.8 · MaxScale 2.5 · Galera Cluster · 3-Node HA
'Programming > 기본 (Baisc)' 카테고리의 다른 글
| HAProxy 3.2 + NGINX Unit으로 구축한 고가용성 웹 인프라 아키텍처 (0) | 2026.03.24 |
|---|---|
| Java Spring Boot DNS 서버에서 RFC 2136 Dynamic DNS UPDATE 프로토콜 완전 구현기 (0) | 2026.02.13 |
| C사 다계정 지문 브라우저 프로그램 판매 · 임대 안내 (0) | 2025.12.30 |
| RSS 피드 수집기: 뉴스와 정보를 한 곳에서 관리하는 스마트한 방법 for PHP (1) | 2025.09.11 |
| WordPress REST API 오류 rest_not_logged_in 해결 방법 (Apache + PHP-FPM 환경) (0) | 2025.06.27 |




