Build Up
- DB를 단일 장애 지점으로 만들면 안된다.
- 가용성 측면을 확보하여 부하를 분산하는 것이 목적이다.
How
- docker compose 준비
version: "3.8" services: mysql-master: image: mysql:8.0 container_name: mysql-master environment: MYSQL_ROOT_PASSWORD: password MYSQL_DATABASE: marketboro volumes: - ./master/my.cnf:/etc/mysql/my.cnf #내가 작성한 설정 파일 - ./master/data:/var/lib/mysql - ./master/init.sql:/docker-entrypoint-initdb.d/init.sql #slave 권한생성 질의 ports: - 3306:3306 mysql-slave-1: image: mysql:8.0 container_name: mysql-slave-1 environment: MYSQL_ROOT_PASSWORD: password MYSQL_DATABASE: marketboro volumes: - ./slave/my.cnf:/etc/mysql/my.cnf #slave - ./slave/init.sql:/docker-entrypoint-initdb.d/init.sql # master 등록 ports: - 3307:3306 depends_on: - mysql-master
- master 설정
- my.cnf
[mysqld] pid-file = /var/run/mysqld/mysqld.pid socket = /var/run/mysqld/mysqld.sock datadir = /var/lib/mysql secure-file-priv= NULL symbolic-links=0 default_authentication_plugin=mysql_native_password bind-address = 0.0.0.0 server-id = 1 # master 번호 log_bin = /var/run/mysqld/mysql-bin.log binlog_do_db = marketboro # 릴레이 로그 이름 [slave에게 알려줘야 함!] gtid_mode = on enforce_gtid_consistency = on log_slave_updates = on
- init.sql
slave_user로 계정을 생성하고 권한을 부여한다!
create user'${db 계정 이름 }'@'%' identified by 'password'; grant replication slave on *.* to ‘${db계정 이름}’@'%'with grant option; flush privileges;
create user'slave_user'@'%' identifiedby'password'; grantreplication slave on *.* to'slave_user'@'%'with grant option; flush privileges;
- slave 설정
- my.cnf
[mysqld] pid-file = /var/run/mysqld/mysqld.pid socket = /var/run/mysqld/mysqld.sock datadir = /var/lib/mysql secure-file-priv= NULL symbolic-links=0 default_authentication_plugin=mysql_native_password bind-address = 0.0.0.0 server-id = 2 # 번호 2번 relay-log = /var/run/mysqld/mysql-relay-bin.log log_bin = /var/run/mysqld/mysql-bin.log binlog_do_db = marketboro # 릴레이 로그 master relay 이름 동일해야함. read_only = on gtid_mode = on enforce_gtid_consistency = on log_slave_updates = on
- init.sql
CHANGE MASTER TO MASTER_HOST='${docker mysql master container name}' ,MASTER_USER='${master init.sql에서 만든 계정 이름}',MASTER_PASSWORD='password', MASTER_AUTO_POSITION=1; START SLAVE;
CHANGE MASTER TO MASTER_HOST='mysql-master',MASTER_USER='slave_user',MASTER_PASSWORD='password',MASTER_AUTO_POSITION=1; START SLAVE;
도커 컴포즈 실행 후 slave log에 [repl] 태그를 가진 로그에서 I/O 오류가 난후 해당 로그가 출력되면 slave가 relay log에 붙은 것임.

REFER
docker-mysql-master-slave
raahii • Updated Jun 7, 2024