citus

citus — функциональность распределённой базы данных и столбцовое хранение

Описание

citus — это расширение, совместимое с Postgres Pro и предоставляющее такие основные функциональные возможности, как столбцовое хранение и распределённая база данных OLAP, которые можно использовать вместе или раздельно.

citus обладает следующими преимуществами:

  • Столбцовое хранение с возможностью сжатия данных.

  • Возможность масштабировать инсталляцию Postgres Pro до кластера распределённых баз данных.

  • Сегментирование на основе строк или схем.

  • Параллельное выполнение DML-операций на узлах кластера.

  • Таблицы-справочники, к которым можно обращаться локально на каждом узле.

  • Возможность выполнять DML-запросы на любом узле, что позволяет максимально эффективно использовать кластер для распределённых запросов.

Основные понятия

Ниже приведены основные понятия citus:

  • Кластер — это группа серверов баз данных, также именуемых узлами кластера, под управлением Postgres Pro обычно на разных компьютерах. Кластер состоит из узла-координатора и нескольких рабочих узлов. В рамках стандартного сценария запросы отправляются на узел-координатор, который обеспечивает их параллельное выполнение, перенаправляя каждый запрос на один или более рабочих узлов.

  • Столбцовое хранение — это тип хранения, который позволяет хранить данные в виде массивов, каждый из которых содержит данные столбца для нескольких строк одновременно, а не в виде последовательности строк, каждая из которых содержит значения всех её столбцов. Такой тип хранения в citus поддерживает только добавление данных и не поддерживает команды UPDATE/DELETE.

  • Таблица-справочник — это таблица, содержимое которой реплицируется на все узлы.

  • Сегментирование на основе строк — это вид сегментирования таблиц, при котором разные строки одной таблицы могут храниться на разных узлах. Строки назначаются узлам в зависимости от значения, которое указано в дополнительном столбце, именуемом столбцом распределения или ключом сегментирования. В качестве такого ключа обычно используется столбец Tenant ID.

  • Сегментирование на основе схем — это вид сегментирования, при котором для каждого арендатора создаётся отдельная схема. Таблицы схемы хранятся на одном узле, при этом на разных узлах могут находиться разные схемы.

  • Сегментирование — это разделение таблицы на сегменты и хранение таких сегментов на разных узлах.

  • Арендатор — это конечный пользователь базы данных. Арендаторы не могут увидеть данные друг друга, при этом сами данные могут физически храниться в одной базе данных или даже таблице.

За подробностями о понятиях citus обратитесь к официальной документации расширения.

Ниже представлены наиболее полезные материалы для начала работы с расширением:

Ограничения

citus несовместим с некоторыми функциональными возможностями Postgres Pro Enterprise, обратите внимание на эти ограничения при планировании работы с расширением:

  • citus не может использоваться совместно с автономными транзакциями.

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

  • Если для параметра enable_self_join_removal задано значение on, запросы к распределённым таблицам citus могут возвращать некорректные результаты, поэтому рекомендуется поменять значение параметра на off.

  • citus не следует использовать совместно с перепланированием запросов в реальном времени, так как команда EXPLAIN ANALYZE может работать некорректно.

Установка

Установка citus на одном узле

Чтобы задействовать citus на одном узле, выполните следующие действия:

  1. Добавьте citus в переменную shared_preload_libraries в файле postgresql.conf:

    shared_preload_libraries = 'citus'
  2. Перезагрузите сервер баз данных для применения изменений. Чтобы убедиться, что библиотека citus установлена правильно, выполните следующую команду:

    SHOW shared_preload_libraries;
  3. Создайте расширение citus, выполнив следующий запрос:

    CREATE EXTENSION citus;

При выполнении команды CREATE EXTENSION в рамках вышеуказанной процедуры также устанавливается расширение citus_columnar. При необходимости задействовать только citus_columnar выполните те же действия, но вместо citus укажите citus_columnar.

Установка citus на нескольких узлах

Чтобы задействовать citus на нескольких узлах, выполните следующие действия на каждом из них:

  1. Добавьте citus в переменную shared_preload_libraries в файле postgresql.conf:

    shared_preload_libraries = 'citus'
  2. Настройте права доступа к серверу баз данных. По умолчанию сервер баз данных принимает подключения от клиентов только через localhost. Установите значение * для параметра listen_addresses, чтобы указать все имеющиеся IP-интерфейсы.

  3. Настройте аутентификацию клиентов, отредактировав файл pg_hba.conf.

  4. Перезагрузите сервер баз данных для применения изменений. Чтобы убедиться, что библиотека citus установлена правильно, выполните следующую команду:

    SHOW shared_preload_libraries;
  5. Создайте расширение citus, выполнив следующий запрос:

    CREATE EXTENSION citus;

Когда все описанные выше шаги будут выполнены на всех узлах, совершите следующие действия на узле-координаторе, чтобы рабочие узлы могли к нему подключиться:

  1. Зарегистрируйте адрес узла, который будет использоваться рабочими узлами для подключения к узлу-координатору:

    SELECT citus_set_coordinator_host('имя_координатора', порт_координатора);
  2. Добавьте каждый рабочий узел:

    SELECT * from citus_add_node('имя_рабочего_узла', порт_рабочего_узла);
  3. Убедитесь, что все рабочие узлы успешно заданы:

    SELECT * FROM citus_get_active_worker_nodes();

Когда использовать citus

Многоарендная база данных SaaS

Модели данных большинства B2B-приложений уже содержат такие понятия, как арендатор, клиент или учётная запись. В рамках этой модели база данных используется несколькими арендаторами, данные которых обрабатываются отдельно друг от друга.

citus поддерживает все возможности SQL для выполнения этих задач и позволяет масштабировать реляционные базы данных. Кроме того, расширение содержит новую функциональность для поддержки многоарендности. Например, поддерживаются таблицы-справочники, позволяющие сократить дублирование данных у разных арендаторов, а также изоляция арендаторов, которая гарантирует высокую производительность системы для крупных арендаторов.

Эти возможности позволяют использовать несколько компьютеров для масштабирования данных арендаторов, предоставляя дополнительные вычислительные мощности, память и место на диске. Кроме того, использование одной схемы базы данных разными арендаторами позволяет эффективно распоряжаться аппаратными ресурсами и упрощает управление базами данных.

citus предоставляет следующие преимущества для многоарендных приложений:

  • Быстрое выполнение запросов всех арендаторов.

  • Логика сегментирования в рамках базы данных, а не приложения.

  • Хранение большого объёма данных на одном узле Postgres Pro.

  • Масштабирование с сохранением возможностей SQL.

  • Сохранение производительности при высококонкурентном доступе.

  • Быстрый анализ показателей по клиентской базе.

  • Масштабирование при увеличении числа клиентов.

  • Изолированное использование ресурсов крупных и небольших арендаторов.

Анализ данных в реальном времени

citus поддерживает запросы к большим наборам данных в реальном времени. Обычно такие запросы выполняют в быстро развивающихся системах событий или системах с данными временных рядов. Ниже приведены сценарии использования:

  • Аналитические панели с высокой скоростью отклика.

  • Исследовательские запросы по событиям, происходящим в реальном времени.

  • Архивирование и подготовка отчётов по большим наборам данных.

  • Анализ сеансов с запросами воронкообразного, сегментного или когортного анализа.

citus распараллеливает выполнение запросов и обеспечивает линейное масштабирование с учётом числа рабочих баз данных кластера. Ниже представлены некоторые преимущества citus для приложений, работающих в реальном времени:

  • Сохранение скорости отклика при увеличении объёма данных.

  • Анализ новых событий и данных в реальном времени.

  • Распараллеливание SQL-запросов.

  • Масштабирование с сохранением возможностей SQL.

  • Сохранение производительности при высококонкурентном доступе.

  • Быстрые ответы на запросы с панели управления.

  • Использование единой базы данных вместо нескольких на разных узлах.

  • Большое число различных типов данных и расширений Postgres Pro.

Микрослужбы

citus поддерживает сегментирование на основе схем, которое позволяет распределять обычные схемы баз данных по разным компьютерам. Такой метод сегментирования отлично согласуется с типовой архитектурой на основе микрослужб, в рамках которой служба полностью владеет хранилищем и у разных арендаторов не может быть одного и того же определения схемы.

Модель сегментирования на основе схем проще в настройке и позволяет несложно создавать новую схему и задавать search_path в службе.

Преимущества использования citus для микрослужб:

  • Возможность горизонтального масштабирования служб.

  • Перенос стратегически важных корпоративных данных из микрослужб в обычные распределённые таблицы для анализа.

  • Эффективное использование аппаратных ресурсов за счёт балансировки служб на разных компьютерах.

  • Изолирование шумных служб на отдельных узлах.

  • Понятная модель сегментирования.

  • Быстрое внедрение.

Замечания об использовании

citus расширяет функциональность Postgres Pro за счёт возможности создания распредёленных баз данных, но не является решением, которое масштабирует любые рабочие нагрузки. Для эффективного использования citus следует продумывать используемые модели данных, инструменты и возможности SQL.

Разумно подойти к вопросу используемых инструментов и возможностей SQL следующим образом: если ваши задачи сопоставимы с описанными здесь сценариями использования, но какой-то инструмент или запрос не поддерживается, — попробуйте воспользоваться обходным решением, обычно оно есть.

Когда нельзя использовать citus

Для одних задач не нужны производительные распределённые СУБД, в то время как в рамках других требуется большой поток данных между рабочими узлами. В первом случае citus не нужен, а во втором — обычно неэффективен. В следующих случаях citus может не подойти:

  • Отсутствуют планы по созданию кластера с более чем одним узлом Postgres Pro Enterprise из-за роста нагрузки.

  • Данные анализируются на остановленном кластере без необходимости их передачи и выполнения запросов в реальном времени.

  • Для аналитических приложений, которым не требуется поддержка большого числа пользователей одновременно.

  • Выполняются запросы по извлечению, преобразованию и загрузке больших массивов данных в рамках ETL-процессов, а не запрашивается краткая сводная информация.

Чтобы узнать больше о citus, обратитесь к официальной документации расширения.