- Docker MySQL Master - Slave2021년 10월 15일 18시 26분 20초에 업로드 된 글입니다.작성자: jCurve728x90반응형
오늘은 MySQL 복제에 대해 블로깅해보겠습니다.
우선 데이터베이스를 왜 복제해야 할까? 라는 생각을 먼저 해볼 수 있을 것 같습니다.
만일 여러대의 서버에서 한 대의 물리 DB를 가리키고 있고 그러한 구조에서 클라이언트의 DB 요청이 많아짐에 따라 데이터베이스 한 대로는 그 부하를 전부 감당하지 못 할 가능성도 있고, 최악의 경우 DB 다운시에 여러 서버에서 해당 DB에 대한 요청이 모두 fail이 날 수 있겠죠 이런 부분에서 SPOF가 될 수 있습니다.
이런 SPOF에 대한 대처로 AWS에서는 master DB 다운시에 slave DB를 master로 승격시켜주는 서비스도 존재하죠
하지만 가장 좋은건 애초에 데이터베이스 한 대가 모든 부하를 감당하지 않도록 분산시키는 것 입니다.
그러기 위해 Read 쿼리를 담당하는 데이터베이스를 별도로 만들어서 분리시켜야 합니다.
master DB에 쓰기, 수정, 삭제를 진행하고 보통 클라이언트의 많은 요청은 읽기 요청이기 때문에 master DB에서 binary log를 slave로 넘겨주어 변동사항을 반영하여 읽기 쿼리는 slave DB에서 진행시키는 것 입니다.
이번 주제와는 관련이 없지만 이 구조에서는 읽기 쿼리에 대한 분산만 진행하고 사실상 master DB에서 넘겨 받은 binary log로 모든 데이터베이스에서 쓰기 쿼리를 진행시키기 때문에 쓰기에 대한 분산도 진행하고 싶은 경우 sharding이나 vertical partitioning이 존재하는데 이부분에 대해서는 다음에 좀 더 공부 후 블로깅 하겠습니다.
그러면 각설하고 위에서 설명했던 내용과 데이터베이스 구조를 바탕으로 구현을 진행해 보겠습니다.
아무래도 가장 빠르게 시작할 수 있는 방법은 Docker로 MySQL 이미지를 받아서 진행하는게 쉬운 것 같아 Docker로 진행하겠습니다.
MySQL:latest 이미지를 받아 master DB로 사용할 컨테이너 한 대와 slave DB로 사용할 컨테이너 한 대를 실행 시키겠습니다.
각각의 mysql 컨테이너의 설정을 추가하기 위해 설정 파일을 만들겠습니다.
먼저 master DB의 설정 파일을 작성합니다.
servier-id는 복제 그룹에서 서버를 식별하기 위해 설정하는 id로 master와 slave를 따로 설정해주셔야합니다.
log-bin은 master DB에서 실행한 쿼리를 binary log로 남긴다는 의미 입니다.
bind-address을 0.0.0.0로 설정하면 모든 외부 ip에서 접속이 가능하다는 의미입니다.
같은 방식으로 slave DB의 cnf 파일도 작성해 줍니다.
이제 도커 컨테이너를 띄우면서 위에 작성한 cnf파일의 위치를 도커 컨테이너와 볼륨 마운트를 해주어 설정을 적용하면 되겠습니다.
추가로 이거는 하면 편하고 안해도 상관없긴한데
Docker 실행시에 각각의 컨테이너 별로 별도의 172.x.x.x 대의 private ip가 할당이 되는데요 이거는 매번 컨테이너가 다시 실행될때마다 할당되는 ip가 변하므로 slave 컨테이너 띄울때 --link masterDB 걸어주시면 편합니다.
그게 아니면 docker inspect로 private ip 확인하시고 slave DB에서 master DB 설정 ip 변경해주셔도 됩니다.
이제 master DB에 접속해서 Replication을 위한 사용자를 생성하고 권한을 쥐어줄겁니다.
repluser라는 사용자를 생성해서 replication 권한을 쥐어 주었습니다.
이 명령어는
GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'%';
이런식으로 실행하시면 됩니다.
이제 복제를 위한 데이터베이스와 테이블을 생성하고 dump 파일을 만들어서 slave DB에 적용하겠습니다.
mysqldump -u root -p opencourse > dump.sql
이런식으로 dump.sql을 만들어주고 이를 docker 명령어로 컨테이너 내부 파일을 외부로 빼내옵니다.
docker cp mysql-master:dump.sql .
이 꺼내온 dump 파일을 이제 slaveDB로 다시 옮겨 줍니다.
docker cp dump.sql mysql-slave:.
이제 mysqldump 파일을 실행시켜 masterDB와 동일한 상태로 만들어 주면 준비가 거의 끝납니다.
다시 masterDB 컨테이너에 접속해서 master status를 확인해주고
이 값을 기억해주고 다시 slaveDB 컨테이너로 접속해줍니다.
이제 master를 설정해줄건데요 설정 명령어는
change master to master_host='호스트 ip', mater_port=포트번호, master_user='masterDB에서 생성한 user',master_log_file='master status로 확인한 log file 이름',master_log_pos='master status로 확인한 로그 위치 지정'; start slave;
이렇게 지정해주시면 됩니다.
이제 Replication이 적용되는지 확인해 보기 위해 masterDB 컨테이너로 접속해서 쿼리를 실행해보겠습니다.
test 테이블에 3을 입력해주고 빠져나와 slaveDB 컨테이너에 접속해서 복제가 이루어졌는지 확인해 보겠습니다.
성공적으로 복제가된 것을 확인할 수 있습니다.
실제 현업에서는 어떻게 복제를 할지 궁금하네요, 편하게 AWS에서 제공해주는 서비스를 많이 채택하려나?
그럼
반응형'DB' 카테고리의 다른 글
MySQL Query Plan (0) 2021.10.24 mongoose 색인 오류 (0) 2020.12.22 댓글