Мы рады сообщить о выходе 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-лидере. Callbackon_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.
