この例では、レプリケーションとスケールアウトの両方に対応したシンプルな ClickHouse クラスターのセットアップ方法を学びます。 このクラスターは 2 つの分片と 2 つのレプリカで構成されており、 クラスター内の協調の管理とクォーラムの維持のために、3 ノードの ClickHouse Keeper クラスターを使用します。セットアップするクラスターのアーキテクチャを以下に示します。
ClickHouse Server と ClickHouse Keeper を同じサーバー上でまとめて実行することも可能ですが、
本番環境では ClickHouse Keeper 用に専用ホストを使用することを強く推奨します。
この例でも、その構成を示します。Keeper サーバーはより小規模なものでも問題なく、通常は各 Keeper サーバーにつき 4GB の RAM があれば、
ClickHouse Server が大規模になるまでは十分です。
前提条件
- 事前にローカルのClickHouseサーバーをセットアップしていること
- 設定ファイルなど、ClickHouseの基本的な設定概念に精通していること
- お使いのマシンにDockerがインストールされていること
1
ディレクトリ構造とテスト環境のセットアップ
このチュートリアルでは、Docker compose を使用して ClickHouse クラスターをセットアップします。この構成は、個別のローカルマシン、仮想マシン、またはクラウドインスタンスでも動作するよう変更することができます。次のコマンドを実行して、この例のディレクトリ構造を作成します。以下の 以下のサブディレクトリとファイルを作成します。
docker-compose.yml ファイルを clickhouse-cluster ディレクトリに追加してください。docker-compose.yml
config.dディレクトリには、ClickHouse server の構成ファイルconfig.xmlが含まれており、 ここで各 ClickHouse ノード用のカスタム構成を定義します。この 構成は、すべての ClickHouse インストールに含まれるデフォルトのconfig.xml構成 ファイルと組み合わされます。users.dディレクトリにはユーザー構成ファイルusers.xmlが含まれており、ここで ユーザーごとのカスタム構成を定義します。この構成は、すべての ClickHouse インストールに含まれるデフォルトのusers.xml構成ファイルと組み合わされます。
2
ClickHouseノードの設定
サーバーのセットアップ
次に、fs/volumes/clickhouse-{}/etc/clickhouse-server/config.d にある空の設定ファイル config.xml をそれぞれ編集します。以下でハイライトされている行は、各ノードに固有の値に変更する必要があります。上記の設定ファイルの各セクションについて、以下で詳しく説明します。
ネットワークとログ
ネットワークインターフェイスで外部からの通信を有効にするには、listen host 設定を有効化します。これにより、ClickHouse server のホストに他の ホストからアクセスできるようになります:8123 に設定されています。9000 に設定されています。<logger> ブロックで定義します。以下の設定例では、1000M に達すると最大3回ロールオーバーするデバッグログが設定されます。クラスターの設定
クラスターの設定は<remote_servers> ブロックで行います。
ここでクラスター名 cluster_2S_2R を定義します。<cluster_2S_2R></cluster_2S_2R> ブロックは、<shard></shard> および <replica></replica> の設定を使用してクラスターのレイアウトを定義し、ON CLUSTER 句を使用してクラスター全体で実行される distributed DDL クエリのテンプレートとして機能します。デフォルトでは distributed DDL クエリは許可されていますが、allow_distributed_ddl_queries 設定で無効にすることもできます。internal_replication を true に設定することで、データはいずれか1つのレプリカにのみ書き込まれます。<cluster_2S_2R></cluster_2S_2R> セクションはクラスターのレイアウトを定義し、ON CLUSTER 句を使用してクラスター全体で実行される分散 DDL クエリのテンプレートとして機能します。Keeper configuration
<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 を設定する
次に、協調に使用する ClickHouse Keeper を設定します。各 ClickHouse Keeper ノード用の 各
ノードディレクトリ 次のセクションでは、
Raftコンセンサスアルゴリズムのクォーラムに参加する
サーバーを設定します。
Keeper のセットアップ
レプリケーションを機能させるには、ClickHouse Keeper クラスターをセットアップして 設定する必要があります。ClickHouse Keeper はデータレプリケーションのための 調整システムを提供し、ZooKeeper の代替として動作します。ZooKeeper を使用することも可能ですが、 より優れた保証と信頼性を備え、 ZooKeeper よりも少ないリソースで動作するため、ClickHouse Keeper の使用が推奨されます。高可用性を確保し、 クォーラムを維持するため、少なくとも 3 台の ClickHouse Keeper ノードを実行することを推奨します。ClickHouse Keeper は、ClickHouse と併せてクラスター内の任意のノードで実行できますが、
スケーリングや 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 のクライアントが使用するポートです。4
セットアップをテストする
お使いのマシンで Docker が起動していることを確認してください。
docker が ClickHouse と Keeper のイメージのプルを開始し、
続いてコンテナーを起動するはずです:クラスターが稼働中であることを確認するには、いずれかのノードに接続し、次の
クエリを実行します。最初のノードに接続するコマンドを以下に示します。成功すると、ClickHouse clientのプロンプトが表示されます:次のクエリを実行して、どのホストにどのクラスターのトポロジーが定義されているかを確認します。次のクエリを実行して、ClickHouse Keeperクラスターの状態を確認します。以下は、フォロワーノードからのレスポンス例です。以下は、リーダーノードからのレスポンス例です:これで、2 つの分片と 2 つのレプリカを持つ ClickHouse クラスターのセットアップは正常に完了しました。
次のステップでは、クラスター内にテーブルを作成します。
cluster_2S_2R ディレクトリのルートで docker-compose up コマンドを実行して、クラスターを起動します。Query
Response
Query
Response
mntr コマンドは、ClickHouse Keeper が稼働していることを確認し、
3 つの Keeper ノード間の関係に関する状態情報を取得するためにも一般的に使用されます。
この例で使用する構成では、3 つのノードが連携して動作します。
ノードは leader を選出し、残りのノードは followers になります。mntr コマンドでは、パフォーマンスに関する情報に加え、
特定のノードが follower か leader かも確認できます。以下のコマンドを clickhouse-keeper-01、clickhouse-keeper-02、および
clickhouse-keeper-03 のシェルで実行し、各 Keeper ノードのステータスを確認します。clickhouse-keeper-01 で実行するコマンドを以下に示します。Response
Response
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 句と ReplicatedMergeTree エンジンの使用を除けば同じです。ON CLUSTER 句は、CREATE、DROP、ALTER、RENAME などの DDL (Data Definition Language)
クエリを分散実行するためのもので、これらの
スキーマ変更がクラスター内のすべてのノードに適用されるようにします。ReplicatedMergeTree
エンジンは通常の MergeTree テーブルエンジンと同様に動作しますが、データもレプリケーションします。
これには 2 つのパラメーターを指定する必要があります。zoo_path: テーブルのメタデータに対する Keeper/ZooKeeper のパス。replica_name: テーブルのレプリカ名。
zoo_path パラメーターには任意の値を設定できますが、プレフィックスを使用するという
慣例に従うことをお勧めします{database}と{table}は自動的に置き換えられます。{shard}と{replica}は、各 ClickHouse ノードのconfig.xmlファイルで あらかじめ定義されたマクロです。
Query
Response
7
分散テーブルにデータを挿入する
テーブルにデータを挿入する際、各ホストで、データは、以下のクエリを使用して、どのホストクライアントからでも
以下のクエリを実行し、挿入されたデータが
クラスター内の各ノードに均等に分散されていることを確認します。
ON CLUSTER は INSERT、UPDATE、DELETE などの DML (Data Manipulation Language) クエリには適用されないため、使用できません。データを挿入するには、
Distributed テーブルエンジンを利用する必要があります。
2 分片・1 レプリカのクラスターをセットアップするガイドで学んだように、分散テーブルは異なる
ホスト上にある分片にアクセスできるテーブルで、Distributed テーブルエンジンを使って定義されます。
分散テーブルは、クラスター内のすべての分片をまたぐインターフェイスとして機能します。どのホストのクライアントからでも、次のクエリを実行して、前のステップで作成した既存のレプリケートテーブルを使用する分散テーブルを作成します。ukデータベースに次のテーブルが表示されるようになります。uk_price_paid_distributed テーブルに挿入できます。