C.1. Основные вопросы

C.1.1. Что такое Shardman?

Shardman — это распределённая система управления базами данных (СУБД) на основе PostgreSQL, реализующая сегментирование. Сегментированием называется принцип проектирования баз данных, при котором строки таблицы хранятся отдельно друг от друга в разных БД, потенциально управляемых разными экземплярами СУБД. Основная задача Shardman — повысить эффективность выполнения запросов к сегментированным распределённым БД и упростить управление ими.

C.1.2. Из чего состоит Shardman?

Shardman состоит из следующих программных компонентов:

  • СУБД PostgreSQL 14 с набором изменений.

  • Расширение Shardman.

  • Инструменты и службы управления, включая встроенный менеджер stolon для обеспечения отказоустойчивости.

C.1.3. Когда использовать Shardman?

  • Рабочий объём данных не помещается в оперативную память одного сервера, но может поместиться в память нескольких сегментов (или хотя бы читаться параллельно).

  • Количество сеансов слишком велико для одного экземпляра PostgreSQL.

  • Интенсивно используется запись в WAL.

  • Сложная логика потребляет слишком много ресурсов процессора, и одного сервера недостаточно.

C.1.4. Когда не рекомендуется использовать Shardman?

  • Если с памятью, сеансом, загрузкой процессора справляется один сервер PostgreSQL — это и быстрее, и проще. (Это относится и к тестированию!).

C.1.5. Сколько узлов требуется для развёртывания Shardman?

Для развёртывания Shardman требуется как минимум три узла. Для кластера etcd требуется один узел (кластер etcd с одним узлом) и как минимум два узла для кластера РСУБД. Минимальное развёртывание можно сократить до двух узлов, разместив etcd на одном из узлов кластера РСУБД. Минимальное развёртывание описано в разделе Начало работы с Shardman.

C.1.6. Отказоустойчив ли Shardman?

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

C.1.7. Как устроено сегментирование?

В Shardman таблицы разделены на секции, а секции распределены между сегментами.

C.1.8. Можно ли изменить количество секций?

Нет, количество секций сегментированных таблиц задаётся при их создании и остаётся неизменным. Если ожидается, что объём имеющихся данных значительно вырастет, следует заранее создать необходимое количество секций (по умолчанию — 20).

C.1.9. Поддерживает ли Shardman повторное сегментирование?

Нет, в Shardman на данный момент не поддерживается автоматическое изменение ключа сегментирования. Для изменения ключа сегментирования необходимо создать новые таблицы с новым ключом сегментирования и перенести в них данные из старых таблиц.

C.1.10. Можно ли преобразовать несегментированную (локальную) таблицу в сегментированную?

Нет, в Shardman на данный момент не поддерживается эта функция.

C.1.11. Поддерживает ли Shardman добавление и удаление сегментов?

Минимальная конфигурация кластера Shardman — один узел без отказоустойчивости, но такая конфигурация не имеет особого смысла. Можно добавлять или удалять сегменты, Shardman будет автоматически (по умолчанию, но это настраивается) перераспределять данные между узлами. Можно добавить в Shardman реплики, чтобы сделать сегменты отказоустойчивыми.

C.1.12. Каков статус балансировки данных?

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

C.1.13. Как осуществляется доступ к кластеру Shardman?

К Shardman можно получить доступ через любой узел в кластере, все узлы в кластере равны. Используйте команду shardmanctl getconnstr, чтобы получить строку подключения к кластеру.

C.1.14. Как реализована балансировка между узлами кластера?

На данный момент нет встроенного решения для балансировки. Но можно организовать балансировку на уровне приложения, например, с помощью параметров драйвера JDBC (loadBalanceHosts). Для libpq эта функция будет реализована в версии PostgreSQL 16.

C.1.15. Поддерживается ли массовая загрузка данных в Shardman?

Да, этот функционал встроен в утилиту управления — см. shardmanctl load.