MySQL on Docker Series
1. Master-Slave Replication 구성하기
2. Bridge Network를 이용한 Replication 구성하기
이전 포스팅에서 컨테이너 환경에서 MySQL 서버 3대(Master DB 1대, Slave DB 2대)를 구축했다.
그런데 MySQL Master DB 컨테이너가 재실행되면서 IP 주소가 변경되는 경우, Replication이 깨질 수 있기 때문에 Slave DB에 각각 접속해서 Master DB 컨테이너의 IP를 수정해야 하는 번거로움이 생긴다.
이러한 번거로움을 해결하기 위해 Docker Bridge Network를 구성하고 net alias를 사용하여 IP 변경에도 문제가 발생하지 않도록 할 수 있다.
Bridge Network란?
Bridge Network는 컨테이너간 통신할 때 사용되는 개념이다.
도커 컨테이너는 독립된 환경이지만, Bridge Network를 통해 컨테이너간 통신을 할 수 있다.
참고로 Bridge Network는 여러 Docker Network 유형 중 하나이다.
Docker Network에는 Bridge, Host, None 등 여러 유형이 존재하는데 Bridge가 기본 값으로 사용된다.
추후 Docker Network에 대해 깊게 다뤄볼 예정이다.
Bridge Network 생성하기
mybridge라는 이름의 Bridge Network를 생성한다.
$ docker network create --driver bridge mybridge
생성한 Bridge Network 확인하기
$ docker network ls

mybridge라는 이름의 Bridge Network가 생성된 것을 확인할 수 있다.
Bridge Network를 생성하지 않았는데도 컨테이너끼리 통신이 가능했었는데?
위 사진을 보면 방금 생성한 mybridge network 말고도 bridge, host, none 등 여러 Docker Network가 출력되는 것을 확인할 수 있다.
이는 도커 엔진이 실행될 때 기본적으로 생성되는 Docker Network이다.
이전 포스팅에서 Master-Slave Replication을 구성할 때 Slave DB에서 Master DB의 IP를 직접 입력했고 통신이 잘 되는 것을 확인했었다. 이는 도커를 사용하여 MySQL 서버를 실행할 때 특정 network를 사용한다는 것을 명시하지 않았기 때문에 기본적으로 생성되는 Bridge Network로 설정이 되어서 가능한 것이다.
Bridge Network를 이용해서 컨테이너 생성하기
# master db 실행
$ docker run -it --name db001 -p 3306:3306 -h db001 \
--net mybridge --net-alias=db001 \
-v ~/db/db001/data:/var/lib/mysql \
-v ~/db/db001/log:/var/log/mysql \
-v ~/db/db001/conf:/etc/percona-server.conf.d \
-e MYSQL_ROOT_PASSWORD="root" \
-d percona:5.7.30
# slave db-1 실행
$ docker run -it --name db002 -p 3307:3306 -h db002 \
--net mybridge --net-alias=db002 \
-v ~/db/db002/data:/var/lib/mysql \
-v ~/db/db002/log:/var/log/mysql \
-v ~/db/db002/conf:/etc/percona-server.conf.d \
-e MYSQL_ROOT_PASSWORD="root" \
-d percona:5.7.30
# slave db-2 실행
$ docker run -it --name db003 -p 3308:3306 -h db003 \
--net mybridge --net-alias=db003 \
-v ~/db/db003/data:/var/lib/mysql \
-v ~/db/db003/log:/var/log/mysql \
-v ~/db/db003/conf:/etc/percona-server.conf.d \
-e MYSQL_ROOT_PASSWORD="root" \
-d percona:5.7.30
Bridge Network를 이용해서 Master-Slave Replication 설정하기
이전 포스팅처럼 동일하게 구성한다.
Replication user 생성(db001)
USER를 생성하기 전에 Master DB(db001)에 접속한다.
$ docker exec -it -uroot db001 /bin/bash
$ mysql -uroot -p # 패스워드는 docker run 명령어 실행 시 설정한 "root"
이후 아래의 명령어를 실행하여 USER 생성한다.
mysql > CREATE USER 'repl'@'%' IDENTIFIED BY 'repl';
mysql > GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
그리고 Master DB (db001) 컨테이너의 IP를 알아두자.

Replication user 생성(db002, db003)
Slave DB 2대는 모두 동일한 Master DB를 바라보고 있어야 한다.
따라서 설정은 동일하니 db002, db003 한꺼번에 진행하기로 한다.
Master DB에와 마찬가지로 USER를 생성하기 전에 Slave DB에 접속한다.
# Slave DB-1(db002)
$ docker exec -it -uroot db002 /bin/bash
$ mysql -uroot -p # 패스워드는 docker run 명령어 실행 시 설정한 "root"
# Slave DB-2(db003)
$ docker exec -it -uroot db003 /bin/bash
$ mysql -uroot -p # 패스워드는 docker run 명령어 실행 시 설정한 "root"
여기서부터는 이전 포스팅과 다르다. 생성한 bridge network를 사용한다.
# SlaveDB 2대 동일하게 아래 명령어를 실행
mysql> reset master;
mysql> CHANGE MASTER TO MASTER_HOST='db001', \ # db001은 도커 실행 시 -h 옵션으로 주었던 호스트 alias이다.
MASTER_USER='repl', \
MASTER_PASSWORD='repl', \
MASTER_AUTO_POSITION=1;
mysql> START SLAVE;
mysql> show slave status\G
slave db-1(db002)에 접속하여 show slave status\G 명령어를 실행해본다.

참고
해당 포스팅은 인프런 인강을 듣고 정리한 내용입니다.