レプリケーション
このエンジンは 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クエリを実行します:
システムテーブルを表示します:
分散テーブルを作成し、データを挿入します:
もうひとつのホストにレプリカを追加します:
クラスタの設定は以下のようになります:
分散テーブルは新しいホストからもデータを取得します: