Chproxy + Clickhouseの高可用性クラスター展開の監視

1.環境の説明

1.1サービス展開計画

サーバーのニックネーム IPアドレス サービス構成
mdw 172.16.104.11 グラファナ、プロメテウス、ck
sdw1 172.16.104.12 chproxy、ck、zk
sdw2 172.16.104.13 ck、zk
sdw3 172.16.104.14 ck、zk

ローカル環境のリソースは限られています。本番環境では、さまざまなサーバーにさまざまなサービスを展開することをお勧めします。

1.2CKクラスター設定

┌─cluster──────┬─shard_num─┬─shard_weight─┬─replica_num─┬─host_name─┬─host_address──┬─port─┬─is_local─┬─user────┬─default_database─┬─errors_count─┬─estimated_recovery_time─┐
│ shard2_repl1 │         1 │            1 │           1 │ mdw       │ 172.16.104.11 │ 9000 │        1 │ default │                  │            0 │                       0 │
│ shard2_repl1 │         1 │            1 │           2 │ sdw1      │ 172.16.104.12 │ 9000 │        0 │ default │                  │            0 │                       0 │
│ shard2_repl1 │         2 │            1 │           1 │ sdw2      │ 172.16.104.13 │ 9000 │        0 │ default │                  │            0 │                       0 │
│ shard2_repl1 │         2 │            1 │           2 │ sdw3      │ 172.16.104.14 │ 9000 │        0 │ default │                  │            0 │                       0 │
└──────────────┴───────────┴──────────────┴─────────────┴───────────┴───────────────┴──────┴──────────┴─────────┴──────────────────┴──────────────┴─────────────────────────┘

第二に、chproxyの使用

2.1chproxyの利点

1.ネイティブクリックハウスクラスターのデメリット

  • ckは、分散クエリとローカルテーブルおよび分散テーブルを介した書き込みを完了します。これにより、ステートメントがデータ分散のために最初のデータベースノード(zkとの協調処理操作)を実行するときに、ネットワーク帯域幅が大量に消費されます。
  • 分散テーブルに書き込む場合、データは分散テーブルが配置されているマシンに配置され、ローカルテーブルが配置されているマシンに非同期で送信されて保存されます。中央に整合性チェックはなく、データの整合性のリスク。
  • 分散テーブルの書き込みでは、分散テーブルが配置されているときにマシンがダウンしていると、データが失われるリスクがあります。
  • 一部のシナリオでは、ネイティブ分散テーブルを使用すると、シャードノードでのデータ書き込みの分散が不均一になります。
  • クラスターSQLでの使用には注意が必要です。現時点では、文法は完全ではありません。場合によっては、SQLがハングする可能性があります。
  • 分散テーブルを使用する場合、特に分散クエリ操作の場合は、個々のノードのみを作成することをお勧めします。

2.chproxyの最適化

  • chproxyを介して直接ポーリングルーティングを実行し、ローカルテーブルに直接データを書き込んで、ネイティブ分散テーブルによって引き起こされる可能性のあるデータの整合性とデータ損失のリスクを回避します。
  • マルチシャードテーブルノードの不均一なデータ分散を回避するために、chproxyを介して直接ポーリングルーティングを実行します。
  • ステートメントが実行され、最初のデータベースノードがデータ配信を実行するときにネットワーク帯域幅の消費が2倍になるのを避けるために、chproxyを介して直接ポーリングルーティングを実行します。
  • Chproxyは、ckクラスターを複数の論理クラスターに分割でき、異なる論理クラスターをオンデマンドで構成できます(異なるロジックは、CKクラスター内の指定されたノードを指定し、データの書き込みとクエリは、リソースの干渉などを回避するために論理的に分離されます)。
  • Chproxyの上位層での負荷分散。これにより、chproxyレベルで高可用性を実現でき、ビジネス機能を水平方向に拡張することもできます。
  • 論理ユーザーのクエリ、アクセス、セキュリティなどを制限します。

ここに画像の説明を挿入

2.2Clickhouseクラスターのインストールとデプロイ

参照ドキュメント:CKクラスターの構築と展開

2.3chproxyのインストールと展開

1.ソフトウェアのインストール

# wget -c https://github.com/Vertamedia/chproxy/releases/download/v1.14.0/chproxy-linux-amd64-v1.14.0.tar.gz
# tar xf chproxy-linux-amd64-v1.14.0.tar.gz

2.chproxy構成ファイルを書き込みます

# mkdir -pv /data/chproxy
# touch /data/chproxy/config.yml


# vim /data/chproxy/config.yml
log_debug: false                                                    # debug日志
hack_me_please: true

# cache设置,可设置长期缓存或者短期缓存,按组区分
caches:                                                             # 缓存设置
  - name: "longterm"
    dir: "/data/chproxy/longterm/cachedir"
    max_size: 100Gb
    expire: 1h
    grace_time: 20s

  - name: "shortterm"
    dir: "/data/chproxy/shortterm/cachedir"
    max_size: 100Mb
    expire: 10s

# 网络白名单组,按组区分
network_groups:                                                     # 白名单组,可设置多个白名单组         
  - name: "cluster_internal"
    networks: ["172.16.104.0/24"]

  - name: "office_addrs"
    networks: ["192.168.102.0/24"]

# 参数设置,按组区分
param_groups:                                                       # 参数组,可设置多个参数
  - name: "cron-job"
    params:
      - key: "max_memory_usage"
        value: "40000000000"

      - key: "max_bytes_before_external_group_by"
        value: "20000000000"

  - name: "web"                                                 
    params:
      - key: "max_memory_usage"
        value: "5000000000"

      - key: "max_columns_to_read"
        value: "30"

      - key: "max_execution_time"
        value: "30"

# chproxy server相关设置,一般分为http、https、metrics
server:
  http:
    listen_addr: ":9090"                                            # chproxy 服务监听端口
    allowed_networks: ["office_addrs", "cluster_internal"]          # 允许访问chproxy服务白名单
    read_timeout: 5m
    write_timeout: 10m
    idle_timeout: 20m

  metrics:
    allowed_networks: ["office_addrs", "cluster_internal"]          # 暴露给prometheus使用的白名单

# 用户设置,按组区分
users:
  - name: "web"                                                     # chproxy 用户名
    password: "123456"                                              # chproxy 密码
    to_cluster: "chproxy_ck_cluster_1"                              # 用户可访问的cluster名称
    to_user: "web"                                                  # chproxy用户对应的ck用户
    deny_http: false                                                # 是否允许http请求
    allow_cors: true                                                
    requests_per_minute: 20                                         # 限制该用户每分钟请求次数
    # cache: "longterm"                                             # 使用缓存,若使用缓存,查询优先走缓存,而不是按照规则轮询
    params: "web"                                                   # 应用“web”指定的参数集
    max_queue_size: 100                                             # 最大队列数    
    max_queue_time: 35s                                             # 队列最大等待时间

  - name: "default"                                                 # chproxy 用户
    to_cluster: "chproxy_ck_cluster_2"                              # 不同的chproxy用户,可对应不同的cluster集群
    to_user: "default"
    allowed_networks: ["office_addrs", "cluster_internal", "172.16.104.12"]
    max_concurrent_queries: 4
    max_execution_time: 1m
    deny_https: false

# 逻辑集群设置,按组区分
clusters:
  - name: "chproxy_ck_cluster_1"                                    # chproxy 集合名称
    scheme: "http"                                                  # 请求类型,http/https
    nodes: ["mdw:8123","sdw2:8123"]                                 # 集群可访问节点,http使用端口默认为8123,https使用端口默认为8443,查看ck服务的config.xml配置文件查询
    heartbeat:                                                      # 集群内部心跳检测定义
      interval: 1m
      timeout: 10s
      request: "/?query=SELECT%201%2B1"
      response: "2\n"

    kill_query_user:                                                # 达到上限自动执行kill用户
      name: "default"
      password: ""

    users:
      - name: "web"                                                 # 集群对应chproxy用户信息
        password: "123456"
        max_concurrent_queries: 4
        max_execution_time: 1m

  - name: "chproxy_ck_cluster_2"                                    # chproxy 集群2名称,可从逻辑上定义多个集群
    scheme: "http"
    replicas:                                                       # 集群可访问节点
      - name: "replica1"
        nodes: ["mdw:8123", "sdw1:8123"]
      - name: "replica2"
        nodes: ["sdw2:8123", "sdw3:8123"]

    users:
      - name: "default"
        max_concurrent_queries: 4
        max_execution_time: 1m

いくつかの構成情報に関する注意:

1)ユーザー構成

  • chproxyには、インユーザーとアウトユーザーの2種類のユーザーが定義されています。
  • in-usersは、chproxyで論理的に定義されたユーザーを指し、out-usersは、ckで実際に作成されたユーザーを指します。
  • 1人のアウトユーザーは1人以上のインユーザーに対応でき、最大同時実行性、最悪のクエリ時間などの一部のクエリ制限はアウトユーザー層で制限できます。

2)クラスター設定

  • chproxyクラスターは、1つ以上の論理クラスターでセットアップできます。各論理クラスターには、名前とノードのリスト、またはレプリカノードのリストが含まれている必要があります。
  • クラスタノードとレプリカノード間のリクエストには、ラウンドロビン+最小負荷バランス方式が採用されています。
  • 近い将来、ノードへのリクエストが失敗した場合、ノードの優先度は短い時間間隔内に自動的に下げられます。これは、chproxyが各リクエストでコピーの負荷が最小の正常なノードを自動的に選択することを意味します
  • ハートビート検出を使用して、クラスター内の各ノードの可用性を確認できます。ビジネスリクエストのルーティングにより、使用できないノードが自動的に除外されます。
  • クラスターは、kill_query_userの設定により、max_execution_time制限に達したクエリを自動的に強制終了できます。
  • クラスターがユーザーを指定しない場合、デフォルトのユーザーがデフォルトで使用されます

3)キャッシュ設定

  • chproxyはキャッシュ設定の構成をサポートしており、クエリ速度を高速化するのに役立ちます
  • キャッシュは大きく分けて長期キャッシュと短期キャッシュに分けられます
  • キャッシュが追加された後、リクエストは最初にキャッシュクエリを介して結果セットを返します。ある程度、各リクエストのルーティングは不均一に見えるかもしれませんが、クラスター全体のパフォーマンスには影響しません。

4)セキュリティ設定

  • hack_me_pleaseはデフォルトでセキュリティチェックを開始します
  • アクセスオブジェクトの構成可能なホワイトリスト
  • httpsをサポート

3.chproxyサービスを開始します

# ./chproxy -config=/data/chproxy/config.yml >> /data/chproxy/error.log 2>&1 &
[1] 32538

2.4chproxy機能テスト

1.トラバースクエリテスト

[root@sdw3 ~]# echo 'select * from system.clusters' | curl 'http://172.16.104.12:9090/?user=default&password=' --data-binary @-
shard2_repl1	1	1	1	mdw	172.16.104.11	9000	0	default		0	0
shard2_repl1	1	1	2	sdw1	172.16.104.12	9000	0	default		0	0
shard2_repl1	2	1	1	sdw2	172.16.104.13	9000	1	default		0	0
shard2_repl1	2	1	2	sdw3	172.16.104.14	9000	0	default		0	0
[root@sdw3 ~]# echo 'select * from system.clusters' | curl 'http://172.16.104.12:9090/?user=default&password=' --data-binary @-
shard2_repl1	1	1	1	mdw	172.16.104.11	9000	1	default		0	0
shard2_repl1	1	1	2	sdw1	172.16.104.12	9000	0	default		0	0
shard2_repl1	2	1	1	sdw2	172.16.104.13	9000	0	default		0	0
shard2_repl1	2	1	2	sdw3	172.16.104.14	9000	0	default		0	0
[root@sdw3 ~]# echo 'select * from system.clusters' | curl 'http://172.16.104.12:9090/?user=default&password=' --data-binary @-
shard2_repl1	1	1	1	mdw	172.16.104.11	9000	0	default		0	0
shard2_repl1	1	1	2	sdw1	172.16.104.12	9000	0	default		0	0
shard2_repl1	2	1	1	sdw2	172.16.104.13	9000	0	default		0	0
shard2_repl1	2	1	2	sdw3	172.16.104.14	9000	1	default		0	0
[root@sdw3 ~]# echo 'select * from system.clusters' | curl 'http://172.16.104.12:9090/?user=default&password=' --data-binary @-
shard2_repl1	1	1	1	mdw	172.16.104.11	9000	0	default		0	0
shard2_repl1	1	1	2	sdw1	172.16.104.12	9000	1	default		0	0
shard2_repl1	2	1	1	sdw2	172.16.104.13	9000	0	default		0	0
shard2_repl1	2	1	2	sdw3	172.16.104.14	9000	0	default		0	0

[root@sdw3 ~]# echo 'select * from system.clusters' | curl 'http://172.16.104.12:9090/?user=web&password=123456' --data-binary @-
shard2_repl1	1	1	1	mdw	172.16.104.11	9000	1	default		0	0
shard2_repl1	1	1	2	sdw1	172.16.104.12	9000	0	default		0	0
shard2_repl1	2	1	1	sdw2	172.16.104.13	9000	0	default		0	0
shard2_repl1	2	1	2	sdw3	172.16.104.14	9000	0	default		0	0
[root@sdw3 ~]# echo 'select * from system.clusters' | curl 'http://172.16.104.12:9090/?user=web&password=123456' --data-binary @-
shard2_repl1	1	1	1	mdw	172.16.104.11	9000	0	default		0	0
shard2_repl1	1	1	2	sdw1	172.16.104.12	9000	0	default		0	0
shard2_repl1	2	1	1	sdw2	172.16.104.13	9000	1	default		0	0
shard2_repl1	2	1	2	sdw3	172.16.104.14	9000	0	default		0	0

3、chproxyモニタリング

3.1 安装grafana

1.ソフトウェアパッケージのインストール

# tar xf grafana-7.1.5.linux-amd64.tar.gz -C /usr/local

2.サービス開始

# ./grafana-server &

3.サービスの検証

grafanaのデフォルトのリスニングポート番号は3000です。確認のためにhttp://172.16.104.11:3000/にアクセスしてください。アカウントの初期パスワードはadmin / adminです。

[外部リンク画像の転送に失敗しました。ソースサイトにヒル防止リンクメカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします(img-7FCLHVFH-1615029258561)(http://note.youdao.com/yws/ res / 80721 / B978CBF7CCC84475A9D6E68732E6414B)]

3.2プロメテウスをインストールする

1.ソフトウェアパッケージのインストール

# tar xf prometheus-2.21.0.linux-amd64.tar.gz -C /usr/local

2.構成ファイルを変更します

scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: 'clickhouse-chproxy'

    scrape_interval: 10s
    static_configs:
    - targets: ['172.16.104.12:9090']               # 监听 chproxy 服务的IP:Port

3.サービスを開始します

# ./prometheus &

4.サービスの検証

grafanaのデフォルトのリスニングポート番号は9090です。http://172.16.104.11:9090 / targetsにアクセスして、ジョブのステータスが正常かどうかを確認してください。

[外部リンク画像の転送に失敗しました。ソースサイトにヒル防止リンクメカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします(img-Lj23YjGT-1615029258565)(http://note.youdao.com/yws/ res / 80742 / FE3A896A8EBF4FE28E537CF12584F0C8)]

3.3chproxyモニタリングの構成

1.chproxy監視テンプレートをインポートします

[外部リンク画像の転送に失敗しました。ソースサイトにヒル防止リンクメカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします(img-QXG4CRMb-1615029258567)(http://note.youdao.com/yws/ res / 80744 / EAAC793EA51B4E6BB7CD6FC599B5A7B4)]

[外部リンク画像の転送に失敗しました。ソースサイトにヒル防止リンクメカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします(img-prhZSVJC-1615029258570)(http://note.youdao.com/yws/ res / 80748 / 82784E80F21D479885AC4ED5C74531B8)]

2.jsonテンプレートの内容は次のとおりです

https://github.com/Vertamedia/chproxy/blob/master/chproxy_overview.json

3.効果テスト

1)chproxyを介して手動でいくつかのデータ操作を実行します

[root@sdw3 ~]# echo 'insert into db1.t1 select * from numbers(1000000);' | curl 'http://172.16.104.12:9090/?user=default&password=' --data-binary @-
[root@sdw3 ~]# echo 'insert into db1.t1 select * from numbers(1000000);' | curl 'http://172.16.104.12:9090/?user=default&password=' --data-binary @-
[root@sdw3 ~]# echo 'insert into db1.t1 select * from numbers(1000000);' | curl 'http://172.16.104.12:9090/?user=default&password=' --data-binary @-
[root@sdw3 ~]# echo 'insert into db1.t1 select * from numbers(1000000);' | curl 'http://172.16.104.12:9090/?user=default&password=' --data-binary @-
[root@sdw3 ~]# echo 'insert into db1.t1 select * from numbers(1000000);' | curl 'http://172.16.104.12:9090/?user=default&password=' --data-binary @-
[root@sdw3 ~]# echo 'insert into db1.t1 select * from numbers(1000000);' | curl 'http://172.16.104.12:9090/?user=default&password=' --data-binary @-
[root@sdw3 ~]# echo 'insert into db1.t1 select * from numbers(1000000);' | curl 'http://172.16.104.12:9090/?user=default&password=' --data-binary @-

2)監視を表示する

[外部リンク画像の転送に失敗しました。ソースサイトにヒル防止リンクメカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします(img-coKVPhBR-1615029258572)(http://note.youdao.com/yws/ res / 80751 / 7E961E0DBC20427FB36D3CD11FCD29FC)]

参照ドキュメント:
https //github.com/Vertamedia/chproxy
https://www.jianshu.com/p/9498fedcfee7

おすすめ

転載: blog.csdn.net/weixin_37692493/article/details/114452689