53.1. Типы таблиц #

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

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

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

Примечание

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

53.1.1.1. Секции #

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

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

53.1.1.2. Реплицированные таблицы #

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

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

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

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

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

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

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

  • ALTER ROLE для управляемых ролей.

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

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

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

У распределённых таблиц есть ряд особенностей. Такие таблицы доступны на всех узлах кластера. Как у секционированных таблиц, у них есть несколько секций, число которых постоянно и не подлежит изменению без перезапуска. В каждом сегменте обычно хранится несколько секций данного сегмента, в то время как другие секции хранятся в другом месте. Обратите внимание, что эти секции взаимосвязаны.

53.1.1.4. Совмещённые таблицы #

Совмещённая таблица Postgres Pro Shardman — это секционированная таблица, состоящая из нескольких секций, которые размещены совместно с секциями распределённой таблицы в целях быстрого доступа. В таком случае секционирование обычно происходит по секциям, через сегментирование или по внешнему ключу для повышения эффективности. Такой сценарий рекомендован для больших JOIN.