최초 작성일 : 2025-07-25 | 수정일 : 2025-07-25 | 조회수 : 38 |
안녕하세요., 오늘은 개발 및 운영 환경에서 데이터 이중화와 부하 분산을 위해 필수적인 MySQL 데이터베이스 실시간 미러링(Replication) 방법을 소개해 본다.
이 가이드에서는 두 대의 MySQL 5.7 서버를 사용하여, 원본 서버(Master)의 특정 데이터베이스 변경 사항을 다른 서버(Slave)로 실시간 복제하는 과정을 블로그 글 형식으로 자세히 알아보자.
복제 환경
원본 (Master) 서버: 172.30.10.191 (MySQL 5.7) 복제 (Slave) 서버: 172.30.10.192 (MySQL 5.7) 대상 데이터베이스: test
1단계: 원본(Master) 서버 설정 (172.30.10.191)
가장 먼저 원본 서버가 자신의 변경 이력을 기록하도록 설정해야 한다.
1. my.cnf 파일 수정
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 데이터베이스에서 발생하는 변경 사항만 바이너리 로그에 기록되어, 불필요한 로그 생성을 막고 복제 부하를 줄일 수 있다.
2. MySQL 서버 재시작
설정을 적용하기 위해 MySQL 서버를 재시작한다.
sudo systemctl restart mysqld # 또는 sudo service mysql restart
3. 복제용 사용자 생성
복제 서버(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;
4. Master 상태 확인 및 기록
가장 중요한 단계이다.
현재 원본 서버의 로그 파일 이름(File)과 위치(Position)를 확인하고 반드시 메모해두어야 한다.
이 정보는 나중에 복제 서버에 알려줄 '시작 지점'이 된다.SHOW MASTER STATUS;
아래와 같은 결과가 나오면 File과 Position 값을 복사해두세요.
+------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000001 | 120 | test | | +------------------+----------+--------------+------------------+
2. 데이터 초기 동기화 (Master → Slave)
복제를 시작하기 전, 두 서버의 데이터가 동일한 상태여야 한다.
원본 서버의 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
3. 복제(Slave) 서버 설정 (172.30.10.192)
이제 복제 서버가 원본 서버를 바라보도록 설정할 차례이다.
1. my.cnf 파일 수정
복제 서버의 MySQL 설정 파일(my.cnf 또는 my.ini)을 열어 [mysqld] 섹션에 아래 내용을 추가한다.
서버 ID는 원본과 달라야 한다.[mysqld] # 원본 서버와 다른 고유 ID를 설정한다.
server-id = 2 # 복제할 데이터베이스 지정 (test DB만 복제) replicate_do_db = test
2. MySQL 서버 재시작
설정 적용을 위해 MySQL 서버를 재시작한다.
sudo systemctl restart mysqld # 또는 sudo service mysql restart
3. Master 정보 등록 및 복제 시작
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;
4. 복제 상태 확인
마지막으로 복제가 정상적으로 동작하는지 확인한다.
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 데이터베이스에도 동일하게 반영되는 것을 확인할 수 있다.