소개
이 실습에서는 MySQL 복제 (replication) 의 기본 사항을 배우게 됩니다. 복제는 여러 서버에 MySQL 데이터베이스의 복사본을 유지하는 프로세스입니다. 이는 일반적으로 로드 밸런싱, 데이터 백업 및 고가용성 (high availability) 에 사용됩니다.
Docker 를 사용하여 두 개의 별도 MySQL 컨테이너로 현실적인 마스터 - 슬레이브 복제 설정을 생성합니다. 먼저, 바이너리 로깅 (binary logging) 이 활성화되도록 사전 구성된 마스터 컨테이너를 시작하고 확인합니다. 마스터에 특별한 복제 사용자 (replication user) 를 생성합니다. 그런 다음, 두 번째 컨테이너를 슬레이브로 구성하고 마스터에 연결한 후 데이터가 올바르게 동기화되는지 확인합니다. 이러한 실습 접근 방식은 실제 MySQL 복제 환경을 관리하는 데 관련된 주요 단계를 이해하는 데 도움이 될 것입니다.
Docker 환경 설정
첫 번째 단계에서는 마스터 - 슬레이브 복제 환경에 필요한 Docker 컨테이너를 설정합니다. 전용 네트워크를 생성하고 두 개의 MySQL 컨테이너를 실행합니다.
Docker 네트워크 생성:
전용 네트워크를 사용하면 컨테이너 간에 이름으로 통신할 수 있습니다.
mysql-net이라는 네트워크를 생성합니다.docker network create mysql-net마스터 MySQL 컨테이너 시작:
다음으로 마스터 컨테이너를 시작합니다. 이 명령은
mysql:5.7을 사용하고 서버 ID 를 1 로 구성하며replication_db데이터베이스에 대한 바이너리 로깅을 활성화합니다.docker run -d \ --name mysql-master \ --network mysql-net \ -e MYSQL_ROOT_PASSWORD=lab_password \ -e MYSQL_DATABASE=replication_db \ mysql:5.7 \ mysqld --server-id=1 --log-bin=mysql-bin --binlog-do-db=replication_db슬레이브 MySQL 컨테이너 시작:
이제 슬레이브 컨테이너를 시작합니다. 이 컨테이너도 동일한 네트워크에 있으며 서버 ID 2 로 구성됩니다. 슬레이브가 마스터의 변경 사항을 올바르게 적용할 수 있도록
replication_db데이터베이스를 미리 생성합니다.docker run -d \ --name mysql-slave \ --network mysql-net \ -e MYSQL_ROOT_PASSWORD=lab_password \ -e MYSQL_DATABASE=replication_db \ mysql:5.7 \ mysqld --server-id=2 --relay-log=mysql-relay-bin --log-slave-updates=1컨테이너 초기화 대기:
MySQL 컨테이너가 초기화되는 데 시간이 필요합니다. 컨테이너가 실행 중인지 확인하기 위해 약 15 초 동안 기다립니다.
docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES cfe8c98d2ad0 mysql:5.7 "docker-entrypoint.s…" 2 minutes ago Up 2 minutes 3306/tcp, 33060/tcp mysql-slave fc125bf293ea mysql:5.7 "docker-entrypoint.s…" 2 minutes ago Up 2 minutes 3306/tcp, 33060/tcp mysql-master
이제 환경 설정이 완료되었으므로 마스터 서버 구성을 진행할 수 있습니다.
마스터 서버 설정 확인
컨테이너가 실행되었으므로 다음 단계는 마스터 서버가 복제를 위해 올바르게 구성되었는지 확인하는 것입니다. 마스터의 주요 책임은 모든 데이터베이스 변경 사항을 바이너리 로그 (binary log) 에 기록하는 것이며, 슬레이브는 나중에 이를 읽게 됩니다.
먼저 데스크톱에서 터미널을 엽니다.
이제 마스터 컨테이너에 연결하여 구성을 확인합니다.
마스터 컨테이너에 연결:
docker exec를 사용하여mysql-master컨테이너 내에서 MySQL 셸을 엽니다. 암호를 입력하라는 메시지가 표시되며, 암호는lab_password입니다.docker exec -it mysql-master mysql -uroot -plab_password바이너리 로깅 및 서버 ID 확인:
mysql>프롬프트가 표시되면 다음 명령을 실행하여 바이너리 로깅이 활성화되었고 서버 ID 가 올바르게 설정되었는지 확인합니다.SHOW VARIABLES LIKE 'log_bin';출력에서
log_bin이ON으로 표시되어야 합니다.+---------------+----+ | Variable_name | Value | +---------------+----+ | log_bin | ON | +---------------+----+ 1 row in set (0.01 sec)다음으로 서버 ID 를 확인합니다.
SHOW VARIABLES LIKE 'server_id';출력에서
server_id가1로 표시되어야 합니다.+---------------+-------+ | Variable_name | Value | +---------------+-------+ | server_id | 1 | +---------------+-------+ 1 row in set (0.00 sec)구성을 확인했으므로 MySQL 셸을 종료할 수 있습니다.
exit;
마스터 서버가 복제를 위해 준비되었음을 성공적으로 확인했습니다.
복제 사용자 및 테스트 데이터베이스 생성
슬레이브 서버는 바이너리 로그를 읽기 위해 마스터에 연결해야 합니다. 보안을 위해 이 목적을 위한 전용 사용자 계정을 생성하고 제한된 권한을 부여하는 것이 가장 좋습니다. 이 단계에서는 복제 사용자를 생성하고 테스트 데이터베이스를 채워 복제를 작동하는 것을 관찰합니다.
마스터 서버에 연결:
mysql-master컨테이너 내에서 MySQL 셸을 엽니다.docker exec -it mysql-master mysql -uroot -plab_password복제 사용자 생성:
mysql>프롬프트에서 다음 명령을 실행하여repl_password라는 암호를 가진repl_user라는 사용자를 생성합니다. 이 사용자는 슬레이브가 연결하는 데 사용됩니다.'@'%'를 사용하여 사용자가 모든 호스트에서 연결할 수 있도록 허용하며, 여기에는 Docker 네트워크의 슬레이브 컨테이너가 포함됩니다.CREATE USER 'repl_user'@'%' IDENTIFIED BY 'repl_password';복제 권한 부여:
새 사용자에게는 마스터의 바이너리 로그를 읽을 수 있는
REPLICATION SLAVE권한이 필요합니다.GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%';권한을 부여한 후 권한 테이블을 다시 로드하여 변경 사항을 즉시 적용합니다.
FLUSH PRIVILEGES;마스터의 바이너리 로그 상태 확인:
슬레이브를 구성하기 전에 슬레이브가 복제를 시작해야 하는 마스터의 바이너리 로그 내 정확한 좌표를 알아야 합니다.
SHOW MASTER STATUS명령은 이 정보를 제공합니다.SHOW MASTER STATUS;출력은 다음과 유사합니다.
File및Position값을 기록해 두십시오. 다음 단계에서 필요합니다.+------------------+----------+------------------+--------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+------------------+--------------------+-------------------+ | mysql-bin.000001 | 337 | replication_db | | | +------------------+----------+------------------+--------------------+-------------------+ 1 row in set (0.00 sec)테스트 테이블 및 데이터 생성:
replication_db데이터베이스는 컨테이너 시작 시 생성되었습니다. 복제를 테스트하기 위해 테이블을 생성하고 일부 데이터를 삽입해 보겠습니다.USE replication_db; CREATE TABLE messages ( id INT PRIMARY KEY AUTO_INCREMENT, content VARCHAR(255) ); INSERT INTO messages (content) VALUES ('Hello from the master!');데이터가 올바르게 삽입되었는지 확인할 수 있습니다.
SELECT * FROM messages;방금 삽입한 행이 표시되어야 합니다.
+----+------------------------+ | id | content | +----+------------------------+ | 1 | Hello from the master! | +----+------------------------+ 1 row in set (0.00 sec)이제 MySQL 셸을 종료합니다.
exit;
복제 사용자 및 일부 테스트 데이터를 생성하여 마스터 서버를 준비했습니다.
슬레이브 서버 구성 및 시작
이제 마스터가 준비되었으므로 슬레이브 컨테이너를 구성합니다. 이 단계에서는 3 단계에서 마스터로부터 기록한 바이너리 로그 좌표를 사용하여 슬레이브가 복제를 시작할 위치를 알려줍니다.
슬레이브 컨테이너에 연결:
먼저
mysql-slave컨테이너 내에서 MySQL 셸을 엽니다.docker exec -it mysql-slave mysql -uroot -plab_password슬레이브를 마스터에 연결하도록 구성:
이제
CHANGE MASTER TO명령을 사용하여 복제 설정을 구성합니다. 3 단계에서SHOW MASTER STATUS에서 기록한File및Position값을 사용합니다.MASTER_HOST는'mysql-master'이며, 이는 두 컨테이너가 동일한 Docker 네트워크에 있기 때문에 작동합니다.참고:
mysql-bin.000001및 위치 번호를 3 단계에서 기록한 실제 값으로 바꾸십시오. 값이 없는 경우 새 터미널에서docker exec mysql-master mysql -uroot -plab_password -e "SHOW MASTER STATUS;"를 실행하여 가져올 수 있습니다.CHANGE MASTER TO MASTER_HOST='mysql-master', MASTER_USER='repl_user', MASTER_PASSWORD='repl_password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=337;이 명령은 슬레이브에 마스터에 연결하는 데 필요한 모든 정보를 구성합니다.
슬레이브 스레드 시작:
마지막으로
START SLAVE명령을 실행하여 복제 프로세스를 시작합니다. 이렇게 하면 두 개의 스레드가 시작됩니다. 하나는 마스터에서 바이너리 로그를 가져오는 I/O 스레드이고, 다른 하나는 로그의 이벤트를 실행하는 SQL 스레드입니다.START SLAVE;이제 MySQL 셸을 종료할 수 있습니다.
exit;
슬레이브가 이제 구성되었으며 마스터에 연결하고 데이터를 복제하려고 시도해야 합니다.
복제 확인
슬레이브를 시작한 후 마지막 단계는 복제가 올바르게 작동하는지 확인하는 것입니다. 슬레이브의 상태를 확인하고 마스터의 데이터가 복사되었는지 확인할 것입니다.
슬레이브 서버에 연결:
mysql-slave컨테이너에서 MySQL 셸을 엽니다.docker exec -it mysql-slave mysql -uroot -plab_password슬레이브 상태 확인:
복제를 모니터링하는 가장 중요한 명령은
SHOW SLAVE STATUS입니다.\G수정자는 출력을 세로로 형식화하여 훨씬 읽기 쉽게 만듭니다.SHOW SLAVE STATUS\G출력에서 다음 두 줄을 찾으십시오. 둘 다
Yes값을 가져야 합니다.Slave_IO_Running: Yes: 슬레이브가 마스터에 성공적으로 연결되어 바이너리 로그 데이터를 수신하고 있음을 확인합니다.Slave_SQL_Running: Yes: 슬레이브가 바이너리 로그의 이벤트를 성공적으로 실행하고 있음을 확인합니다.
또 다른 중요한 필드는
Seconds_Behind_Master입니다.0의 값은 슬레이브가 마스터와 완전히 동기화되었음을 나타냅니다.정상적인 상태는 다음과 유사합니다 (일부 값은 다를 수 있습니다).
*************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: mysql-master Master_User: repl_user Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000001 Read_Master_Log_Pos: 529 Relay_Log_File: mysql-relay-bin.000002 Relay_Log_Pos: 699 Relay_Master_Log_File: mysql-bin.000001 Slave_IO_Running: Yes Slave_SQL_Running: Yes ... Seconds_Behind_Master: 0 ...복제된 데이터 확인:
이제
replication_db데이터베이스와 해당 데이터가 마스터에서 복사되었는지 확인합니다.SHOW DATABASES;목록에서
replication_db를 볼 수 있어야 합니다.+--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | replication_db | | sys | +--------------------+데이터베이스로 전환하고
messages테이블을 쿼리합니다.USE replication_db; SELECT * FROM messages;마스터에 삽입한 데이터가 이제 슬레이브에 있어야 합니다.
+----+------------------------+ | id | content | +----+------------------------+ | 1 | Hello from the master! | +----+------------------------+ 1 row in set (0.00 sec)이는 복제가 올바르게 작동하고 있음을 확인합니다. 이제 MySQL 셸을 종료할 수 있습니다.
exit;
Docker 를 사용하여 기본 MySQL 마스터 - 슬레이브 복제 환경을 성공적으로 설정하고 확인했습니다.
요약
이 실습에서는 Docker 를 사용하여 MySQL 마스터 - 슬레이브 복제를 설정하는 기본 단계를 배웠습니다. Docker 네트워크를 통해 연결된 마스터용 컨테이너와 슬레이브용 컨테이너 두 개를 만들어 시작했습니다. 바이너리 로그 활성화 및 고유한 서버 ID 를 포함한 마스터 구성을 확인했습니다. 그런 다음 보안 연결을 위해 마스터에 전용 복제 사용자를 생성했습니다. 마스터 준비 후 CHANGE MASTER TO 명령을 사용하여 슬레이브 컨테이너를 구성하여 마스터의 바이너리 로그 좌표와 연결을 설정했습니다. 마지막으로 SHOW SLAVE STATUS로 슬레이브 상태를 확인하고 테스트 데이터가 올바르게 동기화되었는지 확인하여 복제 성공을 검증했습니다. 이 실습을 통해 실제 MySQL 복제 설정을 구성, 관리 및 검증하는 데 필요한 기술을 습득했습니다.



