Профили настроек и файлы конфигурации на основе XML не поддерживаются в ClickHouse Cloud. Поэтому в ClickHouse Cloud вы не найдете файл
config.xml. Вместо этого для управления настройками через профили настроек следует использовать команды SQL.Подробнее см. в разделе “Настройка параметров”/etc/clickhouse-server/config.xml в качестве файла конфигурации по умолчанию, но расположение файла конфигурации также можно указать вручную при запуске сервера с помощью параметра командной строки --config-file или -C.
Если ни один из этих параметров не указан, сервер ищет в текущем рабочем каталоге файлы config.xml, config.yaml и config.yml (именно в этом порядке) и использует первый найденный.
Если ни одного из них нет, сервер запускается с конфигурацией, встроенной в бинарный файл.
Файл, указанный с помощью --config-file, используется как есть: если его нет, сервер сообщает об ошибке, а не ищет файл с другим расширением.
clickhouse-keeper действует по тем же правилам, но с файлами keeper_config.xml, keeper_config.yaml и keeper_config.yml.
Дополнительные файлы конфигурации можно размещать в каталоге config.d/ относительно основного файла конфигурации, например в каталоге /etc/clickhouse-server/config.d/.
Файлы в этом каталоге и основная конфигурация сливаются на этапе предварительной обработки перед применением конфигурации в сервере ClickHouse.
Фрагменты конфигурации сливаются в лексикографическом порядке по полным путям. Для файлов в стандартном каталоге config.d/ это эквивалентно упорядочиванию по имени файла. Устаревший каталог conf.d/ также сливается; поскольку conf.d сортируется раньше config.d, при наличии обоих каталогов сначала обрабатываются все его фрагменты.
Чтобы упростить обновления и улучшить модульность, рекомендуется не изменять файл config.xml по умолчанию и размещать дополнительные пользовательские настройки в config.d/.
Конфигурация ClickHouse Keeper находится в /etc/clickhouse-keeper/keeper_config.xml.
Аналогично, дополнительные файлы конфигурации для Keeper нужно размещать в /etc/clickhouse-keeper/keeper_config.d/.
Можно комбинировать файлы конфигурации XML и YAML: например, у вас может быть основной файл конфигурации config.xml и дополнительные файлы конфигурации config.d/network.xml, config.d/timezone.yaml и config.d/keeper.yaml.
Смешивание XML и YAML в пределах одного файла конфигурации не поддерживается.
В файлах конфигурации XML в качестве тега верхнего уровня следует использовать <clickhouse>...</clickhouse>.
В файлах конфигурации YAML clickhouse: указывать необязательно; если он отсутствует, парсер добавляет его автоматически.
Слияние конфигурации
config.d/) объединяются следующим образом:
- Если узел (то есть путь, ведущий к элементу) присутствует в обоих файлах и не имеет атрибутов
replaceилиremove, он включается в итоговый файл конфигурации, а дочерние элементы из обоих узлов включаются и рекурсивно объединяются. - Если один из двух узлов содержит атрибут
replace, он включается в итоговый файл конфигурации, но включаются только дочерние элементы из узла с атрибутомreplace. - Если один из двух узлов содержит атрибут
remove, узел не включается в итоговый файл конфигурации (если он уже существует, он удаляется).
config.xml
config.d/other_config.xml
Подстановка с использованием переменных окружения и узлов ZooKeeper
from_env.
Например, при переменной окружения $MAX_QUERY_SIZE = 150000:
from_zk (узла ZooKeeper):
Как интерпретируются значения
from_env и from_zk по-разному интерпретируют подставляемое значение:
- Прямое значение, подставляемое через
from_env, воспринимается как буквальный текст. Специальные символы XML, такие как&,<и>, экранируются автоматически, поэтому переменная окружения может содержать любое значение, представимое в XML, напримерa&b<c>d, и это не нарушит конфигурацию (см. ниже примечание о недопустимых в XML управляющих символах). Прямое значение никогда не интерпретируется как XML, даже если оно выглядит как фрагмент XML:<a>1</a>подставляется как буквальный текст<a>1</a>. Это относится и к случаю, когда прямой атрибут указан на обычном элементе-контейнере, например<profiles from_env="…"/>: существующую подстановку поддерева XML необходимо перевести на форму<profiles><include from_env="…"/></profiles>. Исключение составляет<include from_env="…"/>, который ради обратной совместимости ведёт себя иначе: он разбирает переменную окружения как фрагмент XML и встраивает его дочерние элементы в родительский элемент. - Интерпретация значения, подставляемого через
from_zk, зависит от того, начинается ли оно с<. Значение, начинающееся с<, всегда разбирается как фрагмент XML: именно так поддерево встраивается в любой элемент — как в структурный<include from_zk="…"/>, так и в обычный контейнер, например<profiles from_zk="…"/>. Это поведение сохранено для обратной совместимости, поскольку в более ранних версиях значениеfrom_zkвсегда интерпретировалось как XML. Значение, не начинающееся с<, разбирается как поддерево YAML только при явной форме<include from_zk="…" yaml="true"/>; в этом случае некорректный YAML приводит к отклонению конфигурации. Атрибутyaml="true"включает разбор YAML везде, где используется общая форма<include>, в том числе внутри конечного элемента, поэтому не используйте его для буквальных настроек или секретов. Безyaml="true"значение, не начинающееся с<, считается буквальным текстом, в том числе при использовании общей формы замены конечного элемента<password><include from_zk="/secret"/></password>. Благодаря этому сохраняются значения, которые содержат синтаксис YAML или являются некорректным YAML, напримерabc # rotatedили[1. В этой форме байты сохраняются в точности, только если<include>указан встроенно, без окружающих текстовых узлов с пробельными символами; для секретов и конечных настроек, где важна точность до байта, лучше использовать прямую форму<password from_zk="…"/>. На любом другом элементе — будь то подстановка в конечный элемент, например<some_setting from_zk="…"/>или<password from_zk="…"/>, или обычный контейнер, например<profiles from_zk="…"/>, — значение, не начинающееся с<, также сохраняется как буквальный текст с точными исходными байтами (специальные символы XML экранируются автоматически, как и дляfrom_env), поэтому значение видаabc: defостаётся буквальным текстомabc: def, а не превращается во вложенный элемент<abc>def</abc>. Чтобы встроить поддерево в обычный элемент (а не в структурный<include>), передайте его как фрагмент XML (значение, начинающееся с<).
Буквальные значения должны быть допустимым текстом XML 1.0Буквальная подстановка (
from_env или значение from_zk для конечного элемента, не начинающееся с <) побайтово сохраняет значение для каждого символа, который XML 1.0 может представить как текст. Управляющие символы, недопустимые в XML 1.0, — 0x00–0x08, 0x0B, 0x0C и 0x0E–0x1F — вообще невозможно передать через XML-конфигурацию (спецификация XML запрещает их даже в виде числовых ссылок на символы, например ), поэтому значение, содержащее такой символ, отклоняется при обработке подстановки. Табуляция (\t), перевод строки (\n) и возврат каретки (\r) допустимы и при записи и обратном чтении сохраняются побайтово.Поведение после обновления для конечных значений, закодированных XML-сущностямиПредыдущие версии повторно разбирали каждое значение, заданное напрямую через
from_env, как XML, поэтому «сырые» символы &, < или > отклонялись как некорректно сформированный XML, и единственным способом встроить такой символ было закодировать его XML-сущностью: переменная окружения со значением a&b декодировалась в a&b, <a>1</a> — в <a>1</a>, а — в символ возврата каретки. Теперь значение, заданное напрямую через from_env, трактуется как буквальный текст, поэтому те же значения переменных окружения разрешаются в буквальные строки a&b, <a>1</a> и . Таким образом, прежний смысл сохраняют только значения в виде обычного текста: значение переменной окружения, закодированное сущностями для старого способа разбора XML, теперь нужно задавать в «сыром» виде (например, задайте a&b — прежде такое значение отклонялось, а теперь принимается как буквальный текст a&b).Предыдущие версии повторно разбирали каждое конечное значение from_zk как XML, поэтому «сырые» символы &, < или > отклонялись как некорректно сформированный XML, и единственным способом встроить такой символ было закодировать его XML-сущностью: значение, сохранённое как a&b, декодировалось в a&b, <a>1</a> — в <a>1</a>, а — в символ возврата каретки. Теперь конечное значение, не начинающееся с <, сохраняется байт в байт, поэтому те же узлы разрешаются в буквальные строки a&b, <a>1</a> и . Таким образом, прежний смысл сохраняют только скалярные значения в виде обычного текста: конечное значение, закодированное сущностями для старого способа разбора XML, теперь нужно хранить в «сыром» виде (например, сохраните a&b — прежде такое значение отклонялось, а теперь принимается как буквальный текст a&b).Это же изменение касается простого скалярного значения, подставляемого через встроенный <include from_zk="…"/> внутри конечной настройки или секрета, например <password><include from_zk="/secret"/></password>: здесь скалярное значение тоже сохраняется байт в байт, поэтому /secret = a&b (раньше декодировалось в a&b) теперь разрешается в буквальную строку a&b, и хранить значение нужно в «сыром» виде — a&b. Не добавляйте пробельные символы вокруг такой конструкции, поскольку они становятся частью итогового значения настройки; если важна точная последовательность байтов, используйте прямую форму <password from_zk="…"/>. (Значения from_zk, начинающиеся с <, а также поддеревья YAML, на которые ссылается <include from_zk="…" yaml="true"/>, это изменение не затрагивает — буквально сохраняются только немаркированные значения, не начинающиеся с <.)Значения по умолчанию
from_env или from_zk также может иметь атрибут replace="1" (последний должен располагаться перед from_env/from_zk).
В этом случае для элемента можно задать значение по умолчанию.
Элемент принимает значение переменной окружения или узла ZooKeeper, если оно задано; в противном случае используется значение по умолчанию.
Ниже повторяется предыдущий пример, но при условии, что MAX_QUERY_SIZE не задан:
Подстановка содержимого файла
- Подстановка значений: Если у элемента есть атрибут
incl, его значение будет заменено содержимым указанного файла. Путь к файлу с подстановками задаётся элементомinclude_fromв конфигурации сервера; пути по умолчанию нет, поэтому подстановки считываются только при его указании. Значения для подстановки задаются в элементах/clickhouse/substitution_nameв этом файле. Если подстановка, указанная вincl, не существует, об этом будет сделана запись в журнале. Чтобы ClickHouse не писал в журнал об отсутствующих подстановках, укажите атрибутoptional="true"(например, для настроек macros). - Подстановка элементов: Если вы хотите заменить подстановкой весь элемент целиком, используйте
includeв качестве имени элемента. Имя элементаincludeможно использовать вместе с атрибутомfrom_zk = "/path/to/node". В этом случае значение элемента заменяется содержимым узла ZooKeeper по пути/path/to/node. Это также работает, если вы храните в узле ZooKeeper всё XML-поддерево: оно будет полностью вставлено в исходный элемент.
Изменено в версии 26.8: до этой версии файл
/etc/metrika.xml неявно использовался всегда, когда он существовал, даже если include_from не был указан. Если вы используете этот файл, явно укажите его путь в include_from. Обратите внимание, что include_from считывается из каждого файла конфигурации отдельно: файлам, которые загружаются отдельно от основной конфигурации сервера — конфигурации пользователей (например, users.xml, если он не включён в основной файл) и XML-конфигурациям словарей — каждому требуется собственный элемент include_from; указание его только в основной конфигурации сервера к ним не применяется.merge="true". Например: <include from_zk="/some_path" merge="true">. В этом случае существующая конфигурация будет объединена с содержимым подстановки, а существующие параметры конфигурации будут заменены значениями из подстановки.
Шифрование и скрытие конфигурации
encrypted_by со значением — именем кодека шифрования.
В отличие от атрибутов from_zk, from_env и incl, а также элемента include, в предварительно обработанном файле подстановка (то есть расшифровка зашифрованного значения) не выполняется.
Расшифровка происходит только во время выполнения в процессе сервера.
Например:
from_env и from_zk также можно использовать для encryption_codecs:
config.xml приведён ниже:
users.xml:
encrypt_decrypt:
hide_in_preprocessed.
Например:
Пользовательские настройки
config.xml можно указать отдельную конфигурацию с пользовательскими настройками, профилями и квотами. Относительный путь к этой конфигурации задается в элементе users_config. По умолчанию используется users.xml. Если users_config не указан, пользовательские настройки, профили и квоты задаются прямо в config.xml.
Пользовательскую конфигурацию можно разделить на отдельные файлы, аналогично config.xml и config.d/.
Имя каталога определяется как значение параметра users_config без суффикса .xml с добавлением .d.
По умолчанию используется каталог users.d, так как значение users_config по умолчанию — users.xml.
Фрагменты пользовательской конфигурации сливаются в лексикографическом порядке по их полным путям. Для файлов в стандартном каталоге users.d/ это эквивалентно упорядочиванию по имени файла. Также сливается устаревший каталог conf.d/; поскольку conf.d сортируется раньше users.d, при наличии обоих каталогов сначала обрабатываются все его фрагменты.
Обратите внимание, что файлы конфигурации сначала сливаются с учетом настроек, и только после этого обрабатываются директивы include.
Пример XML
Примеры YAML
Здесь приведена конфигурация по умолчанию в формате YAML:config.yaml.example.
Форматы YAML и XML имеют некоторые различия в контексте конфигураций ClickHouse.
Ниже приведены рекомендации по написанию конфигурации в формате YAML.
XML-тег с текстовым значением в YAML представляется как пара ключ-значение
@. Обратите внимание: символ @ зарезервирован стандартом YAML, поэтому его нужно заключать в двойные кавычки:
#text:
Подробности реализации
file-preprocessed.xml. Эти файлы содержат все выполненные подстановки и переопределения и предназначены только для ознакомления. Если в конфигурационных файлах использовались подстановки из ZooKeeper, но при запуске сервера ZooKeeper недоступен, сервер загружает конфигурацию из предварительно обработанного файла.
Сервер отслеживает изменения в конфигурационных файлах, а также в файлах и узлах ZooKeeper, которые использовались при выполнении подстановок и переопределений, и на лету перезагружает настройки для пользователей и кластеров. Это означает, что вы можете изменять кластер, пользователей и их настройки без перезапуска сервера.