ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • MySQL DB replication 구성하기
    HOWTO 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 서버에서도 동일하게 조회할 수 있다. 






    반응형

    댓글

Designed by Tistory.