Programming

도커로 MySQL Master Slave Replication 만들기

모두한 2024. 6. 3. 23:02

들어가며

MySQL는 내부 설정을 통해 Replication을 설정할 수 있습니다. 도커를 이용해 더 편하게 설정하도록 합니다. 더 자세한 데이터베이스 복제 과정은 해당 포스팅을 통해 확인할 수 있습니다.

설치 및 실행

1. Git Clone

github으로 이동하여 레포지토리를 클론 합니다.

2. 쉘 파일 실행권한 부여

chmod 755 build.sh

3. 쉘 파일 실행

./build.sh

위 결과나 나와야 합니다.

실제 Replication 확인

터미널 1

# 컨테이너 진입
docker exec -it mysql_master /bin/bash

# MySQL 접속 (Master)
mysql -u mydb_user -p
Enter password: mydb_pwd

# 데이터베이스 선택 & Table 생성 & 데이터 삽입
use mydb
create table demo(code int);
insert into demo values(100);

 

터미널 2

# 컨테이너 진입
docker exec -it mysql_slave /bin/bash

# MySQL 접속 (Slave)
mysql -u read_user -p
Enter password: read_pwd

# 데이터베이스 선택 & Table 조회
use mydb
select * from demo;

Slave 데이터베이스에서 select를 해보면 위와 같은 결과가 나오게 됩니다.

Master 데이터베이스에서 insert를 한번 더 실행 후 Slave 데이터베이스에서 확인을 해보면 

 

동기화가 정상적으로 된 모습을 볼 수 있습니다.

파일 설명

docker-compose.yml

master, slave 컨테이너를 띄웁니다.

두 컨테이너는 서로 동일한 네트워크에 구성됩니다.

env_file 옵션을 통해 다양한 옵션을 지정할 수 있습니다. (참고)

mysql.conf.cnf 파일을 연결하여 mysql의 내부설정을 직접 지정할 수 있습니다.

 

mysql_master.env

root유저 이외에 mydb_user를 생성합니다. 이 유저는 MYSQL_DATABASE 옵션을 통해 초기화한 mydb에만 접근할 수 있습니다.

 

mysql_slave.env

master db에서 데이터를 복제할 데이터베이스를 생성합니다. 동일하게 mydb로 생성합니다. 여기서는 따로 유저를 생성하지 않습니다.

 

master/conf/mysql.conf.cnf

server-id = 1

replication에 사용되는 master, slave 데이터베이스는 모두 고유의 번호를 사용하여야 합니다.

log_bin = 1

바이너리 로그 파일의 경로를 지정합니다. 여기서는 1이라고 설정했지만 var/log/... 형태로 지정할 수 있습니다.

binlog_format = ROW

바이너리 로그 형식을 설정합니다. ROW, STATEMENT, MIXED가 가능하며 해당 실습에서는 ROW를 사용합니다. ROW 옵션은 변경작업을 통해 변경된 모든 ROW를 기록하는 방식입니다. 다른 옵션에 대한 설명은 공식문서에서 확인 가능합니다.

binlog_do_db = mydb

바이너리 로그파일이 기록될 데이터베이스를 지정합니다.

 

build.sh

#!/bin/bash
# ...
# master 데이터베이스 내에 slave 유저를 만든 후 REPLICATION 권한을 부여합니다.
PRIVILEGES_STMT='CREATE USER "mydb_slave_user"@"%" IDENTIFIED BY "mydb_slave_pwd"; GRANT REPLICATION SLAVE ON *.* TO "mydb_slave_user"@"%"; FLUSH PRIVILEGES;'
docker exec mysql_master sh -c "export MYSQL_PWD=111; mysql -u root -e '$PRIVILEGES_STMT'"

# ...
# master 데이터베이스의 replication 설정값을 추출합니다.
MS_STATUS=`docker exec mysql_master sh -c 'export MYSQL_PWD=111; mysql -u root -e "SHOW MASTER STATUS;"'`
CURRENT_LOG=`echo $MS_STATUS | awk '{print $6}'`
CURRENT_POS=`echo $MS_STATUS | awk '{print $7}'`

# ...
# master 데이터베이스를 호스트로 지정하고 (docker container IP 대신 container 이름으로 설정가능)
# master 데이터베이스 내부에 Replication 권한을 가진 유저(mydb_slave_user)를 통해 복제를 시작합니다.
START_SLAVE_STMT="CHANGE MASTER TO MASTER_HOST='mysql_master',MASTER_USER='mydb_slave_user',MASTER_PASSWORD='mydb_slave_pwd',MASTER_LOG_FILE='$CURRENT_LOG',MASTER_LOG_POS=$CURRENT_POS; START SLAVE;"
START_SLAVE_CMD='export MYSQL_PWD=111; mysql -u root -e "'
START_SLAVE_CMD+="$START_SLAVE_STMT"
START_SLAVE_CMD+='"'
docker exec mysql_slave sh -c "$START_SLAVE_CMD"

# ...
# slave 데이터베이스에 read 권한을 가진 유저를 생성합니다.
# 실제 애플리케이션에서는 해당 유저를 통해서 데이터베이스에 접근하도록 합니다.
CREATE_READ_USER_STMT='CREATE USER "read_user"@"%" IDENTIFIED BY "read_pwd"; GRANT SELECT ON *.* TO "read_user"@"%";'
docker exec mysql_slave sh -c "export MYSQL_PWD=111; mysql -u root -e '$CREATE_READ_USER_STMT'"

마치며

이번 글에서는 Docker Compose를 이용해 MySQL Replication을 설정하는 방법을 살펴보았습니다. 도커를 활용함으로써 복제 설정을 간편하게 구현하고, 마스터와 슬레이브 데이터베이스 간의 데이터 동기화를 확인할 수 있었습니다. 이를 통해 데이터의 가용성을 높이고, 백업 및 분산 처리를 위한 기반을 마련할 수 있었습니다.

긴 글 읽어주셔서 감사합니다.

reference

https://medium.com/@vbabak/docker-mysql-master-slave-replication-setup-2ff553fceef2

https://dev.mysql.com/doc/refman/8.4/en/binary-log-setting.html

 

Docker MySQL Master-Slave Replication Setup

Learn by doing. Easy make a test MySQL replication setup on a home laptop with a docker.

medium.com

 

'Programming' 카테고리의 다른 글

객체지향 5원칙 SOLID 코드로 이해하기  (0) 2024.05.20