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
需求
- Vagrant 与 Virtual Box(见 https://www.vagrantup.com/intro)
- ansible => 2.10
- python3
- pip3
- Molecule(见 https://molecule.readthedocs.io/en/latest/installation.html)
要安装 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-mdns
和 avahi
,Vagrant 能够解决 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_hostname
与 inventory_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_name
和 clickhouse_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_name
和 clickhouse_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'] }}"
参考
- https://clickhouse.tech/docs/en/getting-started
- https://docs.ansible.com/ansible/latest/user_guide/intro_patterns.html
作者
- javigs82 github
致谢
- https://github.com/AlexeySetevoi/ansible-clickhouse
- https://github.com/nl2go/ansible-role-clickhouse
- https://github.com/idealista/clickhouse_role
许可证
本项目根据 MIT 许可证发布 - 请参阅 LICENSE 文件了解详细信息。
ansible-galaxy install javigs82.clickhouse