ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [XtraBackup] XtraBackup Stream Mode 알아보기
    Database/XtraBackup 2023. 4. 28. 20:48
    728x90
    반응형

    - 목차

     

    들어가며.

    Percona XtraBackupMySQL 데이터베이스의 백업 및 복구를 위한 강력한 도구입니다.

    그 중에서도 Stream Mode 는 데이터를 효율적으로 전송하고 저장할 수 있는 특별한 모드로, 대규모 데이터베이스 환경에서 자주 활용됩니다.

    Stream Mode 는 백업 데이터를 파일로 저장하지 않고 실시간으로 스트리밍 형태로 출력하여, 네트워크 전송이나 실시간 저장소 적재를 가능하게 합니다.

    이로 인해 디스크 사용량을 줄이고 데이터를 보다 빠르게 이동하거나 처리할 수 있는 장점이 있습니다.

    이번 글에서는 XtraBackup Stream Mode 의 작동 방식과 장점, 그리고 사용 방법을 알아보겠습니다.

     

    아래의 링크는 XtraBackup 에 대한 설명과 간단한 사용 예시가 작성된 블로그 글입니다.

    참고하시면 좋을 것 같네요.

     

    https://westlife0615.tistory.com/125

     

    [XtraBackup] Docker를 활용한 XtraBackup 간단한 백업 시도

    - 목차 들어가며.Docker 를 활용하면 MySQL 서버와 XtraBackup 환경을 손쉽게 설정하여 백업 및 복구를 테스트할 수 있습니다. 이 글에서는 Percona XtraBackup Docker 이미지를 사용하여 간단한 백업을 수행

    westlife0615.tistory.com

     

    XtraBackup Stream Mode 란 ?

    Stream ModeXtraBackup 이 데이터를 실시간으로 전송할 수 있도록 지원하는 기능입니다.

    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 인스턴스를 실행해보도록 하겠습니다.

    백업을 위한 시나리오는 아래와 같습니다.

    1. "test_db" 데이터베이스와 그 내부에 "test_table" 테이블을 생성합니다.
    2. 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 들을 확인할 수 있습니다.

     

     

     

     

    반응형
Designed by Tistory.