MariaDB Replication 구성 해보기

MariaDB primary-replica replication 구성 가이드입니다. binary log, server_id, replication 계정, 백업 기준점, CHANGE MASTER TO, START REPLICA, 상태 점검을 정리했습니다.

MariaDB Replication은 primary 서버의 binary log를 replica 서버가 읽어 같은 변경을 재생하는 구조입니다. 예전 문서에서는 master/slave라는 용어를 많이 쓰지만, MariaDB 문서는 primary/replica 용어를 함께 사용하고 있습니다. 아래 절차는 단일 primary와 단일 replica를 구성하는 기본 흐름입니다.

구성 전 확인

두 서버의 MariaDB 버전, 네트워크, 시간 동기화, 방화벽을 먼저 확인합니다. replica가 primary의 3306/TCP에 도달해야 합니다.

# primary와 replica 양쪽
mariadb --version
timedatectl
hostname -f

# replica에서 primary 접근 확인
nc -vz -w 3 primary-db.example.com 3306

운영 DB에 붙이는 경우에는 신규 replica를 기존 데이터와 같은 시점으로 맞춘 뒤 replication을 시작해야 합니다. 빈 replica에 바로 CHANGE MASTER TO만 넣으면 기존 데이터는 복제되지 않습니다.

primary 설정

primary에서는 binary log와 고유한 server_id가 필요합니다. MariaDB 공식 문서는 replication log 이름을 안정적으로 유지하기 위해 log-basename도 지정하라고 안내합니다.

# /etc/mysql/mariadb.conf.d/60-replication.cnf 또는 배포판에 맞는 conf.d 파일
[mariadb]
server_id=1
log-bin
log-basename=primary1
binlog-format=mixed
bind-address=0.0.0.0

설정 후 재시작합니다.

sudo systemctl restart mariadb
sudo systemctl status mariadb --no-pager

bind-address127.0.0.1로만 잡혀 있으면 원격 replica가 접속할 수 없습니다. 보안상 전체 대역을 열기보다 DB 방화벽과 계정 host 제한을 함께 적용하세요.

replication 계정 생성

primary에서 replica 전용 계정을 만듭니다. 비밀번호는 문서나 쉘 히스토리에 실제 값으로 남기지 말고, 운영 secret 관리 경로에서 주입하는 방식이 좋습니다.

CREATE USER 'replication_user'@'replica-db.example.com' IDENTIFIED BY 'REPLACE_WITH_STRONG_PASSWORD';
GRANT REPLICATION SLAVE ON *.* TO 'replication_user'@'replica-db.example.com';
FLUSH PRIVILEGES;

MariaDB 버전에 따라 REPLICATION REPLICA 권한 표현을 지원할 수 있지만, REPLICATION SLAVE는 호환성 때문에 여전히 많이 쓰입니다. 실제 운영 버전에 맞춰 확인하세요.

replica 설정

replica에도 primary와 다른 고유 server_id를 설정합니다.

# replica: /etc/mysql/mariadb.conf.d/60-replication.cnf
[mariadb]
server_id=2
relay-log=replica1-relay-bin
read_only=ON
sudo systemctl restart mariadb
sudo systemctl status mariadb --no-pager

read_only=ON은 일반 사용자가 replica에 직접 쓰는 실수를 줄이는 장치입니다. 관리자 권한 사용자는 여전히 쓸 수 있으므로 운영 정책으로도 분리해야 합니다.

기존 데이터 기준점 잡기

운영 DB라면 primary에서 일관된 백업과 binary log 좌표를 확보합니다. 가장 단순한 전통 방식은 테이블을 잠그고 좌표를 기록한 뒤 덤프를 뜨는 것입니다. 데이터가 큰 환경에서는 mariadb-backup 같은 물리 백업 방식을 검토합니다.

-- primary 세션 1: 잠금 유지
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;

SHOW MASTER STATUSFilePosition 값을 기록합니다. 잠금 세션을 닫으면 lock이 풀리므로 주의하세요.

# primary 세션 2: 예시 덤프
mariadb-dump --single-transaction --routines --triggers --events --all-databases \
  | gzip -9 > mariadb-primary-full.sql.gz

스토리지 엔진과 쓰기 패턴에 따라 lock/backup 전략은 달라질 수 있습니다. 트랜잭션 테이블 중심이면 --single-transaction이 유용하지만, 모든 상황의 만능은 아닙니다.

-- primary 세션 1: 덤프 기준점 확보 후 잠금 해제
UNLOCK TABLES;

replica에 데이터 적재

scp mariadb-primary-full.sql.gz replica-db.example.com:/tmp/
ssh replica-db.example.com
gzip -dc /tmp/mariadb-primary-full.sql.gz | mariadb

데이터 적재가 끝난 뒤 replication 연결 정보를 설정합니다.

CHANGE MASTER TO
  MASTER_HOST='primary-db.example.com',
  MASTER_USER='replication_user',
  MASTER_PASSWORD='REPLACE_WITH_STRONG_PASSWORD',
  MASTER_PORT=3306,
  MASTER_LOG_FILE='primary1-bin.000001',
  MASTER_LOG_POS=12345,
  MASTER_CONNECT_RETRY=10;

GTID 기반으로 운영할 계획이라면 MASTER_USE_GTID=slave_pos를 검토합니다. 새 환경에서는 GTID가 장애 조치와 재구성에 더 유리한 경우가 많지만, 기존 환경과 섞을 때는 현재 GTID 상태를 먼저 이해해야 합니다.

CHANGE MASTER TO MASTER_USE_GTID=slave_pos;

복제 시작과 상태 확인

최근 MariaDB 문서는 START REPLICA, SHOW REPLICA STATUS를 사용합니다. 기존 START SLAVE, SHOW SLAVE STATUS도 호환 목적으로 남아 있는 환경이 많습니다.

START REPLICA;
SHOW REPLICA STATUS\G

최소한 다음 항목을 확인합니다.

Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0
Last_IO_Error:
Last_SQL_Error:

Slave_IO_Running이 No면 primary 접속, 계정 권한, 방화벽, binary log 좌표를 봅니다. Slave_SQL_Running이 No면 replica에서 SQL 적용 중 충돌이나 중복 키, 누락 테이블 같은 데이터 불일치를 봐야 합니다.

운영 중 기본 점검

SHOW MASTER STATUS;
SHOW REPLICA STATUS\G
SHOW VARIABLES LIKE 'server_id';
SHOW VARIABLES LIKE 'log_bin';
SHOW VARIABLES LIKE 'read_only';

replication은 백업을 대체하지 않습니다. primary에서 잘못 삭제한 데이터도 replica로 복제될 수 있기 때문입니다. 별도의 시점 백업, binlog 보관, 복구 리허설을 함께 운영해야 합니다.

공식 문서

MariaDB 버전별 용어와 옵션은 계속 정리되고 있으므로 실제 운영 전에는 공식 문서를 확인하세요.

BGM EVER