mysql

Master-Slave 노드간 복제(Replication) 실습 (feat. MySQL 8.0)

downfa11 2025. 6. 18. 19:55

MySQL 8.0 기반 데이터베이스 복제 실습

레포지토리에서 제공하는 자동화 스크립트들도 꼭 한번 확인해보길 바란다.

 

docker-entrypoint-initdb.d에서 User 생성, 권한 부여, 복제 구성 설정 등을 자동화하고 있다.

  • 01-init-user.sql : 복제를 담당할 User 생성 및 권한 부여 (Master Node)
  • 02-configure-replication.sql : Slave Node에서 실행될 복제 구성

 

실습한 내용은 Github Repository에서 확인할 수 있다.

https://github.com/downfa11/mysql-replication

 

GitHub - downfa11/mysql-replication: MySQL 8.0 기반 데이터베이스 복제와 GTID mode 실습

MySQL 8.0 기반 데이터베이스 복제와 GTID mode 실습. Contribute to downfa11/mysql-replication development by creating an account on GitHub.

github.com

 

 

📁 디렉토리 구조

.
├── README.md
├── master/
│   ├── init/
│   │   └── 01-init-user.sql
│   └── my.cnf
├── slave/
│   ├── init/
│   │   └── 02-configure-replication.sql
│   └── my.cnf
├── docker-compose.yml

 

MySQL 8.0 복제(Replication)

1. Docker-compose 실행

    docker-compose up -d
  • mysql-master port: 3307
  • mysql-slave port: 3308

 

아, 그리고 각 노드의 my.cnf 파일에서 미리 server-id를 설정하고 있지만, 권한 상태(777 → 644)를 변경해둬야한다.

 

권한이 너무 크면 MySQL가 자체적으로 막아버리고, default인 server-id=1로 중복된 상태로 master,slave 노드가 생성된다.

chmod 작업을 통해서 권한을 제한해둬야 정상적으로 각 노드가 서로 다른 server-id를 갖게 된다.

 

2. Master Node의 상태 확인

docker exec -it mysql-master mysql -uroot -prootpw -e "SHOW MASTER STATUS\G"
  • File, Position 값을 복제 구성에서 설정

 

복제 구성을 Slave 노드에서 실행할때 로그 파일명과 위치(Position)을 기록해둬야한다.

 

4. Master Node 덤프 파일 생성 및 Slave 복원

docker exec mysql-master sh -c "mysqldump -uroot -prootpw --all-databases --master-data=2" > dbdump.sql
docker cp dbdump.sql mysql-slave:/dbdump.sql
docker exec -i mysql-slave mysql -uroot -prootpw < /dbdump.sql

 

복제를 진행하기 전에 혹시 모를 사태를 대비해서 mysqldump 스냅샷을 찍어둔다.

 

5. Slave Node의 복제 구성

docker exec -it mysql-slave mysql -uroot -prootpw -e "
CHANGE MASTER TO
  MASTER_HOST='mysql-master',
  MASTER_PORT=3306,
  MASTER_USER='repl',
  MASTER_PASSWORD='replpw',
  MASTER_LOG_FILE=,
  MASTER_LOG_POS=;
START SLAVE;"
  • MASTER_LOG_FILE, MASTER_LOG_POS는 3번 항목에서 진행한대로, SHOW MASTER STATUS를 통해서 실제 자동 생성된 로그 파일 이름을 확인해야한다.

 

6. 복제(Replication) 확인

docker exec -it mysql-slave mysql -uroot -prootpw -e "SHOW SLAVE STATUS\G"
  • Slave_IO_Running, Slave_SQL_Running이 Yes인지 확인

 


정상적으로 복제에 성공한 모습

 

 

 

 

출처 및 인용

https://dev.mysql.com/doc/refman/8.0/en/replication.html