Learning Platform
Глоссарий Troubleshooting
Урок 15.01 · 21 мин
Средний
deploymentconfigurationoperations

Конфигурационные файлы: config, node, jvm, log.properties

Trino-нода — это JVM-процесс, поведение которого целиком задаётся набором файлов в каталоге etc. Никакой «панели управления» нет: разворачивание Trino — это написать правильные файлы в etc и запустить процесс. Поэтому, прежде чем говорить о тюнинге, безопасности и Kubernetes, надо разобрать сам фундамент — какие файлы есть и за что каждый отвечает.

Базовых файлов четыре: config.properties, node.properties, jvm.config, log.properties. Плюс отдельные файлы каталогов в etc/catalog/. Этот урок разбирает каждый из четырёх: что в нём, какие свойства критичны и чем настройки координатора отличаются от настроек воркера.


Каталог etc: карта конфигурации

Вся конфигурация ноды Trino живёт в одном каталоге, обычно etc. Структура:

Каталог etc: файлы конфигурации ноды Trino
etc/config.propertiesКонфигурация сервера: роль ноды (координатор/воркер), порт HTTP, URI discovery, лимиты памяти, retry-policy
etc/node.propertiesИдентичность ноды в окружении: имя окружения, уникальный node.id, каталог данных
etc/jvm.configОпции запуска JVM по одной на строку: -Xmx, настройки GC, флаги -XX
etc/log.propertiesУровни логирования по пакетам: DEBUG, INFO, WARN, ERROR
etc/catalog/*.propertiesПо файлу на каталог: connector.name и параметры подключения к источнику данных

Каждая нода — координатор и каждый воркер — имеет свой набор этих файлов. Часть свойств на всех нодах одинакова, часть отличается. Разберём файлы по одному.


config.properties: конфигурация сервера

etc/config.properties — главный файл. Он определяет, что нода делает в кластере.

Минимальный config.properties для координатора:

# etc/config.properties — КООРДИНАТОР
coordinator=true
node-scheduler.include-coordinator=false
http-server.http.port=8080
discovery.uri=http://trino-coordinator:8080
query.max-memory=20GB
query.max-memory-per-node=30%

Минимальный config.properties для воркера:

# etc/config.properties — ВОРКЕР
coordinator=false
http-server.http.port=8080
discovery.uri=http://trino-coordinator:8080
query.max-memory=20GB
query.max-memory-per-node=30%

Ключевые свойства:

  • coordinatortrue или false. Главное различие между ролями: одна нода в кластере имеет coordinator=true, все остальные — coordinator=false. Координатор парсит запросы, планирует и управляет воркерами; воркеры исполняют задачи и обрабатывают данные.
  • node-scheduler.include-coordinator — разрешить ли планировщику давать координатору обрабатывать данные как воркеру. Обычно false: на продакшен-кластере координатор занят координацией и не должен конкурировать за ресурсы с обработкой данных. true ставят на крошечных установках (один-два узла) или в учебных целях.
  • http-server.http.port — порт HTTP-сервера, обычно 8080. Клиенты, Web UI и межнодовая коммуникация идут через него.
  • discovery.uri — URI discovery service. Discovery встроен в координатор, поэтому это всегда адрес координатора. Воркеры по этому URI регистрируются в кластере; на самом координаторе это указатель на себя.
WARNING

discovery.uri должен указывать на координатор и быть одинаковым на всех нодах кластера. Это самая частая ошибка при ручном развёртывании: воркер с неверным discovery.uri просто не появится в кластере — координатор о нём не узнает, и его мощность не будет использоваться. Если воркер «не виден», первым делом проверяют именно discovery.uri.


node.properties: идентичность ноды

etc/node.properties описывает, кто эта нода в своём окружении.

# etc/node.properties
node.environment=production
node.id=trino-worker-a3f9c1e8
node.data-dir=/var/trino/data

Три свойства, и у каждого своё правило:

  • node.environment — имя окружения. Должно быть одинаковым на всех нодах одного кластера: координатор и воркеры с разным node.environment не образуют единый кластер. Это механизм, не дающий случайно смешать ноды разных кластеров — например, production и staging.
  • node.id — уникальный идентификатор ноды. Должен быть уникальным для каждой ноды и, что важно, стабильным между перезапусками одной и той же ноды. По node.id Trino опознаёт ноду; если он скачет, кластер видит «новую» ноду на каждый рестарт.
  • node.data-dir — каталог для данных ноды: логи, локальное состояние.
СвойствоПравилоЗачем
node.environmentодинаков на всех нодах кластеране дать смешать разные кластеры
node.idуникален для ноды, стабилен между рестартамиопознавать ноду между перезапусками
node.data-dirпуть к данным нодыгде нода хранит логи и состояние
NOTE

Правила node.id и node.environment особенно важны на Kubernetes, где поды эфемерны. Helm chart Trino решает это так: одинаковый node.environment для всего деплоймента, а уникальность node.id обеспечивается на уровне пода — иначе при пересоздании пода кластер видел бы каждый раз новый узел. Подробнее об этом — в уроке про Kubernetes.


jvm.config: опции виртуальной машины

etc/jvm.config — список опций командной строки JVM, по одной на строку. Это не properties-формат ключ=значение, а именно набор флагов, как если бы их передали java напрямую.

Пример jvm.config:

-Xmx64G
-XX:InitialRAMPercentage=80
-XX:MaxRAMPercentage=80
-XX:+ExitOnOutOfMemoryError
-XX:+HeapDumpOnOutOfMemoryError
-XX:-OmitStackTraceInFastThrow
-Djdk.attach.allowAttachSelf=true

Что задаётся здесь:

  • -Xmx — максимальный размер JVM heap. Главная цифра тюнинга: от неё, как мы видели в модуле про память, считаются дефолты query.max-memory-per-node и memory.heap-headroom-per-node.
  • Настройки garbage collector — GC и его параметры.
  • Флаги -XX — поведение JVM: дамп heap при OOM, выход процесса при OOM и прочее.

Глубоко тюнинг JVM — heap, GC, headroom для координатора и воркера — разбирается в следующем уроке; здесь важно запомнить лишь формат: jvm.config — это флаги по строке, не пары ключ=значение.

WARNING

Каталог временных файлов, который использует JVM, не должен быть смонтирован с флагом noexec. Trino и его зависимости могут распаковывать в temp-каталог нативный код и исполнять его; при noexec запуск завершится непонятной ошибкой. Это типичная засада в зарегулированных окружениях, где /tmp намеренно монтируют с noexec.


log.properties: уровни логирования

etc/log.properties задаёт уровни логирования — насколько подробно Trino пишет в лог, по пакетам Java.

# etc/log.properties
# Общий уровень
io.trino=INFO
# Подробнее для конкретного пакета — например, при отладке коннектора
io.trino.plugin.iceberg=DEBUG

Формат — пакет=уровень. Уровни: DEBUG, INFO, WARN, ERROR. Указанный уровень и всё, что серьёзнее него, попадает в лог; всё, что менее серьёзно, отбрасывается. INFO — разумный дефолт. DEBUG включают точечно, на конкретный пакет, при отладке проблемы — глобальный DEBUG зальёт лог и сам станет источником нагрузки.

log.properties: уровни логирования по серьёзности
DEBUGСамый подробный уровень. Включать точечно на конкретный пакет при отладке — глобально зальёт лог
INFOРазумный дефолт для продакшена: ход работы без избыточных деталей
WARNТолько предупреждения и серьёзнее — потенциальные проблемы
ERRORТолько ошибки — самый скупой уровень

Что одинаково на всех нодах, а что отличается

Соберём картину. Разворачивая кластер, держи в голове, какие свойства разные на координаторе и воркере, а какие должны совпадать:

Файл / свойствоКоординаторВоркерПравило
config.properties coordinatortruefalseразличается — определяет роль
config.properties discovery.uriадрес координатораадрес координатораодинаков на всех нодах
node.properties node.environmentодно значението же значениеодинаков на всех нодах
node.properties node.idуникаленуникаленразличается — уникален у каждой ноды
jvm.config -Xmxпо ролипо ролиможет различаться координатор/воркер
etc/catalog/*.propertiesте же каталогите же каталогиодинаковы на всех нодах

Главное: coordinator и node.id различаются; discovery.uri, node.environment и набор каталогов — одинаковы. Перепутать здесь — типичная причина «кластер не собрался»: воркеры не видны или не образуют единый кластер.


Попробуй сам

Разверни Trino-кластер вручную из конфигурационных файлов — без готового образа «всё включено».

  1. Подготовь два набора каталога etc — для координатора и для воркера. Для координатора: config.properties с coordinator=true, node-scheduler.include-coordinator=false; для воркера — coordinator=false. На обоих — одинаковый discovery.uri (адрес координатора) и одинаковый node.environment, но разные node.id.
  2. Запусти координатор и воркер (двумя контейнерами или процессами). Открой Web UI координатора и проверь во вкладке кластера: воркер появился, число активных воркеров — 1.
  3. Намеренно сломай конфигурацию воркера: поставь неверный discovery.uri или другой node.environment, перезапусти воркер. Убедись, что он пропал из кластера, и посмотри, что говорит лог.
  4. В log.properties воркера включи DEBUG для одного пакета (например, io.trino.plugin.tpch) и понаблюдай, как изменилась подробность лога.

Цель — прочувствовать, что кластер Trino собирается именно из правильных файлов etc, и научиться отлаживать «невидимый воркер».


Проверка знанийKnowledge check
Почему свойство node.environment должно быть одинаковым на всех нодах кластера, а node.id — уникальным и стабильным между перезапусками? Что произойдёт при нарушении каждого из правил?
ОтветAnswer
node.environment — это имя окружения, и оно служит механизмом, не дающим случайно смешать ноды разных кластеров. Координатор и воркеры объединяются в единый кластер только при совпадающем node.environment: если у воркера значение отличается от координаторского, он не войдёт в кластер — это защита, например, от того, чтобы staging-воркер случайно подключился к production-координатору. Поэтому node.environment обязан быть одинаковым на всех нодах одного кластера. node.id — уникальный идентификатор ноды, по которому Trino её опознаёт. Он должен быть уникальным для каждой ноды, иначе две ноды с одинаковым id будут конфликтовать как одна сущность. И он должен быть стабильным между перезапусками одной и той же ноды: если node.id меняется при каждом рестарте, кластер на каждый перезапуск видит якобы новую ноду, а старую считает потерянной — учёт узлов становится некорректным. Особенно это важно на Kubernetes, где поды эфемерны и пересоздаются: Helm chart Trino поэтому держит node.environment одинаковым для всего деплоймента, а уникальность node.id обеспечивает на уровне пода, не давая каждому пересозданию выглядеть новым узлом.

Проверьте понимание

Результат: 0 из 0
Концептуальный
Вопрос 1 из 4. За что отвечает свойство discovery.uri в config.properties и каким оно должно быть?

Закончили урок?

Отметьте его как пройденный, чтобы отслеживать свой прогресс

Войдите чтобы оценить урок

Прогресс модуля
0 из 7