Replication이란?
Replication이란 말 그대로 실시간으로 복제본 데이터 베이스 서버를 운영하는 것으로, 원본 서버를 마스터 서버, 이를 복사하여 사용하는 서버를 슬레이브 서버라고 칭한다.
서버에서 DB가 변하는 요청인 INSERT, UPDATE, DELETE 등은 마스터 서버로 요청을 보내고, SELECT와 같은 조회는 슬레이브 서버로 요청을 보내서 사용하는 것이 일반적이며, 마스터 서버는 받은 요청을 똑같이 슬레이브 서버로 실시간으로 보내 동일한 상태를 유지한다.
Replication을 사용하는 이유는 디비 서버를 분리하여 디비 서버에 대한 부하를 줄이기 위함과 데이터의 안정성에 있다.
오늘은 Docker를 이용하여 Replication Mysql를 구성해보자.
0. 프로젝트 구성
├── docker-compose.yml
├── master
│ └── my.cnf
└── slave
└── my.cnf
우리는 DB 서버를 2개를 띄어야하기에, docker-compose를 이용하여 도커 컨테이너를 2개 띄울 것이며, 각 master와 slave 파일의 my.cnf은 MySQL config 파일이다.
1. my.cnf 구성
# master/my.cnf
[mysqld]
log_bin = mysql-bin # Log 파일
server-id = 10 # server-id, 겹치면 안 됨.
default_authentication_plugin=mysql_native_password
# slave/my.cnf
[mysqld]
log_bin = mysql-bin
server-id = 11
relay_log = /var/lib/mysql/mysql-relay-bin
log_slave_updates = 1
read_only = 1
default_authentication_plugin=mysql_native_password
위에 보이는 대로 mysql의 설정 파일을 작성해주면 되며, 작성한 파일은 복사하여 사용할 거다. 자기가 원하는 옵션이 있다면 추가로 넣어도 된다.
2. docker-compose.yml 구성
# docker-compose.yml
version: "3"
services:
db-master:
image: mysql:8.0
restart: always
environment:
MYSQL_DATABASE: "db"
MYSQL_USER: "admin"
MYSQL_PASSWORD: "qwer1595@!"
MYSQL_ROOT_PASSWORD: "qwer1595@!"
ports:
- "3307:3306"
volumes:
- my-db-master:/var/lib/mysql
- my-db-master:/var/lib/mysql-files
- ./master/my.cnf:/etc/mysql/my.cnf
networks:
- net-mysql
db-slave:
image: mysql:8.0
restart: always
environment:
MYSQL_DATABASE: "db"
MYSQL_USER: "admin"
MYSQL_PASSWORD: "qwer1595@!"
MYSQL_ROOT_PASSWORD: "qwer1595@!"
ports:
- "3308:3306"
volumes:
- my-db-slave:/var/lib/mysql
- my-db-slave:/var/lib/mysql-files
- ./slave/my.cnf:/etc/mysql/my.cnf
networks:
- net-mysql
volumes:
my-db-master:
my-db-slave:
networks:
net-mysql:
driver: bridge
나는 port를 각 3307과 3308를 사용하지만 개인이 편한대로 포트와 username 등을 조절하여 사용하면 된다. 자 이제 구성이 다 되었으니 docker-compose를 실행시키고 내부에 접속하여 구성을 해야한다.
3. docker-compose 실행 후 mysql 설정 변경
프로젝트의 root 디렉토리에서 터미널을 연 후 아래의 명령어를 사용하여 컨테이너를 실행한다.
docker-compose up -d
설정하기 전에 master db 컨테이너의 IP를 알아보자.
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' [container name]
나온 컨테이너 IP를 잘 기억해두고, master db 컨테이너에 접속하여 필요한 정보를 더 알아봐야한다.
# container 접속
docker exec -it [container name] bash
# mysql 접속
mysql -u root -p
위의 명령어를 사용하면 컨테이너에 접속할 수 있고 그 후에는 mysql 서버에 접속하면 된다. mysql 서버에 접속할 때의 비밀번호는 docker-compose.yml에 설정한 root 비밀번호다.
그 후에 아래의 명령어를 입력하면 내가 원하는 File과 Position에 대한 정보를 얻을 수 있고 이것도 IP와 마찬가지로 반드시 기억해두자.
SHOW MASTER STATUS;
자 이제 master db에서 나와서 slave db에 접속한다. 접속하는 방법은 위와 같다.
이제 3가지 명령어만 입력하면 된다.
CHANGE MASTER TO MASTER_HOST='172.22.0.2', MASTER_USER='root', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000013', MASTER_LOG_POS=0, GET_MASTER_PUBLIC_KEY=1;
start slave;
show slave status\G;
위에서 CHANGE 명령어를 실행할 때, 위에서 미리 얻은 Master 컨테이너의 정보를 입력해야한다. MASTER_HOST, MASTER_LOG_FILE에는 File을, MASTER_LOG_POS에는 Postion을 넣으면 된다. 이외에도 PASSWORD등도 미리 정한 값으로 넣으면 끝이다.
show slave status\G 명령어를 쓰면 아래와 같이 나오는 데 중요한 포인트는 Slave_IO_Running과 Slave_SQL_Running이 모두 Yes가 나와야한다는 것이다.
이제 Master DB에 데이터베이스를 생성하면 Slave DB에서도 생성하는 것을 확인할 수 있다.
참고자료
'Database > MySQL' 카테고리의 다른 글
[MySQL] MySQL 설치, 설정 - Mac With Homebrew (0) | 2022.10.11 |
---|