ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [ClickHouse] MergeTree 테이블 Backup 하기 ( clickhouse-backup )
    Database/Clickhouse 2024. 2. 6. 20:27
    반응형

    - 목차

     

    들어가며.

    이번 글에서는 Altinity clickhouse-backup 이미지를 기반으로 ClickHouseMergeTree 테이블을 Backup 하는 방법에 대해서 알아봅니다.

     

    https://hub.docker.com/r/altinity/clickhouse-backup

     

    https://hub.docker.com/r/altinity/clickhouse-backup

     

    hub.docker.com

    https://github.com/Altinity/clickhouse-backup

     

    GitHub - Altinity/clickhouse-backup: Tool for easy backup and restore for ClickHouse® using object storage for backup files.

    Tool for easy backup and restore for ClickHouse® using object storage for backup files. - GitHub - Altinity/clickhouse-backup: Tool for easy backup and restore for ClickHouse® using object storage...

    github.com

     

    ClickHouse 환경 세팅.

    먼저 ClickHouse 환경을 먼저 세팅해보도록 하겠습니다.

    아래의 명령어는 ClickHouse Server 를 1개를 실행하기 위한 도커 명령어입니다.

    ClickHouse Container 뿐만 아니라 docker network 와 volume 도 함께 생성 후 바인딩합니다.

     

    docker network create clickhouse 
    docker volume create clickhouse
    
    docker run -d --platform linux/amd64 \
      --name clickhouse \
      --hostname clickhouse \
      --network clickhouse \
      --volume clickhouse:/var/lib/clickhouse \
      altinity/clickhouse-server:22.3.8.40.altinitystable

     

    그리고 Backup 데이터를 보관할 원격 저장소인 MinIO 로 함께 실행합니다.

     

    docker run --name minio -d \
    --network clickhouse \
    -e MINIO_ROOT_USER=ROOTUSER -e MINIO_ROOT_PASSWORD=123456789 \
    -p 9000:9000 -p 9001:9001 \
    bitnami/minio

     

    docker exec minio \
    	bash -c '
        	mc alias set ch-backup http://localhost:9000 ROOTUSER 123456789 && \
            mc mb ch-backup/clickhouse
        '

     

    생성된 ClickHouse 와 MinIO 의 컨테이너들은 아래와 같이 표현됩니다.

     

     

     

    MergeTree Engine Table 생성하기.

    이제 Backup 을 수행할 MergeTree Table 을 생성합니다.

    Table Create DDL 은 아래와 같습니다.

     

    CREATE TABLE default.products_local (
        id UInt64,
        name String,
        price Float64,
        created_at DateTime
    ) ENGINE = MergeTree()
    ORDER BY id
    PARTITION BY toYYYYMM(created_at);

     

    그리고 아래와 같이 3개의 데이터를 생성합니다.

     

    INSERT INTO default.products_local VALUES
    (1, 'Product A', 10.0, '2023-01-01 15:00:00'),
    (2, 'Product B', 20.0, '2023-02-01 15:00:00'),
    (3, 'Product C', 30.0, '2023-03-01 15:00:00');

     

    clickhouse-backup 실행하기.

    altinity/clickhouse-backup 이미지를 기반으로 Backup 을 수행합니다.

    Backup 을 위해서 실행 중인 ClickHouse Server 의 Disk 에 접근이 허용되어야 합니다.

    clickhouse-backup 컨테이너는 ClickHouse Server 에 바인딩된 Volume 를 공유하여 ClickHouse Server 의 파일시스템에 접근합니다.

    이러한 방식으로 Part 파일들에 접근할 수 있고, 생성된 Part 파일들을 백업할 수 있습니다.

     

    cat <<'EOF'> /tmp/config.yml
    general:
      remote_storage: s3
    
    clickhouse:
      host: clickhouse
      port: 9000
      username: ""
      password: ""
      database: "default"
      sync_replicated_tables: true
      log_sql_queries: false
      timeout: 5m
      data_path: '/var/lib/clickhouse'
    
    s3:
      access_key: "ROOTUSER"
      secret_key: "123456789"
      bucket: "clickhouse"
      endpoint: "http://minio:9000"
      path: clickhouse
      region: "us-east-1"
      force_path_style: true
    EOF
    docker run -it --rm -u clickhouse \
       --network clickhouse \
       --platform linux/amd64 \
       --mount type=bind,source=/tmp/config.yml,target=/etc/clickhouse-backup/config.yml \
       -v "clickhouse:/var/lib/clickhouse" \
       altinity/clickhouse-backup:2.6.5 bash -c 'clickhouse-backup create backup && clickhouse-backup upload backup'

     

    아래의 이미지는 MinIO 에 추가된 ClickHouse Backup 파일들의 목록입니다.

    이는 실제 생성된 3개의 Part 파일들이 백업되고 저장된 결과입니다.

     

     

     

    새로운 ClickHouse Server 에 Restore.

    마지막으로 새로운 ClickHouse Server 를 실행하여 Backup 된 스냅샷을 복원해보겠습니다.

    clickhouse-2 라는 이름의 Volume 과 Container 를 생성합니다.

     

    docker volume create clickhouse-2
    
    docker run -d --platform linux/amd64 \
      --name clickhouse-2 \
      --hostname clickhouse-2 \
      --network clickhouse \
      --volume clickhouse-2:/var/lib/clickhouse \
      altinity/clickhouse-server:22.3.8.40.altinitystable

     

     

    그리고 Restore 실행이 필요합니다.

    Restore 를 위한 명령어는 아래와 같습니다.

    config.yml 의 ClickHouse Network 설정은 새로 생성된 clickhouse-2 에 맞추어 설정합니다.

    그리고 새로운 clickhouse-2 의 Volume 은 Restore 를 수행할 Docker Container 에 바인딩합니다.

     

    cat <<'EOF'> /tmp/config.yml
    general:
      remote_storage: s3
    
    clickhouse:
      host: clickhouse-2
      port: 9000
      username: ""
      password: ""
      database: "default"
      sync_replicated_tables: true
      log_sql_queries: false
      timeout: 5m
      data_path: '/var/lib/clickhouse'
    
    s3:
      access_key: "ROOTUSER"
      secret_key: "123456789"
      bucket: "clickhouse"
      endpoint: "http://minio:9000"
      path: clickhouse
      region: "us-east-1"
      force_path_style: true
    EOF
    
    docker run -it --rm -u clickhouse \
       --network clickhouse \
       --platform linux/amd64 \
       --mount type=bind,source=/tmp/config.yml,target=/etc/clickhouse-backup/config.yml \
       -v "clickhouse-2:/var/lib/clickhouse" \
       altinity/clickhouse-backup:2.6.5 bash -c 'clickhouse-backup download backup && clickhouse-backup restore backup'

     

    Restore 이후에 아래와 같이 복원된 결과를 확인할 수 있습니다.

    docker exec clickhouse-2 \
       clickhouse-client --query="select * from default.products_local;"

     

     

     

    반응형
Designed by Tistory.