xtrabackup 을 이용한 MySQL 8.0.28 Replication 구성하기

리눅스/MySQL|2022. 7. 28. 09:39
반응형

percona-xtrabackup 패키지는 MySQL 또는 MariaDB 서버의 서비스 중지 없이 Replication 을 구성하기 위한 명령어 입니다.

아래 내용은 CentOS 8 환경에서 MySQL 8.0.28 버전으로 테스트 하였습니다.

사용자 계정이나 패스워드, 디렉토리 등은 사용자 환경에 따라 다르므로 명령 실행시 확인 후 실행하시기 바랍니다.

- master 서버 : 192.168.10.2

- slave 서버 : 192.168.10.3

- 참고1 : xtrabackup 8.0 미만 버전에서는 innobackupex 라는 명령이 있었으나

              xtrabackup 8.0 버전부터 xtrabackup 명령으로 통합되었습니다.

- 참고2 : 설치된 패키지 버전을 자세히 보면 지원하는 DB 버전을 알 수 있습니다.

              percona-xtrabackup-80-8.0.28 은 MySQL 8.0.28 버전까지 백업이 가능합니다.

- 참고3: percona-xtrabackup 패키지는 MySQL 과 MariaDB 둘 다 가능합니다. 다만 설치 버전에 따라 지원가능한 DB 버전이 다르며 MySQL 은 xtrabackup, MariaDB 는 mariabackup 이라는 명령을 사용하는것이 큰 차이점 입니다.

(redo 로그를 기록하는 파일이 다름)

 

- LINK : mariabackup 을 이용한 MariaDB 10.6.9 Replication 구성하기

 

1. 설치

 

(인터넷 연결 가능할 경우)

master 서버와 slave 서버에 xtrabackup 을 설치 합니다.

# yum -y install https://repo.percona.com/yum/percona-release-latest.noarch.rpm

# yum -y install percona-xtrabackup-80

 

(인터넷 연결 불가의 경우)

사설망에서 DB를 운영할 경우 서버에 없는 패키지는 설치 파일을 다운 받아 복사하여 설치하면 됩니다.

서버 환경에 따라 필요한 패키지가 다를 수 있으며 이는 아래 rpm 명령으로 의존성 확인이 가능합니다.

 

# wget https://vault.centos.org/centos/8/AppStream/x86_64/os/Packages/libev-4.24-6.el8.x86_64.rpm

# wget https://vault.centos.org/centos/8/BaseOS/x86_64/os/Packages/perl-DBI-1.641-1.el8.x86_64.rpm

# wget https://vault.centos.org/centos/8/AppStream/x86_64/os/Packages/perl-DBD-MySQL-4.046-3.module_el8.3.0+419+c2dec72b.x86_64.rpm

# wget https://vault.centos.org/centos/8/BaseOS/x86_64/os/Packages/rsync-3.1.3-12.el8.x86_64.rpm

# wget https://repo.percona.com/yum/release/8/RPMS/x86_64/percona-xtrabackup-80-8.0.28-21.1.el8.x86_64.rpm 

 

필요한 패키지를 다운로드 한 후 DB 서버로 옮깁니다. (scp 또는 rsync 등으로 복사하면 됩니다. 방법은 생략)

그리고 아래 순서에 따라 설치합니다.

 

# rpm -ivh libev-4.24-6.el8.x86_64.rpm

# rpm -ivh perl-DBI-1.641-1.el8.x86_64.rpm

# rpm -ivh perl-DBD-MySQL-4.046-3.module_el8.3.0+419+c2dec72b.x86_64.rpm

# rpm -ivh rsync-3.1.3-12.el8.x86_64.rpm

# rpm -ivh percona-xtrabackup-80-8.0.28-21.1.el8.x86_64.rpm

 

2. 원본 데이터 백업

 

(master 서버에서)

# xtrabackup --defaults-file=/etc/my.cnf --user=root --password=12345678 --backup --target-dir=/xtrabackup --no-lock --port=3306 --socket=/tmp/mysql.sock

 

백업이 완료되면 /xtrabackup 디렉토리가 생성되며 하단에 백업 파일들이 존재하게 됩니다.

data 디렉토리 내 파일들과 xtrabackup 관련된 로그가 있습니다.

 

3. 데이터 이전

 

(master 서버에서)

master 서버에 백업된 데이터를 slave 서버로 복사합니다.

# rsync -avzPog /xtrabackup root@192.168.10.3:/

 

4. 데이터 복원

 

(slave 서버에서)

mysqld 데몬을 중지하고 기존 data 디렉토리를 삭제 합니다. (mv 명령으로 디렉토리 이름 변경 권장)

가져온 데이터를 복구하는 과정에서 기존 data 디렉토리내 파일이 있으면 실행이 되지 않기 때문입니다.

 

백업중 작성된 redo 로그를 데이터에 적용합니다.

# xtrabackup --prepare --target-dir=/xtrabackup

 

> --use-memory=10G 와 같이 본 작업에 사용할 시스템 메모리양을 어느정도 할당 해주면 빠른처리가 가능합니다.

> redo 로그 적용 도중에 아래와 같은 에러 메세지가 출력 될 경우 --innodb_force_recovery=1 옵션을 추가 합니다.

2022-10-14  8:47:54 0 [Note] InnoDB: Set innodb_force_recovery=1 to ignore corrupted pages.
2022-10-14  8:47:54 0 [ERROR] InnoDB: Plugin initialization aborted with error Generic error
[00] FATAL ERROR: 2022-10-14 08:47:54 xtrabackup: innodb_init() returned 11 (Generic error).

하지만 백업 과정에서 문제가 생겼을 수 있으므로 master 서버에서 몇 번 더 백업을 반복 시도해 보는것도 좋습니다.

 

백업 파일을 이동합니다. (--copy-back 를 사용하면 복사)
# xtrabackup --move-back --datadir=/usr/local/mysql/data --target-dir=/xtrabackup

 

root 로 복원하였기 때문에 복원된 파일의 권한이 root 로 되어 있습니다.

mysql 가동을 위해 data 디렉토리의 권한을 설정을 합니다.

# chmod 755 /usr/local/mysql/data
# chown mysql.mysql -R /usr/local/mysql/data

# systemctl start mysqld

 

5. 로그 포지션 설정 및 동기화 시작

 

백업본의 xtrabackup_binlog_info 에 있는 mysql-bin 파일명과 position 값 참고하여
replication 을 적용합니다.

 

(slave 서버에서)

# cat /usr/local/mysql/data/xtrabackup_info |grep binlog_pos

binlog_pos = filename 'binlog.000004', position '156'    // 출력된 내용을 참고

 

# mysql -p

mysql> stop slave;

mysql> reset slave;

mysql> change master to master_host='192.168.10.2', master_user='repl',
master_password='12345678', master_log_file='binlog.000004',
master_log_pos=156;

mysql> start slave;

 

정상적으로 동기화 된 것을 확인할 수 있습니다.

mysql> show slave status \G;

Slave_IO_Running: Yes
Slave_SQL_Running: Yes

 

6. 과정 테스트

 

서비스 사용중 (무정지) 데이터 유실 없이 리플리케이션이 되는지 확인하기 위해 테스트를 진행했습니다.

1) master 서버 테이블에 1,000개의 레코드를 넣은 상태에서

2) 추가로 1,000개의 레코드를 입력하는 스크립트를 가동하고

3) 레코드가 입력되는 중에 xtrabackup 을 수행했습니다.

4) 1,000개의 레코드 입력이 완료되면 (계속 진행되어도 상관없음) slave 로 데이터를 넘겨서

5) --prepare 옵션으로 실행해주면 로그가 데이터에 적용되는것이 백분율로 보였고

6) 그 데이터를 --copy-back 하여 서비스할 위치로 복사하고 replication 포지션을 맞추고 연동하니

7) slave 서버에도 최종 2,000개의 레코드가 확인되었습니다.

 

반응형

댓글()