Доступен релиз-кандидат Picodata 26.2

Мы рады сообщить о выходе Picodata 26.2 RC — релиз-кандидата новой версии распределённой СУБД от команды разработчиков Picodata. Эта версия поставляется с крупным набором изменений, включающих расширение возможностей транзакционных блоков в SQL, поддержку типа данных ARRAY, переработанный EXPLAIN, поддержку синхронной репликации для шардированных таблиц, новые параметры в файле конфигурации и многое другое. Также, начиная с версии 26.2, мы переходим к практике публикации релиз-кандидатов для того, чтобы учесть обратную связь от пользователей и подготовить более стабильный итоговый релиз.

Новые возможности языка SQL

В SQL появились новые возможности, полезные как разработчикам приложений, так и администраторам, анализирующим распределенные запросы:

  • Picodata теперь поддерживает литералы ARRAY, массивы в PostgreSQL-интерфейсе, а также колонки массивов в CREATE TABLE и ALTER TABLE ADD COLUMN. Доступен синтаксис T[], T[N], T[N][M], T[][], T ARRAY и T ARRAY[N]. Изменения касаются только синтаксиса и не затрагивают внутреннюю реализацию. Пример создания таблицы с колонками-массивами:

    CREATE TABLE measurements (
        id INTEGER PRIMARY KEY,
        samples DOUBLE ARRAY,
        tags TEXT[]);
  • Добавлена поддержка выражений вида INSERT ... ON CONFLICT DO UPDATE внутри транзакционных блоков команд. Пример:

    DO $$
    BEGIN
      INSERT INTO account_balances VALUES (1, 25)
      ON CONFLICT (id) DO UPDATE
      SET amount = amount + 25;
    END $$;

    Помимо UPDATE поддерживаются также LET, IF, INSERT и DELETE. Это делает анонимные транзакционные процедуры более пригодными для прикладной логики, где нужно объединить чтение, ветвление и изменение данных в одной атомарной операции. Пример ссылки на ранее объявленную LET-переменную:

    DO $$
    BEGIN
      LET increment = (
        SELECT amount FROM account_balances WHERE id = 1
      );
      IF increment > 0 THEN
        INSERT INTO account_balances VALUES (1, 25)
          ON CONFLICT (id) DO UPDATE
          SET amount = amount + increment;
      END IF;
    END $$;
  • Команда EXPLAIN позволяет указывать определенные режимы вывода, также называемые фасетами. Поддерживаются фасеты RAW, LOGICAL, BUCKETS, FORWARD и CONTEXT в любом порядке. Каждый фасет отвечает за конкретную информацию о запросе. При указании нескольких фасетов одновременно также печатаются заголовки для каждого режима, позволяющие быстро ориентироваться в выводе. Например:

    EXPLAIN (LOGICAL, BUCKETS) SELECT name, id FROM _pico_table;
    ──────────────────────────────────────────────────────────────────────
    # Logical plan
    ──────────────────────────────────────────────────────────────────────
    
    projection (_pico_table.name::string -> name, _pico_table.id::int -> id)
      scan _pico_table
    
    ──────────────────────────────────────────────────────────────────────
    # Buckets
    ──────────────────────────────────────────────────────────────────────
    
    buckets = any
  • Добавлена опция forward, управляющая маршрутизацией распределённых DQL- и DML-запросов с учётом распределения данных по бакетам. Доступны следующие значения:

    • on: автоматическое перенаправление запроса на лидера репликасета
    • ro_to_rw: все бакеты, затрагиваемые запросом, должны находиться на одном узле, но запрос может быть переадресован узлу, доступному на запись
    • off: полностью локальный режим. Если целевой бакет находится на другом узле — возвращается ошибка. Пример вставки данных с явно заданным локальным режимом:
    INSERT INTO t (a) VALUES (1), (2), (3)
    OPTION (FORWARD = OFF);
  • Добавлена скалярная SQL-функция pico_instance_health_status, возвращающая статус текущего инстанса на основе /api/v1/health/status.

Синхронная репликация

В Picodata 26.2 RC добавлена поддержка синхронной репликации на уровне тира. Новый параметр cluster.tier.<name>.replication_mode принимает значения async и sync; по умолчанию используется прежний асинхронный режим.

В режиме sync запись в шардированную таблицу подтверждается только после того, как ее примет кворум репликасета: ReplicationFactor / 2 + 1. Это полностью устраняет риски потери пользовательских данных и конфликтов репликации при переключении мастера.

Благодаря привязке к тиру, администраторы могут строить более гибкие конфигурации с Picodata. Например, возможна топология кластера, в которую будут входить два тира: один для высококритичных данных с более высоким фактором репликации и синхронным режимом, и второй, с меньшим фактором репликации и асинхронным режимом.

У новой возможности есть важные ограничения. Синхронная репликация применяется только к пользовательским шардированным таблицам; глобальные и системные таблицы по-прежнему реплицируются через Raft. Режим задается при начальном развертывании кластера и не меняется для уже работающего кластера. При потере кворума репликасет переходит в режим только для чтения до ручного восстановления кворума, поэтому фактор репликации 2 для sync не рекомендуется.

Новые параметры файла конфигурации

В Picodata 26.2 станет проще управлять расположением данных на диске. В конфигурации (picodata.yaml) предложены новые параметры instance.memtx.dir и instance.vinyl.dir, которые задают директории для snapshot-файлов memtx и файлов vinyl. Для WAL добавлен отдельный параметр instance.wal_dir.

Также появился параметр cluster.tier.wal_mode, управляющий тем, как WAL-журнал сбрасывается на диск. Режим write используется по умолчанию: транзакция ждет завершения write(2), но не ждет fsync(2). В режиме fsync операция записи дожидается выполнения fsync для надежной фиксации данных.

При обновлении стоит учесть и изменения совместимости: устаревшие параметры plugin_dir и advertise_address удалены, вместо них нужно использовать share_dir и секцию iproto.

Новый способ настройки LDAP

Параметры LDAP-аутентификации теперь можно описывать прямо в picodata.yaml через секцию instance.ldap. Это удобнее старой схемы с переменными окружения и позволяет хранить настройки рядом с остальной конфигурацией инстанса.

В новой секции можно включить LDAP, указать адрес сервера, задать формат Distinguished Name через dn_format, настроить TLS и выбрать способ подключения: implicit для LDAPS или start_tls для StartTLS. Также поддерживается параметр ca_file: с его помощью можно использовать отдельный файл с доверенными корневыми сертификатами вместо системного хранилища.

Переменные окружения TT_LDAP_URL, TT_LDAP_DN_FMT и TT_LDAP_ENABLE_TLS пока продолжают работать, но считаются устаревшими. При их использовании Picodata выведет соответствующее предупреждение при запуске.

Обновление веб-интерфейса

В веб-интерфейсе доработано отображение кластера и инстансов. Запросы /api/v1/tiers и /api/v1/cluster оптимизированы: HTTP-адреса теперь читаются из _pico_peer_address, а информация об использовании памяти запрашивается только у лидеров репликасетов. Это снижает число RPC-вызовов с O(N × RF) до O(N), где N — число репликасетов. Для недоступных инстансов теперь также отображается HTTP-адрес из хранилища.

В список инстансов добавлены фильтры isVoter и isRaftLeader, а карточки тиров и репликасетов показывают признаки наличия Raft-лидера и voter-инстансов. Карточки репликасетов теперь отображают строки для ожидаемых, но временно отсутствующих инстансов, а также индикаторы состояния not ready.

Еще одно заметное улучшение — модальное окно с деталями инстанса. Оно открывается из списка инстансов и содержит вкладки Overview (Общее), Storage (Хранилище) и Replication (Репликация): общую информацию, настройки Vinyl и Memtx, а также сведения о репликации, включая upstream- и downstream-связи с удаленными узлами:

Прочие новые функции и изменения

  • В API плагинов добавлен callback on_cluster_leader_change, который вызывается при смене лидера кластера на старом и новом Raft-лидере. Callback on_leader_change переименован в on_replicaset_leader_change; оба варианта будут вызываться до следующего мажорного релиза.

  • При присоединении инстанса к кластеру Picodata теперь приоритезирует стандартную схему именования <replicaset_name>_<n>. Если replicaset_name явно не указан, инстанс с именем вроде default_6_2 предпочтет присоединиться к репликасету default_6, что упрощает восстановление кластера из резервной копии мастер-инстансов.

  • Улучшена точность space:len() для таблиц Vinyl, исправлены панели cache hitrate во встроенном дашборде Grafana, а операция резервного копирования теперь автоматически прерывается при наличии недоступных инстансов, чтобы кластер не оставался заблокированным в режиме только для чтения.

Picodata 26.2 RC стоит протестировать тем, кто планирует использовать синхронную репликацию, переносить LDAP-настройки в конфигурационный файл и использовать новые возможности транзакционных SQL-блоков.

В Picodata 26.2 RC было исправлено множество найденных ошибок. Подробная информация приведена в файле RELEASE NOTES данного релиза. Если вы заметили ошибку или у вас появились вопросы о Picodata, пишите в наш Telegram-чат @picodataru.

Попробуйте Picodata в деле!

Для установки релиз-кандидата Picodata 26.2 в Linux подключите репозиторий с ночными сборками Picodata (доступны пакеты DEB и RPM). Инструкции приведены на странице загрузки в разделе “Получение ночных сборок”. В Ubuntu и Debian установите пакет picodata=26.2.1~rc1.0-{os_name}, подставив нужное значение os_name (focal, jammy, noble, resolute, bullseye, bookworm или trixie), в RHEL/Fedora — picodata-26.2.1~rc1.0.

Инструкции и руководства по установке, использованию и администрированию Picodata размещены на портале документации Picodata.

Вопросы и пожелания направляйте в наш Telegram-чат @picodataru.