self-managed ClickHouse와 ClickHouse Cloud 간 마이그레이션

self-managed ClickHouse와 ClickHouse Cloud 간 마이그레이션 (remoteSecure)

이 가이드는 self-managed ClickHouse 서버에서 ClickHouse Cloud로, 그리고 ClickHouse Cloud 서비스 간에 마이그레이션하는 방법을 보여줘요. remoteSecure 함수를 SELECTINSERT 쿼리에서 사용하면 원격 ClickHouse 서버에 접근할 수 있어서, 테이블 마이그레이션이 내장 SELECT가 있는 INSERT INTO 쿼리를 쓰는 것처럼 단순해져요.

출처: Migrating between self-managed ClickHouse and ClickHouse Cloud using remoteSecure

본문

이 가이드는 self-managed ClickHouse 서버에서 ClickHouse Cloud로, 그리고 ClickHouse Cloud 서비스 간에 마이그레이션하는 방법을 보여줘요. remoteSecure 함수는 SELECTINSERT 쿼리에서 원격 ClickHouse 서버에 접근하는 데 사용돼요. 이 함수 덕분에 테이블 마이그레이션이 내장 SELECT가 있는 INSERT INTO 쿼리를 작성하는 것처럼 간단해져요.

self-managed ClickHouse에서 ClickHouse Cloud로 마이그레이션

소스 테이블이 샤딩(sharded) 및/또는 복제(replicated)되었는지와 무관하게, ClickHouse Cloud에서는 destination 테이블만 만들면 돼요 (이 테이블의 Engine 파라미터는 생략할 수 있어요 — SharedMergeTree가 테이블 엔진으로 자동 선택됨). 그리고 ClickHouse Cloud가 수직·수평 확장을 자동으로 처리해 줘요. 테이블을 어떻게 복제하고 샤딩할지 여러분이 고민할 필요가 없어요. 이 예시에서 self-managed ClickHouse 서버가 _source_이고 ClickHouse Cloud 서비스가 _destination_이에요.

개요 (Overview)

과정은 다음과 같아요:

  1. 소스 서비스에 read-only 사용자를 추가합니다.
  2. destination 서비스에 소스 테이블 구조를 복제합니다.
  3. 소스의 네트워크 가용성에 따라, 데이터를 소스에서 destination으로 pull하거나 소스에서 push합니다.
  4. destination의 IP Access List에서 소스 서버를 제거합니다 (해당되는 경우).
  5. 소스 서비스에서 read-only 사용자를 제거합니다.

한 시스템에서 다른 시스템으로 테이블 마이그레이션

이 예시는 self-managed ClickHouse 서버에서 ClickHouse Cloud로 테이블 하나를 마이그레이션해요.

호환성 (Compatibility) 셀프 호스팅 ClickHouse 배포와 ClickHouse Cloud 서비스 간 동작 차이를 발견한다면, compatibility 설정과 관련이 있을 수 있어요. Cloud에서 compatibility는 서비스 생성 시 설정되며, 서비스가 업그레이드되어도 클라이언트가 일관된 동작을 얻을 수 있도록 서비스 수준에서 변하지 않아요. compatibility를 변경하고 싶다면 지원을 통해 요청할 수 있어요.

소스 ClickHouse 시스템 (현재 데이터를 호스팅하는 시스템)에서:

  • 소스 테이블(이 예시에서는 db.table)을 읽을 수 있는 read-only 사용자를 추가해요:
CREATE USER exporter
IDENTIFIED WITH SHA256_PASSWORD BY 'password-here'
SETTINGS readonly = 1;
GRANT SELECT ON db.table TO exporter;
  • 테이블 정의를 복사해요:
SELECT create_table_query
FROM system.tables
WHERE database = 'db' AND table = 'table'

destination ClickHouse Cloud 시스템에서:

  • destination 데이터베이스를 만듭니다:
CREATE DATABASE db
  • 소스의 CREATE TABLE 문을 사용해서 destination을 만듭니다. CREATE 문을 실행할 때 ENGINE을 파라미터 없는 ReplicatedMergeTree로 바꾸세요. ClickHouse Cloud는 항상 테이블을 복제하고 올바른 파라미터를 제공해요. ORDER BY, PRIMARY KEY, PARTITION BY, SAMPLE BY, TTL, SETTINGS 절은 유지하세요.
CREATE TABLE db.table ...
  • remoteSecure 함수를 사용해서 self-managed 소스에서 데이터를 pull해요:
INSERT INTO db.table SELECT * FROM
remoteSecure('source-hostname', db, table, 'exporter', 'password-here')

소스 시스템이 외부 네트워크에서 접근 가능하지 않다면 pull 대신 push할 수 있어요. remoteSecure 함수가 select와 insert 모두에서 동작하거든요. 다음 옵션을 참고하세요.

  • remoteSecure 함수를 사용해서 ClickHouse Cloud 서비스로 데이터를 push해요.

원격 시스템을 ClickHouse Cloud 서비스의 IP Access List에 추가하세요. remoteSecure 함수가 ClickHouse Cloud 서비스에 연결하려면 원격 시스템의 IP 주소가 IP Access List에 허용되어 있어야 해요. 아래 팁의 Manage your IP Access List를 펼쳐 자세한 정보를 확인하세요.

IP Access List 관리하기: ClickHouse Cloud 서비스 목록에서 작업할 서비스를 선택하고 Settings로 전환하세요. IP Access List에 ClickHouse Cloud 서비스에 연결해야 하는 원격 시스템의 IP 주소나 범위가 없다면 Add IPs로 문제를 해결할 수 있어요. ClickHouse Cloud 서비스에 연결해야 하는 개별 IP 주소 또는 주소 범위를 추가하고, 양식을 적절히 수정한 뒤 Save하세요.

INSERT INTO FUNCTION
remoteSecure('HOSTNAME.clickhouse.cloud:9440', 'db.table',
'default', 'PASS') SELECT * FROM db.table

ClickHouse Cloud 서비스 간 마이그레이션

ClickHouse Cloud 서비스 간 데이터 마이그레이션의 몇 가지 예시 사용:

  • 복원된 백업에서 데이터 마이그레이션
  • 개발 서비스에서 스테이징 서비스로 데이터 복사 (또는 스테이징에서 프로덕션으로)

이 예시에는 두 개의 ClickHouse Cloud 서비스가 있고, 이를 _source_와 _destination_이라고 부를게요. 데이터는 소스에서 destination으로 pull돼요. 원한다면 push할 수도 있지만, pull은 read-only 사용자를 사용하므로 여기서는 pull을 보여줘요. 마이그레이션에는 몇 단계가 있어요:

  1. 한 ClickHouse Cloud 서비스를 _source_로, 다른 하나를 _destination_으로 식별합니다.
  2. 소스 서비스에 read-only 사용자를 추가합니다.
  3. destination 서비스에 소스 테이블 구조를 복제합니다.
  4. 소스 서비스에 IP 접근을 일시적으로 허용합니다.
  5. 소스에서 destination으로 데이터를 복사합니다.
  6. destination에서 IP Access List를 재설정합니다.
  7. 소스 서비스에서 read-only 사용자를 제거합니다.

소스 서비스에 read-only 사용자 추가

  • 소스 테이블(이 예시에서는 db.table)을 읽을 수 있는 read-only 사용자를 추가해요:
CREATE USER exporter
IDENTIFIED WITH SHA256_PASSWORD BY 'password-here'
SETTINGS readonly = 1;
GRANT SELECT ON db.table TO exporter;
  • 테이블 정의를 복사해요:
select create_table_query
from system.tables
where database = 'db' and table = 'table'

destination 서비스에 테이블 구조 복제

destination에 데이터베이스가 아직 없다면 만듭니다:

CREATE DATABASE db
  • 소스의 CREATE TABLE 문을 사용해서 destination을 만듭니다. destination에서 소스의 select create_table_query... 출력을 사용해서 테이블을 만들어요:
CREATE TABLE db.table ...

소스 서비스에 원격 접근 허용

소스에서 destination으로 데이터를 pull하려면 소스 서비스가 연결을 허용해야 해요. 소스 서비스에서 "IP Access List" 기능을 일시적으로 비활성화하세요.

소스 ClickHouse Cloud 서비스를 계속 사용할 거라면, 어디서나 접근을 허용하도록 전환하기 전에 기존 IP Access List를 JSON 파일로 내보내세요. 이렇게 하면 데이터 마이그레이션 후 접근 목록을 다시 가져올 수 있어요.

허용 목록을 수정하고 일시적으로 Anywhere에서의 접근을 허용하세요. 자세한 내용은 IP Access List 문서를 참고하세요.

소스에서 destination으로 데이터 복사

  • remoteSecure 함수를 사용해 소스 ClickHouse Cloud 서비스에서 데이터를 pull해요. destination에 연결하세요. 이 명령을 destination ClickHouse Cloud 서비스에서 실행해요:
INSERT INTO db.table SELECT * FROM
remoteSecure('source-hostname', db, table, 'exporter', 'password-here')
  • destination 서비스의 데이터를 검증하세요.

소스에서 IP 접근 목록 재설정

아까 접근 목록을 내보냈다면 Share를 이용해 다시 가져올 수 있고, 그렇지 않으면 접근 목록에 항목을 다시 추가하세요.

read-only exporter 사용자 제거

DROP USER exporter
  • 서비스 IP Access List를 전환해서 접근을 제한하세요.

더 알아보기 (Learn more)