clickhouse
Ansible Clickhouse
Эта роль отвечает за настройку и установку кластера ClickHouse с N шардами и M репликами. apt и yum протестированы с помощью Molecule на Vagrant.
Кластер строится на основе групп инвентаря 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 с VirtualBox (см. 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: Остановить службу cron на debian, если она запущена
systemd:
name: avahi-daemon
state: started
С помощью nss-mdns
и avahi
Vagrant может разрешать DNS так же, как
Примечание: разрешение DNS предполагается более сложным в реальных сценариях использования.
Чтобы правильно настроить имя хоста, ознакомьтесь с следующей ссылкой:
https://www.vagrantup.com/docs/networking/basic_usage#setting-hostname
Архитектура
Clickhouse-кластер построен на основе имени хоста, поэтому убедитесь, что имя хоста установлено правильно, как
^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
обязательны.
Дизайн
- Загрузка: из репозитория RPM Yandex. Понижение версии разрешено с помощью свойства
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 }}"
# список шардов рассчитывается на основе списка реплик. Они должны соответствовать регулярному выражению: см. clickhouse_hostname_regex в vars/main.yml
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 — смотрите файл LICENSE для подробностей.
ansible-galaxy install javigs82/ansible-role-clickhouse