-
Mac에서 docker-compose로 maria replication (master slave) 설정하기개발 2023. 4. 10. 01:25
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/
'개발' 카테고리의 다른 글
iOS 개발하기 todo list (0) 2023.08.21 statement, prepared statement, $, # (0) 2023.05.28 mac 에서 mariaDB 설치 (docker) (1) 2023.04.03 맥북 초기 세팅 개발자 (리눅스 파일 편집) (0) 2023.03.29 Python, Django 간단한 서비스 기능 만들기: 게시판 만들기 (0) 2023.03.28