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

Требования

Чтобы установить 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 так же, как .local.

Примечание: разрешение 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'] }}"

Ссылки

Автор

Благодарности

Лицензия

Этот проект лицензирован под MIT License — смотрите файл LICENSE для подробностей.

О проекте

Clickhouse Cluster

Установить
ansible-galaxy install javigs82/ansible-role-clickhouse
Лицензия
mit
Загрузки
153
Владелец