최초 작성일 : 2025-07-25 | 수정일 : 2025-07-25 | 조회수 : 92 |
안녕하세요! 오늘은 개발 및 운영 환경에서 데이터 이중화와 부하 분산을 위해 필수적인 MySQL 데이터베이스 실시간 미러링(Replication) 방법을 소개하려고 합니다.
이 가이드에서는 두 대의 MySQL 5.7 서버를 사용하여, 원본 서버(Master)의 특정 데이터베이스 변경 사항을 다른 서버(Slave)로 실시간 복제하는 과정을 블로그 글 형식으로 자세히 알아보겠습니다.
원본 (Master) 서버: 172.30.10.191 (MySQL 5.7)
복제 (Slave) 서버: 172.30.10.192 (MySQL 5.7)
대상 데이터베이스: test
가장 먼저 원본 서버가 자신의 변경 이력을 기록하도록 설정해야 합니다.
MySQL 설정 파일(my.cnf 또는 my.ini)을 열어 [mysqld] 섹션에 아래 내용을 추가하거나 수정해주세요.
[mysqld]
# 서버 ID는 각 서버마다 고유해야 합니다.
server-id = 1
# 바이너리 로그 활성화 (변경 이력 기록)
log-bin = mysql-bin
# 복제할 데이터베이스 지정 (test DB만 변경 이력을 기록)
binlog_do_db = test
💡 왜 binlog_do_db를 사용하나요? 이 옵션을 사용하면 test 데이터베이스에서 발생하는 변경 사항만 바이너리 로그에 기록되어, 불필요한 로그 생성을 막고 복제 부하를 줄일 수 있습니다.
설정을 적용하기 위해 MySQL 서버를 재시작합니다.
sudo systemctl restart mysqld
# 또는 sudo service mysql restart
복제 서버(Slave)가 원본 서버(Master)에 접속할 때 사용할 전용 계정을 생성하고, 복제에 필요한 최소한의 권한을 부여합니다.
-- MySQL에 root 계정으로 접속
mysql -u root -p
-- '172.30.10.192' 서버에서만 접속 가능한 'replicator' 유저 생성
CREATE USER 'replicator'@'172.30.10.192' IDENTIFIED BY '사용할_비밀번호';
-- 복제에 필요한 권한 부여
GRANT REPLICATION SLAVE ON *.* TO 'replicator'@'172.30.10.192';
-- 권한 적용
FLUSH PRIVILEGES;
가장 중요한 단계입니다. 현재 원본 서버의 로그 파일 이름(File)과 위치(Position)를 확인하고 반드시 메모해두어야 합니다. 이 정보는 나중에 복제 서버에 알려줄 "시작 지점"이 됩니다.
SHOW MASTER STATUS;
아래와 같은 결과가 나오면 File과 Position 값을 복사해두세요.
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 120 | test | |
+------------------+----------+--------------+------------------+
복제를 시작하기 전, 두 서버의 데이터가 동일한 상태여야 합니다. 원본 서버의 test 데이터베이스를 그대로 복제 서버로 옮기는 과정입니다.
mysqldump를 사용해 test 데이터베이스만 백업하고, scp로 복제 서버에 전송한 뒤, 복원합니다.
# 1. 원본 서버(191)에서 백업
mysqldump -u root -p --databases test > test_db_backup.sql
# 2. 복제 서버(192)로 파일 전송
scp test_db_backup.sql root@172.30.10.192:/tmp/
# 3. 복제 서버(192)에서 복원
mysql -u root -p < /tmp/test_db_backup.sql
이제 복제 서버가 원본 서버를 바라보도록 설정할 차례입니다.
복제 서버의 MySQL 설정 파일(my.cnf 또는 my.ini)을 열어 [mysqld] 섹션에 아래 내용을 추가합니다. 서버 ID는 원본과 달라야 합니다.
[mysqld]
# 원본 서버와 다른 고유 ID를 설정합니다.
server-id = 2
# 복제할 데이터베이스 지정 (test DB만 복제)
replicate_do_db = test
설정 적용을 위해 MySQL 서버를 재시작합니다.
sudo systemctl restart mysqld
# 또는 sudo service mysql restart
MySQL에 접속하여, 아까 메모해 둔 원본 서버의 정보(로그 파일, 위치)를 등록하고 복제를 시작합니다.
-- MySQL에 root 계정으로 접속
mysql -u root -p
-- 원본(Master) 서버 정보 등록
CHANGE MASTER TO
MASTER_HOST='172.30.10.191',
MASTER_USER='replicator',
MASTER_PASSWORD='설정한_비밀번호',
MASTER_LOG_FILE='mysql-bin.000001', -- 메모해둔 File 값
MASTER_LOG_POS=120; -- 메모해둔 Position 값
-- 복제 프로세스 시작
START SLAVE;
마지막으로 복제가 정상적으로 동작하는지 확인합니다.
SHOW SLAVE STATUS\G;
출력된 결과에서 아래 두 항목이 모두 Yes로 표시되면 성공입니다! 🎉
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
만약 No가 있다면, Last_Error 필드를 확인하여 원인을 찾아 해결해야 합니다. (보통 IP 주소, 사용자 계정, 비밀번호, 방화벽 문제인 경우가 많습니다.)
이제 원본 서버 172.30.10.191의 test 데이터베이스에 데이터를 추가하거나 수정하면, 잠시 후 복제 서버 172.30.10.192의 test 데이터베이스에도 동일하게 반영되는 것을 확인할 수 있습니다.