The Pursuit of Happyness

실제 MySQL을 운영할 때는 replication을 많이 구성하게 됩니다.

Replication 은 목적에 따라 다양한 형태로 구성될 수 있는데, 여기서는 기본적인 Master - Slave 구조를 설정해 보겠습니다.

MySQL의 복제 방식은 Master서버에서 bin_log 를 생성한 후에 Slave 서버가 bin_log 내용을 받아와서 query를 재생하는 방식으로 처리됩니다.


0. Master - Slave Replication 구성을 위해서 DB 로 사용할 서버를 두 대 준비합니다.

편의상 Master 서버의 Private IP 는 10.0.0.51, Slave 서버의 Private IP는 10.0.0.61 이라고 하겠습니다.


1. [Master] 먼저 Master 서버의 my.cnf 설정에 다음의 내용을 추가하여 bin 로그를 활성화 합니다.


[mysqld]

log-bin=mysql-bin

server-id=51


log-bin 에는 bin 로그가 생성될 파일 이름을 지정해 줍니다. 서버의 default 값을 사용하고 싶다면 "log-bin" 이라고만 적어줘도 됩니다.

그리고 server-id는 replication 구성 내에서 unique 한 값을 적어줘야 합니다. DB가 많지 않다면 Private IP 마지막 자리를 적어주면 겹치지 않습니다.


그리고 MySQL을 재시작하여 bin 로그가 생성되는지 확인합니다.


# systemctl restart mysqld


bin 로그는 MySQL 데이터베이스 경로에 생성되며 위에서 지정한 파일 명으로 생성됩니다. (mysql-bin.000001, mysql-bin.000002, ...)

또한 mysql-bin.index 라는 파일이 생성되어 bin 로그를 생성한 시점부터의 로그 파일 리스트가 기록됩니다.


2. [Master] Replication 에서 사용할 계정을 생성합니다.

MySQL을 실행해서 Replication 에서 사용할 계정을 아래와 같이 생성합니다.


# GRANT REPLICATION SLAVE ON *.* TO 'repl'@'10.0.0.%' IDENTIFIED BY 'password';


Private IP 대역 10.0.0.x 에 대해 "repl" 이라는 계정으로 비밀번호 "password" 로 replication 을 허용하겠다는 의미 입니다.


3. [Master] Replication 시작 위치를 확인합니다.

Replication 위치를 제대로 맞춰주기 위해서 지금부터 Master DB의 백업이 완료될 때 까지 DB 접속을 차단하는 것이 좋습니다. query가 실행되면 replication 지점이 변경될 수 있습니다.

다음의 명령어로 replication 위치를 확인합니다.


mysql> show master status\G


만약을 대비하여 File 과 Position 값을 기록해 둡니다.


4. [Master] DB를 백업합니다.

# mysqldump --all-databases --master-data -u root -p > dbdump.db

--master-data 라는 옵션을 주게되면 dbdump.db 파일에 replication 지점이 같이 저장됩니다.

Master DB에서의 할일은 끝났습니다. 


5. [Slave] my.cnf에 다음의 내용을 추가합니다.


[mysqld]

server-id=61


slave 서버에서의 데이터 변경 방지를 위해서 read_only 를 추가할 수 있습니다.


[mysqld]

read_only


Slave 에서도 relay 로그 외에 별도의 bin 로그가 필요하다면 log-bin 옵션을 추가해도 됩니다.

MySQL을 재시작하여 설정을 반영 시킵니다.


# systemctl restart mysqld


6. [Slave] DB 리스토어

Master에서 백업한 데이터를 복사해서 restore 합니다.


# mysql -u root -p < dbdump.db


7. [Slave] Slave DB에서 Master DB의 Replication 지점을 설정합니다.


mysql> CHANGE MASTER TO 

        ->      MASTER_HOST='10.0.0.51'

        ->      , MASTER_USER='repl'

        ->      , MASTER_PASSWORD='password'

        ->      , MASTER_LOG_FILE='mysql-bin.000004'

        ->      , MASTER_LOG_POS=120;


MASTER_LOG_FILE 과  MASTER_LOG_POS는 dbdump.db 파일에서 읽어도 되고, 3번에서 기록해 둔 값을 적어줘도 됩니다.

그리고 Slave 를 시작합니다.


mysql> start slave;


Slave DB의 상태를 확인합니다.


mysql> show slave status\G



8. 기타

* MySQL에서의 DB 백업과 리스토어는 데이터베이스를 그대로 이미지 떠서 rsync 시키는 방법을 사용하실 수 있습니다. InnoDB 엔진을 사용하는 경우에는 반드시 MySQL 서비스를 중지시키고 하는 것을 권장하고 그 외의 기본 엔진에 대해서는 서비스 중지 없이 Lock을 걸고 진행할 수 있습니다.


* 하나의 bin 로그 파일이 너무 커지는 것을 막기 위해서 bin 로그 파일 사이즈를 제한할 수 있습니다. 

최소값은 4096이며 최대값은 1073741824 (1GB) 입니다. default 설정은 1073741824 입니다.


[mysqld]

max_binlog_size=1G



* bin 로그가 서버에 무한히 쌓이는 것을 방지하기 위해서 다음의 옵션을 통해서 일정 기간이 지나면 삭제되도록 설정할 수 있습니다.

아래는 7일 (일주일) 이 지난 로그를 삭제하는 옵션입니다. 최대 99일까지 설정이 가능하며 0을 쓰면 삭제하지 않습니다.


[mysqld]

expire_logs_days=7







Comment +0

이전 포스팅에서 CentOS 7.x 서버에 MySQL 5.6 을 설치해 보았습니다.  [MySQL 설치 다시보기]


이번 포스팅에서는 MySQL 설치 후에 필요한 세팅에 대해서 알아보도록 하겠습니다.


MySQL은 시작할 때 /etc/my.cnf 파일을 읽어서 필요할 설정을 하게 됩니다.


아래 명령으로 해당 파일을 열어서 편집합니다.


vi /etc/my.cnf


파일을 열어보면 [mysqld], [mysqld_safe] 와 같이 설정 영역이 나뉘어져 있습니다. 설정은 반드시 필요한 영역에 적어줘야 합니다.


1. DB 경로 설정

- [mysqld] 에 있는 datadir 의 경로를 변경해 줍니다. datadir을 변경할 때는 변경할 datadir의 context를 같이 변경해 주어야 합니다.


[mysqld]

datadir=/var/lib/mysql


- context 변경 (mysql DB 경로를 /datadir 로 변경했다고 가정) 

다음 중 하나만 실행해 주면 됩니다.


  • selinux 상에서 context 변경


- semanage 설치


yum install policycoreutils-python


- context 설정 변경


semanage fcontext -a -t mysqld_db_t "/datadir(/.*)?"


- 변경된 설정 적용


restorecon -Rv /datadir


  • chcon 을 이용해서 context 직접 변경


chcon --reference=/var/lib/mysql /datadir


    2. 기본 DB 엔진 설정

    - 테이블을 생성할 때 기본으로 사용할 DB 엔진을 설정할 수 있습니다. 트랜젝션을 지원하는 InnoDB 엔진을 기본으로 설정하려면 다음을 추가해 주면 됩니다.


    [mysqld]

    default-storage-engine=InnoDB


    MySQL 4.x 버전에서는 default-storage-engine 대신 default-table-type 이라는 옵션을 사용했었는데, 5.x 버전에서는 이 설정이 있으면 에러가 나면서 MySQL이 실행되지 않습니다.


    3. 인코딩 설정

    - 한글이나 일본어 중국어 등의 문자를 사용하는 경우 utf8 방식으로 인코딩을 하여 저장하는 것이 편리합니다.

    인코딩에 대해서는 데이터가 저장될 때의 인코딩과 클라이언트와 서버간의 주고 받는 데이터의 인코딩 등이 다르게 설정될 수 있으므로, 데이터 저장에 대한 것은 [mysqld] 영역에 클라이언트 접속시의 기본 인코딩은 [client] 영역에 다음과 같이 적어 주면 됩니다.


    [mysqld]

    character-set-server=utf8

    collation-server=utf8_general_ci


    [client]

    default-character-set=utf8


    MySQL에서는 서버, 데이터베이스, 테이블, 컬럼에 대해서 각각의 인코딩 방식을 적용할 수 있습니다. 이미 생성된 데이터베이스나 테이블 등은 백업 / 리스토어 시에 해당 인코딩 설정이 붙어서 오기 때문에 기존에 생성된 데이터베이스, 테이블, 컬럼에 대해서는 alter 명령어로 변경해 주는 작업이 필요할 수 있습니다.


    4. Slow Query 로그 설정

     - MySQL의 성능을 모니터링 하기 위해서 필요한 설정입니다. MySQL 서버에서 처리하는 query 중에 지나치게 오랜 시간이 소요되어 퍼포먼스에 영향을 주는 query가 없는지 혹은 index를 타지 않아 문제의 소지가 될 만한 query가 있는지를 로그에 남기는 작업입니다.

    slow-query-log 는 Slow Query 로그를 남긴다는 설정입니다. slow-query-log=1 과 같은 의미 입니다.

    long_query_time은 Slow Query 로그에 남길 기준 시간을 초단위로 설정합니다.

    log_queries_not_using_indexes 는 index를 타지 않는 Query를 로그에 기록합니다.


    [mysqld]

    slow-query-log

    long_query_time=2

    log_queries_not_using_indexes



    slow_query_log_file 옵션으로 파일명을 별도로 설정을 하지 않았다면, MySQL DB가 설치된 경로에 localhost-slow.log 파일에 Slow Query 로그가 생성됩니다.


    5. Max Connections 설정

    최대 접속 가능 클라이언트 숫자 지정 (default 151)


    [mysqld]

    max_connections=500



    6. Timeout 시간 지정

    default 28800


    [mysqld]

    wait_timeout=60











    Comment +0