Docker 환경에서 MySQL 이중화를 만들어보자
docker 버전
20.10.0부터 docker-compose 플러그인이 docker compose 같이 Docker CLI에 통합 되었다.
Docker Compose v2 부터는
version필드가 의미가 없어졌다고 한다!
services:
master:
image: mysql:8.0.35
environment:
MYSQL_ROOT_PASSWORD: 1234
MYSQL_DATABASE: my_db
TZ: UTC
volumes:
- ./master/config:/etc/mysql/conf.d
networks:
- mysql_network
ports:
- "3306:3306"
command: --default-authentication-plugin=mysql_native_password
slave:
image: mysql:8.0.35
environment:
MYSQL_ROOT_PASSWORD: 1234
MYSQL_DATABASE: my_db
TZ: UTC
volumes:
- ./slave/config:/etc/mysql/conf.d
networks:
- mysql_network
ports:
- "3307:3306"
command: --default-authentication-plugin=mysql_native_password
networks:
mysql_network:
[mysqld]
server-id = 1
log-bin = mysql-bin
binlog_format = ROW
[mysqld]
server-id = 2
read_only = 1
$ docker compose up -d
master DataBase의 source를 Replication 할 계정 생성
$ docker compose exec master mysql -uroot -p1234
master status의 File과 Position 확인
해당 정보를 기반으로 replication이 이뤄짐
CREATE USER 'repl'@'%' IDENTIFIED BY 'repl_password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;
SHOW MASTER STATUS;
$ docker-compose exec slave mysql -uroot -p1234
CHANGE MASTER TO
MASTER_HOST='master',
MASTER_USER='repl',
MASTER_PASSWORD='repl_password',
MASTER_LOG_FILE='mysql-bin.000003, # master status의 file
MASTER_LOG_POS=1345; # master status의 position
START SLAVE;
SHOW SLAVE STATUS\G; # 대문자로!
Last_IO_Error, Last_SQL_Error가 empty이다
