Clickhouseクラスタの作成—第1部:シェアリング


ClickHouseは、ロシアのIT会社Yandexによって開発されたオープンソースのカラム指向のDBMSです.それは大きなデータ、ビジネス分析と時系列データに適しています.この記事では、クラスタモードでClickHouseを実行する方法を紹介します.

必要条件
このチュートリアルでは、我々は公式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 .
  • もちろん、マスターノードは特別で、クラスタ構成を格納しなければなりません.以下の3つのシャドウを持つクラスタの構成と、それぞれのシャードに対して1つだけのレプリカです.
    <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 .
    また、あなたが見て歓迎しています.