Надежная эксплуатация высоконагруженных систем
Контекст
Современные информационные системы часто функционируют в условиях высоких нагрузок: миллионы транзакций в день, тысячи одновременных подключений, интенсивная работа с большими объемами данных, интеграция с внешними сервисами и приложениями (в том числе с 1С). Отказоустойчивость, производительность и масштабируемость становятся критически важными характеристиками инфраструктуры.
Для СУБД это означает необходимость быстрой обработки запросов, эффективной работы с пулами соединений, гибкой архитектуры хранения данных и минимального времени отклика, даже в условиях пиковых нагрузок.
Проблема
При эксплуатации СУБД в высоконагруженной среде возникают типовые сложности:
- деградация производительности из-за роста числа подключений;
- неэффективные планы выполнения запросов, приводящие к замедлению операций;
- блокировки и узкие места при работе с большим объемом данных в партиционированных таблицах;
- невозможность быстрой масштабируемости;
- ограниченная поддержка платформ, таких как 1С;
- сложность развертывания высокодоступных и управляемых кластеров, особенно в контейнеризованных средах.
Эти проблемы ведут к нарушению SLA, затрудняют сопровождение, увеличивают нагрузку на администраторов и разработчиков.
Решение
Для обеспечения надежной эксплуатации высоконагруженных систем в СУБД Pangolin доступны следующие функциональности, которые расширят возможности разработчика:
- Поддержка работы с 1С;
- Улучшенный пулер соединений – Pangolin Pooler;
- Резервирование подключений для ролей;
- Управление планами запросов;
- Неблокирующее нативное интервальное партиционирование;
- Глобальные индексы и глобальные ограничения на партиционированные таблицы;
- Управление легкими блокировками;
- Механизм обновления системных каталогов Pangolin без изменения структуры данных;
- 64-битные идентификаторы транзакций;
- Поставка сборки с отладочными пакетами;
- Поставка Docker-образа СУБД Pangolin.
Совокупность этих решений позволяет добиться стабильной, управляемой и масштабируемой работы СУБД Pangolin в условиях высоких нагрузок, снизить издержки на администрирование и сопровождение, а также обеспечить гибкость в развертывании.
В подразделах ниже представлено более детальное описание данных функциональностей.
Поддержка работы с 1С
Данная функциональность позволяет использовать СУБД Pangolin в качестве СУБД для «Платформы 1С: Предприятие».
Включение поддержки 1С активирует:
- оптимизации планировщика запросов;
- изменения в работе внутренних алгоритмов СУБД;
- дополнительные расширения.
Возможность является отключаемой, так как полная совместимость поведения продукта Pangolin с выключенной поддержкой 1С и с включенной поддержкой 1С отличается. Оптимизации и изменения могут приводить к построению планов с деградацией производительности при использовании без 1С. Рекомендуется включать поддержку при использовании продукта совместно с 1С.
Более подробное описание данной функциональности представлено в разделе «Поддержка 1С» документа «Руководство администратора».
Улучшенный пулер соединений – Pangolin Pooler
Компонент Pangolin Pooler – это менеджер пулов соединений СУБД Pangolin. Данный компонент является доработанной версией утилиты PgBouncer.
Предназначением компонента является минимизация издержек, связанных с установлением новых подключений к СУБД Pangolin. Pangolin Pooler позволяет уменьшить накладные расходы на базу данных в случае, когда огромное количество физических соединений ведет к падению производительности СУБД Pangolin.
К ключевым доработкам программы PgBouncer в рамках создания компонента Pangolin Pooler относятся:
- Режим сквозной аутентификации пользователей, который дополнительно осуществляет поддержку аутентификации пользователей методом LDAP и аудирование действий пользователя в лог компонента Pangolin Pooler;
- Поддержка подготовленных запросов для транзакционного режима кластера высокой доступности Pangolin;
- Поддержка использования сертификатов PKCS#12 и управление через Secret Management System (SecMan);
- Поддержка топологии N-ЦОД в Pangolin Pooler;
- Реализация вывода команды
SHOW POOLSв лог компонента; - Создание команды
RESET_AUTH, которая сбрасывает в исходное состояние сквозную аутентификацию пользователей.
Более подробное описание и управление компонентом и его доработками представлено в разделе «Администрирование Pangolin Pooler» документа «Руководство администратора».
Резервирование подключений для ролей
В ядре оригинального PostgreSQL отсутствует возможность резервирования подключений для пользователей, не обладающих правами суперпользователя. Это приводит к проблеме невозможности подключиться к БД, когда все свободные подключения заняты.
В СУБД Pangolin реализована возможность резервировать для ролей количество доступных подключений как индивидуально, так и по признаку вхождения в групповую роль. Это гарантирует пользователю наличие свободных подключений к БД в любое время.
В каждой БД создается файл pg_quota.conf, который содержит записи для ролей, требующих зарезервировать соединения.
Более подробное описание и настройка данной функциональности представлено в одноименном разделе документа «Руководство администратора».
Управление планами запросов
В теории порядок выполнения запроса определяет оптимизатор запросов – программа, определяющая оптимальный «маршрут» на основании информации о количестве записей, распределения данных и индексах.
План выполнения запроса на практике может быть неоптимальным по ряду причин:
- некорректная или неполная статистика;
- недостаточные или избыточные индексы;
- некорректные настройки стоимостей операций;
- ошибки работы оптимизатора.
Неоптимальный маршрут выполнения может приводить к увеличенному времени выполнения запросов, деградации сервиса в целом (вплоть до отказа) или несоблюдению SLA.
Реализованная возможность фиксации и подмены планов запросов позволяет оперативно и без влияния на существующую структуру объектов:
- принудительно определять план выполнения SQL-запроса, выполняемого как самостоятельный запрос, подготовленный запрос или запрос в составе PL/pgSQL-блока;
- корректировать в процессе план выполнения запроса на стороне сервера при его обработке без необходимости вносить изменения в его текст на стороне отправляющего его приложения.
Подробнее о расширениях, которые предоставляют данную функциональность представлено в разделе «Управление планами запросов» документа «Руководство администратора».
Неблокирующее нативное интервальное партиционирование
Неблокирующее нативное интервальное партиционирование – это возможность создать партиционированную таблицу, указав лишь правило разбиения на партиции и сразу наполнять данными. В этом случае при добавлении данных отсутствующая партиция будет создана автоматически, вместо генерации сообщения об ошибке о необходимости создать партицию вручную. В остальном поведение автопартиционированных таблиц не отличается от стандартного партиционирования.
Более подробное описание и настройка функциональности представлено в разделе «Нативное интервальное партиционирование» документа «Руководство администратора».
Глобальные индексы и глобальные ограничения на партиционированные таблицы
СУБД Pangolin предоставляет возможность создавать и использовать глобальные ограничения уникальности по полям партиционированных таблиц, отличных от полей ключа партиционирования. Тем самым повышая эффективность поиска записей в партиционированных таблицах для предикатов, не включающих ключ партиционирования.
Более подробное описание и настройка данной функциональности представлено в одноименном разделе документа «Руководство администратора».
Управление легкими блокировками
В СУБД Pangolin реализованы дополнительные конфигурационные параметры, обеспечивающие более эффективное использование механизмов блокировок в многопроцессорных системах и под высокой нагрузкой.
Настройка этих параметров позволяет:
- снизить конкуренцию за общие ресурсы;
- предотвратить чрезмерные задержки exclusive-блокировок;
- повысить общую масштабируемость и предсказуемость производительности кластера СУБД Pangolin.
Параметры позволяют управлять легкими блокировками (LWLock) на высоконагруженных системах для повышения производительности в следующих сценариях нагрузки:
- редкие пишущие запросы и чрезмерно частые читающие запросы;
- запросы с большим числом таблиц: партиционированные таблицы, таблицы с большим числом индексов, объединение таблиц с помощью оператора
JOIN; - запросы, сопровождающиеся частым обращением к буферному кешу для чтения страниц из файловой системы, записи страниц в файловую систему, вытеснения страниц из буферного кеша.
Более подробное описание и настройка данной функциональности представлено в одноименном разделе документа «Руководство администратора».
Механизм обновления системных каталогов Pangolin без изменения структуры данных
Утилита pangolin-inplace-upgrade предоставляет механизм обновления системных каталогов СУБД Pangolin без изменения структуры таблиц и без миграции пользовательских данных, что позволяет существенно сократить длительность обновления и избежать выполнения ресурсоемкого процесса, который требует полного комплекса действий:
- миграции с помощью
pg_upgrade; - создания резервной копии;
- инициализации и настройки новой базы данных;
- подготовки конфигурационных файлов
- переноса данных (
rsync); - сборки статистики (
vacuumdb); - обновления расширений.
Утилита pangolin-inplace-upgrade работает гораздо быстрее, так как не выполняет полную выгрузку и загрузку данных системного каталога.
Такой подход снижает эксплуатационные затраты, делает обновление менее ограниченным по требованиям и позволяет выполнить переход на новую версию СУБД значительно быстрее и проще.
Описание работы утилиты приведено в одноименном разделе документа «Руководство по установке».
64-битные идентификаторы транзакций
В ядре оригинального PostgreSQL под счетчик транзакций выделено 32 бита, которые покрывают всего 4 млрд транзакций (XID). Во избежание исчерпания номеров транзакций применяется закольцованная схема счетчика транзакций.
Переход на 64-битный счетчик транзакций решает проблему их переполнения, делая этот момент практически недостижимым. Даже при нагрузке транзакций в день (~50 000 TPS) граница раздела между прошлым и будущим будет достигнута через дней (5,9 млн лет). Использование 64-битного счетчика предоставляет следующие преимущества:
-
В условии высокой транзакционной нагрузки позволяет избежать прекращения выполнения поступающих запросов на запись при наличии долгоживущей транзакции, удерживающей горизонт транзакций (
xmin).В случае 32-битного счетчика 13 часовой OLAP-запрос стал бы причиной отказа в обслуживании OLTP-запросов со скоростью 50 000 TPS спустя 12 часов. К этому моменту возраст самой старой транзакции достиг бы . Горизонт транзакций (
xmin), удерживаемый OLAP-запросом, не даетautovacuumзаморозить версии строк младше горизонта транзакций для продвижения счетчика. В результате новый номер для пишущей транзакции не выделяется и Pangolin завершает OLTP-запросы с ошибкой, чтобы не допустить потерю данных.64-битный счетчик снимает ограничение на предельный возраст самой старой транзакции , поэтому рассмотренная выше проблема отсутствует.
-
Появляется возможность снизить риск деградации производительности при интенсивной транзакционной нагрузке за счет настройки более редкого запуска процедуры заморозки и ее планирования на период с меньшей нагрузкой.
Более подробное описание и настройка данной функциональности представлено в одноименном разделе документа «Руководство администратора».
Поставка сборки с отладочными пакетами
Для улучшения качества и скорости исследования инцидентов, возникших в промышленной среде, производится поставка отладочных символов. Отладочная информация отделяется от исполняемых/библиотечных объектов и сохраняется в отдельных файлах.
В корневом каталоге дистрибутива продукта существует директория debug, содержащая отладочные пакеты всех компонентов, для которых предусмотрена поставка.
Установка отладочных пакетов позволяет:
- получать информативный стек вызовов (с адресами и именами функций);
- производить рассекречивание дампов памяти процесса (
core dump), в том числе сформированных автоматически до момента установки отладочных пакетов; - сократить срок расследования инцидентов.
Описание установки и управление функциональностью представлено в одноименном разделе документа «Руководство по установке».
Поставка Docker-образа СУБД Pangolin
В СУБД Pangolin возможно запускать Docker-образы компонентов продукта в кластерных конфигурациях с одним главным узлом и произвольным числом узлов реплицирования. Решение позволяет создавать многоконтейнерные приложения, где роль кластера базы данных берет на себя Pangolin DB, а управление пулом соединений обеспечивает Pangolin Pooler.
В Docker-образе включены определенные функциональности, не требующие конфигурирования. Пользователю доступны преднастроенные функциональные возможности, которые активируются специальным ключом при старте контейнера.
Дополнительно можно самостоятельно активировать и настроить также ряд функциональных возможностей.
Список данных функциональностей (включенных и дополнительно настраиваемых), а также процесс запуска образа представлен в разделе «Docker-образы СУБД Pangolin» документа «Руководство по установке».