AlexeySetevoi.clickhouse
ansible-clickhouse
Простая роль для развёртывания и управления clickhouse-server. Любые вопросы и предложения по улучшению приветствуются.
Переменные роли
F: Вы можете указать конкретную версию (или * для последней). Имейте в виду, что понижение версии не поддерживается.
clickhouse_version: "19.11.3.11"
F: Вы можете управлять портами прослушивания:
clickhouse_http_port: 8123
clickhouse_tcp_port: 9000
clickhouse_interserver_http: 9009
F: Вы можете добавить IP-адреса для прослушивания дополнительно к значениям по умолчанию:
clickhouse_listen_host_custom:
- "192.168.0.1"
F: Вы можете управлять TTL для журнала запросов:
clickhouse_query_log_ttl: 'event_date + INTERVAL 7 DAY DELETE'
F: Вы можете управлять TTL для журнала потоков запросов:
clickhouse_query_thread_log_ttl: 'event_date + INTERVAL 7 DAY DELETE'
F: Либо можете указать IP-адреса напрямую, например, чтобы слушать на всех IPv4 и IPv6 адресах:
clickhouse_listen_host:
- "::"
F: Вы можете создать пользовательские профили:
clickhouse_profiles_custom:
my_custom_profile:
max_memory_usage: 10000000000
use_uncompressed_cache: 0
load_balancing: random
my_super_param: 9000
Позволяет любые простые K-V. Преобразуется в XML:
<profiles>
<!-- Профили настроек. -->
<!-- Профили по умолчанию. -->
<default>
<max_memory_usage>10000000000</max_memory_usage>
<load_balancing>random</load_balancing>
<use_uncompressed_cache>0</use_uncompressed_cache>
</default>
<readonly>
<readonly>1</readonly>
</readonly>
<!-- Конец профилей по умолчанию. -->
<!-- Пользовательские профили. -->
<my_custom_profile>
<max_memory_usage>10000000000</max_memory_usage>
<load_balancing>random</load_balancing>
<use_uncompressed_cache>0</use_uncompressed_cache>
<my_super_param>9000</my_super_param>
</my_custom_profile>
<!-- Конец пользовательских профилей. -->
</profiles>
F: Вы можете создавать пользовательских пользователей:
clickhouse_users_custom:
- { name: "testuser",
password_sha256_hex: "f2ca1bb6c7e907d06dafe4687e579fce76b37e4e93b7605022da52e6ccc26fd2",
networks: "{{ clickhouse_networks_default }}",
profile: "default",
quota: "default",
dbs: [ testu1 ] ,
comment: "обычный пользователь с простым паролем"}
- { name: "testuser2",
password: "testplpassword",
networks: "{{ clickhouse_networks_default }}",
profile: "default",
quota: "default",
dbs: [ testu2 ] ,
comment: "обычный пользователь с хэшированным паролем"}
- { name: "testuser3",
password: "testplpassword",
networks: { 192.168.0.0/24, 10.0.0.0/8 },
profile: "default",
quota: "default",
dbs: [ testu1,testu2,testu3 ] ,
comment: "обычный пользователь с несколькими БД и несколькими пользовательскими разрешениями на доступ"}
- { name: "testuser4",
ldap_server: "example_ldap_server",
networks: { 192.168.0.0/24, 10.0.0.0/8 },
profile: "default",
quota: "default",
dbs: [ testu1,testu2,testu3 ] ,
comment: "внешняя аутентификация с использованием определения ldap_server"}
F: Вы можете управлять собственными квотами:
clickhouse_quotas_custom:
- { name: "my_custom_quota", intervals: "{{ clickhouse_quotas_intervals_default }}", comment: "Квота по умолчанию - учитывает только количество запросов" }
Объект квоты — это простой словарь:
- { duration: 3600, queries: 0, errors: 0, result_rows: 0, read_rows: 0, execution_time: 0 }
F: Вы можете создавать любые базы данных: состояние БД по умолчанию — присутствует
clickhouse_dbs_custom:
- { name: testu1 }
- { name: testu2 }
- { name: testu3 }
- { name: testu4, state: absent }
- { name: testu5, state: present }
- { name: testu6, state: absent, cluster: testu6 }
- { name: testu7, state: present, cluster: testu7 }
- { name: testu8, state: absent, cluster: testu8, engine: Lazy(3600) }
- { name: testu9, state: present, cluster: testu9, engine: Lazy(3600) }
F: Вы можете создавать словари через ODBC:
clickhouse_dicts:
test1:
name: test_dict
odbc_source:
connection_string: "DSN=testdb"
source_table: "dict_source"
lifetime:
min: 300
max: 360
layout: hashed
structure:
key: "testIntKey"
attributes:
- { name: testAttrName, type: UInt32, null_value: 0 }
test2:
name: test_dict
odbc_source:
connection_string: "DSN=testdb"
source_table: "dict_source"
lifetime:
min: 300
max: 360
layout: complex_key_hashed
structure:
key:
attributes:
- { name: testAttrComplexName, type: String }
attributes:
- { name: testAttrName, type: String, null_value: "" }
F: Флаг для удаления ClickHouse с хоста (по умолчанию отключен):
clickhouse_remove: no
F: Вы можете управлять конфигурацией Kafka:
# глобальная конфигурация
clickhouse_kafka_config:
auto_offset_reset: smallest
debug: cgrp
# конфигурация на уровне темы
clickhouse_kafka_topics_config:
topic1:
retry_backoff_ms: 250
fetch_min_bytes: 100000
topic2:
retry_backoff_ms: 300
fetch_min_bytes: 120000
F: Вы можете управлять конфигурацией LDAP-сервера:
clickhouse_ldap_servers:
# Отладка с помощью ldapwhoami -H '<host>' -D '<bind_dn>' -w <password>
example_ldap_server:
host: "ldaps.example.com"
port: "636"
bind_dn: "EXAMPLENET\\{user_name}"
verification_cooldown: "300"
enable_tls: "yes"
tls_require_cert: "demand"
F: Вы можете управлять внешним пользовательским каталогом LDAP:
# Полезное руководство на https://altinity.com/blog/integrating-clickhouse-with-ldap-part-two
clickhouse_ldap_user_directories:
- server: "example_ldap_server"
roles:
- "ldap_user"
role_mapping:
base_dn: "ou=groups,dc=example,dc=com"
attribute: "CN"
scope: "subtree"
search_filter: "(&(objectClass=group)(member={user_dn}))"
prefix: "clickhouse_"
F: Вы можете управлять конфигурацией Merge Tree. Для списка доступных параметров смотрите настройки таблиц MergeTree.
clickhouse_merge_tree_config:
max_suspicious_broken_parts: 5
parts_to_throw_insert: 600
Пример плейбука
Включение примера использования вашей роли (например, с переменными, переданными в качестве параметров) всегда будет полезно для пользователей:
- hosts: clickhouse_cluster
remote_user: root
vars:
clickhouse_users_custom:
- { name: "testuser",
password_sha256_hex: "f2ca1bb6c7e907d06dafe4687e579fce76b37e4e93b7605022da52e6ccc26fd2",
networks: "{{ clickhouse_networks_default }}",
profile: "default",
quota: "default",
dbs: [ testu1 ] ,
comment: "обычный пользователь с простым паролем"}
- { name: "testuser2",
password: "testplpassword",
networks: "{{ clickhouse_networks_default }}",
profile: "default",
quota: "default",
dbs: [ testu2 ] ,
comment: "обычный пользователь с хэшированным паролем"}
- { name: "testuser3",
password: "testplpassword",
networks: { 192.168.0.0/24, 10.0.0.0/8 },
profile: "default",
quota: "default",
dbs: [ testu1,testu2,testu3 ] ,
comment: "обычный пользователь с несколькими БД и несколькими пользовательскими разрешениями на доступ"}
clickhouse_query_log_ttl: 'event_date + INTERVAL 7 DAY DELETE'
clickhouse_query_thread_log_ttl: 'event_date + INTERVAL 7 DAY DELETE'
clickhouse_dicts:
test1:
name: test_dict
odbc_source:
connection_string: "DSN=testdb"
source_table: "dict_source"
lifetime:
min: 300
max: 360
layout: hashed
structure:
key: "testIntKey"
attributes:
- { name: testAttrName, type: UInt32, null_value: 0 }
test2:
name: test_dict
odbc_source:
connection_string: "DSN=testdb"
source_table: "dict_source"
lifetime:
min: 300
max: 360
layout: complex_key_hashed
structure:
key:
attributes:
- { name: testAttrComplexName, type: String }
attributes:
- { name: testAttrName, type: String, null_value: "" }
clickhouse_dbs_custom:
- { name: testu1 }
- { name: testu2, state:present }
- { name: testu3, state:absent }
clickhouse_clusters:
your_cluster_name:
shard_1:
- { host: "db_host_1", port: 9000 }
- { host: "db_host_2", port: 9000 }
shard_2:
- { host: "db_host_3", port: 9000 }
- { host: "db_host_4", port: 9000 }
clickhouse_zookeeper_nodes:
- { host: "zoo_host_1", port: 2181 }
- { host: "zoo_host_2", port: 2181 }
- { host: "zoo_host_3", port: 2181 }
roles:
- ansible-clickhouse
Чтобы сгенерировать макросы: в файле host_vars\db_host_1.yml
clickhouse_macros:
layer: 01
shard: "your_shard_name"
replica: "db_host_1"
Укрепление безопасности кластера. Вы можете настроить кластер с помощью дополнительных настроек, которые включают:
- HTTPS порт
- Шифрование TCP порта с помощью TLS
- HTTPS для репликации данных
- Учетные данные для репликации данных
- Секрет для проверки распределенных запросов
- ACL ZooKeeper
- hosts: clickhouse_cluster
become: true
roles:
- ansible-clickhouse
vars:
# HTTPS вместо обычного HTTP
clickhouse_https_port: 8443
# Шифрование TLS для родного TCP-протокола (требуется `clickhouse-client --secure`)
clickhouse_tcp_secure_port: 9440
# Шифрование TLS между узлами в кластере
clickhouse_interserver_https: 9010
# Учетные данные для аутентификации узлов во время репликации данных
clickhouse_interserver_http_credentials:
user: "internal"
password: "supersecretstring"
# Секрет для проверки узлов в кластере для распределенных запросов
clickhouse_distributed_secret: "supersecretstring2"
# Защита паролем путей ZooKeeper, используемых ClickHouse
clickhouse_zookeeper_identity:
user: "zoo_user"
password: "secretzoostring"
# Настройки OpenSSL
clickhouse_ssl_server:
certificate_file: "/etc/clickhouse-server/server.crt"
private_key_file: "/etc/clickhouse-server/server.key"
dh_params_file: "/etc/clickhouse-server/dhparam.pem"
verification_mode: "none"
load_default_ca_file: "true"
cache_sessions: "true"
disable_protocols: "sslv2,sslv3"
prefer_server_ciphers: "true"
clickhouse_clusters:
your_cluster_name:
shard_1:
- host: "db_host_1"
port: 9440
secure: true
- host: "db_host_2"
port: 9440
secure: true
shard_2:
- host: "db_host_3"
port: 9440
secure: true
- host: "db_host_4"
port: 9440
secure: true
clickhouse_zookeeper_nodes:
- host: "zoo_host_1"
port: 2181
- host: "zoo_host_2"
port: 2181
- host: "zoo_host_3"
port: 2181
F: Вы можете отдельно вызывать этапы (из плейбука, внешней роли и т.д.):
| Тег | Действие |
|---|---|
| install | Только установка пакетов |
| config_sys | Только конфигурация системных конфигураций (users.xml и config.xml) |
| config_db | Только добавление и удаление баз данных |
| config_sys | Только регенерация словарей |
| config | config_sys + config_db |
Лицензия
BSD
Информация об авторе
ClickHouse от ClickHouse, Inc..
Роль от AlexeySetevoi.
Дорогие контрибьюторы, спасибо.
ansible-galaxy install AlexeySetevoi.clickhouse