카테고리 없음

Mariadb Master-Slave 구축

ㅈ현 2022. 7. 1. 23:09

서비스를 운영하다 보면 당연히 Post에 비해 Get 요청이 많은것을 알 수 있을것이다.  모든 요청이 하나의 데이터 베이스로 들어갈 경우 해당 데이터 베이스에 높은 부하를 만들 수 있게 된다. 때문에 서비스가 커지게 될 경우 데이터 베이스의 분산처리는 필수불가결 하게 된다. 

이번 포스팅에서는 Mariadb의 Master-Slave 데이터베이스 구축에 대해 다룬다.

 

Docker 기반 mariadb:10.5 이미지를 사용하여 진행을 한다.

 

기본적으로 Mariadb에는 바이너리 로그라는 로그파일이 존재한다.

Master-Slave의 원리는 이 Binary 로그가 변경되는 이벤트가 생기게 되면, Master -> Slave로 이 로그를 보내주게 되고,

Slave에서 이 로그를 해석하여 자신의 데이터 베이스에 적용을 시키는 방법으로 진행되게 된다.

 

우선 Mariadb Docker 컨테이너 두개를 준비한다.

 

이후 실습에 사용하게 될 데이터베이스를 받는다.

 

MySQL Sample Database

This page provides you with a MySQL sample database that helps you to practice with MySQL effectively and quickly. You can download the sample database and load it into your MySQL Server.

www.mysqltutorial.org

 

다운로드 받은파일을 docker cp 명령을 통해 컨테이너로 복사해준다.

docker cp {file} {container}:{container path}

 

Master 

이후 master db에 접속하여 해당 데이터베이스를 적용한다.

docker exec -it master bash
//컨테이너 내부에서
mysql -uroot -p1234 < mysqlsampledatabase.sql //샘플 db 적용

 

이후 데이터 베이스의 설정을 바꿔준다.

(바꿔주기 위해 vim을 설치해야함)

 

/etc/mysql/my.cnf 의 [mariadbd] 설정에 다음 두줄을 추가한다.

server_id=1
log_bin=mysql.bin

 

 

설정을 바꿔준 이후 docker restart를 통해 컨테이너를 재실행시킵니다.

docker restart master

master 컨테이너에 접속하여 복제를 위한 유저를 추가해주고 권한을 부여해줍니다.

grant all privileges on classicmodels.* to 'rep_manager'@'%' identified by '1234';
grant replication slave on *.* to 'rep_manager'@'%';
flush privileges;

마지막으로 명령을 통해 마스터 정보를 파악합니다.

SHOW MASTER STATUS\G

 

Slave

slave db역시 복사한 샘플 db를 적용하여 줍니다. 

//컨테이너 내부에서
mysql -uroot -p1234 < mysqlsampledatabase.sql //샘플 db 적용

slave db에서도 설정파일을 변경하여 줍니다.

/etc/mysql/my.cnf [mariadbd] 설정에  다음두줄을 추가해줍니다.

server-id = 2 
log-bin = mysql-bin

 

이후 복제를 위한 유저를 추가합니다.

grant all privileges on classicmodels.* to 'rep_manager'@'%' identified by '1234';
flush privileges;

slave db역시 docker restart 명령을 통해 재실행 해줍니다.

 

다시 slave db에 접속하여 다음 명령을 통해 master 정보를 초기화 해줍니다.

change master to  
master_host="172.17.0.4", 
master_user="rep_manager", 
master_password="1234", 
master_port=3306, 
master_log_file="mysql.000001", 
master_log_pos = 324;

master_host는 master db 컨테이너의 주소입니다.

master_user는 마스터 db에서 만든 유저 입니다.

마스터 로그파일, 로그 포지션은 마스터 DB에서 마지막으로 확인한 로그 정보입니다.

 

이후 slave 를 시작합니다.

start slave

 

이후 다음 명령을 통해 Slave_IO_State를 확인하여 아래 그림과 같은 상태가 되면 정상입니다.

show slave status\G

 

확인

확인을 위해 slave db에서 다음 명령을 실행합니다.

select customerNumber, customerName from customers;

이제 마지막 Number=496인 행의 이름을 마스터DB에서 update 합니다.

update customers set customerName = "jhkim" where customerNumber=496;

 

이후 다시 slave db에서 확인합니다.

변경된 것을 확인할 수 있습니다.