MySQL xtrabackup 을 이용한 replication 구성

Last Updated on 3월 30, 2021 by 태랑(정현호)



0. 포스팅 환경

포스팅에서는 아래의 환경에서 진행 하였습니다.

OS: CentOS 7.8
MySQL : 5.7.31
MySQL data 경로 : /usr/local/mysql/data
MySQL replication 유저 : repl_user
Xtrabackup : 2.4.21



1. XtraBackup 설치 및 구성

1.1 Repository 구성 - Master/Slave 모두 수행

먼저 xtrabackup 을 받기 위해서 repository 를 구성 합니다

[root] yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm


1.2 xtrabackup 와 qpress 설치 - Master/Slave 모두 수행

[root] yum install -y qpress percona-xtrabackup-24


1.3 백업 유저 및 Replication 유저 생성 - Master 서버에서만 수행

mysql> CREATE USER 'bkpuser'@'localhost' IDENTIFIED BY 'bkpuser';
mysql> GRANT RELOAD, LOCK TABLES, PROCESS,
       REPLICATION CLIENT ON *.* TO 'bkpuser'@'localhost'; 

mysql> CREATE USER 'repl_user'@'%' IDENTIFIED BY 'repl_user';
mysql> GRANT REPLICATION SLAVE,
       REPLICATION CLIENT ON *.* to 'repl_user'@'%';

mysql> FLUSH PRIVILEGES;




2. 백업 수행

2.1 백업 받을 디렉토리 생성 및 백업 수행

* 포스팅에서 사용된 디텍토리는 예시 입니다.

[root]# mkdir -p /root/backup/

[root]# innobackupex \
--defaults-file=/etc/my.cnf \
--host="localhost" \
--user="bkpuser" \
--password="bkpuser" \
--compress \
--compress_threads=4 \
--parallel=4 --no-lock \
--stream=xbstream /tmp > /root/backup/backup.xbstream

[root]# ls -alrth /root/backup/backup.xbstream
-rw-r--r--. 1 root root 1.5G Feb 2 18:27 /root/backup/backup.xbstream



2.2 파일을 슬레이브 서버로 전송

먼저 슬레이스 서버에서 디렉토리 생성 합니다
* 포스팅에서 사용된 디텍토리는 예시 입니다.

[root]# mkdir -p /root/backup/xbstream


2.3 백업 파일 전송 - 마스터 서버에서 수행

마스터 서버에서 슬레이브 서버로 백업파일을 전송 합니다.

[root]# rsync -avzr --progress /root/backup/backup.xbstream \
root@슬레이브서버IP:/root/backup/xbstream/

root@ip's password: 
sending incremental file list
backup.xbstream
    133,758,976   8%   14.84MB/s    0:01:33  




3. 백업 리스토어

3.1 파일 묶음 해제

먼저 슬레이브 서버에서 전송받은 stream 형태의 파일을 해제를 진행 합니다

[root]# cd /root/backup/xbstream

[root]# xbstream -x < backup.xbstream -C /root/backup/

ls -al /root/backup/
total 178060
drwxr-xr-x. 11 root root 4096 Feb 3 10:56 .
dr-xr-x---. 12 root root 4096 Feb 3 10:55 ..
-rw-r-----. 1 root root 492 Feb 3 10:56 backup-my.cnf.qp
drwxr-x---. 2 root root 4096 Feb 3 10:56 employees
-rw-r-----. 1 root root 550 Feb 3 10:56 ib_buffer_pool.qp
-rw-r-----. 1 root root 2923584 Feb 3 10:55 ibdata1.qp
drwxr-x---. 2 root root 4096 Feb 3 10:56 mysql
<..중략..>


3.2 압축 해제

파일을 보면 ibdata1.qp 와 같이 qp 확장자가 확인되며 이러한 파일은 qpress 로 압축된 상태 입니다 압축을 해제하는 방법은 2가지 있습니다.

• 첫번째로 innobackupex --decompress 를 사용 하여 압축해제를 할 수 있으며 이 경우 압축이 해제된 파일과 압축된 qp 파일이 2개가 존재 하게 됩니다.
필요시 아래 커맨드를 통해 qp 파일을 삭제 할 수 있습니다.

[root]# find . -type f -name "*.qp" -exec rm -v {} \;


• 두번째로 아래의 qpress 유틸리티를 사용하여 아래 명령어 조합으로 압축을 해제 할 수 있습니다 아래 명령어의 경우 압축 해제 후 qp 파일을 삭제 하게 됩니다.

[root]# cd /root/backup/
[root]# for bf in `find . -iname "*\.qp"`; do qpress -d $bf $(dirname $bf) && /usr/bin/rm $bf; done


포스팅 에서는 innobackupex --decompress 을 통해 진행 하였습니다

[root]# innobackupex --decompress /root/backup/

[root]# ls -al /root/backup/
total 616372
drwxr-xr-x. 11 root root 4096 Feb 3 11:50 .
dr-xr-x---. 12 root root 4096 Feb 3 11:08 ..
-rw-r--r--. 1 root root 517 Feb 3 11:50 backup-my.cnf
-rw-r-----. 1 root root 492 Feb 3 11:09 backup-my.cnf.qp
drwxr-x---. 2 root root 4096 Feb 3 11:50 employees
-rw-r--r--. 1 root root 823 Feb 3 11:50 ib_buffer_pool
-rw-r-----. 1 root root 550 Feb 3 11:09 ib_buffer_pool.qp
<..중략..>


3.3 apply log

apply log 단계를 수행 합니다.

[root]# innobackupex --apply-log /root/backup/


3.4 data dir 삭제

삭제 전 Slave DB 가 기동 중이라면 먼저 중지가 필요하며 기존 data dir 를 삭제하거나 mv 합니다.
포스팅에서 data 디렉토리는 /usr/local/mysql/data 을 사용하고 있습니다.

[root]# systemctl stop mysqld

[root]# cd /usr/local/mysql
[root]# rm -rf data
[root]# mkdir data
[root]# chown -R mysql:mysql data


3.5 데이터 파일 위치 원복

백업 파일에 대해서 원복은 --copy-back 이니 --move-back 을 사용하면 되며 copy는 백업에서 data 디렉토리로 복제를 하게 되고, move 는 data 디렉토리로 백업 파일을 옴기게 됩니다.

공간적으로 파일을 2개 유지하기 하기 어렵거나 하면 --move-back 을 사용하면 되며, 백업과 복구를 다시 해야할 필요성이 있다면 재사용을 위해 --copy-back 을 사용하시면 됩니다.


파일이 모두 복사(원복) 되었다면 디렉토리와 파일에 대해서 소유권을 변경 합니다

[root]# innobackupex --defaults-file=/etc/my.cnf \
--copy-back /root/backup/

[root]# chown -R mysql:mysql /usr/local/mysql/data

[참고] data 디렉토리 아래에 디렉토리나 파일이 중복이 되어서는 안됩니다 즉 data 디렉토리는 비워져 있어야 합니다.


3.6 Slave DB 를 시작 합니다.

[root]# systemctl start mysqld



4. replication 설정

4.1 마스터 정보 조회

백업 파일 중에 xtrabackup_info 이나 xtrabackup_binlog_info 에서 binlog 파일명과 log position 정보를 알수 있습니다.

[root]# cd /root/backup

[root]# cat xtrabackup_info
<..중략..>
tool_name = innobackupex
tool_command = --host=localhost --user=bkpuser 
               --compress_threads=4 --parallel=4 
               --password=... --compress 
               --no-lock --stream=xbstream /tmp
tool_version = 2.4.21
ibbackup_version = 2.4.21
server_version = 5.7.31-log
<..중략..>
binlog_pos = filename 'binlog.000080', position '815'
<..중략..>


[참고] Slave(Replica) 에서 백업 받은 파일로 추가적인 Replication 을 구성하려고 할 경우에는 xtrabackup_slave_info 파일을 참조하면 백업 받은 Slave DB가 참조하는(바라보는) Master 서버의 정보를 확인 할 수 있습니다.
Slave 에서 다시 Replication 을 설정하는 Relay Replication 을 설정하려면 slave 에서 binlog 활성화 후에 xtrabackup 을 수행 한 다음 다른 서버에서 Replication 설정시 xtrabackup_info 을 참조하시면 백업 받은 slave의 정보를 확인 할 수 있습니다.



4.2 replication 설정 및 확인

MySQL 에 접속 하여 change master 구문을 통해 복제 설정을 진행 하면 되며, 복제 설정 후 show slave status\G 명령어를 통해 상태 및 정상 복제 여부를 확인 하면 됩니다

[참고] --login-path 에 대한 정보는 아래 포스팅을 참조하시면 됩니다.

 

user$ mysql --login-path=dba

mysql> change master to master_host='마스터서버IP',master_port=포트번호,
master_user='repl_user', master_password='repl_user',
master_log_file='binlog.000001',master_log_pos=154;

mysql> start slave;

mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 마스터서버IP
Master_User: repl_user
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: binlog.000080
Read_Master_Log_Pos: 815
Relay_Log_File: relay_log.000002
Relay_Log_Pos: 317
Relay_Master_Log_File: binlog.000080
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: 
Replicate_Ignore_DB: 
Replicate_Do_Table: 
Replicate_Ignore_Table: 
Replicate_Wild_Do_Table: 
Replicate_Wild_Ignore_Table: 
Last_Errno: 0
Last_Error: 
Skip_Counter: 0
Exec_Master_Log_Pos: 815
Relay_Log_Space: 518
Until_Condition: None
Until_Log_File: 
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File: 
Master_SSL_CA_Path: 
Master_SSL_Cert: 
Master_SSL_Cipher: 
Master_SSL_Key: 
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error: 
Last_SQL_Errno: 0
Last_SQL_Error: 
Replicate_Ignore_Server_Ids: 
Master_Server_Id: 1
Master_UUID: 12416d15-0bfa-11eb-ad17-080027d4f8ed
Master_Info_File: /usr/local/mysql/data/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind: 
Last_IO_Error_Timestamp: 
Last_SQL_Error_Timestamp: 
Master_SSL_Crl: 
Master_SSL_Crlpath: 
Retrieved_Gtid_Set: 
Executed_Gtid_Set: 
Auto_Position: 0
Replicate_Rewrite_DB: 
Channel_Name: 
Master_TLS_Version:



Ref link.
percona.com/streaming_backups_innobackupex.html[Link]
percona.com/recipes_ibkx_compressed.html[Link]
percona.com/streaming_backups_innobackupex.html[Link]


연관된 다른 글

 

 

 

 

 

 

답글 남기기