Alibaba, одна из крупнейших китайских IT-компаний, открыла исходные тексты распределённой СУБД PolarDB, основанной на PostgreSQL. PolarDB расширяет возможности PostgreSQL средствами для распределённого хранения данных с обеспечением целостности и поддержкой ACID-транзакций в контексте всей глобальной базы данных, разнесённой по разным узлам кластера. PolarDB также поддерживает распределённую обработку SQL-запросов, обеспечение отказоустойчивости и избыточное хранение данных для восполнения информации после выхода из строя одного или нескольких узлов. При необходимости расширения хранилища достаточно просто добавить в кластер новые узлы. Код открыт под лицензией Apache 2.0.
PolarDB состоит из двух составных частей – расширений и набора патчей к PostgreSQL. Патчи расширяют возможности ядра PostgreSQL, а расширения включают компоненты, реализованные отдельно от PostgreSQL, такие как механизм распределённого управления транзакциями, глобальные сервисы, обработчик распределённых SQL-запросов, дополнительные метаданные, инструменты для управления кластером, развёртывания кластера и упрощения переноса в него существующих систем.
Патчи добавляют в ядро PostgreSQL распределённый вариант механизма управления параллельным доступом к данным при помощи многоверсионности (MVCC, Multiversion concurrency control) для разных уровней изоляции. Большая часть функциональности PolarDB вынесена в расширения, что снижает зависимость от PostgreSQL и упрощает обновление и внедрение решений на базе PolarDB (упрощается переход на новые версии PostgreSQL и поддержание полной совместимости с PostgreSQL). Для управления кластером применяется инструментарий pgxc_ctl, основанный на аналогичной утилите от PostgreSQL-XC и PostgreSQL-XL.
В кластере выделяется три базовых компонента: узлы БД (DN), менеджер кластера (CM) и сервис управления транзакциями (TM). Дополнительно может быть задейсвован прокси-балансировщик нагрузки. Каждый из компонентов является отдельным процессом и может быть запущен на разном сервере. Узлы БД обслуживают SQL-запросы от клиентов и одновременно выступают координаторами распределённого выполнения запросов с участием других узлов БД. Менеджер кластера отслеживает состояние каждого узла БД, хранит конфигурацию кластера и предоставляет инструменты для управления, резервного копирования, балансировки нагрузки, обновления, запуска и остановки узлов. Сервис управления транзакциями отвечает за поддержание общей целостности во всём кластере.
PolarDB базируется на архитектуре распределённых вычислений Shared-nothing, в соответствии с которой данные распределяются при хранении на разные узлы, без применения общего для всех узлов хранилища, и каждый узел отвечает за привязанную к нему порцию данных и выполняет связанные с данными запросы. Каждая таблица сегментируется на части (sharding) с применением хэширования по первичному ключу. Если запрос охватывает данные, размещённые на разных узлах, для обеспечения атомарности, согласованности, изолированности и надёжности (ACID) подключается механизм распределённого выполнения транзакций и координатор транзакций.
Для обеспечения отказоустойчивости каждый сегмент реплицируется как минимум на три узла. Для экономии ресурсов полные данные включают только две реплики, а одна ограничивается хранением лога отложенной записи (WAL). Один из двух узлов с полными репликами выбирается в качестве лидера и участвует в обработке запросов. Второй узел выступает запасным для рассматриваемого сегмента данных, а третий принимает участие в выборе лидирующего узла и может использоваться для восстановления информации в случае выхода из строй двух узлов с полными репликами. Репликация данных между узлами кластера организована с использованием алгоритма Paxos, обеспечивающего согласованное определение консенсуса в сети с потенциально ненадёжными узлами.
Отмечается, что полную функциональность СУБД PolarDB планируется раскрыть в течение трёх выпусков: В первой версии будет опубликованы средства репликации, обеспечения высокой доступности и управления кластером. Во втором выпуске будет реализована система распределённого выполнения транзакций, поддерживающая ACID на уровне разных узлов и распределённое выполнение SQL. В третьем выпуске появится плагин к PostgreSQL и средства для гибкого распределения данных по узлам, включая адаптивное размещение сегментов для достижения оптимальной производительности и возможность расширения кластера через добавление новых узлов.