メインコンテンツまでスキップ
メインコンテンツまでスキップ

レプリケーション

このエンジンは Atomic エンジンに基づいています。メタデータのレプリケーションをサポートしており、DDLログがZooKeeperに書き込まれ、特定のデータベースのすべてのレプリカで実行されます。

1つのClickHouseサーバーでは、複数のレプリケートされたデータベースを同時に実行および更新できます。ただし、同じレプリケートされたデータベースのレプリカを複数作成することはできません。

データベースの作成

エンジンパラメーター

  • zoo_path — ZooKeeperのパス。同じZooKeeperのパスは同じデータベースに対応します。
  • shard_name — シャード名。データベースのレプリカは shard_name によってシャードにグループ化されます。
  • replica_name — レプリカ名。レプリカ名は同じシャードのすべてのレプリカで異なる必要があります。

ReplicatedMergeTree テーブルでは、引数が提供されていない場合、デフォルトの引数が使用されます:/clickhouse/tables/{uuid}/{shard}{replica}。これらはサーバー設定の default_replica_path および default_replica_name で変更できます。マクロ {uuid} はテーブルのuuidに展開され、{shard}{replica} はデータベースエンジンの引数ではなくサーバーconfigからの値に展開されます。しかし、今後はReplicatedデータベースの shard_name および replica_name を使用できるようになる予定です。

特徴と推奨事項

Replicated データベースを用いたDDLクエリは ON CLUSTER クエリと似たように機能しますが、いくつかの違いがあります。

まず、DDLリクエストはイニシエーター(ユーザーからリクエストを最初に受信したホスト)で実行しようとします。リクエストが完了しない場合、ユーザーはすぐにエラーを受け取り、他のホストはリクエストを完了しようとしません。リクエストがイニシエーターで正常に完了した場合、他のすべてのホストは、それを完了するまで自動的に再試行します。イニシエーターは、他のホストでクエリが完了するのを待つようにし、distributed_ddl_task_timeoutを超えない範囲で実行します。また、各ホストでのクエリ実行の状態を示すテーブルを返します。

エラーが発生した場合の挙動は distributed_ddl_output_mode 設定によって規定されますが、Replicated データベースには null_status_on_timeout に設定するのが良いでしょう。つまり、いくつかのホストが distributed_ddl_task_timeout のリクエストを実行する時間がなかった場合、例外をスローせずに、テーブル内のそれらのホストには NULL ステータスを表示します。

system.clusters システムテーブルは、レプリケートされたデータベースに名前が付けられたクラスタを含んでおり、データベースのすべてのレプリカで構成されています。このクラスタは、レプリカの作成/削除時に自動的に更新され、Distributed テーブルに利用できます。

データベースの新しいレプリカを作成する際には、このレプリカが自動的にテーブルを作成します。もしそのレプリカが長い間利用できなくなっており、レプリケーションログから遅れている場合は、ローカルメタデータがZooKeeperの現在のメタデータと一致するかを確認し、追加のテーブルを別の非レプリケートされたデータベースに移動します(不要なものを誤って削除しないため)。不足しているテーブルを作成し、名前が変更されている場合はそのテーブル名を更新します。データは ReplicatedMergeTree レベルでレプリケートされます。つまり、テーブルがレプリケートされていない場合、データはレプリケートされません(データベースはメタデータのみに責任があります)。

ALTER TABLE FREEZE|ATTACH|FETCH|DROP|DROP DETACHED|DETACH PARTITION|PART クエリは許可されていますが、レプリケートされません。データベースエンジンは、現在のレプリカに対してのみパーティション/パートを追加/取得/削除します。ただし、テーブル自体がレプリケートされたテーブルエンジンを使用している場合、ATTACH を使用した後にデータがレプリケートされます。

テーブルのレプリケーションを維持せずにクラスタを設定したい場合は、Cluster Discovery 機能を参照してください。

使用例

3つのホストを持つクラスタを作成します:

DDLクエリを実行します:

システムテーブルを表示します:

分散テーブルを作成し、データを挿入します:

もうひとつのホストにレプリカを追加します:

クラスタの設定は以下のようになります:

分散テーブルは新しいホストからもデータを取得します: