スケーリングアウト
説明
この例のアーキテクチャは、拡張性を提供するために設計されています。 それは3つのノードを含みます:2つのClickHouseと調整(ClickHouse Keeper)サーバー、および第3のサーバーは、クオーラムを三つにするためだけのClickHouse Keeperを持っています。この例では、データベース、テーブル、および両方のノードのデータをクエリできる分散テーブルを作成します。
レベル: 基本
Terminology
Replica
データのコピーです。ClickHouseは常にデータのコピーを少なくとも1つ保持しており、レプリカの最小数は1です。この点は重要で、データの元のコピーをレプリカとしてカウントすることに慣れていないかもしれませんが、これはClickHouseのコードおよびドキュメントで使用されている用語です。データの2番目のレプリカを追加することで、フォールトトレランスが提供されます。
Shard
データのサブセットです。ClickHouseは常にデータのために少なくとも1つのシャードを持っており、データを複数のサーバーに分割しない場合、データは1つのシャードに保存されます。データを複数のサーバーにシャーディングすることで、単一のサーバーの容量を超えた場合に負荷を分散することができます。宛先サーバーはシャーディングキーによって決定され、分散テーブルを作成するときに定義されます。シャーディングキーはランダムでも、ハッシュ関数の出力としても設定できます。シャーディングに関する展開例では、rand()
をシャーディングキーとして使用し、異なるシャーディングキーをいつどのように選ぶかについてのさらなる情報を提供します。
Distributed coordination
ClickHouse Keeperは、データレプリケーションおよび分散DDLクエリの実行のための調整システムを提供します。ClickHouse KeeperはApache ZooKeeperと互換性があります。
環境
アーキテクチャ図

ノード | 説明 |
---|---|
chnode1 | データ + ClickHouse Keeper |
chnode2 | データ + ClickHouse Keeper |
chnode3 | ClickHouse Keeperのクオーラム用 |
本番環境では、ClickHouse Keeperが専用ホストで実行されることを強くお勧めします。この基本構成では、Keeper機能がClickHouse Serverプロセス内で実行されます。 ClickHouse Keeperをスタンドアロンでデプロイするための手順は、インストールドキュメントにあります。
インストール
アーカイブタイプに関する手順に従って、3つのサーバーにClickhouseをインストールします(.deb、.rpm、.tar.gzなど)。この例では、すべての3台のマシンでClickHouse ServerおよびClientのインストール手順に従います。
設定ファイルの編集
ClickHouse Serverを設定する際に、設定ファイルを追加または編集する場合は、次のことに注意してください:
/etc/clickhouse-server/config.d/
ディレクトリにファイルを追加する/etc/clickhouse-server/users.d/
ディレクトリにファイルを追加する/etc/clickhouse-server/config.xml
ファイルはそのままにしておく/etc/clickhouse-server/users.xml
ファイルはそのままにしておく
chnode1の設定
chnode1
には5つの設定ファイルがあります。これらのファイルを1つのファイルに統合することもできますが、ドキュメントの明確さのために、個別に見る方が簡単かもしれません。設定ファイルを読み進めると、chnode1
とchnode2
のほとんどの設定が同じであることがわかります; 違いは強調されます。
ネットワークおよびロギング設定
これらの値は必要に応じてカスタマイズできます。この例の設定は、1000Mで3回ロールオーバーするデバッグログを提供します。ClickHouseはポート8123と9000でIPv4ネットワークをリッスンし、ポート9009をサーバー間通信に使用します。
ClickHouse Keeper の設定
ClickHouse Keeperはデータレプリケーションと分散DDLクエリ実行の調整システムを提供します。 ClickHouse KeeperはApache ZooKeeperと互換性があります。この設定は、ポート9181でClickHouse Keeperを有効にします。強調された行は、このKeeperインスタンスのserver_id
が1であることを示しています。これは、3台のサーバーで唯一の違いです。 chnode2
にはserver_id
が2に設定され、chnode3
にはserver_id
が3に設定されます。 raft設定セクションはすべての3台のサーバーで同じであり、server_id
とraft設定内のserver
インスタンスの関係を示すために強調されています。
何らかの理由でKeeperノードが交換または再構築される場合、既存のserver_id
を再利用しないでください。 たとえば、server_id
が2
のKeeperノードが再構築された場合、4
以上のserver_id
を付与してください。
マクロの設定
マクロshard
とreplica
は分散DDLの複雑さを軽減します。設定された値は、DDLクエリ内で自動的に置き換えられ、DDLを簡単にします。この設定のマクロは、各ノードのシャードとレプリカ番号を指定します。
この2シャード1レプリカの例では、レプリカマクロはreplica_1
で、両方のchnode1
とchnode2
に設定されています。シャードマクロはchnode1
が1
で、chnode2
が2
です。
レプリケーションおよびシャーディングの設定
上から始めましょう:
- XMLの
remote_servers
セクションは、環境内の各クラスタを指定します。属性replace=true
は、デフォルトのClickHouse構成のサンプルremote_servers
をこのファイルで指定されたremote_servers
構成に置き換えます。この属性がないと、このファイル内のリモートサーバーはデフォルトのサンプルリストに追加されます。 - この例では、
cluster_2S_1R
という名前のクラスタが1つあります。 - クラスタ
cluster_2S_1R
には、値mysecretphrase
のための秘密が作成されます。この秘密は、正しいサーバーが一緒に参加できるように、環境内のすべてのリモートサーバーで共有されます。 - クラスタ
cluster_2S_1R
には2つのシャードがあり、それぞれのシャードには1つのレプリカがあります。このドキュメントの冒頭にあるアーキテクチャ図を見て、それを以下のXMLの2つのshard
定義と比較してください。各シャードの定義には1つのレプリカがあります。そのレプリカはその特定のシャードのためのものです。そのレプリカのホストとポートが指定されています。設定内の最初のシャードのレプリカはchnode1
に保存され、設定内の2番目のシャードのレプリカはchnode2
に保存されます。 - シャードの内部レプリケーションはtrueに設定されています。各シャードには、設定ファイル内で
internal_replication
パラメータを定義できます。このパラメータがtrueに設定されている場合、書き込み操作は最初の正常なレプリカを選択し、データを書き込みます。
Keeperの使用の設定
上記のいくつかのファイルでClickHouse Keeperが設定されていました。この設定ファイルuse-keeper.xml
は、ClickHouse Serverがレプリケーションと分散DDLの調整にClickHouse Keeperを使用するように設定しています。このファイルでは、ClickHouse Serverがノードchnode1
からchnode3
でポート9181のKeeperを使用する必要があることを指定し、このファイルはchnode1
とchnode2
で同じです。
chnode2の設定
chnode1
とchnode2
の設定は非常に似ているため、ここでは違いのみを指摘します。
ネットワークおよびロギング設定
ClickHouse Keeper の設定
このファイルにはchnode1
とchnode2
の間の2つの違いの1つがあります。Keeper設定の中で、server_id
が2に設定されています。
マクロの設定
マクロの設定にはchnode1
とchnode2
の間の違いの1つがあります。shard
がこのノードで2
に設定されています。
レプリケーションおよびシャーディングの設定
Keeperの使用の設定
chnode3の設定
chnode3
はデータを保存せず、ClickHouse Keeperがクオーラムの3番目のノードを提供するためだけに使われるため、chnode3
はネットワークおよびロギングを設定するための設定ファイルが2つだけあります。
ネットワークおよびロギング設定
ClickHouse Keeper の設定
テスト
chnode1
に接続し、上記で設定されたクラスタcluster_2S_1R
が存在することを確認します。
- クラスタにデータベースを作成します。
- クラスタ上にMergeTreeテーブルエンジンを持つテーブルを作成します。
テーブルエンジンのパラメータは自動的にマクロに基づいて定義されるため、指定する必要はありません。
chnode1
に接続し、行を挿入します。
chnode2
に接続し、行を挿入します。
- 任意のノード、
chnode1
またはchnode2
に接続すると、そのノードのテーブルに挿入された行のみが表示されます。 たとえば、chnode2
で
- 両方のノードの両方のシャードをクエリするための分散テーブルを作成します。
(この例では、
rand()
関数がシャーディングキーとして設定されているため、各挿入をランダムに分散させます)
chnode1
またはchnode2
のいずれかに接続し、分散テーブルをクエリして両方の行を確認します。