Mac에서 docker-compose로 maria replication (master slave) 설정하기
DB 이중화 작업을 해야하는 이유는 하나, 안전성이다.
트래픽에 따라 늘어나는 부하를 줄이기 위해 역할을 분리해준다.
master: 쓰기/수정/삭제
slave: 읽기 처리
Mysql 의 Replication은 비동기 복제 방식을 사용하고 있다.
간단히 말해 master에서 변경사항을 기록한 Binary Log를 비동기적으로 Slave에 전송
[master] 변경사항 (Binary Log) 을 slave에 비동기적 전송
[slave] Relay Log에 기록
[slave] Apply
(동작원리 : http://cloudrain21.com/mysql-replication)
도커로 mysql 서버 replication 설정하기
아주아주 심플 주의
도커 설정을 저장할 폴더를 만든다.
거기에 파일 네 개를 작성(docker 설정, master, slave 설정, 실행파일)
docker-cmopose.yml
코드만 (더보기)
version: "3.3"
services:
db_master:
image: mariadb:10.6.3-focal
container_name: db_master
restart: always
environment:
MYSQL_ROOT_PASSWORD_FILE: /run/secrets/mariadb_root_password
ports:
- "3306:3306"
secrets:
- mariadb_root_password
db_slave:
image: mariadb:10.6.3-focal
container_name: db_slave
restart: always
environment:
MYSQL_ROOT_PASSWORD_FILE: /run/secrets/mariadb_root_password
ports:
- "3307:3306"
depends_on:
- db_master
secrets:
- mariadb_root_password
secrets:
mariadb_root_password:
file: ./mariadb_root_password.txt
# mariadb image 를 통해서 master-slave db container를 생성합니다.
version: "3.3"
services:
db_master:
image: mariadb:10.6.3-focal
container_name: db_master
# 컨테이너가 다운됐을 때 설정
restart: always
environment:
MYSQL_ROOT_PASSWORD_FILE: /run/secrets/mariadb_root_password
ports:
- "3306:3306"
secrets:
- mariadb_root_password
# 컨테이너에서 사용하는 볼륨 설정
# volumes:
# - ./master/data:/var/lib/mysql
# - ./master/config/:/etc/mysql/conf.d
# - ./master/mysql-init-files/:/docker-entrypoint-initdb.d/
db_slave:
image: mariadb:10.6.3-focal
container_name: db_slave
restart: always
environment:
MYSQL_ROOT_PASSWORD_FILE: /run/secrets/mariadb_root_password
# "" 필수. 없는경우 시간으로 판단
ports:
- "3307:3306"
depends_on:
- db_master
secrets:
- mariadb_root_password
# volumes:
# - ./slave/data:/var/lib/mysql
# - ./slave/config/:/etc/mysql/conf.d
# - ./slave/mysql-init-files/:/docker-entrypoint-initdb.d/
secrets:
mariadb_root_password:
file: ./mariadb_root_password.txt
enviroment 자체를 파일로 사용할 수 있다.
env_file 옵션
env_file:
- ./mysql_env.txt
# ./mysql_env.txt
MYSQL_ROOT_PASSWORD=1234
MYSQL_DATABASE=test_db
[MASTER]
$ docker exec -it db_master bash
# apt update; apt install vim -y;
# vi /etc/mysql/my.cnf
[mysqld]
log-bin = mysql-bin
server-id = 1
binlog_format = row
expire_logs_days = 2
저장
# exit
$ docker restart db_master
$ docker exec -it db_master bash
# mysql -u root -p
grant replication slave on *.* to 'repl_user'@'%' identified by 'p@ssw0rd';
show master status;
[SALVE]
$ docker exec -it db_master bash
# apt update; apt install vim -y;
# vi /etc/mysql/my.cnf
[mysqld]
log-bin = mysql-bin
server-id = 2
binlog_format = row
expire_logs_days = 2
read_only = 1
저장
# exit
$ docker restart db-slave
* 마스터 서버 접근 정보 설정
[SLAVE]
$ docker exec -it db_salve bash
# mysql -u root -p
CHANGE MASTER TO MASTER_HOST = '172.24.0.2'
, MASTER_PORT=3306
, MASTER_USER='repl_user'
, MASTER_PASSWORD='p@ssw0rd'
, MASTER_LOG_FILE='mysql-bin.000001'
, MASTER_LOG_POS=523
, MASTER_CONNECT_RETRY=10;
MASTER_HOST, _PORT: master 컨테이너의 ip, port
MASTER_USER, _PASSWORD: master mysql 에서 만든 계정정보
MASTER_LOG_FILE, _POS: master mysql의 상태정보
start slave;
아까 docker-compose 를 백그라운드로 안 돌리고 로그를 볼 수 있다면
마운트된 로그가 찍힌다.
show slave status;
* TEST
[MASTER] 데이터 생성
create database db_test;
use db_test;
-- db_test.users definition
CREATE TABLE `users` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`name` char(10) DEFAULT NULL,
`created_at` datetime NOT NULL DEFAULT current_timestamp(),
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4;
insert into users (name) value ('sample')
;
insert into users (name) value ('sample2')
;
select * from users;
[SLAVE]
master에서 생성한 정보를 확인할 수 있다.
show databases;
use db_test;
show tables;
select * from users;
참고
https://onethejay.tistory.com/m/182
https://waytothem.com/blog/181/