Clickhouseクラスタの作成—第1部:シェアリング
19174 ワード
ClickHouseは、ロシアのIT会社Yandexによって開発されたオープンソースのカラム指向のDBMSです.それは大きなデータ、ビジネス分析と時系列データに適しています.この記事では、クラスタモードでClickHouseを実行する方法を紹介します.
必要条件
このチュートリアルでは、我々は公式docker image Clickhouse用.もちろん、DockerとDockerをインストールする必要があります.
クラスタアーキテクチャ
どんなClickhouseクラスタもshardsから成ります.シャードは、同じデータを格納するノードのグループです.テーブルがある場合は、そのデータはシャード間で配布されます.
シャードはレプリカからなる.シャードの各レプリカは、同じデータを格納します.それらのすべては互いに同期しているので、1つのレプリカがデータを受信するならば、それは他にデータを放送します.
基本的には負荷分散のためのデータベースシェアリングとフォールトトレランスのためのデータベース複製を必要とする.
シャープで複製されたデータテーブルを問い合わせるには、下位ノードからクラスタを形成するマスターノードを使用する必要があります.マスターノードには、いくつかの特徴があります. クラスタの設定を保存します 彼らはテーブルを持っている
クラスタ構成
さて、現在ノード構成に.クラスタ内の各ノードには、これらのフィールドを初期化する必要があります. また、などのパラメータに値を割り当てることができます
そして、これらのパラメータのデフォルト値を残すほうがよいでしょう. もちろん、マスターノードは特別で、クラスタ構成を格納しなければなりません.以下の3つのシャドウを持つクラスタの構成と、それぞれのシャードに対して1つだけのレプリカです.
クラスタ展開
今、我々はシステムを起動する準備が整いました.Dockerを使って行います.
クラスター表
すべてが稼働している後、データテーブルを作成する時間です.このタスクはPythonプログラミング言語とclickhouse-driver 図書館.最初のスクリプトに
それから、我々は
また、あなたが見て歓迎しています.
必要条件
このチュートリアルでは、我々は公式docker image Clickhouse用.もちろん、DockerとDockerをインストールする必要があります.
クラスタアーキテクチャ
どんなClickhouseクラスタもshardsから成ります.シャードは、同じデータを格納するノードのグループです.テーブルがある場合は、そのデータはシャード間で配布されます.
シャードはレプリカからなる.シャードの各レプリカは、同じデータを格納します.それらのすべては互いに同期しているので、1つのレプリカがデータを受信するならば、それは他にデータを放送します.
基本的には負荷分散のためのデータベースシェアリングとフォールトトレランスのためのデータベース複製を必要とする.
シャープで複製されたデータテーブルを問い合わせるには、下位ノードからクラスタを形成するマスターノードを使用する必要があります.マスターノードには、いくつかの特徴があります.
Distributed
データのどんな行も格納しないで、下位のノードの上でテーブルを照会して、クラスタ全体のデータを集めることを目的とするエンジン.クラスタ構成
さて、現在ノード構成に.クラスタ内の各ノードには、これらのフィールドを初期化する必要があります.
tcp_port
- クライアントのためのポートをダイヤルし、新しい接続を確立する(デフォルト値は9000です);http_port
- HTTPを使用してクライアントと通信するためのポートlisten_host
- IPアドレスを聞くには(それらの多くは、設定ファイルで指定することができます);interserver_http_port
- 複製のためのポートは、クラスタで互いに通信するために.max_concurrent_queries
, max_connections
and keep_alive_timeout
あなた自身の裁量で.そして、これらのパラメータのデフォルト値を残すほうがよいでしょう.
logger/log
- ログファイルへのパス/var/log/clickhouse-server/clickhouse-server.log
; logger/errorlog
- エラーログファイルへのパス/var/log/clickhouse-server/clickhouse-server.err.log
; path
- データディレクトリへのパス/var/lib/clickhouse/
; tmp_path
- 一時ファイルディレクトリへのパス/var/lib/clickhouse/tmp/
; users_config
- ユーザーのファイルへのパス、アクセス権と設定プロファイル、デフォルト値はusers.xml
; default_profile
- デフォルトの設定でプロファイルdefault
; default_database
- クライアントがダイヤルした後に最初に接続されるデータベースはdefault
. <remote_servers>
<example_cluster>
<shard>
<replica>
<host>ch-sub-1</host>
<port>9000</port>
</replica>
</shard>
<shard>
<replica>
<host>ch-sub-2</host>
<port>9000</port>
</replica>
</shard>
<shard>
<replica>
<host>ch-sub-3</host>
<port>9000</port>
</replica>
</shard>
</example_cluster>
</remote_servers>
にhost
フィールド、実際のドメイン名が指定されます.example_cluster
はクラスタの名前です.あなたが望むように多くのクラスタを指定することができますremote_servers
セクション.クラスタ展開
今、我々はシステムを起動する準備が整いました.Dockerを使って行います.
version: "3.7"
services:
ch-master:
container_name: ch_master
image: yandex/clickhouse-server:19.14.13.4
depends_on:
- ch-sub-1
- ch-sub-2
- ch-sub-3
ports:
- 9000:9000
- 8123:8123
volumes:
- type: volume
source: ch-master-data
target: /var/lib/clickhouse
- type: volume
source: ch-master-logs
target: /var/log/clickhouse-server
- ./master-config.xml:/etc/clickhouse-server/config.xml
ch-sub-1:
container_name: ch_sub_1
image: yandex/clickhouse-server:19.14.13.4
ports:
- 9001:9000
- 8124:8123
volumes:
- type: volume
source: ch-sub-1-data
target: /var/lib/clickhouse
- type: volume
source: ch-sub-1-logs
target: /var/log/clickhouse-server
- ./sub-config.xml:/etc/clickhouse-server/config.xml
ch-sub-2:
container_name: ch_sub_2
image: yandex/clickhouse-server:19.14.13.4
ports:
- 9002:9000
- 8125:8123
volumes:
- type: volume
source: ch-sub-2-data
target: /var/lib/clickhouse
- type: volume
source: ch-sub-2-logs
target: /var/log/clickhouse-server
- ./sub-config.xml:/etc/clickhouse-server/config.xml
ch-sub-3:
container_name: ch_sub_3
image: yandex/clickhouse-server:19.14.13.4
ports:
- 9003:9000
- 8126:8123
volumes:
- type: volume
source: ch-sub-3-data
target: /var/lib/clickhouse
- type: volume
source: ch-sub-3-logs
target: /var/log/clickhouse-server
- ./sub-config.xml:/etc/clickhouse-server/config.xml
volumes:
ch-master-data:
ch-master-logs:
ch-sub-1-data:
ch-sub-1-logs:
ch-sub-2-data:
ch-sub-2-logs:
ch-sub-3-data:
ch-sub-3-logs:
ご覧のように、ノードのデータとログを格納するために、各ノードのボリュームを作成しました.また、ノードの設定をマウントしました.現在の例では、各サブノードに対して別々の設定ファイルを必要としません.クラスター表
すべてが稼働している後、データテーブルを作成する時間です.このタスクはPythonプログラミング言語とclickhouse-driver 図書館.最初のスクリプトに
create-cluster.py
:from clickhouse_driver import Client
subs = [
("127.0.0.1", "9001"),
("127.0.0.1", "9002"),
("127.0.0.1", "9003")
]
master = ("127.0.0.1", "9000")
if __name__ == "__main__":
for sub in subs:
client = Client(sub[0], port=sub[1])
client.execute("CREATE DATABASE IF NOT EXISTS db")
client.execute('''CREATE TABLE IF NOT EXISTS db.entries(
timestamp DateTime,
parameter String,
value Float64)
ENGINE = MergeTree()
PARTITION BY parameter
ORDER BY (timestamp, parameter)''')
client = Client(master[0], port=master[1])
client.execute("CREATE DATABASE IF NOT EXISTS db")
client.execute('''CREATE TABLE IF NOT EXISTS db.entries(
timestamp DateTime,
parameter String,
value Float64)
ENGINE = Distributed(example_cluster, db, entries, rand())''')
まず、各下位ノードにデータテーブルを作成します.CREATE TABLE IF NOT EXISTS db.entries(
timestamp DateTime,
parameter String,
value Float64)
ENGINE = MergeTree()
PARTITION BY parameter
ORDER BY (timestamp, parameter)
順序付けは選択操作と挿入クエリのパフォーマンスを向上させますが、パーティションはデータ操作を意図します.DROP PARTITION part_name
). 挿入ブロックあたりのパーティションの制限はmax_partitions_per_insert_block
設定パラメータ.テーブルあたりのパーティションの推奨総数は1000です.10000この値を超えた場合、サーバの起動が遅くなり、選択したり挿入したりしないようになります.それから、我々は
Distributed
マスターノードのテーブル:CREATE TABLE IF NOT EXISTS db.entries(
timestamp DateTime,
parameter String,
value Float64)
ENGINE = Distributed(example_cluster, db, entries, rand())
最初のエンジンパラメータはクラスタ名で、データベース名、テーブル名、キーをキーにします.Shardingキーは、その結果を使用して、どのシャードがデータ列を列の値に応じて格納するかを決定するために使用します.指定した場合rand()
, 行はランダムシャードに行きます.マスターテーブルに挿入操作を行う場合(マスターテーブル自体がデータを格納しないことに注意してください.クエリ中にシャードからデータを集約するだけです).しかし、サブノードに直接挿入操作を行うことができます.from clickhouse_driver import Client
from datetime import datetime
client = Client("127.0.0.1", port="9002")
client.execute("INSERT INTO db.entries (timestamp, parameter, value) VALUES", \
[(datetime.utcnow(), "elasticity", 38.9), (datetime.utcnow(), "gravity", 27.2), \
(datetime.utcnow(), "density", 19.8)])
任意のノードを任意のデータを挿入することができます.ではマスターノードに接続してみましょうClickHouse client :docker run --network="clustering_default" -it --rm --link ch_master:clickhouse-server yandex/clickhouse-client:19.14.12.2 --host clickhouse-server
次の一連のSQL命令を実行します.USE db
SELECT * FROM entries
すべてが適切に設定されている場合は、各シャードに送信されたすべてのデータが表示されます.なぜ自分ですべてを試してみませんか?ちょっと見てくださいproject source .また、あなたが見て歓迎しています.
Reference
この問題について(Clickhouseクラスタの作成—第1部:シェアリング), 我々は、より多くの情報をここで見つけました https://dev.to/zergon321/creating-a-clickhouse-cluster-part-i-sharding-4j20テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol