7.1. Типы таблиц

В распределённой базе данных, управляемой Shardman, используются следующие специальные типы таблиц: сегментированные таблицы и глобальные таблицы.

7.1.1. Сегментированные таблицы

Сегментированные таблицы — это обычные секционированные таблицы PostgreSQL, в которых несколько секций, составляющих сегмент, являются обычными локальными таблицами, а остальные секции — сторонними таблицами, доступными с удалённых серверов через postgres_fdw. Сегментированные таблицы зарегистрированы в словаре shardman.sharded_tables. Используйте оператор CREATE TABLE с параметром distributed_by, чтобы создать сегментированную таблицу. Несколько сегментированных таблиц могут быть созданы как совмещённые. Это означает, что они имеют одинаковое количество секций и что их секции, соответствующие одному и тому же ключу сегментирования, должны располагаться вместе. Во время перебалансировки утилиты управления Shardman гарантируют, что соответствующие секции совмещённых таблиц будут перемещены на один и тот же узел. (Такая перебалансировка происходит, например, при добавлении в кластер нового узла). Совмещение необходимо для того, чтобы объединения нескольких таблиц распространялись на узел, где находятся фактические данные. Чтобы сделать одну сегментированную таблицу совмещённой с другой, сначала создайте одну таблицу, а затем используйте параметр colocate_with оператора CREATE TABLE при создании второй таблицы. Цепочки совмещённых таблиц не поддерживаются, вместо этого все связанные таблицы должны быть помечены как совмещённые с одной из таблиц. Обратите внимание, что свойство colocate_with является симметричным и транзитивным.

7.1.1.1. Секции

Сегментированная таблица состоит из нескольких секций. Некоторые из них являются обычными таблицами, а другие — сторонними. По умолчанию количество секций определяется параметром shardman.num_parts, но может быть перезаписано в параметре num_parts команды CREATE TABLE. Большинство операций DDL ограничены секциями сегментированной таблицы. Чтобы обойти это ограничение, следует изменять родительскую таблицу.

Количество секций в сегментированной таблице задаётся при её создании и не может быть изменено впоследствии. При добавлении новых узлов в кластер некоторые секции перемещаются с существующих узлов на новые, чтобы сбалансировать нагрузку. Таким образом, чтобы обеспечить масштабирование кластеров, начальных секций должно быть достаточно много, но не слишком много, поскольку слишком большое количество секций значительно замедляет планирование запросов. Например, если вы ожидаете, что количество узлов в вашем кластере вырастет максимум в 4 раза, создайте сегментированные таблицы с количеством секций, равным 4 * N, где N — это количество узлов. Предел масштабируемости кластера достигается, когда число узлов кластера достигает числа секций в сегментированной таблице с их минимальным количеством.

7.1.1.2. Подсекции

Секции сегментированной таблицы могут быть секционированы по диапазону. В этом случае каждая секция сегментированной таблицы представляет собой секционированную таблицу, состоящую только из обычных или только из сторонних подсекций. Все подсекции секции расположены на одном узле. Используйте параметр partition_by оператора CREATE TABLE, чтобы указать столбец, который следует использовать в качестве столбца ключа подсекции, и параметр partition_bounds, чтобы установить границы секций таблицы второго уровня. Новые подсекции могут быть добавлены или удалены из таблицы по мере необходимости. Таким образом, вы можете опустить параметр partition_bounds во время создания таблицы и создать секции позже, используя функцию shardman.create_subpart(). Другие функции управления подсекциями позволяют удалять, отсоединять или присоединять подсекции сегментированной таблицы. Управление подсекциями осуществляется на уровне кластера.

7.1.2. Глобальные таблицы

Глобальные таблицы доступны для всех узлов кластера. Сейчас глобальная таблица — это набор обычных таблиц, синхронизированных по триггерам. Основной вариант использования глобальной таблицы — хранение относительно редко обновляемого набора данных, который используется всеми узлами кластера. Когда сегментированная таблица присоединяется к глобальной таблице, соединения между сегментированными секциями таблицы и глобальной таблицей могут выполняться на узлах, где находятся отдельные секции. Реализация репликации на основе триггеров требует, чтобы неоткладываемый первичный ключ был определён в глобальной таблице. В настоящее время при изменении глобальной таблицы срабатывает триггер оператора after, который распространяет изменения на другие узлы кластера через сторонние таблицы. Когда в кластер добавляются новые узлы, данные глобальных таблиц передаются на новые узлы посредством логической репликации. Когда какие-либо узлы удаляются из кластера, глобальные таблицы ненадолго блокируются для записи. Используйте параметр global в команде CREATE TABLE для создания глобальной таблицы. Глобальные таблицы регистрируются в словаре shardman.global_tables. Секционированные глобальные таблицы не поддерживаются.

7.1.3. Распределённый DDL

Расширение Shardman позволяет создавать несколько видов глобальных объектов. Это сегментированные и глобальные таблицы, роли и табличные пространства. Список операций, разрешённых для глобальных объектов, ограничен, в частности, для защиты согласованности глобальной схемы. По той же причине большинство операций над глобальными объектами выполняются на уровне кластера. Список операций на уровне кластера включает:

  • CREATE для сегментированных и глобальных таблиц, глобальных ролей и табличных пространств или индексов для сегментированных или глобальных таблиц.

  • DROP для сегментированных и глобальных таблиц, глобальных ролей и табличных пространств или индексов для сегментированных или глобальных таблиц.

  • ALTER TABLE для сегментированных и глобальных таблиц.

  • ALTER TABLESPACE для глобальных табличных пространств.

  • ALTER ROLE для глобальный ролей.

  • RENAME для сегментированных и глобальных таблиц или построенных по ним индексов.

  • SET CONSTRAINTS ALL внутри блокировки транзакции.

Эти параметры конфигурации управляют выполнением команд распределённого DDL: shardman.broadcast_ddl и shardman.sync_schema. Первый можно использовать для трансляции всех обычных операций DDL (например, создания схем или функций) на весь кластер. Второй управляет трансляцией операторов, связанных с глобальными объектами, и никогда не должен отключаться без консультации со службой поддержки Postgres Pro Shardman.