Postgres と ClickHouse: 対応する概念と異なる概念
INSERT、UPDATE、DELETE 操作に基づく変更をストリーミングする、より高レベルな抽象化です。結果として物理レプリケーションと同様のことが可能な場合もありますが、特定のテーブルや操作を対象にしたり、データ変換を行ったり、異なる Postgres バージョンをサポートしたりできるため、より高い柔軟性があります。
これに対して、ClickHouse の分片とレプリカは、データ分散と冗長性に関する 2 つの重要な概念です。ClickHouse のレプリカは Postgres のレプリカに似ていますが、レプリケーションは結果整合性であり、プライマリという概念はありません。一方、シャーディングは Postgres と違ってネイティブにサポートされています。
分片は、テーブルデータの一部です。分片は常に少なくとも 1 つ存在します。データを複数のサーバーにまたがってシャーディングすることで、単一サーバーの容量を超える場合でも負荷を分散できます。このとき、すべての分片がクエリを並列に実行するために使われます。異なるサーバー上にテーブルの分片を手動で作成し、そこへ直接データを挿入することもできます。あるいは、データをどの分片に振り分けるかを定義するシャーディングキーを持つ分散テーブルを使うこともできます。シャーディングキーにはランダムな値を使うことも、ハッシュ関数の出力を使うこともできます。重要なのは、1 つの分片が複数のレプリカで構成される場合があるという点です。
レプリカは、データのコピーです。ClickHouse には常に少なくとも 1 つのデータのコピーが存在するため、レプリカの最小数は 1 です。データの 2 つ目のレプリカを追加すると、耐障害性が得られ、さらに多くのクエリを処理するための追加のコンピュートも利用できる可能性があります (単一のクエリのコンピュートを分散してレイテンシを下げるために、並列レプリカ を使うこともできます) 。レプリカは ReplicatedMergeTree テーブルエンジン によって実現され、これにより ClickHouse は異なるサーバー間で複数のデータコピーの同期を保てます。レプリケーションは物理的です。ノード間で転送されるのはクエリではなく、圧縮されたパーツだけです。
要約すると、レプリカは冗長性と信頼性 (場合によっては分散処理も) を提供するデータのコピーであり、分片は分散処理と負荷分散を可能にするデータの一部分です。
ClickHouse Cloud は、S3 をバックエンドとする単一のデータコピーと、複数のコンピュートレプリカを使用します。データは各レプリカノードから利用でき、各ノードにはローカルSSD cache があります。これは、ClickHouse Keeper を通じたメタデータのレプリケーションのみに依存しています。
結果整合性
ユーザーへの影響
推奨事項
一貫したルーティング
ClickHouse Cloud
スティッキーエンドポイントを利用するには、サポートに連絡してください。
ClickHouse OSS
session_id や user_id などのプロパティに基づいて、一貫したノードルーティングが行われるようにする必要があります。設定 prefer_localhost_replica=0 と load_balancing=in_order は、クエリで設定 する必要があります。これにより、まず各分片のローカルレプリカが優先され、ローカルレプリカがない場合は設定に記載された順序でレプリカが優先されます。ただし、これはエラー数が同じ場合に限られ、エラー数が多い場合はランダム選択でフェイルオーバーします。決定論的な分片選択の代替として、load_balancing=nearest_hostname も使用できます。
分散テーブルを作成するときは、クラスターを指定します。config.xml で指定するこのクラスター定義には、分片 (およびそのレプリカ) が列挙されます。これにより、各ノードからどの順序で使用するかをユーザーが制御できます。これを利用すれば、選択を決定論的にできます。
逐次整合性
- 同じノードに対して読み書きする - ネイティブプロトコルを使用している場合、または HTTP 経由で書き込み/読み取りを行うセッション を使用している場合は、同じレプリカに接続している必要があります。この場合、書き込み先のノードから直接読み取るため、読み取り結果は常に一貫します。
- レプリカを手動で同期する - 1 つのレプリカに書き込み、別のレプリカから読み取る場合は、読み取り前に
SYSTEM SYNC REPLICA LIGHTWEIGHTを実行できます。 - 逐次整合性を有効にする - クエリ設定
select_sequential_consistency = 1を使用します。OSS では、設定insert_quorum = 'auto'も指定する必要があります。
これらの設定を有効にする方法の詳細は、こちら を参照してください。
逐次整合性を使用すると、ClickHouse Keeper への負荷が増加します。その結果、 書き込みと読み取りが遅くなる可能性があります。ClickHouse Cloud でメインのテーブルエンジンとして使われている SharedMergeTree では、逐次整合性のオーバーヘッドが小さく、より高いスケーラビリティが得られます。OSS では、この方法は慎重に使用し、Keeper の負荷を測定してください。
トランザクション (ACID) のサポート
圧縮
Query (Postgres)
Query (ClickHouse)
Response
データ型マッピング
| Postgres データ型 | ClickHouse 型 |
|---|---|
DATE | Date |
TIMESTAMP | DateTime |
REAL | Float32 |
DOUBLE | Float64 |
DECIMAL, NUMERIC | Decimal |
SMALLINT | Int16 |
INTEGER | Int32 |
BIGINT | Int64 |
SERIAL | UInt32 |
BIGSERIAL | UInt64 |
TEXT, CHAR, BPCHAR | String |
INTEGER | Nullable(Int32) |
ARRAY | Array |
FLOAT4 | Float32 |
BOOLEAN | Bool |
VARCHAR | String |
BIT | String |
BIT VARYING | String |
BYTEA | String |
NUMERIC | Decimal |
GEOGRAPHY | Point, Ring, Polygon, MultiPolygon |
GEOMETRY | Point, Ring, Polygon, MultiPolygon |
INET | IPv4, IPv6 |
MACADDR | String |
CIDR | String |
HSTORE | Map(K, V), Map(K,Variant) |
UUID | UUID |
ARRAY<T> | ARRAY(T) |
JSON | String, Variant, Nested, Tuple |
JSONB | String |