メインコンテンツへスキップ
この例では、スケール可能なシンプルな ClickHouse クラスターのセットアップ方法を学びます。 5 台のサーバーを構成します。そのうち 2 台はデータの分片化に使用します。 残りの 3 台のサーバーは協調に使用します。
これからセットアップするクラスターのアーキテクチャを以下に示します。
ClickHouse Server と ClickHouse Keeper を同じサーバー上でまとめて実行することも可能ですが、 本番環境では ClickHouse Keeper 用に専用ホストを使用することを強く推奨します。 この例でも、その構成を示します。Keeper サーバーはより小規模なものでも問題なく、通常は各 Keeper サーバーにつき 4GB の RAM があれば、 ClickHouse Server が大規模になるまでは十分です。

前提条件

1

ディレクトリ構造とテスト環境のセットアップ

サンプルファイル以下の手順では、クラスターを一からセットアップする方法を順を追って説明します。これらの手順を省略して、すぐにクラスターを実行したい場合は、examplesリポジトリの’docker-compose-recipes’ ディレクトリからサンプルファイルを取得できます。
このチュートリアルでは、Docker compose を使用して ClickHouse クラスターをセットアップします。このセットアップは、個別のローカルマシン、仮想マシン、またはクラウドインスタンス向けに変更することも可能です。次のコマンドを実行して、この例のディレクトリ構造を作成します。
以下の docker-compose.yml ファイルを cluster_2S_1R ディレクトリに追加します。
docker-compose.yml
以下のサブディレクトリとファイルを作成してください:
  • config.d ディレクトリには、ClickHouse server の構成ファイル config.xml が含まれており、 ここで各 ClickHouse ノード用のカスタム構成を定義します。この 構成は、すべての ClickHouse インストールに含まれるデフォルトの config.xml 構成 ファイルと組み合わされます。
  • users.d ディレクトリにはユーザー構成ファイル users.xml が含まれており、ここで ユーザーごとのカスタム構成を定義します。この構成は、すべての ClickHouse インストールに含まれるデフォルトの users.xml 構成ファイルと組み合わされます。
カスタム構成ディレクトリ独自の構成を記述する場合は、/etc/clickhouse-server/config.xml および etc/clickhouse-server/users.xml の デフォルト構成を直接変更するのではなく、config.dusers.d ディレクトリを 使用することをベストプラクティスとして推奨します。次の行
により、config.d および users.d ディレクトリで定義した構成セクションが、デフォルトの config.xml および users.xml ファイルで定義された構成セクションを上書きするようになります。
2

ClickHouseノードの設定

サーバーのセットアップ

次に、fs/volumes/clickhouse-{}/etc/clickhouse-server/config.d にある空の設定ファイル config.xml をそれぞれ編集します。以下でハイライトされている行は、各ノードに固有の値に変更する必要があります。
上記の設定ファイルの各セクションについて、以下で詳しく説明します。

ネットワークとログ

ネットワークインターフェイスで外部からの通信を有効にするには、listen host 設定を有効化します。これにより、ClickHouse server のホストに他の ホストからアクセスできるようになります:
HTTP API のポートは 8123 に設定されています。
clickhouse-client や他のネイティブ ClickHouse ツール、ならびに clickhouse-server と他の clickhouse-servers の間で ClickHouse のネイティブプロトコルによる通信に使用される TCP ポートは、9000 に設定されています。
ログは <logger> ブロックで定義します。以下の設定例では、1000M に達するとローテーションするデバッグログを3回分保持します:
ロギング設定の詳細については、デフォルトの ClickHouse 設定ファイルに含まれるコメントを参照してください。

クラスターの設定

クラスターの設定は <remote_servers> ブロックで行います。 ここでクラスター名 cluster_2S_1R を定義します。<cluster_2S_1R></cluster_2S_1R> ブロックは、<shard></shard> および <replica></replica> の設定を使用してクラスターのレイアウトを定義し、ON CLUSTER 句を使用してクラスター全体で実行される distributed DDL クエリのテンプレートとして機能します。デフォルトでは distributed DDL クエリは許可されていますが、allow_distributed_ddl_queries の設定で無効にすることもできます。internal_replication は、分片ごとのレプリカが1つのみであるため、デフォルトで false のままにしています。
各サーバーに対して、次のパラメーターを指定します。

Keeper の設定

<ZooKeeper> セクションでは、ClickHouse Keeper (または ZooKeeper) の実行場所を ClickHouse に指定します。 ClickHouse Keeper クラスターを使用する場合、クラスター内の各 <node> に対して、<host> タグおよび <port> タグでそれぞれホスト名とポート番号を指定する必要があります。ClickHouse Keeper のセットアップについては、チュートリアルの次のステップで説明します。
ClickHouse Keeper を ClickHouse Server と同じサーバー上で実行することもできますが、 本番環境では、ClickHouse Keeper は専用ホストで実行することを強く推奨します。

マクロの設定

また、<macros> セクションはレプリケートテーブル向けのパラメータ置換を定義するために使用されます。これらは system.macros に一覧表示され、クエリ内で {shard}{replica} などの置換を利用できます。
これらは、クラスターの構成に応じてそれぞれ定義されます。

ユーザー設定

次に、fs/volumes/clickhouse-{}/etc/clickhouse-server/users.d にある空の設定ファイル users.xml をそれぞれ以下の内容に変更します。
/users.d/users.xml
この例では、簡略化のためにデフォルトユーザーをパスワードなしで設定しています。 実際の運用では、この方法は推奨されません。
この例では、users.xml ファイルはクラスター内のすべてのノードで同一です。
3

ClickHouse Keeper を設定する

Keeperのセットアップ

レプリケーションを機能させるには、ClickHouse Keeper クラスターをセットアップして 設定する必要があります。ClickHouse Keeper はデータレプリケーションのための 調整システムを提供し、ZooKeeper の代替として動作します。ZooKeeper を使用することも可能ですが、 より優れた保証と信頼性を備え、 ZooKeeper よりも少ないリソースで動作するため、ClickHouse Keeper の使用が推奨されます。高可用性を確保し、 クォーラムを維持するため、少なくとも 3 台の ClickHouse Keeper ノードを実行することを推奨します。
ClickHouse Keeper は、ClickHouse と併せてクラスター内の任意のノードで実行できますが、 スケーリングや ClickHouse Keeper クラスターの管理をデータベースクラスターから独立して行えるため、 専用ノードで実行することを推奨します。
各 ClickHouse Keeper ノード用の keeper_config.xml ファイルを、 example フォルダーのルートで次のコマンドを使用して作成します。
各 ノードディレクトリ fs/volumes/clickhouse-keeper-{}/etc/clickhouse-keeper に作成された空の設定ファイルを編集します。以下で 強調表示されている行は、各ノードごとに対応する内容へ変更する必要があります。
/clickhouse-keeper/keeper_config.xml
各設定ファイルには、次のような固有の設定 (以下参照) を含めます。 使用する server_id は、クラスター内の該当する ClickHouse Keeper ノードごとに一意であり、 <raft_configuration> セクションで定義されたサーバーの <id> と一致している必要があります。 tcp_port は、ClickHouse Keeper のクライアントが使用するポートです。
次のセクションでは、 Raftコンセンサスアルゴリズムのクォーラムに参加する サーバーを設定します。
ClickHouse Cloud なら管理がシンプルになりますClickHouse Cloud を利用すると、分片やレプリカの管理に伴う運用負荷を軽減できます。この プラットフォームでは、高可用性、レプリケーション、スケーリングに関する処理が自動的に行われます。 コンピュートとストレージは分離されており、手動での 設定や継続的な保守を必要とせず、需要に応じてスケールします。詳細はこちら
4

セットアップをテストする

お使いのマシンで Docker が実行中であることを確認してください。 cluster_2S_1R ディレクトリのルートで docker-compose up コマンドを実行して、クラスターを起動します。
docker が ClickHouse と Keeper のイメージのプルを開始し、 その後コンテナーを起動するはずです。
クラスターが稼働していることを確認するには、clickhouse-01 または clickhouse-02 のいずれかに接続して、次の クエリを実行します。以下は、最初のノードに接続するコマンドです。
成功すると、ClickHouse clientのプロンプトが表示されます。
各ホストにどのクラスターのトポロジーが定義されているかを確認するには、次のクエリを実行します。
Query
Response
ClickHouse Keeper クラスターの状態を確認するには、次のクエリを実行します。
Query
Response
mntr コマンドは、ClickHouse Keeper が稼働していることを確認し、 3 つの Keeper ノード間の関係に関する状態情報を取得するためにも一般的に使用されます。 この例で使用する構成では、3 つのノードが連携して動作します。 ノードは leader を選出し、残りのノードは followers になります。mntr コマンドでは、パフォーマンスに関する情報に加え、 特定のノードが follower か leader かも確認できます。
mntr コマンドを Keeper に送信するには、netcat のインストールが必要になる場合があります。 ダウンロード方法については、nmap.org のページを参照してください。
以下のコマンドを clickhouse-keeper-01clickhouse-keeper-02、および clickhouse-keeper-03 のシェルで実行し、各 Keeper ノードのステータスを確認します。clickhouse-keeper-01 で実行するコマンドを以下に示します。
以下は、フォロワーノードからのレスポンス例です。
Response
以下は、リーダーノードからのレスポンス例です:
Response
これで、2 つの分片と、各分片に 1 つのレプリカを持つ ClickHouse クラスターのセットアップは正常に完了です。 次のステップでは、クラスター内にテーブルを作成します。
5

データベースを作成する

クラスターが正しくセットアップされ、稼働していることを確認できたので、次は UK property prices のサンプルデータセットのチュートリアルで使用したものと同じテーブルを再作成します。これには、1995 年以降のイングランドおよびウェールズの不動産売買価格に関する 約 3,000 万行のデータが含まれています。各ホストのクライアントに接続するには、それぞれ別のターミナルタブまたはウィンドウで、以下の各コマンドを実行します:
デフォルトのものを除いて、まだデータベースが作成されていないことを確認するには、 各ホストのclickhouse-clientから以下のクエリを実行できます。
Query
Response
clickhouse-01 クライアントから、ON CLUSTER 句を使用して uk という 新しいデータベースを作成する次の 分散 DDL クエリを実行します:
各ホストのクライアントから先ほどと同じクエリをもう一度実行すると、 クエリは clickhouse-01 でしか実行していないにもかかわらず、データベースがクラスター全体に作成されていることを確認できます:
6

クラスター上にテーブルを作成する

データベースを作成したので、次にテーブルを作成します。 次のクエリを任意のホストクライアントから実行します。
これは、元の CREATE ステートメントで使用されているクエリと同一で、 UK property prices サンプルデータセットのチュートリアルと違うのは、 ON CLUSTER 句だけです。ON CLUSTER 句は、CREATEDROPALTERRENAME などの DDL (データ定義言語) クエリを分散実行するためのもので、これらの スキーマ変更がクラスター内のすべてのノードに適用されるようにします。以下のクエリを各ホストのクライアントから実行すると、テーブルがクラスター全体で作成されていることを確認できます。
Query
Response
UK の price paid data を挿入する前に、簡単な実験として、いずれかのホストから通常のテーブルにデータを挿入するとどうなるかを確認してみましょう。いずれかのホストで、次のクエリを実行してテスト用のデータベースとテーブルを作成します。
次に、clickhouse-01 で以下の INSERT クエリを実行します。
clickhouse-02 に切り替え、次の INSERT クエリを実行します。
Query
次に、clickhouse-01 または clickhouse-02 で、次のクエリを実行します。
ReplicatedMergeTree テーブルとは異なり、この特定のホスト上で テーブルに挿入された行だけが返され、両方の行が返されるわけではないことがわかります。2 つの分片にまたがるデータを読み取るには、すべての分片にまたがるクエリを処理できる インターフェイスが必要です。これにより、そのインターフェイスに対して select クエリを実行すると両方の分片のデータを組み合わせ、 insert クエリを実行すると両方の分片にデータを挿入できます。ClickHouse では、このインターフェイスは 分散テーブル と呼ばれ、 Distributed テーブルエンジンを使って作成します。どのように動作するのか見てみましょう。
7

分散テーブルを作成する

以下のクエリを使用して分散テーブルを作成します。
この例では、rand() 関数がシャーディングキーとして選択されているため、 挿入データは各分片にランダムに分散されます。次に、どちらかのホストから分散テーブルに対してクエリを実行すると、 前の例とは異なり、2 つのホストに挿入された両方の行が返されます。
同じことを、英国の不動産価格データについても行いましょう。いずれかのホストクライアントから、 先ほど ON CLUSTER を使って作成した既存のテーブルを使用して分散テーブルを作成するには、 次のクエリを実行します。
8

分散テーブルへのデータの挿入

いずれかのホストに接続し、データを挿入します。
データが挿入されたら、distributedテーブルを使用して行数を確認できます:
Query
Response
いずれかのホストで次のクエリを実行すると、データが各分片にほぼ均等に分散されていることを確認できます (どの分片に挿入するかは rand() によってランダムに決定されるため、実行環境によって結果が異なる場合があります) :
ホストの1つに障害が発生した場合、どうなるでしょうか?clickhouse-01をシャットダウンして実際に確認してみましょう:
次のコマンドを実行して、ホストがダウンしていることを確認します:
Response
次に、clickhouse-02 から、先ほど Distributed テーブルに対して実行したのと同じ select クエリを実行します:
Response
残念ながら、このクラスターはフォールトトレラントではありません。いずれかのホストに障害が発生すると、クラスターは異常とみなされてクエリが失敗します。前の例で確認したレプリケートテーブルでは、ホストの1つに障害が発生してもデータを挿入できたのとは対照的です。

結論

このクラスター構成の利点は、データが複数のホストに分散されるため、各ノードで必要なストレージ容量を半分に抑えられることです。さらに重要なのは、クエリが両方の分片にまたがって処理されるため、メモリ使用効率が向上し、各ホストの I/O も削減されることです。 もちろん、このクラスター構成の最大の欠点は、ホストの 1 台が失われると、 クエリを提供できなくなることです。 次の例では、拡張性と 耐障害性の両方を備えた、2 つの分片と 2 つのレプリカを持つクラスターの 構成方法を見ていきます。
最終更新日 2026年6月12日