javigs82.clickhouse

Ansible Clickhouse

这个角色负责配置和安装一个包含 N 个分片和 M 个副本的 Clickhouse 集群。
apt 和 yum 通过 Vagrant 进行了分子(Molecule)测试。

集群是基于 Ansible 清单组(也称为 清单模式)构建的,因此可以运行集群的以下组是必需的:

  • clickhouse:包含所有 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: 准备
  hosts: all
  tasks:
    - name: 安装 epel-release
      yum:
        name: epel-release
        state: present
  
    - name: 安装 nss-mdns
      yum:
        name: nss-mdns
        state: present

    - name: 停止 Debian 上正在运行的 cron 服务
      systemd:
        name: avahi-daemon
        state: started

使用 nss-mdnsavahi,Vagrant 能够解决 DNS,就像 .local

注意,在现实使用案例中,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:操作系统中的名称:在主机上执行 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

# 请查看 vars 了解 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})"
# 根据正则表达式进行发现
clickhouse_shard_name: "{{ ansible_hostname | regex_search(clickhouse_hostname_regex, '\\1') | first }}"
clickhouse_replica_name: "{{ ansible_hostname | regex_search(clickhouse_hostname_regex, '\\2') | first }}"

# 分片列表根据副本列表计算。必须符合正则表达式:查看 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 文件了解详细信息。

安装
ansible-galaxy install javigs82.clickhouse
许可证
mit
下载
169
拥有者