-
[XtraBackup] XtraBackup Stream Mode 알아보기Database/XtraBackup 2023. 4. 28. 20:48728x90반응형
- 목차
들어가며.
Percona XtraBackup 은 MySQL 데이터베이스의 백업 및 복구를 위한 강력한 도구입니다.
그 중에서도 Stream Mode 는 데이터를 효율적으로 전송하고 저장할 수 있는 특별한 모드로, 대규모 데이터베이스 환경에서 자주 활용됩니다.
Stream Mode 는 백업 데이터를 파일로 저장하지 않고 실시간으로 스트리밍 형태로 출력하여, 네트워크 전송이나 실시간 저장소 적재를 가능하게 합니다.
이로 인해 디스크 사용량을 줄이고 데이터를 보다 빠르게 이동하거나 처리할 수 있는 장점이 있습니다.
이번 글에서는 XtraBackup Stream Mode 의 작동 방식과 장점, 그리고 사용 방법을 알아보겠습니다.
아래의 링크는 XtraBackup 에 대한 설명과 간단한 사용 예시가 작성된 블로그 글입니다.
참고하시면 좋을 것 같네요.
https://westlife0615.tistory.com/125
XtraBackup Stream Mode 란 ?
Stream Mode 는 XtraBackup 이 데이터를 실시간으로 전송할 수 있도록 지원하는 기능입니다.
XtraBackup 은 Tablespace 또는 ibd 파일 내부의 데이터들을 페이지 단위로 복사하여 데이터를 처리합니다.
Stream Mode 를 사용하면, 이렇게 복사된 페이지 단위의 데이터를 실시간으로 xbstream 형식으로 변환하여 전송하거나 저장할 수 있습니다.
이 과정에서 디스크에 중간 파일을 생성하지 않으므로, 디스크 I/O를 최소화하면서도 효율적인 데이터 전송이 가능합니다.
Stream Mode 는 대규모 데이터 환경에서 빠르고 유연한 백업 작업을 지원합니다.
또한 Tablespace 에 해당하는 ibd File 뿐만 아니라 Redo Log ( ib_redo ), Undo Log File (undo_001, undo_002) 들 또한 XtraBackup 에 의해서 백업이 됩니다.
Source MySQL 실행하기.
먼저 Backup 을 수행하기 위한 MySQL 인스턴스를 실행해보도록 하겠습니다.
백업을 위한 시나리오는 아래와 같습니다.
- "test_db" 데이터베이스와 그 내부에 "test_table" 테이블을 생성합니다.
- 10만개의 Rows 를 삽입합니다.
아래의 스크립트는 Database, Table, Insert Rows 에 대한 초기화 SQL 스크립트입니다.
cat <<'EOF'> /tmp/init_db.sql CREATE DATABASE test_db; USE test_db; CREATE TABLE test_table ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50) NOT NULL, description TEXT ) ENGINE=InnoDB; DELIMITER $$ CREATE PROCEDURE InsertTestData() BEGIN DECLARE i INT DEFAULT 1; WHILE i <= 100000 DO INSERT INTO test_table (name, description) VALUES ( CONCAT('Name_', i), CONCAT('This is a description for record number ', i) ); SET i = i + 1; END WHILE; END$$ DELIMITER ; CALL InsertTestData(); EOF
그리고 아래의 Docker 명령어를 통해서 MySQL 인스턴스를 실행합니다.
docker volume create mysql docker run -d --platform linux/amd64 \ --name mysql \ -e MYSQL_ALLOW_EMPTY_PASSWORD=1 \ -p 3306:3306 \ --mount type=bind,source=/tmp/init_db.sql,target=/docker-entrypoint-initdb.d/init_db.sql \ -v mysql:/var/lib/mysql \ mysql:8.0.30
MySQL 인스턴스가 정상적으로 실행되었다면 아래의 명령어를 통해서 생성된 10만개의 Rows 를 확인할 수 있습니다.
docker exec mysql mysql -e 'select count(*) from test_db.test_table;'
xtrabackup --stream.
xtrabackup --stream 옵션은 XtraBackup 의 데이터를 실시간으로 스트리밍 형태로 출력할 수 있게 해주는 강력한 기능입니다.
이 옵션을 사용하면 백업 데이터를 xbstream 또는 tar 형식으로 지정하여 디스크에 저장하지 않고, 네트워크로 전송하거나 다른 프로세스로 전달할 수 있습니다.
먼저 backup-stream 이라는 이름의 Docker Volume 을 생성하여 백업 데이터를 저장합니다.
MySQL 인스턴스와 Back Snapshot 이 모두 동일한 File System 에서 관리되도록 하기 위해서 Docker Volume 을 사용하였습니다.
docker volume create backup-stream
그리고 아래의 Docker & xtrabackup 명령어를 통해서 MySQL 데이터를 백업합니다.
docker run --platform linux/amd64 --name xtrabackup \ --volumes-from mysql \ -v backup-stream:/backup \ --user root \ percona/percona-xtrabackup:8.0.30 \ bash -c 'xtrabackup \ --backup \ --stream=xbstream \ --datadir=/var/lib/mysql/ \ --target-dir=/tmp/backup \ --host=host.docker.internal \ --port=3306 \ --user=root > /backup/backup.xbstream'
Stream Mode Backup 확인해보기.
위에서 실행한 xtrabackup 컨테이너를 Backup 이 완료된 이후에 자동으로 종료됩니다.
아래의 명령어를 통해서 종료된 xtrabackup 컨테이너의 실행 결과를 확인할 수 있습니다.
xtrbackup 컨테이너의 Disk 상태를 유지한채로 새로운 ubuntu 컨테이너를 실행합니다.
docker run --platform linux/amd64 --rm -it --volumes-from xtrabackup ubuntu:20.04 bash
그리고 /backup 디렉토리를 조회하면 backup.xbstream 파일의 존재를 확인할 수 있습니다.
xbstream -x.
xtrabackup --stream 명령어의 결과로써 backup.xbstream 파일이 생성됩니다.
이 파일은 백업 스냅샷으로써 저장 및 관리되며, 이 파일로부터 원본 데이터를 복원하기 위해서 xbstream -x 명령어가 필요합니다.
( xbstream -x 의 -x Flag 는 Extract 의 약자로 사용됩니다. )
docker volume create backup-prepare
docker run --platform linux/amd64 --rm \ -v backup-stream:/backup \ -v backup-prepare:/prepare \ --user root \ percona/percona-xtrabackup:8.0.30 \ bash -c '\ mkdir -p /backup/snapshot && \ xbstream -x --verbose -C /prepare < /backup/backup.xbstream'
위의 명령어가 실행되면 /backup/snapshot 위치에 xbstream 파일 형식으로 생성된 백업 데이터가 MySQL Data 형식으로 추출됩니다.
아래의 이미지는 ls -R 명령어를 통해서 xbstream -x 에 의해서 추출된 결과를 보여줍니다.
테이블스페이스를 저장하는 ibd 파일과 undo log, binlog, 그리고 redo log 를 기록한 xtrabackup_logfile 등이 확인됩니다.
xtrabackup --prepare.
마지막으로 Restore 가능한 백업 데이터를 완성하기 위해서 xtrabackup --prepare 단계가 수행되어야 합니다.
xtrabackup --prepare 는 백업 과정에서 발생한 데이터 변경 사항들을 Merge 하여 백업을 시도한 시점의 완전한 데이터를 만들어줍니다.
이러한 데이터 변경 사항들은 MySQL InnoDB 의 Redo Log 에 기록되며, xtrabackup 과정에서 Redo Log 는 xtrabackup_logfile 에 기록됩니다.
즉, xtrabackup_logfile 를 다른 Table ibd 파일에 병합시켜줍니다.
docker run --platform linux/amd64 --name xbstream-prepare \ -v backup-prepare:/backup-prepare \ --user root \ percona/percona-xtrabackup:8.0.30 \ bash -c 'xtrabackup --prepare --target-dir=/backup-prepare'
MySQL Restore.
backup-prepare Docker Volume 에 저장된 Backup 데이터를 토대로 MySQL 인스턴스를 복원합니다.
docker run -d --platform linux/amd64 \ --name restored-mysql \ -e MYSQL_ALLOW_EMPTY_PASSWORD=1 \ --mount type=volume,source=backup-prepare,target=/var/lib/mysql \ mysql:8.0.30
복원된 MySQL 인스턴스는 아래의 이미지와 같이 원본 MySQL 의 데이터베이스와 테이블, 그리고 생성된 Rows 들을 확인할 수 있습니다.
반응형'Database > XtraBackup' 카테고리의 다른 글
[XtraBackup] Docker를 활용한 XtraBackup 간단한 백업 시도 (0) 2023.03.29