Clickhouse Docker クラスターの展開と構成を例を使って説明します

Clickhouse Docker クラスターの展開と構成を例を使って説明します

前面に書かれた

ビッグデータに関する経験を更新する時間を見つけました。最初にアーキテクチャを選択するときに、データ ウェアハウスとして Hadoop を使用することを検討しました。ただし、Hadoop には多数のサーバーが必要であり、少なくとも 6 台以上のサーバーのクラスターが必要であるため、Clickhouse (以下、CH と呼びます) を選択しました。 CH がクラスター化されている場合は、3 台のサーバーから始めることができます。もちろん、必須ではありません。Zookeeper がクラスター化されているかどうかによって異なります。次に、CH の方がパフォーマンスが強力です。ボリュームがそれほど大きくないシナリオでは、1 台のマシンでさまざまな OLAP シナリオを処理できます。

では本題に入りましょう。関連環境:

IPサーバー名オペレーティング·システム仕える述べる
172.192.13.10サーバー01ウブントゥ 20.04 2つのClickhouseインスタンス、Zookeeper

CH インスタンス 1 ポート: tcp 9000、http 8123、同期ポート 9009、MySQL 9004、タイプ: プライマリ シャード 1

CH インスタンス 2 ポート: tcp 9000、http 8124、同期ポート 9010、MySQL 9005、タイプ: server02 のレプリカ

172.192.13.11サーバー02ウブントゥ 20.04 2つのClickhouseインスタンス、Zookeeper

CH インスタンス 3 ポート: tcp 9000、http 8123、同期ポート 9009、MySQL 9004、タイプ: プライマリ シャード 2

CH インスタンス 4 ポート: tcp 9000、http 8124、同期ポート 9010、MySQL 9005、タイプ: server03 のレプリカ

172.192.13.12サーバー03ウブントゥ 20.04 2つのClickhouseインスタンス、Zookeeper

CH インスタンス 5 ポート: tcp 9000、http 8123、同期ポート 9009、MySQL 9004、タイプ: プライマリ シャード 3

CH インスタンス 6 ポート: tcp 9000、http 8124、同期ポート 9010、MySQL 9005、タイプ: server01 のレプリカ

各サービスに docker をインストールします。図に示すように、docker には ch-main、ch-sub、zookeeper_node の 3 つのサービスがインストールされています。

注意深い観察者なら、ポート間にマッピング関係がないことに気付くでしょう。ここでは Docker ホスト ネットワーク モードが使用されています。このモードはシンプルでパフォーマンスが高く、コンテナ間またはサーバー間の多くの通信問題を回避できます。これは長い間行われてきました。

環境の展開

1. サーバー環境の構成

各サーバーで実行します: vim /etc/hosts、hosts を開いて次の構成を追加します。

172.192.13.10 サーバー01
172.192.13.11 サーバー02
172.192.13.12 サーバー03

2. Dockerをインストールする

シンプルすぎる、ちょっと…

3. クリックハウスと動物園の画像をプルする

シンプルすぎる、ちょっと…

Zookeeper クラスタの展開

各サーバー上の保存場所 (ここでは /usr/soft/zookeeper/) に、Zookeeper 構成情報を保存する新しいフォルダーを作成し、各サーバーで次の起動コマンドを順番に実行します。

Server01 は次を実行します:

docker run -d -p 2181:2181 -p 2888:2888 -p 3888:3888 --name zookeeper_node --restart always \
-v /usr/soft/zookeeper/data:/data \
-v /usr/soft/zookeeper/datalog:/datalog \
-v /usr/soft/zookeeper/logs:/logs \
-v /usr/soft/zookeeper/conf:/conf \
--ネットワークホスト\
-e ZOO_MY_ID=1 飼育係

Server02 は次を実行します:

docker run -d -p 2181:2181 -p 2888:2888 -p 3888:3888 --name zookeeper_node --restart always \
-v /usr/soft/zookeeper/data:/data \
-v /usr/soft/zookeeper/datalog:/datalog \
-v /usr/soft/zookeeper/logs:/logs \
-v /usr/soft/zookeeper/conf:/conf \
--ネットワークホスト\
-e ZOO_MY_ID=2 飼育係

Server03 は次を実行します:

docker run -d -p 2181:2181 -p 2888:2888 -p 3888:3888 --name zookeeper_node --restart always \
-v /usr/soft/zookeeper/data:/data \
-v /usr/soft/zookeeper/datalog:/datalog \
-v /usr/soft/zookeeper/logs:/logs \
-v /usr/soft/zookeeper/conf:/conf \
--ネットワークホスト\
-e ZOO_MY_ID=3 飼育係

唯一の違いは -e ZOO_MY_ID=* です。

次に、各サービスの /usr/soft/zookeeper/conf パスを開き、zoo.cfg 構成ファイルを見つけて、次のように変更します。

データディレクトリ=/データ
dataLogDir=/データログ
ティックタイム=2000
初期化制限=5
同期制限=2
クライアントポート=2181
自動パージ.snapRetainCount=3
自動パージ.パージ間隔=0
最大クライアント接続数=60

サーバー1=172.192.13.10:2888:3888
サーバー2=172.192.13.11:2888:3888
サーバー3=172.192.13.12:2888:3888

次に、サーバーの 1 つに入り、zk と入力して、構成が成功したかどうかを確認します。

docker exec -it zookeeper_node /bin/bash

./bin/zkServer.sh ステータス

Clickhouse クラスターの展開

1. 一時的なミラーコピー構成

ホスト上の構成、データ、ログ、その他の情報を保存する一時コンテナを実行します。

docker run --rm -d --name=temp-ch yandex/clickhouse-server

コンテナ内のファイルをコピーします。

docker cp temp-ch:/etc/clickhouse-server/ /etc/

//https://www.cnblogs.com/EminemJK/p/15138536.html

2. config.xml構成を変更する

// IPV6 とも互換性があります。<listen_host>0.0.0.0</listen_host>

//タイムゾーンを設定します <timezone>Asia/Shanghai</timezone>

//元のノードのテスト情報を削除します <remote_servers> <remote_servers incl="clickhouse_remote_servers" />

// 新しく追加されました。上の remote_servers ノードと同じレベルです <include_from>/etc/clickhouse-server/metrika.xml</include_from>

// 新しく追加されました。上の remote_servers ノードと同じレベルです <zookeeper incl="zookeeper-servers" optimal="true" />

// 新しく追加されました。上の remote_servers ノードと同じレベルです <macros incl="macros" optimal="true" />

他の listen_host については、エントリを 1 つだけ残し、他のエントリをコメント アウトします。

3. 別のフォルダにコピーする

cp -rf /etc/clickhouse-server/ /usr/soft/clickhouse-server/main
cp -rf /etc/clickhouse-server/ /usr/soft/clickhouse-server/sub

main はプライマリ シャードであり、sub はレプリカです。

4. 他のサーバーに配布する

#設定をserver02にコピーします scp /usr/soft/clickhouse-server/main/ server02:/usr/soft/clickhouse-server/main/
scp /usr/soft/clickhouse-server/sub/ server02:/usr/soft/clickhouse-server/sub/ 
#設定をserver03にコピーします scp /usr/soft/clickhouse-server/main/ server03:/usr/soft/clickhouse-server/main/
scp /usr/soft/clickhouse-server/sub/ server03:/usr/soft/clickhouse-server/sub/

SCPは本当に良いです。

その後、一時コンテナを削除します: docker rm -f temp-ch

クラスターの構成

ここには3台のサーバーがあり、各サーバーには2つのCHインスタンスがあり、リングで相互にバックアップすることで高可用性を実現しています。リソースが十分にある場合は、レプリカのSubインスタンスを完全に独立させ、構成を変更することもできます。これはClickhouseのもう1つの利点であり、水平拡張が非常に便利です。

1. 設定を変更する

server1 サーバーに入り、/usr/soft/clickhouse-server/sub/conf の config.xml ファイルを変更し、次の内容を変更します。

オリジナル:
<http_ポート>8123</http_ポート>
<tcp_port>9000</tcp_port>
<mysql_port>9004</mysql_port>
<インターサーバーhttp_ポート>9009</インターサーバーhttp_ポート>

変更後:
<http_ポート>8124</http_ポート>
<tcp_port>9001</tcp_port>
<mysql_port>9005</mysql_port>
<インターサーバー_http_ポート>9010</インターサーバー_http_ポート>

変更の目的は、メインシャードの構成と区別することです。ポートは 2 つのプログラムに同時に適用できません。 Server02 と server03 は、この方法で変更されるか、scp コマンドを使用して配布されます。

2. クラスター構成ファイル metrika.xml を追加する

server01、メインプライマリシャード構成:

/usr/soft/clickhouse-server/main/conf フォルダに移動し、metrika.xml ファイル (ファイル エンコーディング: utf-8) を追加します。

<ヤンデックス>
    <!-- CH クラスター構成、すべてのサーバーは同じです-->
    <クリックハウスリモートサーバー>
        <クラスター_3s_1r>
            <!-- データ シャード 1 -->
            <破片>
                <内部レプリケーション> 真</内部レプリケーション>
                <レプリカ>
                    <ホスト>server01</ホスト>
                    <ポート>9000</ポート>
                    <user>デフォルト</user>
                    <パスワード></パスワード>
                </レプリカ>
                <レプリカ>
                    <ホスト>server03</ホスト>
                    <ポート>9001</ポート>
                    <user>デフォルト</user>
                    <パスワード></パスワード>
                </レプリカ>
            </シャード>
            <!-- データ シャード 2 -->
            <破片>
                <内部レプリケーション> 真</内部レプリケーション>
                <レプリカ>
                    <ホスト>server02</ホスト>
                    <ポート>9000</ポート>
                    <user>デフォルト</user>
                    <パスワード></パスワード>
                </レプリカ>
                <レプリカ>
                    <ホスト>server01</ホスト>
                    <ポート>9001</ポート>
                    <user>デフォルト</user>
                    <パスワード></パスワード>
                </レプリカ>
            </シャード>
            <!-- データ シャード 3 -->
            <破片>
                <内部レプリケーション> 真</内部レプリケーション>
                <レプリカ>
                    <ホスト>server03</ホスト>
                    <ポート>9000</ポート>
                    <user>デフォルト</user>
                    <パスワード></パスワード>
                </レプリカ>
                <レプリカ>
                    <ホスト>server02</ホスト>
                    <ポート>9001</ポート>
                    <user>デフォルト</user>
                    <パスワード></パスワード>
                </レプリカ>
            </シャード>
        </cluster_3s_1r>
    </clickhouse_remote_servers>

    <!-- すべての zookeeper_servers インスタンスは同じ構成です -->
    <動物園飼育員サーバー>
        <ノードインデックス="1">
            <ホスト>172.16.13.10</ホスト>
            <ポート>2181</ポート>
        </ノード>
        <ノードインデックス="2">
            <ホスト>172.16.13.11</ホスト>
            <ポート>2181</ポート>
        </ノード>
        <ノードインデックス="3">
            <ホスト>172.16.13.12</ホスト>
            <ポート>2181</ポート>
        </ノード>
    </動物園管理サーバー>

    <!-- marcos の各インスタンスは異なる構成を持ちます -->
    <マクロ>
        <レイヤー>01</レイヤー>
        <シャード>01</シャード>
        <レプリカ>クラスター01-01-1</レプリカ>
    </マクロ>
    <ネットワーク>
        <ip>::/0</ip>
    </ネットワーク>

    <!-- データ圧縮アルゴリズム-->
    <クリックハウス圧縮>
        <ケース>
            <最小部分サイズ>10000000000</最小部分サイズ>
            <最小部分サイズ比率>0.01</最小部分サイズ比率>
            <メソッド>lz4</メソッド>
        </ケース>
    </clickhouse_compression>
</ヤンデックス>

<macros> ノードはサーバーおよびインスタンスごとに異なり、他のノードの構成は同じにすることができます。以下は、<macros> ノードの構成の違いのみを示します。

Server01、サブレプリカ構成:

<マクロ>
    <レイヤー>01</レイヤー>
    <shard>02</shard>
    <レプリカ>クラスター01-02-2</レプリカ>
</マクロ>

Server02、メインプライマリシャード構成:

<マクロ>
    <レイヤー>01</レイヤー>
    <shard>02</shard>
    <レプリカ>クラスター01-02-1</レプリカ>
</マクロ>

Server02、サブレプリカ構成:

<マクロ>
    <レイヤー>01</レイヤー>
    <shard>03</shard>
    <レプリカ>クラスター01-03-2</レプリカ>
</マクロ>

Server03、メインプライマリシャード構成:

<マクロ>
    <レイヤー>01</レイヤー>
    <shard>03</shard>
    <レプリカ>クラスター01-03-1</レプリカ>
</マクロ>

Server03、サブレプリカ構成:

<マクロ>
    <レイヤー>01</レイヤー>
    <shard>02</shard>
    <レプリカ>クラスター01-01-2</レプリカ>
</マクロ>

この時点で、すべての設定が完了しています。パスワードなどのその他の設定は、必要に応じて追加できます。

クラスターの運用とテスト

各サーバーでインスタンスを順番に実行します。Zookeeper は以前に実行されています。そうでない場合は、まず zk クラスターを実行する必要があります。

メインインスタンスを実行します。

docker run -d --name=ch-main -p 8123:8123 -p 9000:9000 -p 9009:9009 --ulimit nofile=262144:262144 \ -v /usr/soft/clickhouse-server/main/data:/var/lib/clickhouse:rw \ -v /usr/soft/clickhouse-server/main/conf:/etc/clickhouse-server:rw \ -v /usr/soft/clickhouse-server/main/log:/var/log/clickhouse-server:rw \
--add-host server01:172.192.13.10 \
--add-host server02:172.192.13.11 \
--add-host server03:172.192.13.12 \
--ホスト名 server01 \
--ネットワークホスト\
--restart=常に\
 yandex/クリックハウスサーバー

サブインスタンスを実行します。

docker run -d --name=ch-sub -p 8124:8124 -p 9001:9001 -p 9010:9010 --ulimit nofile=262144:262144 \
-v /usr/soft/clickhouse-server/sub/data:/var/lib/clickhouse:rw \
-v /usr/soft/clickhouse-server/sub/conf:/etc/clickhouse-server:rw \
-v /usr/soft/clickhouse-server/sub/log:/var/log/clickhouse-server:rw \
--add-host server01:172.192.13.10 \
--add-host server02:172.192.13.11 \
--add-host server03:172.192.13.12 \
--ホスト名 server01 \
--ネットワークホスト\
--restart=常に\
 yandex/クリックハウスサーバー

各サーバーでコマンドを実行する場合、唯一異なるパラメータはホスト名です。これは、以前にホスト名を設定してサーバーを指定しているためです。そうでない場合、クラスターをクエリするために select * from system.clusters を実行すると、is_local 列がすべて 0 になり、ローカル サービスが見つからないことが示されます。これは注意が必要なことです。各サーバー インスタンスが起動したら、正規の DataGrip を使用して開きます。

任意のインスタンスに新しいクエリを作成します。

クラスターcluster_3s_1rにテーブルT_UserTestを作成します。
(
    ts 日時、
    uid 文字列、
    ビジネス文字列
)
    エンジン = ReplicatedMergeTree('/clickhouse/tables/{layer}-{shard}/T_UserTest', '{replica}')
        PARTITION BY toYYYYMMDD(ts)
        順序
        設定 index_granularity = 8192;

cluster_3s_1r は、先ほど設定したクラスターの名前です。これらは 1 対 1 で対応している必要があります。/clickhouse/tables/ は固定のプレフィックスです。関連する構文については、公式ドキュメントを参照してください。

各インスタンスを更新すると、すべてのインスタンスにこの T_UserTest テーブルがあることがわかります。Zookeeper がセットアップされているため、分散 DDL を簡単に実装できます。

新しい分散テーブルの作成を続行します。

クラスター cluster_3s_1r にテーブル T_UserTest_All を作成します。 T_UserTest ENGINE = Distributed(cluster_3s_1r, default, T_UserTest, rand())

各プライマリ シャードは関連情報を個別に挿入します。

--server01 を T_UserTest の値に挿入します ('2021-08-16 17:00:00',1,1)
--サーバー02
T_UserTest の値に挿入 ('2021-08-16 17:00:00',2,1)
--サーバー03
T_UserTest の値に挿入 ('2021-08-16 17:00:00',3,1)

次に、分散テーブルをクエリします。select * from T_UserTest_All、

対応するレプリカ テーブルをクエリしたり、いずれかのサーバーの Docker インスタンスをシャットダウンしたりしても、クエリには影響しません。これは時間的制約のためテストされていません。

Clickhouse Docker クラスターの構成と展開に関するこの記事はこれで終わりです。Clickhouse Docker クラスターの関連コンテンツの詳細については、123WORDPRESS.COM で以前の記事を検索するか、次の関連記事を引き続き参照してください。今後も 123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • SpringbootはClickhouseリアルタイムビッグデータ分析エンジンを使用する(使用方法)
  • Apache Superset を使用して ClickHouse データを視覚化する 2 つの方法
  • MybatisをClickHouseに接続する方法
  • SpringBoot2 統合 ClickHouse データベースのケース分析
  • ビッグデータ分野におけるデータ分析データベースClickHouseの応用実践

<<:  js を使用してシンプルなスイッチ ライト コードを実装する

>>:  サイト全体を灰色にするCSSコードのまとめ

推薦する

MySQL 8.0.14 のインストールと設定方法のグラフィックチュートリアル

この記事では、MySQL 8.0.14のインストールと設定のプロセスを記録しています。具体的な内容は...

MySQLテーブルシャーディングとパーティショニングの具体的な実装方法

縦型テーブル垂直テーブル分割とは、多数の列を持つテーブルを複数のテーブルに分割することを意味します。...

Vueは開始時間と終了時間の範囲クエリを実装します

この記事では、Vueで開始時間と終了時間の範囲を照会する方法を参考までに紹介します。具体的な内容は次...

Dockerカスタムネットワークコンテナ相互接続

目次序文-リンクカスタムネットワーク質問する序文前回は、 -Linkパラメータを使用してコンテナ間の...

Vue+SSMは画像アップロードのプレビュー効果を実現します

現在の要件は、ファイルのアップロード ボタンがあることです。ボタンをクリックすると、アップロードする...

MySQL 5.7 でパスワードを忘れた場合の解決方法の詳細な説明

環境: [root@centos7 ~]# uname -r 3.10.0-514.el7.x86_...

実際のプロジェクトでElementUIを使用する手順の詳細な説明

目次1. テーブル自動ソート2. ページング機能3.el-checkbox-group 複数選択ボッ...

Vue+WebSocket ページでの長時間接続のリアルタイム更新

最近、Vue プロジェクトではデータをリアルタイムで更新する必要があります。折れ線グラフは 1 秒ご...

MySQL 上級学習インデックスの長所と短所、使用ルール

1. インデックスの利点と欠点利点: 高速検索、高速グループ化および並べ替えデメリット: ストレージ...

Docker での WSL の構成と変更の問題について

https://docs.microsoft.com/ja-jp/windows/wsl/wsl-...

HTML テーブルタグチュートリアル (20): 行の背景色属性 BGCOLOR

BGCOLOR 属性を使用して、行の背景色を設定できます。基本的な構文<TR BGcolor...

Nginx アクセス ログとエラー ログ パラメータの説明

例: nginx ログには、アクセス ログとエラー ログの 2 つの主な種類があります。アクセス ロ...

MySql バッチ挿入の最適化 SQL 実行効率の例の詳細な説明

MySql バッチ挿入の最適化 SQL 実行効率の例の詳細な説明itemcontractprice ...

きれいなJavaScriptコードの書き方を教える記事

目次1. 変数意味のある名前を使う不必要なコンテキストを追加しないようにするハードコードされた値を避...

JavaScript 関数はランダムな色の検証コードをカプセル化します (完全なコード)

数字、文字、またはランダムな色の数字と文字の混合で構成される n 桁の確認コード。以下に完全なコード...