HOWTO

MySQL DB replication 구성하기

한크크 2018. 12. 29. 18:48

MySQL DB 사용 시 Master 서버의 장애에 대비하거나 읽기 부하 분산을 위해 Replication 을 구성하여 사용한다. 

RDS 와 같이 관리형 DB 서비스를 사용할 경우에는 굳이 구성할 필요 없지만 늘 관리형 DB 를 사용할 수 있는 건 아니니 구성 방법 정도는 알아두도록 하자.


아래 이미지와 같이 1대의 서버를 Master 로 두고 2대의 replication 을 구성하고자 한다. 


1. VM 생성하기

네이버 클라우드 플랫폼에서 MySQL 5.7 엔진이 설치된 이미지로 VM 3대를 생성한다. 





2. VM 에 볼륨 할당하기

데이터를 저장할 볼륨을 생성 후 VM 별로 연결해 준다. 

테스트를 위해 할당하는 볼륨이므로 30GB 씩만 할당해 주었다. 




3. 파일 시스템 마운트

볼륨만 할당해서는 사용할 수 없다. 파일시스템도 생성해서 각각 마운트 해준다. 

여기서는 /dev/xvdb 를 /data001 로 마운트 했다. 




/etc/fstab 에 등록해 주어야 리부팅 하더라도 볼륨이 마운트 될 수 있다. 



마지막으로 mount 할 대상인 data001 디렉토리를 생성해 준 후 마운트 한다. 


# mkdir /data001

# mount -a



4. mysql 데이터 저장 디렉토리 변경 

데이터를 /root 영역에 저장하다 보면 용량이 크지 않을 경우에는 상관 없겠지만 데이터가 많아지만 파일시스템 용량 증설이 어렵고 OS 에 문제가 생겨서 서버가 부팅되지 않을 경우 데이터도 함께 유실될 가능성이 있기 때문에 데이터는 별도로 할당한 볼륨에 저장하는 것이 좋다. 


먼저 master 서버의 DB 에 접속해서 현재의 datadir 를 확인한다. 

기본 설정인 /var/lib/mysql 로 되어 있음을 확인할 수 있다. 




데이터 저장 경로 변경을 위해 mysql 서비스를 중지한다. 

# systemctl stop mysqld


그리고 /var/lib/mysql 하위에 있던 기본 데이터 파일 및 설정 정보를 /data001 하위로 복사하고 소유권 정보를 변경한다. 


# rsync -av /var/lib/mysql /data001/

# chown -R mysql:mysql /data001/mysql



5. /etc/my.cnf 파일 내용 수정 

변경한 디렉토리 정보로 mysql 서비스가 기동될 수 있도록 /etc/my.cnf 파일에 내용을 수정한다. 

네이버클라우드플랫폼에서 제공한 mysql 이미지에는 기본 설정이 들어가 있는데 [mysqld] 하위 타 클라우드 플랫폼을 사용하거나 물리 서버에 설치했다면 해당 내용이 없을 수 있다. 동일하게 넣어주는 것이 좋다. 


여기서 디렉토리 설정 변경 관련한 파라미터는 [mysqld] 하위의 datadir , socket 정보와 [client] 하위의 socket 정보니 참고하시길.. 




이제 mysql 서비스를 기동시켜서 변경된 datadir 이 반영되어 기동되는지 확인해 본다. 

master 서버 설정이 정상적으로 반영되었음이 확인되면 slave 서버 2대에도 동일하게 datadir 를 변경해 준다. 


# systemctl start mysqld



6. DB 의 Master / Slave 설정 

먼저 Master 서버의 /etc/my.cnf 파일에 master 서버임을 기재해준다. 


# vi /etc/my.cnf


[mysqld]

server-id = 1

log-bin=mysql-bin


slave 1 번 서버에는 아래와 같이 설정한다. 


# vi /etc/my.cnf


[mysqld]

server-id = 2


slave 2번 서버에는 아래와 같이 설정한다. 


# vi /etc/my.cnf


[mysqld]

server-id=3


master / slave 서버의 my.cnf 에 등록한 후 mysql 서비스를 재기동한다. 


# systemctl restart mysqld



7. master 서버에서 DB 관리를 위해 사용할 user 를 생성한 후 replication 권한을 부여한다. 

예제에서는 testuser 라는 계정을 생성하고 P@ssw0rd 라는 패스워드를 설정했다.


# mysql -u root -p

mysql> create user ’testuser'@'localhost' identified by ’P@ssw0rd’ ;

mysql> grant replication slave on *.* to testuser@'%' identified by 'P@ssw0rd’ ;

mysql> flush privileges ;


8. Master 서버 db dump 수행 

Slave 서버에 Master 서버 데이터를 복제하기 전에 시점을 맞추기 위해서 Master 서버에 lock 을 걸고 DB dump 를 수행한다. 

아래 이미지와 같이 dump.db 파일이 생성되면 완료된 것이다. 


mysql > flush tables with read lock ;

mysql > exit


# mysqldump -u root -p --all-databases > dump.db



DB 에 접속해서 File 명과 Position 을 확인한다. slave 에 복제 이후에 번호가 동일해야 한다. 



File 명과 Position 번호 확인 후 Master DB 에 lock 을 해제한다. 


mysql> unlock tables ;



9. Slave 서버에 Master DB 복구

앞에서 수행한 master db 의 dump 파일을 통해 slave db 에 데이터를 복제한다. 

먼저 master db 의 dump 파일을 각 slave 서버로 복사한 후 복구한다. 


#scp dump.db root@slave서버IP:/복사위치/

# mysql -u root -p < dump.db



10. auto.cnf 파일 삭제

동일한 mysql 엔진이 설치된 이미지로 VM 을 생성했기 때문에 서버 UUID 가 동일하게 설정되므로 Slave 서버로 replication 을 시작하면 UUID 중복 에러가 발생한다. 

master/slave 모든 서버의 데이터 저장 경로에서 my.cnf 파일을 삭제해야 한다. 




11. Slave 서버에서 Master 지정 및 replication 시작 

각 slave 서버의 DB 에 접속하여 master 서버의 IP , ID, PWD , log file , position number 에 대한 설정을 진행한다. 


mysql> change master to
    -> master_host='master 서버의 IP 입력',
    -> master_user='testuser',
    -> master_password='P@ssw0rd',
    -> master_log_file='mysql-bin.000002',

    -> master_log_pos=154 ;


설정이 완료되면 Master -> slave 로 replication 이 시작되므로 에러가 없는지 확인한다. 


mysql> show slave status \G ;


에러가 없다면 정상적으로 replication 구성이 완료된 것이고 이후 테이블 생성이나 데이터 insert 작업을 수행했을 때 slave 서버에서도 동일하게 조회할 수 있다. 






반응형