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
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기