MySQL Master Slave 구조 만들어보기
일반적으로 디비에 대한 트래픽 분산을 위해서
Mysql Replication 를 통해서 트래픽 집중 문제를 해결할 수 있는데요
Master에게는 데이터 동시성이 아주 높게 요구되는 트랜잭션을 담당하고,
Slave에게는 읽기만 데이터 동시성이 꼭 보장될 필요는 없는 경우에 읽기 전용으로 데이터를 가져오게 됩니다.
일반적으로 Front에서 데이터를 읽어들일 때, 꼭 데이터 일관성이 필요한 경우와 아닌 경우에 대한
API 가 나누어지게 됩니다.
그런 경우에 읽기전용으로 트랜잭션을 사용하여 디비에 대한 트래픽을 분산할 수 있습니다.
그래서 오늘은 Mysql을 직접 구축 해보는 시간을 가질 것이에요 ㅎㅎ
Docker Compose 로 구축하기
직접 로컬에 설치하는 방법도 있겠지만,
그렇게 하면 직접적으로 pc가 조금 복잡해지는 것도 있고, 잘못된 파일들이 남아있는 경우들이 있으니
Docker-compose로 띄워보는 방식을 소개할까 합니다.
먼저 제가 소개해드릴 전체적인 구조는 아래와 같습니다
루트 디렉토리에
docker-compose.yml 파일을 생성해주시고,
하위 디렉토리에 master 폴더와 slave 폴더를 생성해줍시다.
master의 Dockerfile을 만들어주고, Mysql 설정 파일은 cnf 파일이 필요한데요.
[mysqld]
log_bin = mysql-bin
server_id = 10
default_authentication_plugin=mysql_native_password
master의 세팅은 심플합니다.
slave 또한 마찬가지로 master와 동일하게 Dockerfile을 만들어주시고,
설정 파일(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
읽기 설정으로 할 것을 의미하고, I/O Thread 를 통해서 데이터를 전달받고, 해당 기록을 relay log로 남기게 됩니다.
그러면~
우리는 이제 Docker Compose 로 띄워볼 시간이 왔습니다 ㅎㅎ
master 는 로컬 포트 3306 port 에 띄울 것이고,
slave는 로컬 포트 3307 port 에 띄울 것입니다.
자세한 동작은 yml 설정 파일을 읽어볼 것을 권장드립니다 ㅎㅎ
Container 띄워보기
그러면 이제 간단하게 띄우는 명령만 입력하면 되는데요.
docker-compose up -d
docker network ls
NETWORK ID NAME DRIVER SCOPE
a6260b4d5998 bridge bridge local
f5c621aee97f host host local
f997b87515bb mysql_net-mysql bridge local
ae7e075418cd none null local
compose로 띄워지는 것을 확인 했으면,
우리는 master slave간의 통신을 위한 내부 IP 주소를 알아내야 합니다
docker inspect f997b87515bb | jq
[
{
"Name": "mysql_net-mysql",
"Containers": {
"913e258e271eca08249611c813b7efd84756ac1d4b3c5254c42e9dbfcab8e9d3": {
"Name": "mysql_db-master_1",
"EndpointID": "7951e87e0ab78728a8db387c180375e19b0aa8136593fbe7793ce932350de162",
"MacAddress": "02:42:ac:16:00:03",
"IPv4Address": "172.22.0.3/16", // 이 정보 기억하기
"IPv6Address": ""
},
"c64a8e5ec49e748f899c1b2158ea19a4ae527e0cc8422a4d854501e65d253c74": {
"Name": "mysql_db-slave_1",
"EndpointID": "c1608ce02b2e834721b2902257e7e7a65fc5bfce75f4fb447df702f905ccf300",
"MacAddress": "02:42:ac:16:00:02",
"IPv4Address": "172.22.0.2/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {
"com.docker.compose.network": "net-mysql",
"com.docker.compose.project": "mysql",
"com.docker.compose.version": "1.29.0"
}
}
]
docker inspect 라는 명령어를 통해 자세한 정보를 얻어낼 수 있으며,
우리는 slave에서 master로 통신 연결 작업을 해야 되서, master의 IP 주소를 알아내면 됩니다.
그러면 이제 slave에 접속해서 연결 작업을 실시해볼까요?
docker exec -it mysql_db-slave_1 bash
mysql -u root -p
위와 같이 정상적으로 접속창이 뜬다면, 성공입니다.!!
CHANGE MASTER TO MASTER_HOST='172.22.0.3', 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;
아까전에 master 서버의 IP 주소를 기억해 놓으셨죠?
위의 명령어에서 써먹기만 하면 됩니다.!!
해당 명령이 실행되면, 아래와 같이 창이 나오는데요
Master로 향하는 Slave의 I/O Thread 가 동작하고 있다면 성공입니다.!!
그러면 우리는 master slave간의 replication 연결을 확인하였습니다 ㅎㅎ
정말 동기화가 되는지 테스트만 더 해볼까요?
docker exec -it mysql_db-master_1 bash
mysql -u root -p
create database test_db;
master에서 test_db 라는 데이터베이스를 생성하고, slave에도 정상적으로 반영되었는지 확인해봅니다.
slave에 들어가서 show databases 라는 명령을 통해 db 가 생성된 것이 확인되면,
정상적으로 반영이 되는 것을 확인할 수 있습니다.!!
Spring Datasource 설정은 어떻게 하지?
https://huisam.tistory.com/entry/routingDataSource
작성해 놓을 게시글이 있으니 참고하면 좋을 것 같습니다 :)
참고
https://github.com/huisam/mysql-master-slave
'Developer > Database' 카테고리의 다른 글
Database - Mysql 기반으로 Index 에 대해 Deep Dive 해보자 (0) | 2022.06.26 |
---|---|
Mysql Query Plan - Intellij 를 활용하여 Plan query 를 해보자 (0) | 2021.10.10 |
DataBase - 정규화 (0) | 2019.04.21 |
DataBase - Table, Object (0) | 2019.04.21 |
DataBase - 개념 + 기본활용 (0) | 2019.04.20 |