[Clickhouse] S3에 백업 구성하기

[원본 링크]

clickhouse는 다른 저장소에 백업해주는 기능을 기본적으로 제공한다.
현재 지원되는 디스크 포맷은 로컬 디스크, AWS S3, Azure, AzureBlobStorage다.

여기서는 S3에 백업을 하는 방법을 간단히 정리해본다.

사용법은 그렇게 어렵진 않다. BACK TO S3로 S3에 백업을 업로드하고, RESTORE FROM S3로 백업을 로드할 수 있다.

BACKUP
TABLE 테이블명 or DATABASE DB명
TO
S3('<S3 endpoint>/<path>', '<Access key ID>', '<Secret access key>')

RESTORE
TABLE 테이블명 or DATABASE DB명
FROM
S3('<S3 endpoint>/<path>', '<Access key ID>', '<Secret access key>')

예를 들어, 다음 쿼리는 테이블 하나만을 백업하는 간단한 쿼리다.

그러면 실제로 이렇게 S3에 백업본이 저장될 것이다.

저렇게 저장되어있는 백업을 로드하고 싶다면, 다음과 같이 RESTORE로 해당 디렉터리를 지정해서 가져오면 된다.
이 때 AS를 사용하면 다른 이름으로 테이블/DB가 만들어지게 할 수 있다.




스케줄러로 백업 자동화

clickhouse 자체 기능만으로는 자동화된 백업을 구현하기 좀 까다롭다.
clickhouse가 내장된 스케줄러 기능을 제공하지도 않고, S3 인자에는 리터럴만 넣기를 강제하기 때문이다.

그래서 그냥 내 경우에는 AWS의 Lambda와 Event Bridge를 써서 백업 자동 프로세스를 구현했다.


별건 없다.

예시 코드

import { createClient } from '@clickhouse/client' // or '@clickhouse/client-web'

export const handler = async (event) => {
  const client = createClient({
    username: process.env.CLICKHOUSE_USERNAME, 
    password: process.env.CLICKHOUSE_PASSWORD, 
    url: process.env.CLICKHOUSE_URL,
  })

  await client.ping();
  console.log('ping success');

  const today = new Date().toISOString().slice(0, 10);

  console.log('backup trying...');
  await client.command({
    query: `
      BACKUP database DB명
      TO
      S3('s3://버킷명/clickhouse-auto-backup/${today}', '${process.env.AWS_ACCESS_KEY_}', '${process.env.AWS_ACCESS_KEY_SECRET}')
    `,
  });
  console.log('backup success');

  await client.close();

  const response = {
    statusCode: 200,
    body: JSON.stringify('Hello from Lambda!'),
  };
  return response;
};


참조
https://clickhouse.com/docs/operations/backup/overview