티스토리 뷰




Replication 이란?


 Replication 은 번역하면 복제라는 뜻으로 말그대로 1 번 DB - Master 의 DB 혹은 테이블을 2 번 DB - Slave 에 복제 하는것을 말하며 일반적인 방법으로 로그를 이용합니다.


 MariaDB 의 경우 Galera Cluster 를 이용하는 방법도 있지만 이 글에서는 간단하게 Mysql 과 동일한 방법으로 Replication 하는 방법을 설명드리겠습니다.


MariaDB 의 버전은 10.1.3 입니다.


* 여기서의 Replication 은 복제할 DB 나 테이블의 구조가 이미 Master 와 Slive  에 모두 존재 해야 합니다. mysqldump 혹은 쿼리를 이용해 생성하고 진행하여 주시기 바랍니다.


* 원격 상에서 DB 를 복제 하신다고 하신다면 당연히 bind-address 를 주석처리 해주시거나 slave 의 ip 를 적어주셔야 합니다. 참고





1. Master 설정


 참고 : MariaDB 의 경우 간단한 셋팅들은 주석 처리 되어 있으니 그냥 풀어 주시기만 하셔도 쉽게 이용하실수 있습니다.


우선 vim 혹은 nano 를 이용하여 /etc/mysql/my.cnf 를 열어서 replication 을 검색해 보시기 바랍니다.


# The following can be used as easy to replay backup logs or forreplication.
# note: if you are setting up a replication slave, see README.Debian about
#       other settings you may need to change.
server-id               = 1
#report_host            = master1
#auto_increment_increment = 2
#auto_increment_offset  = 1
log_bin                 = /var/log/mysql/mariadb-bin
log_bin_index           = /var/log/mysql/mariadb-bin.index
# not fab for performance, but safer
#sync_binlog            = 1
expire_logs_days        = 10
max_binlog_size         = 100M
# slaves
#relay_log              = /var/log/mysql/relay-bin
#relay_log_index        = /var/log/mysql/relay-bin.index
#relay_log_info_file    = /var/log/mysql/relay-bin.info
#log_slave_updates
#read_only

 검색을 재대로 하셨다면 위와 같은 라인들을 보실수 있으실탠대요. 위의 설정과 같이 주석을 제거해 주시면됩니다. 아래는 정리만 해봤습니다.


server-id               = 1
log_bin                 = /var/log/mysql/mariadb-bin
log_bin_index           = /var/log/mysql/mariadb-bin.index
expire_logs_days        = 10
max_binlog_size         = 100M


 위 부분의 주석만을 제거해 주시기 바랍니다. 그리고  service mysql restart 를 이용하여 재시작 하여 주시기 바랍니다.

# service mysql restart
 * Stopping MariaDB database server mysqld                                                    [ OK ]
 * Starting MariaDB database server mysqld                                                    [ OK ]


재시작이 완료 되셧다면 MariaDB 로 접속하여 Replication 사용자를 생성 후 replication 권한만을 주도록 합니다.

MariaDB [(none)]> CREATE USER 'repliUser'@'%' IDENTIFIED BY '비밀번호';
MariaDB [(none)]> GRANT REPLICATION SLAVE ON *.* TO repliUser;


* REPLICATION  SLAVE 권한을 줄때 특정 DB 나 테이블을 설정하진 못하는것 같더군요.


 이제 Slave 에서 사용할 현재 Master DB 로그 정보 를 받을 시간입니다. ( DB 가 이미 사용중이시라면 mysqldump 를 이용하여 DB 데이터 까지 옴겨 주셔야 합니다. 이전의 데이터들이 상관 없으시거나 비어 있다면 구조만 똑같이 생성 하셔도 됩니다. )


MariaDB [(none)]> FLUSH TABLES WITH READ LOCK; # 테이블에 락을 걸어 줍니다. 
MariaDB [(none)]> SHOW MASTER STATUS; #마스터의 정보를 가져 옵니다.
+--------------------+----------+--------------+------------------+
| File               | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+--------------------+----------+--------------+------------------+
| mariadb-bin.000170 |   447118 |              |                  |
+--------------------+----------+--------------+------------------+

Slave 설정시 필요한 정보는 File 과 Position 이니 복사해 두시기 바랍니다.


 Master 설정은 여기까지 입니다. LOCK 의 경우 replication  종료 후 혹은 서비스 중이 아니시라면 unlock tables 를 이용하여 바로 풀으셔도 됩니다. 사용중이 아니실 경우는 당연히 락을 거실 필요도 없습니다.


MariaDB [(none)]> UNLOCK TABLES;


2. Slave 설정


 이제 Slave 를 설정할 차례 입니다. 우선 Master 와 마찬가지로 vim 혹은 nano 를 이용하여 replication 파트를 찾으셔서 아래와 같이 주석을 제거하고 설정하시기 바랍니다.


# The following can be used as easy to replay backup logs or for replication.
# note: if you are setting up a replication slave, see README.Debian about
#       other settings you may need to change.
server-id               = 2
#report_host            = master1
#auto_increment_increment = 2
#auto_increment_offset  = 1
log_bin                 = /var/log/mysql/mariadb-bin
log_bin_index           = /var/log/mysql/mariadb-bin.index
# not fab for performance, but safer
#sync_binlog            = 1
expire_logs_days        = 10
max_binlog_size         = 100M
# slaves
relay_log               = /var/log/mysql/relay-bin
relay_log_index = /var/log/mysql/relay-bin.index
relay_log_info_file     = /var/log/mysql/relay-bin.info
replicate-do-table = wp_ms.wp_posts
log_slave_updates
#read_only

 Master 와 다른점은 server-id 의 경우 Master 와 겹쳐서는 안됩니다. 다수의 Slave 가 있다면 마찬가지로 모든서버가 각각의 server-id 를 가지고 있어야 합니다.


그리고 slaves 쪽의 주석들을 풀어 주시기 바랍니다. 간단히 정리해 보자면


server-id               = 2
log_bin                 = /var/log/mysql/mariadb-bin
log_bin_index           = /var/log/mysql/mariadb-bin.index
expire_logs_days        = 10
max_binlog_size         = 100M
relay_log               = /var/log/mysql/relay-bin
relay_log_index = /var/log/mysql/relay-bin.index
relay_log_info_file     = /var/log/mysql/relay-bin.info
replicate-do-table = wp_ms.wp_posts
log_slave_updates

 

 위의 설정 중 기본에서 추가된 부분은 replicate-do-table = wp_ms.wp_posts 라는 부분입니다. 이 부분은 wp_ms.wp_posts 그러니까 wp_ms 라는 데이터베이스의 wp_posts 만을 복사 한다는 뜻입니다. 참고


 설정을 모두 완료 하셨다면 Master 에서와 마찬가지로 DB 서비스를 재시작 하여 주시기 바랍니다.


이제 mysql 로 접속하여 설정하라 차례 입니다. 


* 다시 한번 말씀 드리지만 동일한 DB 혹은 Table 의 구조가 이미 적용되 있어야 합니다. 데이터 까지 똑같을 필요는 없습니다. mysqldump 를 이용하여 복사 하지 않으신다고 해도 DB 구조가 같다면 Replication 설정 이후 데이터가 정상적으로 들어 가는 것을 확인하실수 있습니다.


MariaDB [(none)]> CHANGE MASTER TO
MASTER_HOST='아이피',
MASTER_USER='repliUser',
MASTER_PASSWORD='비밀번호',
MASTER_PORT=포트번호,
MASTER_LOG_FILE='Master File',
MASTER_LOG_POS=Master Position,
MASTER_CONNECT_RETRY=10;
 
MariaDB [(none)]> FLUSH PRIVILEGES;

MariaDB [(none)]> START SLAVE;


아이피, 사용자, 비밀번호, 그리고 Master 에서 확인했던 File 과 Position 을 모두 입력하고 쿼리로 날려 주시기 바랍니다.


만약 정상적으로 적용 되었다면 큰 에러 없이 바로 적용 되실 것 입니다.


작동 확인

 우선 작동 확인은 show slave status\G 를 통하여 대략 확인이 가능합니다. 

MariaDB [(none)]> show slave status\G;



위와 같이 에러가 없다면 Insert 를 통해서 데이터를 넣을 경우 정상적으로 입력되는 것을 확인하실수 있습니다.



공유하기 링크
댓글