Computer >> 컴퓨터 >  >> 시스템 >> Linux

MariaDB 마스터-마스터/마스터-슬레이브 복제 구성 완벽 가이드

복제(Replication)는 SQL 데이터베이스에서 소스 데이터베이스의 데이터를 다른 데이터베이스(또는 여러 데이터베이스)로 복사하는 프로세스입니다. 한 데이터베이스 서버의 데이터가 하나 이상의 서버에 지속적으로 복사되며, 복제를 활용하면 여러 대의 복제 서버 풀에 요청을 분산·부하 분산할 수 있고, MariaDB 데이터베이스의 장애 조치(failover)와 고가용성도 확보할 수 있습니다.

MariaDB(MySQL 포함)에서는 마스터-마스터(Master-Master)마스터-슬레이브(Master-Slave) 두 가지 복제 방식을 사용할 수 있습니다. 이 글에서는 Linux CentOS 7 환경에서 두 가지 복제 방식을 모두 구성하는 방법을 자세히 살펴보겠습니다.

MariaDB 설치

CentOS 7에 MariaDB를 설치하는 과정은 이전에 발행한 별도의 가이드에서 다루었으므로, 여기서는 설치 자체보다 복제 설정 방법에 집중하겠습니다. 아직 설치하지 않았다면 먼저 MariaDB 설치 문서를 참고해 환경을 준비한 뒤 이 가이드를 따라오시기 바랍니다.

MariaDB 마스터-마스터 복제 구성하기

마스터-마스터 복제 방식에서는 두 대의 MariaDB/MySQL 서버 모두 읽기와 쓰기를 동시에 수행할 수 있습니다. 복제는 특수한 binlog 파일을 기반으로 동작합니다. 마스터 서버는 데이터베이스에 대한 모든 작업을 binlog에 기록하고, 슬레이브 서버는 마스터에 접속하여 해당 명령들을 자신의 데이터베이스에 적용합니다.

1. 첫 번째 마스터 서버(Master-1) 설정

첫 번째 MariaDB 서버의 my.cnf 파일에 다음 내용을 추가합니다:

#replication
server_id = 1
report_host = master
log_bin = /var/lib/mysql/mariadb-bin
log_bin_index = /var/lib/mysql/mariadb-bin.index
relay_log = /var/lib/mysql/relay-bin
relay_log_index = /var/lib/mysql/relay-bin.index

설정을 저장한 후 MariaDB 서비스를 재시작합니다:

service mariadb restart

복제 전용 사용자를 생성합니다:

mysql
create user 'test_master'@'%' identified by 'test_master';
grant replication slave on *.* to 'test_master'@'%';

슬레이브를 추가하려면 Master-1 서버의 binlog 정보가 필요합니다:

MariaDB [(none)]> show master status;

+--------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+--------------------+----------+--------------+------------------+
| mariadb-bin.000002 | 664 | | |
+--------------------+----------+--------------+------------------+
1 row in set (0.000 sec)

2. 두 번째 마스터 서버(Master-2) 설정

두 번째 MariaDB 서버에 접속하여 my.cnf 파일을 열고 다음 설정을 추가합니다:

#replication
server_id = 2
report_host = master2
log_bin = /var/lib/mysql/mariadb-bin
log_bin_index = /var/lib/mysql/mariadb-bin.index
relay_log = /var/lib/mysql/relay-bin
relay_log_index = /var/lib/mysql/relay-bin.index

두 번째 서버에서도 복제용 사용자를 생성합니다:

create user 'test_master2'@'%' identified by 'test_master2';
grant replication slave on *.* to 'test_master2'@'%';

Master-2의 binlog 정보도 확인합니다:

MariaDB [(none)]> show master status;

+--------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+--------------------+----------+--------------+------------------+
| mariadb-bin.000001 | 667 | | |
+--------------------+----------+--------------+------------------+
1 row in set (0.000 sec)

이제 복제 클러스터를 구성하는 두 서버 간 연결을 설정합니다. 먼저 슬레이브를 중지합니다:

STOP SLAVE;

두 번째 서버에 Master-1 정보를 등록합니다:

CHANGE MASTER TO MASTER_HOST='IP_master1', MASTER_USER='test_master', MASTER_PASSWORD='test_master', MASTER_LOG_FILE='mariadb-bin.000002', MASTER_LOG_POS=664;

복제를 시작합니다:

START SLAVE;

이번에는 Master-1에 접속하여 동일한 절차를 수행하되, 두 번째 서버의 정보를 지정합니다:

STOP SLAVE;
CHANGE MASTER TO MASTER_HOST='10.2.10.36', MASTER_USER='test_master2', MASTER_PASSWORD='test_master2', MASTER_LOG_FILE='mariadb-bin.000001', MASTER_LOG_POS=667;
START SLAVE;

두 번째 서버의 상태를 확인합니다:

show slave status \G

출력 결과를 보면 두 서버 간 연결이 정상적으로 수립되었고 오류가 없음을 확인할 수 있습니다.

3. MariaDB 서버 간 복제 동작 확인하기

마스터-마스터 복제가 정상 동작하는지 확인하기 위해 Master-1에서 새 데이터베이스와 테이블을 생성해 보겠습니다.

MariaDB [(none)]> create database master1;
MariaDB [(none)]> use master1;
MariaDB [master1]> CREATE TABLE hello (
-> AuthorID INT NOT NULL AUTO_INCREMENT,
-> AuthorName VARCHAR(100),
-> PRIMARY KEY(AuthorID)
-> );

두 번째 마스터 서버에서 해당 데이터베이스가 자동으로 복제되어 동일한 테이블을 포함하고 있는지 확인합니다:

MariaDB [(none)]> show databases;

+--------------------+
| Database |
+--------------------+
| information_schema |
| master1 |
| mysql |
| performance_schema |
+--------------------+

MariaDB [(none)]> use master1;
MariaDB [master1]> show tables;

+-------------------+
| Tables_in_master1 |
+-------------------+
| hello |
+-------------------+

두 번째 마스터에도 데이터베이스가 생성된 것을 확인했습니다. 전체 사이클을 검증하기 위해 이번에는 반대로 두 번째 마스터 서버의 master1 데이터베이스에 테이블을 생성하고, 첫 번째 서버에 나타나는지 확인합니다.

MariaDB [master1]> CREATE TABLE hello_master1 (
-> AuthorID INT NOT NULL AUTO_INCREMENT,
-> AuthorName VARCHAR(100),
-> PRIMARY KEY(AuthorID)
-> );

hello_master1 테이블이 첫 번째 서버로 복제되었습니다:

MariaDB [master1]> show tables;

+-------------------+
| Tables_in_master1 |
+-------------------+
| hello |
| hello_master1 |
+-------------------+

새 테이블이 Master-1에도 나타난 것을 확인할 수 있으며, 양방향 복제가 정상적으로 동작하고 있습니다.

MariaDB 마스터-슬레이브 복제 설정 방법

마스터-슬레이브 복제 방식에서는 한 서버가 슬레이브 역할을 하며, 마스터 서버의 데이터가 슬레이브에 지속적으로 기록됩니다. 슬레이브 서버에서 수행한 변경 사항은 마스터로 전달되지 않습니다. 이 복제 방식은 더 안정적이며 실무에서 가장 널리 사용됩니다.

이 구성에서는 항상 최신 데이터베이스 상태를 유지하는 백업 서버를 확보하게 되며, 슬레이브에 장애가 발생해도 마스터는 데이터를 잃지 않습니다. 또한 애플리케이션이 슬레이브 서버에서 데이터를 읽고 쓰기 작업만 마스터로 보내도록 부하를 분산하면, 데이터베이스 응답 속도를 최대화할 수 있습니다.

마스터-슬레이브 복제를 구성할 때 마스터 서버(master1)의 설정은 앞서 설명한 마스터-마스터 구성과 동일합니다.

이제 슬레이브 서버로 이동하여 my.cnf 파일에 다음 설정을 추가합니다:

#replication
server_id = 2
report_host = slave2
log_bin = /var/lib/mysql/mariadb-bin
log_bin_index = /var/lib/mysql/mariadb-bin.index
relay_log = /var/lib/mysql/relay-bin
relay_log_index = /var/lib/mysql/relay-bin.index

MariaDB 서비스를 재시작한 후, 첫 번째 서버의 binlog 정보를 확인합니다:

MariaDB [(none)]> show master status;

+--------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+--------------------+----------+--------------+------------------+
| mariadb-bin.000001 | 664 | | |
+--------------------+----------+--------------+------------------+

슬레이브 서버의 MariaDB 콘솔에서 다음 명령을 실행합니다:

MariaDB [(none)]> STOP SLAVE;

MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='IP_master', MASTER_USER='test_master', MASTER_PASSWORD='test_master', MASTER_LOG_FILE='mariadb-bin.000001', MASTER_LOG_POS=664;
MariaDB [(none)]> START SLAVE;

주의: 이미 운영 중인 기존 MariaDB 데이터베이스에 복제를 구성하는 경우, 복제를 시작하기 전에 데이터베이스를 읽기 전용 모드로 전환해야 binlog 위치가 변경되지 않습니다.

SET GLOBAL read_only = ON;

또한 데이터베이스 덤프(mysqldump)를 생성하여 슬레이브 서버의 초기 데이터 적재에 사용해야 합니다.

슬레이브 상태는 다음 명령으로 확인할 수 있습니다: SHOW SLAVE STATUS\G;

마스터에서 데이터베이스를 생성해 봅니다:

MariaDB [(none)]> create database master_hello;

슬레이브 서버에도 해당 데이터베이스가 생성되었는지 확인합니다:

MariaDB [(none)]> show databases;

+--------------------+
| Database |
+--------------------+
| information_schema |
| master_hello |
| master_test |
| mysql |
| performance_schema |
| test |
+--------------------+

이번에는 슬레이브 서버에서 데이터베이스를 생성하고, 그것이 마스터로 복제되는지 확인해 보겠습니다. 결과적으로 슬레이브에는 데이터베이스가 존재하지만, 마스터에는 나타나지 않습니다. 즉, 데이터는 슬레이브에서 마스터로 복제되지 않으며, MariaDB 복제가 단방향으로만 동작함을 의미합니다.

추가 검증으로 슬레이브 서버에서 master_hello 데이터베이스를 삭제해 보겠습니다. 삭제 후 마스터 서버를 확인하면 데이터베이스가 그대로 존재합니다. 이는 마스터-슬레이브 복제가 정상적으로 단방향으로만 동작한다는 것을 보여줍니다.

복제 구성 시 자주 발생하는 문제와 해결 방법

MariaDB 복제를 구성할 때 가장 흔히 마주치는 장애물은 방화벽입니다. CentOS에는 기본적으로 firewalld가 설치되어 있으며, MariaDB 복제 포트(TCP 3306)를 차단합니다. iptables로 포트를 열거나 방화벽을 비활성화(권장하지 않음)할 수 있습니다.

데이터베이스가 연결을 대기하는 IP 주소는 my.cnf의 bind-address 파라미터로 지정됩니다. 로컬 및 외부 연결을 허용하려면 이 줄을 주석 처리하고, 마스터/슬레이브 IP 주소에서 3306 포트로의 연결을 허용하는 iptables 규칙을 추가해야 합니다.

iptables -I INPUT -p tcp -s ip_address_slave_server --dport 3306 -j ACCEPT
iptables -I INPUT -p tcp --dport 3306 -j DROP

초기 설정 시 이 문제를 겪기 쉽지만, 진단은 어렵지 않습니다. SHOW SLAVE STATUS\G로 슬레이브 상태를 확인하면 관련 오류를 바로 확인할 수 있습니다.

my.cnf 주요 복제 파라미터 정리

my.cnf 파일의 #replication 블록에 추가할 수 있는 유용한 파라미터들을 소개합니다.

  • server_id = 1 — 서버 ID를 지정합니다. 보통 1부터 시작하지만, 복제에 참여하는 다른 서버와 중복되지 않는 숫자라면 무엇이든 사용할 수 있습니다.
  • report_host = master — 일반적으로 서버의 호스트명을 지정하며, IP 주소를 입력해도 됩니다.
  • log_bin = /var/lib/mysql/mariadb-bin — 업데이트 로그(log_bin)의 경로입니다.
  • log_bin_index = /var/lib/mysql/mariadb-bin.index — 현재 활성 로그와 이전에 사용된 로그를 확인할 수 있습니다.
  • relay_log = /var/lib/mysql/relay-bin, relay_log_index = /var/lib/mysql/relay-bin.index — 복제 릴레이 로그 경로입니다.

특정 데이터베이스만 복제하려면 다음 파라미터를 사용합니다:

replicate-do-db = dbname — 여러 개의 데이터베이스가 필요하면 쉼표로 구분하여 이름을 나열합니다.

반대로 특정 데이터베이스를 복제에서 제외하려면(일반적으로 information_schema, mysql, performance_schema 같은 시스템 데이터베이스를 제외합니다):

binlog-ignore-db = dbname

binlog의 보관 기간을 설정하려면:

expire_logs_days = 10 — 10은 로그가 저장되는 일수입니다.

또한 마스터 서버의 데이터가 다른 이름의 데이터베이스에 기록되도록 하려면 설정 파일에서 다음과 같이 지정할 수 있습니다:

replicate-rewrite-db=dbmastername->dbslavename

지금까지 MariaDB 복제 구성의 전체 과정을 살펴보았습니다. 이 가이드를 따르면 마스터-마스터 및 마스터-슬레이브 두 가지 모드 모두에서 MariaDB 복제를 문제없이 구성할 수 있을 것입니다.