Установка и настройка Tengri

Операционные системы

Установка из deb-пакетов поддерживается для операционных систем:

  • Debian 13 (Trixie)

  • Ubuntu 22.04 LTS (Jammy Jellyfish)

Открытые порты

Для установки должны быть открыты порты:

  • 5433 — клиентские подключения (ODBC/JDBC, PostgreSQL)

  • 3000 — веб-интерфейс

  • 3001-3004 — WebSocket-подключения

  • 3005 — Iceberg REST API

  • 9002 — S3 API

  • 9591 — метрики OpenTelemetry

Дополнительно только для кластерной конфигурации:

  • 2379 — координация кластера

  • 57776 — RPC (межузловое взаимодействие)

Установка Tengri

Для установки одномашинной конфигурации:

  1. Получаем архив с необходимыми файлами и распаковываем:

    tar xf example_client.tar.gz
    cd example_client
    example_client
    ├── client.crt
    ├── client.key
    ├── install.sh
    └── license.txt
  2. Запускаем скрипт для установки сертификата, файла конфигурации и репозитория APT:

    sudo ./install.sh
  3. Устанавливаем пакеты:

    1. Только Tengri

      sudo apt install tengri
    2. Tengri с локальным S3 (MinIO)

      sudo apt install tengri tengri-minio
  • После установки Tengri будет готов к работе на порту 3000.
    Логин и пароль по умолчанию: admin / admin.

  • Пакет tengri-minio установит локальный MinIO с дефолтными настройками. Подробности о дальнейшей настройке можно узнать в документации MinIO.

Установка кластерной конфигурации Tengri

Tengri использует распределённую архитектуру с двумя основными компонентами:

  • Endpoints (Точки входа) — экземпляры SQL-сервера, к которым подключаются клиенты

  • Agents (Агенты) — вычислительные воркеры, выполняющие запросы

Все узлы автоматически обнаруживают друг друга через etcd — сервис распределённой координации.

Предварительные требования

  • Минимум 3 сервера (на Debian 13 Trixie или Ubuntu 22.04 LTS Jammy Jellyfish)

  • Сетевая связность между всеми серверами

  • Открытые порты

Шаг 1: Установка Tengri на каждом сервере

На каждом сервере в вашем кластере выполните:

apt install tengri

Эта команда установит все необходимые компоненты.

Шаг 2: Настройка каждого узла

Отредактируйте /etc/tengri/config.env:

export TNGRI_ADVERTISE_RPC_HOST="<IP_ЭТОГО_СЕРВЕРА>"
export TNGRI_REMOTE_SESSIONS=true

Шаг 3: Запуск сервисов Tengri

На каждом сервере запустите оба сервиса:

systemctl enable tengri-endpoint
systemctl enable tengri-agent
systemctl start tengri-endpoint
systemctl start tengri-agent

После запуска узлы автоматически:

  1. Регистрируются в etcd

  2. Обнаруживают другие Endpoints и агентов

  3. Устанавливают RPC-соединения для распределённого выполнения запросов

Шаг 4: Доступ к панели администратора

Откройте браузер и перейдите к интерфейсу администратора любого Endpoint:

http://<IP_ЛЮБОГО_ENDPOINT>:3000/admin

Вкладка "Кластер"

Для каждого сервера создайте его описание в кластере:

  • Нажмите "Новый Endpoint"

  • Введите параметры: адрес и порт RPC, если он отличается

  • Нажмите "Готово"

После этого индикаторы всех серверов должны стать зелеными, что означает что кластер работоспособен.

Во вкладке Кластер вы можете просмотреть:

  • Все зарегистрированные Endpoints с их RPC-адресами

  • Всех зарегистрированных агентов с их выделением RAM

  • Статус соединений между узлами

Шаг 5: Проверка кластера

С любого Endpoint выполните:

SHOW ENDPOINTS;
SHOW AGENTS;
SHOW WORKER POOLS;

Вы увидите все ваши серверы в списке. Клиенты могут подключаться к любому Endpoint — запросы автоматически распределяются по всем агентам в кластере.


Готово! Ваш кластер Tengri теперь работает на нескольких серверах с автоматическим распределением нагрузки.

Устранение неполадок

Узлы не обнаруживают друг друга:

  • Проверьте, что etcd запущен: etcdctl endpoint health

  • Проверьте правила файрвола для портов 2379 и 57776

  • Убедитесь, что advertise_rpc_host указывает на доступный IP (не localhost)

Просмотр состояния кластера напрямую:

etcdctl get --prefix /tengri/

Настройка конфигурации

  • Дополнительные настройки конфигурации Tengri можно задать в файле /etc/tengri/tengri.conf (по умолчанию файл отсутствует).

    Полный список возможных настроек в файле tengri.conf
    # TNGRi configuration parameters
    
    # =========
    # Licencing
    # =========
    #
    TNGRI_LICENSE_FILE=/opt/tengri/license.txt
    
    # ===========================
    # S3 configuration parameters
    # ===========================
    #
    #
    # Access key id and secret key of user that will connect to S3
    # rename SECRET_ACCESS_KEY to SECRET_KEY
    TNGRI_S3_ACCESS_KEY_ID=minioadmin
    TNGRI_S3_SECRET_ACCESS_KEY=minioadmin
    #
    # Region to send to S3 server. Generally you don't need to change that, just make
    # sure that target S3 has this same region
    TNGRI_S3_REGION=eu-central-1
    TNGRI_S3_DEFAULT_REGION=eu-central-1
    #
    # API endpoint URL for target S3. Must be in FQDN form
    #     TNGRI_S3_ENDPOINT_URL=http://example.com
    TNGRI_S3_ENDPOINT_URL=http://127.0.0.1:9002
    #
    # Bucket name to use. Must exist before start, so make sure that it exists and
    # has full access rights for this bucket. Must be in full form, i.e.
    #     TNGRI_S3_BUCKET_NAME=s3://example:9000
    TNGRI_S3_BUCKET_NAME=prostore
    
    # =======================
    # TNGRi server parameters
    # =======================
    #
    #
    # Iceberg catlog path in S3 bucket
    TNGRI_WAREHOUSE_PATH=s3://prostore/iceberg/
    #
    # Name for the default schema in TNGRi.
    TNGRI_DEFAULT_SCHEMA=public
    #
    # URI for catalog endpoint. Must be either PostgreSQL or SQLite connection string, i.e.
    #     TNGRI_CATALOG_URI=postgresql://user:password@example.com/database
    TNGRI_CATALOG_URI=postgresql://prostore:prostore@127.0.0.1:5432/prostore
    #
    # Path to writable directory where cached files will be placed.
    #
    # WARNING: Should be placed on SSD storage. Tngri uses aggressive caching strategies
    # to reduce S3 load
    #
    TNGRI_CACHE_DIR=/var/lib/tengri/cache
    #
    # Path to writable directory where python kernels will be stored.
    TNGRI_KERNEL_DIR=/var/lib/tengri/kernels
    #
    # If set to false then no agent is required to process queries.
    # Must be true for production environments
    TNGRI_REMOTE_SESSIONS=true
    #
    # Set to true for more log output
    TNGRI_DEBUG=false
    #
    # Host to bind main server to
    TNGRI_HOST=0.0.0.0
    #
    # Port to bind PostgreSQL protocol implementation to
    TNGRI_PORT=5433
    #
    # Host to bind RPC server for communication between agent and server
    TNGRI_RPC_HOST=0.0.0.0
    #
    # Port to bind RPC server for communication between agent and server
    TNGRI_RPC_PORT=57776
    
    # =============================
    # Web application configuration
    # =============================
    #
    #
    # SSL configuration. If set then Web communication will be done over SSL, otherwise
    # it will be plaintext.
    #
    # Path to SSL key.
    # TNGRI_SSL_KEY=
    #
    # Path to SSL certificate file.
    # TNGRI_SSL_CERT=
    #
    # Enables TNGRi web app.
    TNGRI_ENABLE_WEBSOCKET=true
    #
    # Path to static files for web app.
    TNGRI_WEBAPP_DIR=/usr/share/tengri-web
    #
    # Host to bind HTTP server to
    TNGRI_WEBAPP_HOST=0.0.0.0
    #
    # Port to bind HTTP server to
    TNGRI_WEBAPP_PORT=3000
    #
    # Host to bind Websocket server to. It is used extensively by webapp and python clients
    TNGRI_WEBSOCKET_HOST=0.0.0.0
    #
    # Port to bind Websocket server to
    TNGRI_WEBSOCKET_PORT=3001
    #
    # Host to bind PyLSP server to. It is used by webapp to provide code completion
    TNGRI_PYLSP_HOST=0.0.0.0
    #
    # Port to bind PyLSP server to
    TNGRI_PYLSP_PORT=3003
    #
    # Host to bind CRUD. Used by webapp to send messages in chats, manage scheduled
    # notebooks and manage external catalogs
    TNGRI_CRUD_HOST=0.0.0.0
    #
    # Port to bind CRUD to
    TNGRI_CRUD_PORT=3004
    
    # ============================
    # TNGRi services configuration
    # ============================
    #
    # Enable TNGRi's Iceberg REST catalog API provider
    TNGRI_ENABLE_REST_CATALOG=true
    
    # Host to bind REST catalog server to
    TNGRI_REST_CATALOG_HOST=0.0.0.0
    
    # Port to bind REST catalog to
    TNGRI_REST_CATALOG_PORT=3005
    
    # Enable compaction daemon
    TNGRI_ENABLE_COMPACTION=true
    
    # Enable notebook CRON daemon
    TNGRI_ENABLE_CRON=true
    
    # ============================
    # TNGRi deployment information
    # ============================
    #
    # Needed for external clients to connect to TNGRi services. For example, python clients
    # connecting from user's local machines. Set these to the values that point to this
    # installation, for example, if using reverse proxy for HTTP or Postgres protocol.
    #
    # Change the name of site deployment
    # TNGRI_SITE_NAME=tngri
    #
    # Websocket address to connect to. Must be in FQDN form, i.e.
    #     TNGRI_SITE_WS_ADDR=ws://example.com:3001
    TNGRI_SITE_WS_ADDR=ws://0.0.0.0:3001
    #
    # Postgres protocol address to connect to, i.e.
    #     TNGRI_SITE_PSQL_ADDR=example.com:5433
    # TNGRI_SITE_PSQL_ADDR=
    #
    # S3 address to connect to. Must be in FQDN form, i.e.
    #     TNGRI_SITE_S3_ADDR=http://example.com:9000
    # TNGRI_SITE_S3_ADDR=
    #
    # S3 access key for public usage (Stage only)
    # TNGRI_SITE_PUBLIC_LOADER_ACCESS_KEY=public_loader
    #
    # S3 secret key for public usage (Stage only)
    # TNGRI_SITE_PUBLIC_LOADER_SECRET_KEY=public_loader
    #
  • Дополнительные настройки конфигурации MinIO можно задать в файле /etc/default/tengri-minio в соответствии с документацией MinIO.

    После обновления файла конфигурации MinIO необходимо выполнить:

    sudo systemctl daemon-reload
    sudo systemctl restart minio

Сброс пароля администратора

В случае если утрачен доступ к паролю администратора, его можно сбросить.

Для этого на сервере, где был установлен пакет, нужно выполнить:

sudo -u tengri bash -c 'export $(egrep -v "^#|^$|.*#" /var/lib/tengri/tengri.defaults | xargs); prostore reset-admin-password'

После этого текущий пароль администратора сбросится, и новый автоматически сгенерированный пароль будет показан в логе вывода.