EmbeddedRocksDB 테이블 엔진

EmbeddedRocksDB 테이블 엔진

ClickHouse를 RocksDB와 통합할 수 있게 해주는 테이블 엔진이에요.

출처: 문서

본문

이 엔진은 ClickHouse를 RocksDB와 통합할 수 있게 해줘요.

테이블 만들기 (Creating a table)

CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
    name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
    name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
    ...
) ENGINE = EmbeddedRocksDB([ttl, rocksdb_dir, read_only]) PRIMARY KEY(primary_key_name)
[ SETTINGS name=value, ... ]

엔진 매개변수:

  • ttl — 값의 time to live. TTL은 초 단위로 받아들여져요. TTL이 0이면 일반 RocksDB 인스턴스가 사용돼요(TTL 없이).
  • rocksdb_dir — 기존 RocksDB의 디렉토리 경로 또는 생성된 RocksDB의 대상 경로. 지정된 rocksdb_dir로 테이블을 열어요.
  • read_onlyread_only가 true로 설정되면 읽기 전용 모드가 사용돼요. TTL이 있는 스토리지의 경우 컴팩션(수동·자동 모두)이 트리거되지 않으므로 만료된 항목이 제거되지 않아요.
  • primary_key_name — 컬럼 목록의 어떤 컬럼 이름이든.
  • primary key는 반드시 지정해야 하고, 기본 키에 단 하나의 컬럼만 지원해요. 기본 키는 바이너리로 rocksdb key로 직렬화돼요.
  • 기본 키가 아닌 다른 컬럼은 해당 순서대로 바이너리로 rocksdb value로 직렬화돼요.
  • equals 또는 in 필터링이 있는 키 쿼리는 rocksdb에서 다중 키 조회로 최적화돼요.

엔진 설정:

  • optimize_for_bulk_insert — 테이블이 대량 삽입에 최적화돼요(삽입 파이프라인이 memtables에 쓰는 대신 SST 파일을 만들어 rocksdb 데이터베이스로 가져와요). 기본값: 1.
  • bulk_insert_block_size — 대량 삽입으로 생성되는 SST 파일의 최소 크기(행 단위). 기본값: 1048449.

예시:

CREATE TABLE test
(
    `key` String,
    `v1` UInt32,
    `v2` String,
    `v3` Float32
)
ENGINE = EmbeddedRocksDB
PRIMARY KEY key

매트릭 (Metrics)

rocksdb 통계를 노출하는 system.rocksdb 테이블도 있어요.

SELECT
    name,
    value
FROM system.rocksdb

┌─name──────────────────────┬─value─┐
│ no.file.opens             │     1 │
│ number.block.decompressed │     1 │
└───────────────────────────┴───────┘

구성 (Configuration)

구성을 사용해 rocksdb 옵션을 변경할 수도 있어요.

<rocksdb>
    <options>
        <max_background_jobs>8</max_background_jobs>
    </options>
    <column_family_options>
        <num_levels>2</num_levels>
    </column_family_options>
    <tables>
        <table>
            <name>TABLE</name>
            <options>
                <max_background_jobs>8</max_background_jobs>
            </options>
            <column_family_options>
                <num_levels>2</num_levels>
            </column_family_options>
        </table>
    </tables>
</rocksdb>

기본적으로 사소한 근사 개수 최적화(trivial approximate count optimization)가 꺼져 있어 count() 쿼리의 성능에 영향을 줄 수 있어요. 이 최적화를 켜려면 optimize_trivial_approximate_count_query = 1을 설정해요. 또한 이 설정은 EmbeddedRocksDB 엔진의 system.tables에 영향을 주므로, total_rowstotal_bytes의 근사값을 보려면 이 설정을 켜요.

지원되는 연산 (Supported operations)

삽입 (Inserts)

EmbeddedRocksDB에 새 행이 삽입될 때 키가 이미 존재하면 값이 업데이트되고, 그렇지 않으면 새 키가 만들어져요. 예시:

INSERT INTO test VALUES ('some key', 1, 'value', 3.2);

삭제 (Deletes)

행은 DELETE 쿼리나 TRUNCATE로 삭제할 수 있어요.

DELETE FROM test WHERE key LIKE 'some%' AND v1 > 1;
ALTER TABLE test DELETE WHERE key LIKE 'some%' AND v1 > 1;
TRUNCATE TABLE test;

업데이트 (Updates)

값은 ALTER TABLE 쿼리로 업데이트할 수 있어요. 기본 키는 업데이트할 수 없어요.

ALTER TABLE test UPDATE v1 = v1 * 10 + 2 WHERE key LIKE 'some%' AND v3 > 3.1;

조인 (Joins)

EmbeddedRocksDB 테이블과의 특별한 direct 조인이 지원돼요. 이 direct 조인은 메모리에 해시 테이블을 형성하지 않고 EmbeddedRocksDB에서 직접 데이터에 접근해요. 큰 조인에서 direct 조인은 해시 테이블이 만들어지지 않으므로 메모리 사용이 훨씬 낮은 것을 볼 수 있어요. direct 조인을 켜려면:

SET join_algorithm = 'direct, hash'

join_algorithmdirect, hash로 설정되면 가능할 때 direct 조인이, 그렇지 않으면 hash가 사용돼요.

예시 (Example)
CREATE TABLE rdb
(
    `key` UInt32,
    `value` Array(UInt32),
    `value2` String
)
ENGINE = EmbeddedRocksDB
PRIMARY KEY key
INSERT INTO rdb
    SELECT
        toUInt32(sipHash64(number) % 10) AS key,
        [key, key+1] AS value,
        ('val2' || toString(key)) AS value2
    FROM numbers_mt(10);
CREATE TABLE t2
(
    `k` UInt16
)
ENGINE = TinyLog
INSERT INTO t2 SELECT number AS k
FROM numbers_mt(10)
SET join_algorithm = 'direct'
SELECT *
FROM
(
    SELECT k AS key
    FROM t2
) AS t2
INNER JOIN rdb ON rdb.key = t2.key
ORDER BY key ASC
┌─key─┬─rdb.key─┬─value──┬─value2─┐
│   0 │       0 │ [0,1]  │ val20  │
│   2 │       2 │ [2,3]  │ val22  │
│   3 │       3 │ [3,4]  │ val23  │
│   6 │       6 │ [6,7]  │ val26  │
│   7 │       7 │ [7,8]  │ val27  │
│   8 │       8 │ [8,9]  │ val28  │
│   9 │       9 │ [9,10] │ val29  │
└─────┴─────────┴────────┴────────┘

조인 추가 정보 (More information on Joins)

더 알아보기 (Learn more)