MySQL

MySQL 5.7 서버 간 실시간 데이터베이스 미러링 완벽 가이드


MySQL 5.7 서버 간 실시간 데이터베이스 미러링 완벽 가이드




최초 작성일 : 2025-07-25 | 수정일 : 2025-07-25 | 조회수 : 38


MySQL 5.7 서버 간 실시간 데이터베이스 미러링 완벽 가이드

 

 

안녕하세요., 오늘은 개발 및 운영 환경에서 데이터 이중화와 부하 분산을 위해 필수적인 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 데이터베이스에도 동일하게 반영되는 것을 확인할 수 있다.

Tags  #2  

닉네임:
댓글내용:
🎖️ 'MySQL' 카테고리의 다른 인기글