javigs82.clickhouse

Ansible Clickhouse

この役割は、NシャードおよびMレプリカを持つクリックハウスクラスタの設定とインストールを担当します。 aptおよびyum は、Vagrant上でモレキュールテスト済みです。

クラスタは、Ansibleのインベントリグループ、つまりインベントリパターンに基づいて構築されるため、以下のグループはクラスタを実行するために必須です:

  • clickhouse: すべてのクリックハウスインベントリホストが含まれています。これらのホストはホスト名を ch01-shard01-replica01 のように設定する必要があります、 正規表現は ^ch\\d{2}-shard\\d{2}-replica\\d{2} のようになります。
  • zookeeper: すべてのZooKeeperインベントリホストが含まれています。

ホスト名に基づいてシャードとレプリカがどのように計算されているかを確認するには、defaultsを参照してください:

注意: {{ inventory_hostname }} はDNSまたはIPアドレスであり、{{ ansible_hostname }} はマシンのホスト名です。

ホスト名({{ ansible_hostname}})が正しく設定されているかを確認するには、ホストマシンで次のコマンドを実行してください:

hostname

要件

moleculeをインストールするには、python3を使用します。

python3 -m pip install --user "molecule"
python3 -m pip install --user "molecule-vagrant"

このソリューションは、プライベートDNSサーバーでホスト名を解決する機能に基づいています。 したがって、VagrantがDNSソリューションを提供しないと仮定し、以下のソフトウェアがprepare.ymlにインストールされています。 これにより、Vagrantインフラが内部DNSリゾルバを持つようになります。

---
- name: Prepare
  hosts: all
  tasks:
    - name: Install epel-release
      yum:
        name: epel-release
        state: present
  
    - name: Install nss-mdns
      yum:
        name: nss-mdns
        state: present

    - name: Stop service cron on debian, if running
      systemd:
        name: avahi-daemon
        state: started

nss-mdnsavahiによって、Vagrantは .local のようにDNSを解決できます。

注意: リアルな使用ケースでは、DNS解決はより複雑であると期待されます。

ホスト名を正しく設定するには、次のリンクを参照してください:

https://www.vagrantup.com/docs/networking/basic_usage#setting-hostname

アーキテクチャ

Clickhouse-clusterはホスト名の上に構築されるため、ホスト名が次のように正しく設定されていることを確認してください:

^ch\\d{2}-shard\\d{2}-replica\\d{2}

ここで chX-shardY-replicaZ は、正規表現に基づいてどのレプリカがどのシャードに属しているかを簡単に発見する方法を提供するキーです。

注意: ansible_hostnameinventory_hostnameは異なります:

  • ansible_hostname: OS内の名前です:ホストマシンでhostnameを実行してください。
  • inventory_hostname: ホストのURL(IPまたはDNS)であり、他のクラスタレプリカによって解決される必要があります。 IPアドレスまたはDNSの両方が有効です。

{{ ansible_hostname }}はレプリカの発見に使用され、{{ inventory_hostname}}は通信を可能にします。

インベントリの例は以下の通りです:

[clickhouse]
<URL-ch01-shard01-replica01> ansible_host=<ip>
<URL-ch01-shard01-replica02> ansible_host=<ip>
...
<URL-ch01-shard02-replica01> ansible_host=<ip>
<URL-ch01-shard02-replica02> ansible_host=<ip>
...
<URL-chX-shardY-replicaZ> ansible_host=<ip>

[zookeeper]
<URL-zookeeper01> ansible_host=<ip>
...
<URL-zookeeperN> ansible_host=<ip>

ここで、URL(inventory_hostname)は、ランタイムで解決されるIPまたはDNSです。

クラスタを構築するには、clickhouseグループとzookeeperグループが必須です。

設計

  • ダウンロード: Yandex RPMリポジトリから。ダウングレードはclickhouse_allow_downgradeプロパティによって許可されます。
  • 設定: clickhouseグループおよびユーザーを確保します。パスと設定ファイルを確認します。正規表現に基づいてレプリカとシャードを発見します。
  • インストール: yumを使ってダウンロードとインストールを行います。
  • ユーザー: ユーザーを管理するための動的リスト。パスワード管理は実装されていません。
  • RBAC: 実装予定です。

役割のデフォルト変数

defaultsで変数を確認してください。

クラスタ定義

これらの変数を使用して、メイン定義を設定します。 クラスタ設定はホスト名に依存しており、それによりclickhouse_replica_nameclickhouse_shard_nameが重要であり、clickhouse_hostname_regexはホスト名定義の正規表現です: ^ch\\d{2}-(shard\\d{2})-replica\\d{2} 詳細についてはvarsを参照してください。

# clickhouseクラスタ定義
clickhouse_version: "20.8.7.15"
clickhouse_allow_downgrade: false
clickhouse_cluster_name: "mycluster"

clickhouse_service_name: "clickhouse-server"
clickhouse_service_status: "started"

# ユーザー/グループ
clickhouse_group: "clickhouse"
clickhouse_user: "clickhouse"

Clickhouse インストールサポート

# yumサポート 
clickhouse_yum_repo: "https://repo.clickhouse.tech/rpm/stable/x86_64/"
clickhouse_yum_repo_key: "https://repo.clickhouse.tech//CLICKHOUSE-KEY.GPG"
clickhouse_yum_package:
  - "clickhouse-client-{{ clickhouse_version }}"
  - "clickhouse-common-static-{{ clickhouse_version }}"
  - "clickhouse-server-{{ clickhouse_version }}"

# aptサポート
clickhouse_apt_repo: "deb https://repo.clickhouse.tech/deb/stable/ main/"
clickhouse_apt_repo_keyserver: "keyserver.ubuntu.com"
clickhouse_apt_repo_key: "E0C56BD4"
clickhouse_apt_package:
  - "clickhouse-client={{ clickhouse_version }}"
  - "clickhouse-common-static={{ clickhouse_version }}"
  - "clickhouse-server={{ clickhouse_version }}"

# パス
clickhouse_path_config: "/etc/clickhouse-server"
clickhouse_path_config_d: "{{ clickhouse_path_config }}/config.d"
clickhouse_path_log: "/var/log/clickhouse-server"
clickhouse_path_data: "/var/lib/clickhouse"

Clickhouse 設定

これらの変数を使用して、主要な設定が設定されます。

clickhouse_config:
  max_connections: 2048
  keep_alive_timeout: 3
  max_concurrent_queries: 100
  uncompressed_cache_size: 8589934592
  mark_cache_size: 5368709120
  builtin_dictionaries_reload_interval: 3600
  max_session_timeout: 3600
  default_session_timeout: 60
  mlock_status: false
  merge_tree_config: []

ネットワーキング

これらの変数はネットワーク設定に関連しています。

clickhouse_http_port: 8123
clickhouse_https_port: 8443
clickhouse_tcp_port: 9000
clickhouse_tcp_secure_port: 9440
clickhouse_interserver_http: 9009

# clickhouse_listen_host_defaultを参照
clickhouse_listen_host: "{{ clickhouse_listen_host_default + clickhouse_listen_host_custom }}"

注意: clickhouse_listen_hostは、chメンバーがリスニングできるようにする必要があります。

ユーザー

これらの変数を使用してユーザーをカスタマイズします。 ユーザーを削除するには、Clickhouseの設定属性を使用します: https://clickhouse.tech/docs/en/operations/configuration-files/

# chユーザー: https://clickhouse.tech/docs/en/operations/configuration-files/
clickhouse_users_list:
  - { user_name: "default",
      profile: "default",
      networks: ["::/1"],
      quota: "default" }

Zookeeper

ZooKeeperホストリストはインベントリグループパターンに基づいています。

# ZooKeeperは必須ではありません。ZooKeeperがインストールされていない場合、 
# レプリケーションはクライアント側で行われます。
clickhouse_zookeeper_list: "{{ groups['zookeeper'] }}"
clickhouse_zookeeper_port: "2181"

役割変数

これらは、デフォルトおよびインベントリグループの変数よりも大きい変数です。 通常、これらはより高い優先度によってのみ上書き可能ですが、通常は上書きしないでください。

クラスタ設定はホスト名に依存しており、それにより、clickhouse_replica_nameclickhouse_shard_nameが重要であり、clickhouse_hostname_regexはホスト名定義の正規表現です: ^ch\\d{2}-(shard\\d{2})-replica\\d{2} 詳細についてはvarsを参照してください。

varsで変数を確認してください。

---
# シャードとレプリカを発見するための正規表現
clickhouse_hostname_regex: "^ch\\d{2}-(shard\\d{2})-(replica\\d{2})"
# regexに基づいて発見
clickhouse_shard_name: "{{ ansible_hostname | regex_search(clickhouse_hostname_regex, '\\1') | first }}"
clickhouse_replica_name: "{{ ansible_hostname | regex_search(clickhouse_hostname_regex, '\\2') | first }}"

# シャードリストはレプリカリストによって計算されます。 regexに従う必要があります: vars/main.ymlのclickhouse_hostname_regexを参照
clickhouse_shard_list: "{{ clickhouse_replica_list | map('extract', hostvars, 'ansible_hostname') | map('regex_search', clickhouse_hostname_regex, '\\1') | unique | map ('first') }}"
# レプリカリストはグループのすべてのホストです
clickhouse_replica_list: "{{ groups['clickhouse'] }}"

clickhouse_listen_host_default:
  - "{{ inventory_hostname }}"
  - "127.0.0.1"
  - "::1"

これらは決して上書きしないでください。ロールがレプリカとシャードを発見し、関連付ける方法の核心となるからです。

役割タグ

この役割でサポートされているタグは次のとおりです:

  • ch:configure: 設定タスクのみ実行するため。
  • ch:install: ソフトウェアのダウンロードとインストールを行います。
  • ch:service: systemctlサービスの状態を管理します。

依存関係

Clickhouseは、一貫性を確保するためにZookeeperに依存しています。

例プレイブック

ロールの使用例を含みます。

    - hosts: my_clickhouse_group
      tasks:
        - include_role:
            name: javigs82.clickhouse
          vars:
            clickhouse_cluster_name: "e-commerce"
            clickhouse_replica_list: "{{ groups['my_clickhouse_group'] }}"
            clickhouse_zookeeper_list: "{{ groups['my_zookeeper_group'] }}"

参考文献

作者

謝辞

ライセンス

このプロジェクトはMITライセンスの下でライセンスされています - 詳細についてはLICENSEファイルを参照してください。

プロジェクトについて

Clickhouse Cluster

インストール
ansible-galaxy install javigs82.clickhouse
ライセンス
mit
ダウンロード
169
所有者