スケーリング
この例では、スケール可能なシンプルな ClickHouse クラスターのセットアップ方法を学びます。設定されているサーバーは 5 台です。2 台はデータをシャードするために使用され、残りの 3 台はコーディネーションのために使用されます。
設定するクラスターのアーキテクチャは以下に示されています:

ClickHouse Server と ClickHouse Keeper を同じサーバーで実行することは可能ですが、
本番環境では ClickHouse keeper に専用のホストを使用することを強く推奨します。
これがこの例で説明するアプローチです。
Keeper サーバーは小型で済むことがあり、4GB の RAM で一般的には各 Keeper サーバーに十分です
あなたの ClickHouse Servers が大きくなるまでは。
前提条件
- 以前に ローカル ClickHouse サーバー を設定したことがある
- 設定ファイル など、ClickHouse の基本的な設定概念に精通している
- お使いのマシンに docker がインストールされている
ディレクトリ構造とテスト環境をセットアップする
以下の手順では、最初からクラスタをセットアップする方法を説明します。これらの手順を省略して直接クラスタを実行したい場合は、examples repository から例のファイルを取得できます。
このチュートリアルでは、Docker compose を使用して ClickHouse クラスターをセットアップします。このセットアップは、別々のローカルマシン、仮想マシン、またはクラウドインスタンスでも動作するように変更できます。
次のコマンドを実行して、この例のためのディレクトリ構造を設定します:
次の docker-compose.yml ファイルを clickhouse-cluster ディレクトリに追加します:
次のサブディレクトリとファイルを作成します:
config.dディレクトリには ClickHouse サーバーの設定ファイルconfig.xmlが含まれており、各 ClickHouse ノードのカスタム設定が定義されています。この設定は、すべての ClickHouse インストールに付属するデフォルトのconfig.xmlClickHouse 設定ファイルと組み合わされます。users.dディレクトリにはユーザー設定ファイルusers.xmlが含まれており、ユーザー向けのカスタム設定が定義されています。この設定も、すべての ClickHouse インストールに付属するデフォルトの ClickHouseusers.xml設定ファイルと組み合わされます。
独自の設定を書く際は、デフォルトの設定を直接 /etc/clickhouse-server/config.xml および etc/clickhouse-server/users.xml で修正するのではなく、config.d と users.d ディレクトリを活用することがベストプラクティスです。
この行
は、config.d および users.d ディレクトリで定義された設定セクションが、デフォルトの config.xml および users.xml ファイルで定義されたデフォルト設定セクションを上書きすることを保証します。
ClickHouse ノードを構成する
サーバーセットアップ
次に、fs/volumes/clickhouse-{}/etc/clickhouse-server/config.d にある各空の設定ファイル config.xml を修正します。以下で強調表示されている行は、各ノードに特有のものに変更する必要があります:
| ディレクトリ | ファイル |
|---|---|
fs/volumes/clickhouse-01/etc/clickhouse-server/config.d | config.xml |
fs/volumes/clickhouse-02/etc/clickhouse-server/config.d | config.xml |
上記の設定ファイルの各セクションは、以下でより詳細に説明します。
ネットワーキングとロギング
外部通信は、リッスンホスト設定を有効にすることによってネットワークインターフェースに対して行われます。これにより、ClickHouseサーバーホストが他のホストから到達可能になります:
HTTP APIのポートは8123に設定されています:
ClickHouseのネイティブプロトコルによるclickhouse-clientと他のネイティブClickHouseツール、およびclickhouse-serverと他のclickhouse-serversとの間の相互作用のためのTCPポートは9000に設定されています:
ロギングは <logger> ブロックで定義されています。この例の設定では、デバッグログが 1000M ごとに 3 回ロールオーバーします:
ロギング設定の詳細については、デフォルトの ClickHouse 設定ファイル に含まれているコメントを参照してください。
クラスター構成
クラスターの設定は <remote_servers> ブロックで行います。ここでクラスター名 cluster_2S_1R が定義されています。
<cluster_2S_1R></cluster_2S_1R> ブロックは、クラスターのレイアウトを定義し、<shard></shard> と <replica></replica> 設定を使用し、ON CLUSTER 句を使用してクラスター全体で実行されるクエリである分散 DDL クエリのテンプレートとして機能します。デフォルトでは、分散 DDL クエリは許可されますが、allow_distributed_ddl_queries 設定でオフにすることも可能です。
internal_replication は true に設定されており、データはレプリカの 1 つにのみ書き込まれます。
各サーバーには、以下のパラメータが指定されています:
| パラメータ | 説明 | デフォルト値 |
|---|---|---|
host | リモートサーバーのアドレスです。ドメイン名またはIPv4またはIPv6アドレスのいずれかを使用できます。ドメインを指定すると、サーバーは起動時にDNSリクエストを行い、その結果はサーバーが稼働している間保存されます。DNSリクエストが失敗すると、サーバーは起動しません。DNSレコードを変更した場合は、サーバーを再起動する必要があります。 | - |
port | メッセンジャーアクティビティ用のTCPポート(設定のtcp_port、通常は9000に設定されています)。http_portと混同しないでください。 | - |
Keeper 構成
<ZooKeeper> セクションは、ClickHouse が ClickHouse Keeper (または ZooKeeper) が実行されている場所を示します。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 を以下の内容で修正します:
| ディレクトリ | ファイル |
|---|---|
fs/volumes/clickhouse-01/etc/clickhouse-server/users.d | users.xml |
fs/volumes/clickhouse-02/etc/clickhouse-server/users.d | users.xml |
この例では、デフォルトユーザーが簡単さを考慮してパスワードなしで設定されています。実際には、これは推奨されません。
この例では、各 users.xml ファイルはクラスター内のすべてのノードで同一です。
ClickHouse Keeper を構成する
Keeper セットアップ
レプリケーションが機能するためには、ClickHouse Keeper クラスターを設定し、構成する必要があります。ClickHouse Keeper は、データレプリケーションのための調整システムを提供し、Zookeeper の代わりとして機能しますが、Zookeeper も使用可能です。しかし、ClickHouse Keeper の使用が推奨されます。なぜなら、ClickHouse Keeper の方が保証と信頼性が高く、ZooKeeper よりもリソースを少なく使用するからです。高可用性を実現し、過半数を維持するためには、少なくとも 3 つの ClickHouse Keeper ノードを実行することが推奨されます。
ClickHouse Keeper は、クラスターの任意のノードで ClickHouse と並行して実行できますが、データベースクラスターとは独立して ClickHouse Keeper クラスターをスケーリングおよび管理できる専用ノードで実行することが推奨されます。
次のコマンドを使用して、サンプルフォルダーのルートから各 ClickHouse Keeper ノードの keeper_config.xml ファイルを作成します。
各ノードディレクトリ fs/volumes/clickhouse-keeper-{}/etc/clickhouse-keeper で作成された空の構成ファイルを修正します。下記の強調表示された行は、各ノードに特有のものに変更する必要があります。
| ディレクトリ | ファイル |
|---|---|
fs/volumes/clickhouse-keeper-01/etc/clickhouse-server/config.d | keeper_config.xml |
fs/volumes/clickhouse-keeper-02/etc/clickhouse-server/config.d | keeper_config.xml |
fs/volumes/clickhouse-keeper-03/etc/clickhouse-server/config.d | keeper_config.xml |
各設定ファイルには、以下のユニークな設定が含まれます(下記参照)。
使用される server_id は、その特定の ClickHouse Keeper ノードに対してユニークで、<raft_configuration> セクションで定義されたサーバーの <id> と一致する必要があります。
tcp_port は ClickHouse Keeper の クライアント によって使用されるポートです。
以下のセクションは、raft 合意アルゴリズム に参加するサーバーを構成するために使用されます:
ClickHouse Cloud は、シャードやレプリカの管理に伴う運用上の負担を取り除きます。この プラットフォームは、高可用性、レプリケーション、およびスケーリングの決定を自動的に処理します。 コンピューティングとストレージは別々にスケールし、手動での設定や継続的なメンテナンスを必要とせずに需要に応じてスケールします。
セットアップをテストする
お使いのマシンで docker が実行されていることを確認してください。cluster_2S_1R ディレクトリのルートから docker-compose up コマンドを使用してクラスターを起動します:
ClickHouse と Keeper のイメージがプルされ、コンテナが起動し始めるのが表示されるはずです:
クラスターが実行中であることを確認するために、clickhouse-01 または clickhouse-02 に接続し、次のクエリを実行します。最初のノードに接続するためのコマンドが示されています:
成功した場合、ClickHouse クライアントプロンプトが表示されます:
次のクエリを実行して、どのホストに対してどのクラスターのトポロジーが定義されているかを確認します:
次のクエリを実行して ClickHouse Keeper クラスターの状態を確認します:
mntr コマンドは、ClickHouse Keeper が実行されているかを確認し、3 つの Keeper ノードの関係に関する状態情報を取得するためにも一般的に使用されます。この例で使用される構成では、3 つのノードが協力して動作しています。ノードはリーダーを選出し、残りのノードはフォロワーになります。
mntr コマンドは、パフォーマンスに関連する情報や、特定のノードがフォロワーなのかリーダーなのかを示します。
mntr コマンドを Keeper に送信するためには、netcat をインストールする必要があるかもしれません。ダウンロード情報については nmap.org ページをご覧ください。
以下のコマンドを clickhouse-keeper-01、clickhouse-keeper-02、および clickhouse-keeper-03 のシェルから実行して、各 Keeper ノードのステータスを確認します。clickhouse-keeper-01 のためのコマンドは以下のようになります。
以下のレスポンスは、フォロワーノードからの応答の例を示しています:
以下のレスポンスは、リーダーノードからの応答の例を示しています:
これで、単一のシャードと 2 つのレプリカを持つ ClickHouse クラスターが正常にセットアップされました。次のステップでは、クラスター内にテーブルを作成します。
データベースを作成する
クラスターが正しくセットアップされ、実行中であることを確認したので、UK property prices の例データセットチュートリアルで使用されているのと同じテーブルを再作成します。このテーブルは、1995 年以降のイングランドおよびウェールズの不動産物件に対する支払い価格の約 3000 万行で構成されています。
各ホストのクライアントに接続するには、別々のターミナルタブまたはウィンドウから次のコマンドを実行します:
各ホストの clickhouse-client から以下のクエリを実行して、デフォルトのデータベースを除いてまだデータベースが作成されていないことを確認できます:
clickhouse-01 クライアントから、ON CLUSTER 句を使用して新しいデータベース uk を作成する 分散 DDL クエリを実行します:
前回と同じクエリを各ホストのクライアントから再度実行して、clickhouse-01 でのみクエリを実行しても、クラスター全体でデータベースが作成されたことを確認できます:
クラスター上にテーブルを作成する
データベースが作成されたので、分散テーブルを作成します。分散テーブルは、異なるホストにあるシャードにアクセスできるテーブルであり、Distributed テーブルエンジンを使用して定義されます。分散テーブルは、クラスター内のすべてのシャードを横断するインターフェイスとして機能します。
任意のホストクライアントから次のクエリを実行します:
このクエリは、UK property prices の例データセットチュートリアルの元の CREATE ステートメントで使用されたクエリと同一であることに注意してください。ただし、ON CLUSTER 句が異なります。
ON CLUSTER 句は、CREATE、DROP、ALTER、RENAME といった DDL (データ定義言語) クエリの分散実行のために設計されており、これらのスキーマ変更がクラスター内のすべてのノードに適用されることを保証します。
クラスター全体でテーブルが作成されていることを確認するために、各ホストのクライアントから以下のクエリを実行できます:
分散テーブルにデータを挿入する
UK 支払い価格データを挿入する前に、どのような状況になるかを確認するために、任意のホストから通常のテーブルにデータを挿入するための簡単な実験を行いましょう。
任意のホストから以下のクエリを実行してテストデータベースとテーブルを作成します:
次に clickhouse-01 から以下の INSERT クエリを実行します:
clickhouse-02 に切り替え、以下の INSERT クエリを実行します:
次に clickhouse-01 または clickhouse-02 から以下のクエリを実行します:
特定のホストのテーブルに挿入された行のみが返されることに注意してください。
2 つのシャードからデータを読み取るには、すべてのシャードを横断し、選択クエリを実行する際に両方のシャードからデータを結合し、挿入クエリを実行する際に別のシャードへのデータの挿入を処理できるインターフェースが必要です。
ClickHouse では、このインターフェースは分散テーブルと呼ばれ、Distributed テーブルエンジンを使用して作成します。その仕組みを見てみましょう。
次のクエリを使用して分散テーブルを作成します:
この例では、rand() 関数がシャーディングキーとして選ばれ、挿入がシャードにランダムに分配されます。
任意のホストから分散テーブルをクエリすると、2 つのホストに挿入された両方の行が返されます:
UK プロパティ価格データでも同様のことを行いましょう。任意のホストクライアントから次のクエリを実行して、既存のテーブルを使用して分散テーブルを作成します:
次に、任意のホストに接続し、データを挿入します:
データが挿入されたら、分散テーブルを使用して行数を確認できます:
任意のホストで次のクエリを実行すると、データがシャード全体にほぼ均等に分配されていることが確認できます(挿入するシャードの選択が rand() で設定されているため、結果は異なる場合があります):
一方のホストが失敗した場合はどうなるでしょうか? clickhouse-01 をシャットダウンしてシミュレートしてみましょう:
ホストがダウンしていることを確認するには、次のコマンドを実行します:
次に、clickhouse-02 から分散テーブルで以前に実行したのと同じセレクトクエリを実行します:
残念ながら、私たちのクラスターはフォールトトレラントではありません。一方のホストが失敗すると、クラスターは不健全と見なされ、クエリは失敗します。これは、前の例 で見たレプリケートテーブルとは異なり、そこではホストの 1 つが失敗してもデータを挿入できました。
結論
このクラスター トポロジーの利点は、データが別々のホストに分散され、各ノードあたりのストレージが半分になることです。さらに重要なのは、クエリが両方のシャードで処理されるため、メモリ利用効率が向上し、ホストごとの I/O が削減されることです。
このクラスター トポロジーの主な欠点はもちろん、ホストの 1 つを失うとクエリに応じることができなくなることです。
次の例では、スケーラビリティとフォールトトレランスの両方を提供する 2 つのシャードと 2 つのレプリカを持つクラスターのセットアップ方法を見ていきます。