--- slug: /ja/architecture/horizontal-scaling sidebar_label: 水平拡張 sidebar_position: 10 title: 水平拡張 --- import ReplicationShardingTerminology from '@site/docs/ja/_snippets/_replication-sharding-terminology.md'; import ConfigFileNote from '@site/docs/ja/_snippets/_config-files.md'; ## 概要 この例のアーキテクチャは、スケーラビリティを提供するように設計されています。こちらには3つのノードが含まれています:2つのClickHouseとコーディネーション(ClickHouse Keeper)サーバーが組み合わさったもの、およびこのクォーラムを完成させるためのClickHouse Keeperのみを持つ3番目のサーバーです。この例を使用して、データベース、テーブル、および2つのノードの両方でデータをクエリできる分散テーブルを作成します。 ## レベル: 基本 ## 環境 ### アーキテクチャ図 ![2シャードと1レプリカのアーキテクチャ図](@site/docs/ja/deployment-guides/images/scaling-out-1.png) |ノード|説明| |----|-----------| |chnode1|データ + ClickHouse Keeper| |chnode2|データ + ClickHouse Keeper| |chnode3|ClickHouse Keeperクォーラムに使用| :::note 本番環境では、ClickHouse Keeperを専用ホストで実行することを強くお勧めします。この基本構成では、ClickHouse Serverプロセス内でKeeper機能を実行しています。ClickHouse Keeperをスタンドアロンでデプロイする手順は、[インストールドキュメント](/docs/ja/getting-started/install.md/#install-standalone-clickhouse-keeper)で確認できます。 ::: ## インストール 3つのサーバーにClickhouseをインストールし、[アーカイブタイプごとの手順](/docs/ja/getting-started/install.md/#available-installation-options) (.deb, .rpm, .tar.gzなど) に従ってください。この例では、3台のマシンすべてにClickHouse ServerとClientのインストール手順に従います。 ## 設定ファイルの編集 ## chnode1の設定 chnode1には、5つの設定ファイルがあります。これらのファイルを1つのファイルにまとめることもできますが、ドキュメント内で個別に見る方が明確かもしれません。設定ファイルを読み進めると、chnode1とchnode2のほとんどの設定が同じであることがわかります。一部の違いは強調されます。 ### ネットワークとログ設定 これらの値は、お好みでカスタマイズできます。この例の設定は、1000Mで3回ロールオーバーするデバッグログを提供します。ClickHouseはIPv4ネットワークでポート8123と9000でリッスンし、インターサーバー通信にポート9009を使用します。 ```xml title="network-and-logging.xml on chnode1" debug /var/log/clickhouse-server/clickhouse-server.log /var/log/clickhouse-server/clickhouse-server.err.log 1000M 3 clickhouse 0.0.0.0 8123 9000 9009 ``` ### ClickHouse Keeper設定 ClickHouse Keeperは、データレプリケーションと分散DDLクエリの実行のためのコーディネーションシステムを提供します。ClickHouse KeeperはApache ZooKeeperと互換性があります。この設定では、ポート9181でClickHouse Keeperを有効にします。強調表示されている行は、Keeperのインスタンスに`server_id`を1としていることを示しています。この`enable-keeper.xml`ファイルの違いは3つのサーバーすべてでこれだけです。`chnode2`では`server_id`は`2`に設定され、`chnode3`では`server_id`は`3`に設定されます。raft構成セクションは3つのサーバーすべてで同じであり、下記に強調されて、`server_id`とraft構成内の`server`インスタンスの関係を示します。 :::note 何らかの理由でKeeperノードが交換または再構築された場合、既存の`server_id`を再利用しないでください。例えば、`server_id`が`2`であるKeeperノードが再構築された場合は、`server_id`を`4`以上にしてください。 ::: ```xml title="enable-keeper.xml on chnode1" 9181 # highlight-next-line 1 /var/lib/clickhouse/coordination/log /var/lib/clickhouse/coordination/snapshots 10000 30000 trace # highlight-start 1 chnode1 9234 # highlight-end 2 chnode2 9234 3 chnode3 9234 ``` ### マクロ設定 マクロ`shard`と`replica`により、分散DDLの複雑さが軽減されます。設定された値はDDLクエリ内で自動的に置き換えられるため、DDLを簡素化できます。この設定のマクロは、各ノードのシャードとレプリカ番号を指定します。この2シャード1レプリカの例では、レプリカマクロはchnode1とchnode2の両方で`replica_1`に設定されています。シャードマクロはchnode1では`1`、chnode2では`2`です。 ```xml title="macros.xml on chnode1" # highlight-next-line 1 replica_1 ``` ### レプリケーションとシャーディング設定 以下の設定の大まかな概要です: - XMLの`remote_servers`セクションは、環境内の各クラスターを指定します。属性`replace=true`は、デフォルトのClickHouse設定のサンプル`remote_servers`をこのファイルで指定された`remote_servers`設定で置き換えます。この属性がない場合、このファイル内のリモートサーバーはデフォルトのサンプルリストに追加されます。 - この例では、1つのクラスターが`cluster_2S_1R`という名前で存在します。 - クラスター`cluster_2S_1R`のためのシークレットが`mysecretphrase`という値で作成されます。環境内のすべてのリモートサーバー間でシークレットが共有され、正しいサーバーが一緒に結合されることを保証します。 - クラスター`cluster_2S_1R`には2つのシャードがあり、それぞれのシャードに1つのレプリカがあります。文書の冒頭近くのアーキテクチャ図を見て、以下のXMLの2つの`shard`定義と比較してください。各シャード定義には1つのレプリカがあります。レプリカは特定のシャード用です。レプリカのホストとポートが指定されています。最初のシャードの設定のレプリカは`chnode1`に保存され、2番目のシャードの設定のレプリカは`chnode2`に保存されます。 - シャードの内部レプリケーションはtrueに設定されています。各シャードは設定ファイルで`internal_replication`パラメーターを定義することができ、このパラメーターがtrueに設定されている場合、書き込み操作は最初の正常なレプリカを選択し、データを書き込みます。 ```xml title="remote-servers.xml on chnode1" mysecretphrase true chnode1 9000 true chnode2 9000 ``` ### Keeperの使用設定 上でClickHouse Keeperが設定されました。この設定ファイル`use-keeper.xml`は、レプリケーションと分散DDLのコーディネーションのためにClickHouse ServerがClickHouse Keeperを使用する設定を行っています。このファイルは、ClickHouse Serverがポート9181でchnode1から3のKeeperを使用するように指定しており、ファイルは`chnode1`と`chnode2`で同じです。 ```xml title="use-keeper.xml on chnode1" chnode1 9181 chnode2 9181 chnode3 9181 ``` ## chnode2の設定 chnode1とchnode2の設定は非常に似ているため、ここでは違いのみを指摘します。 ### ネットワークとログ設定 ```xml title="network-and-logging.xml on chnode2" debug /var/log/clickhouse-server/clickhouse-server.log /var/log/clickhouse-server/clickhouse-server.err.log 1000M 3 clickhouse 0.0.0.0 8123 9000 9009 ``` ### ClickHouse Keeper設定 このファイルにはchnode1とchnode2の違いの一つが含まれています。Keeperの設定で`server_id`が`2`に設定されています。 ```xml title="enable-keeper.xml on chnode2" 9181 # highlight-next-line 2 /var/lib/clickhouse/coordination/log /var/lib/clickhouse/coordination/snapshots 10000 30000 trace 1 chnode1 9234 # highlight-start 2 chnode2 9234 # highlight-end 3 chnode3 9234 ``` ### マクロ設定 マクロ設定にはchnode1とchnode2の違いの一つがあります。`shard`はこのノードでは`2`に設定されています。 ```xml title="macros.xml on chnode2" # highlight-next-line 2 replica_1 ``` ### レプリケーションとシャーディング設定 ```xml title="remote-servers.xml on chnode2" mysecretphrase true chnode1 9000 true chnode2 9000 ``` ### Keeperの使用設定 ```xml title="use-keeper.xml on chnode2" chnode1 9181 chnode2 9181 chnode3 9181 ``` ## chnode3の設定 chnode3はデータを保存せず、ClickHouse Keeperがクォーラムの3番目のノードを提供するために使用されているため、chnode3には、ネットワークとログを設定するファイルとClickHouse Keeperを設定するファイルの2つの設定ファイルのみがあります。 ### ネットワークとログ設定 ```xml title="network-and-logging.xml on chnode3" debug /var/log/clickhouse-server/clickhouse-server.log /var/log/clickhouse-server/clickhouse-server.err.log 1000M 3 clickhouse 0.0.0.0 8123 9000 9009 ``` ### ClickHouse Keeper設定 ```xml title="enable-keeper.xml on chnode3" 9181 # highlight-next-line 3 /var/lib/clickhouse/coordination/log /var/lib/clickhouse/coordination/snapshots 10000 30000 trace 1 chnode1 9234 2 chnode2 9234 # highlight-start 3 chnode3 9234 # highlight-end ``` ## テスト 1. `chnode1`に接続し、上で設定されたクラスター`cluster_2S_1R`が存在することを確認します。 ```sql SHOW CLUSTERS ``` ```response ┌─cluster───────┐ │ cluster_2S_1R │ └───────────────┘ ``` 2. クラスター上にデータベースを作成します。 ```sql CREATE DATABASE db1 ON CLUSTER cluster_2S_1R ``` ```response ┌─host────┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐ │ chnode2 │ 9000 │ 0 │ │ 1 │ 0 │ │ chnode1 │ 9000 │ 0 │ │ 0 │ 0 │ └─────────┴──────┴────────┴───────┴─────────────────────┴──────────────────┘ ``` 3. クラスター上にMergeTreeテーブルエンジンを使用したテーブルを作成します。 :::note テーブルエンジンのパラメーターを指定する必要はありません。これらはマクロに基づいて自動的に定義されます。 ::: ```sql CREATE TABLE db1.table1 ON CLUSTER cluster_2S_1R ( `id` UInt64, `column1` String ) ENGINE = MergeTree ORDER BY id ``` ```response ┌─host────┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐ │ chnode1 │ 9000 │ 0 │ │ 1 │ 0 │ │ chnode2 │ 9000 │ 0 │ │ 0 │ 0 │ └─────────┴──────┴────────┴───────┴─────────────────────┴──────────────────┘ ``` 4. `chnode1`に接続して1行を挿入します。 ```sql INSERT INTO db1.table1 (id, column1) VALUES (1, 'abc'); ``` 5. `chnode2`に接続して1行を挿入します。 ```sql INSERT INTO db1.table1 (id, column1) VALUES (2, 'def'); ``` 6. `chnode1`または`chnode2`のどちらかに接続し、そのノードのテーブルに挿入された行のみが表示されることを確認します。 例えば、`chnode2`で ```sql SELECT * FROM db1.table1; ``` ```response ┌─id─┬─column1─┐ │ 2 │ def │ └────┴─────────┘ ``` 7. 両方のノードで両方のシャードをクエリする分散テーブルを作成します。 (この例では、`rand()`関数をシャーディングキーとして設定し、各挿入をランダムに分散させます) ```sql CREATE TABLE db1.table1_dist ON CLUSTER cluster_2S_1R ( `id` UInt64, `column1` String ) ENGINE = Distributed('cluster_2S_1R', 'db1', 'table1', rand()) ``` ```response ┌─host────┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐ │ chnode2 │ 9000 │ 0 │ │ 1 │ 0 │ │ chnode1 │ 9000 │ 0 │ │ 0 │ 0 │ └─────────┴──────┴────────┴───────┴─────────────────────┴──────────────────┘ ``` 8. `chnode1`または`chnode2`に接続し、両方の行を確認するために分散テーブルをクエリします。 ``` SELECT * FROM db1.table1_dist; ``` ```reponse ┌─id─┬─column1─┐ │ 2 │ def │ └────┴─────────┘ ┌─id─┬─column1─┐ │ 1 │ abc │ └────┴─────────┘ ``` ## さらに詳しい情報: - [分散テーブルエンジン](/docs/ja/engines/table-engines/special/distributed.md) - [ClickHouse Keeper](/docs/ja/guides/sre/keeper/index.md)