Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
ОБЛАСТЬ ПРИМЕНЕНИЯ: База данных Azure для PostgreSQL — гибкий сервер
Эластичные кластеры на гибком сервере База данных Azure для PostgreSQL — это управляемое предложение расширения Citus с открытым исходным кодом для PostgreSQL, которое обеспечивает горизонтальное сегментирование PostgreSQL.
Хотя Citus является просто расширением, он подключает несколько экземпляров PostgreSQL. При развертывании гибкого сервера База данных Azure для PostgreSQL с помощью Citus он обрабатывает управление и настройку нескольких экземпляров PostgreSQL в качестве одного ресурса. Он также автоматически настраивает узлы и делает их известными для расширения Citus.
Эластичные кластеры на гибком сервере предлагают две модели сегментирования: сегментирование на основе строк и сегментирование на основе схем. Дополнительные сведения см. в документации по сегментированию моделей с открытым кодом.
Архитектура
Эластичные кластеры состоят из одного или нескольких узлов База данных Azure для PostgreSQL гибкого сервера. Эти экземпляры автоматически становятся известны друг другу и подключены к кластеру Citus. Узлы должны быть одинаковыми уровнями вычислений и хранилища, а также могут быть равномерно масштабироваться вверх или вниз до более высоких или более низких уровней.
Эластичные кластеры используют экземпляры гибких серверов (называемых узлами) для координации друг с другом в архитектуре "общего ничего". Узлы в кластере совместно хранят больше данных и используют больше ядер ЦП, чем возможно на одном сервере. Архитектура также позволяет масштабировать базу данных, добавляя дополнительные узлы в кластер.
Подключение к кластеру с помощью порта 5432 приземляется на назначенном узле координатора. Эластичные кластеры также позволяют распределять нагрузку между кластерами с помощью метода хэширования с пятью кортежами, если вы подключаетесь с помощью порта 7432. Используя 7432, вы можете по-прежнему приземлиться на узле, назначенном в настоящее время в качестве координатора. Для некоторых операций на уровне кластера, таких как распространение таблиц, может потребоваться подключиться через порт 5432. Настоятельно рекомендуется всегда подключаться к порту 5432 при планировании обновления схемы приложения и аналогичных изменений.
В отличие от Cosmos DB для PostgreSQL, адреса узлов не предоставляются внешним образом. При просмотре таблиц метаданных Citus, например pg_dist_node
, можно заметить, что все узлы имеют один и тот же IP-адрес, что и в примере 10.7.0.254
, но разные номера портов.
select nodeid, nodename, nodeport from pg_dist_node;
nodeid | nodename | nodeport
--------+------------+----------
1 | 10.7.0.254 | 7000
2 | 10.7.0.254 | 7001
(2 rows)
В инфраструктуре Azure эти узлы живут на разных виртуальных машинах, даже если они могут быть разными портами на одном компьютере.
Дополнительные сведения о Citus см. в официальной документации по проекту с открытым исходным кодом.
По умолчанию таблицы и схемы, созданные с помощью Citus, не распределяются по кластеру автоматически. Вам нужно решить о модели сегментирования и либо решить распространить схемы, либо распределить данные таблицы с сегментированием на основе строк.
Для каждого запроса в распределенных таблицах запрашиваемый узел либо направляет его на один узел, либо параллелизирует его между несколькими узлами. Решение зависит от того, находятся ли необходимые данные на одном узле или на нескольких. С сегментированием на основе схемы координатор направляет запросы непосредственно на узел, на котором размещена схема. В обоих вариантах сегментирования на основе схем и сегментирования на основе строк узел решает, что делать с помощью таблиц метаданных для консультаций. Эти таблицы отслеживают расположение и работоспособность узлов, а также распределение данных между узлами.
После распространения данных с помощью одной из моделей сегментирования можно подключиться к любому из узлов для выполнения операций DML (язык изменения данных) (SELECT, UPDATE, INSERT, DELETE). Все узлы содержат метаданные, необходимые для поиска данных, необходимых для запроса, и могут получить его для ответа на запрос.
Операции DDL (язык определения данных) и широкие операции кластера в настоящее время ограничены узлом, где находится роль координатора. Убедитесь, что вы выполняете операции DDL и кластера, подключаясь к порту 5432, а не с помощью порта 7432.
Вы можете масштабировать эластичный кластер, добавив новые узлы и перебалансируя данные в нем. Перебалансирование — это интерактивная операция, которая не блокирует выполнение рабочих нагрузок.
Сегменты
В предыдущем разделе описано, как распределенные таблицы хранятся в качестве сегментов на рабочих узлах. В этом разделе рассматриваются дополнительные технические сведения об этих сегментах.
Таблица pg_dist_shard
метаданных содержит строку для каждого сегмента каждой распределенной таблицы в системе. Строка соответствует идентификатору сегмента (shardid
) с диапазоном целых чисел в хэш-пространстве (shardminvalue
, shardmaxvalue
).
SELECT * from pg_dist_shard;
logicalrelid | shardid | shardstorage | shardminvalue | shardmaxvalue
---------------+---------+--------------+---------------+---------------
github_events | 102026 | t | 268435456 | 402653183
github_events | 102027 | t | 402653184 | 536870911
github_events | 102028 | t | 536870912 | 671088639
github_events | 102029 | t | 671088640 | 805306367
(4 rows)
Если узел хочет определить, какой сегмент содержит строку github_events
, он хэширует значение столбца распространения в строке. Затем узел проверяет, какой диапазон сегмента содержит хэшированное значение. Диапазоны определены так, чтобы образ хэш-функции был их непересекающимся объединением.
Размещение сегментов
Предположим, что сегмент 102027 связан с интересующей строкой. Строка читается из таблицы github_events_102027
или записывается в нее одной из рабочих ролей. Используя сведения, хранящиеся в таблицах метаданных, расширение определяет, что такое конкретная рабочая роль. Сопоставление сегмента и рабочей роли называется размещением сегмента.
Узел перезаписывает запросы на фрагменты, ссылающиеся на определенные таблицы, например github_events_102027
и запускающие эти фрагменты на соответствующих рабочих ролях. Ниже приведен пример выполнения запроса за кулисами, чтобы найти узел с сегментом с идентификатором 102027.
SELECT
shardid,
node.nodename,
node.nodeport
FROM pg_dist_placement placement
JOIN pg_dist_node node
ON placement.groupid = node.groupid
AND node.noderole = 'primary'::noderole
WHERE shardid = 102027;
┌─────────┬───────────┬──────────┐
│ shardid │ nodename │ nodeport │
├─────────┼───────────┼──────────┤
│ 102027 │ localhost │ 5433 │
└─────────┴───────────┴──────────┘