Расширение PostgreSQL для контроля целостности данных на всех уровнях
-
Обеспечение логической проверки целостности данных — разработка механизма вычисления контрольных сумм, которые зависят только от значений данных и не меняются при физической реорганизации (VACUUM FULL, CLUSTER, REINDEX).
-
Многоуровневый контроль целостности — реализация вычисления контрольных сумм на всех уровнях иерархии данных: ячейка, строка, таблица, индекс, база данных.
-
Обнаружение скрытых изменений данных — выявление несанкционированных или ошибочных изменений, которые не обнаруживаются встроенными средствами (page checksums, WAL).
-
Проверка согласованности между репликами — предоставление возможности сравнивать логические суммы таблиц на основном сервере и реплике без передачи всех данных.
-
Верификация данных после миграций — обеспечение быстрой проверки, что данные не были изменены или потеряны при переносе между серверами или версиями PostgreSQL.
-
Аудит изменений данных — создание инструмента для периодического сравнения эталонных контрольных сумм с текущими значениями с целью выявления модификаций данных.
1. Функциональные возможности
1.1. Вычисление контрольных сумм на пяти уровнях иерархии данных:
-
Уровень ячейки — вычисление контрольной суммы отдельного атрибута (с поддержкой всех типов данных, включая TOAST и NULL).
-
Уровень строки — вычисление контрольной суммы всей строки (физическая — с учётом расположения и заголовка; логическая — только по значениям атрибутов, с обязательным использованием первичного ключа).
-
Уровень таблицы — агрегация контрольных сумм всех строк таблицы (с сортировкой для независимости от порядка).
-
Уровень индекса — вычисление контрольных сумм для всех типов индексов (B-tree, Hash, GiST, GIN, SP-GiST, BRIN) как по физической структуре, так и по логическим ключам.
-
Уровень базы данных — агрегация контрольных сумм всех отношений в базе данных (с возможностью исключения системных каталогов и TOAST-таблиц).
1.2. Поддержка двух режимов вычисления:
-
Физический режим — контрольная сумма зависит от физического расположения данных на диске, заголовков страниц и кортежей. Используется для обнаружения физических повреждений и контроля перемещений данных.
-
Логический режим — контрольная сумма зависит только от значений данных и не меняется при операциях VACUUM FULL, CLUSTER, REINDEX. Используется для проверки логической целостности, сравнения реплик и аудит.
2. Элементы проекта
2.1. Программная реализация:
-
Язык реализации: C (с использованием внутреннего API PostgreSQL).
-
Интерфейс: набор SQL-функций, доступных для вызова из любого клиента PostgreSQL.
-
Алгоритм хеширования: FNV-1a (32-битный).
-
Сборка: стандартная система сборки PostgreSQL (PGXS).
-
Документация: пояснительная записка объёмом 40 страниц, включающая описание архитектуры, реализации и тестирования.
2.3. Тестирование:
-
Регрессионные тесты (более 100 тестов) с использованием pg_regress.
-
Тесты стабильности логических сумм после VACUUM FULL, CLUSTER, REINDEX.
-
Тесты производительности для объёмов данных от 100 до 1 000 000 строк.
-
Тесты обработки NULL, пустых таблиц, различных типов данных и индексов.
-
Платформа: PostgreSQL 18, Linux / Unix-подобные ОС.
-
Язык: C (внутренний API PostgreSQL).
-
Сборка: PGXS (стандартная инфраструктура сборки расширений PostgreSQL), Make, GCC/Clang.
-
Тестирование: pg_regress (регрессионные тесты).
-
Система контроля версий: Git, GitHub.
1. Технические улучшения:
-
Инкрементальное обновление контрольных сумм — разработка механизма, который позволяет пересчитывать только изменённые строки, а не всю таблицу. Это сократит время вычисления для больших таблиц на порядки.
-
Параллельное сканирование — адаптация расширения для использования параллельных рабочих процессов PostgreSQL (Parallel Seq Scan), что ускорит вычисление сумм для таблиц большого объёма.
-
Поддержка секционированных таблиц — добавление возможности вычислять контрольные суммы как для отдельных секций, так и для всей секционированной таблицы целиком.
-
Поддержка материализованных представлений — расширение функциональности на материализованные представления, которые также являются хранимыми данными.
-
Поддержка внешних таблиц — возможность вычислять контрольные суммы для данных, доступных через FDW (например, в других СУБД или файловых системах).
2. Функциональные расширения:
-
Хранение эталонных сумм в системном каталоге — добавление возможности сохранять контрольные суммы непосредственно в PostgreSQL (в специальной таблице) и автоматически сравнивать их с текущими значениями при вызове.
-
Автоматическое оповещение — интеграция с механизмом уведомлений PostgreSQL (NOTIFY) для автоматического информирования администратора о расхождении контрольных сумм.
-
Проверка целостности с учётом сжатия — поддержка таблиц с включённым сжатием (ZSTD, LZ4).
-
Поддержка JSON/JSONB полей — более глубокая интеграция с полуструктурированными данными.
Достижение целей
Все задачи, поставленные в рамках дипломной работы, полностью решены:
-
Анализ — изучены существующие механизмы обеспечения целостности в PostgreSQL, выявлены их ограничения.
-
Проектирование — спроектирована архитектура расширения, выбран алгоритм FNV-1a, разработаны методы агрегации, независимые от порядка обхода.
-
Реализация — расширение реализовано на C, поддерживает все типы данных и методы доступа индексов, вычисляет физические и логические суммы на пяти уровнях.
-
Тестирование — проведено регрессионное тестирование (более 100 успешных тестов), тесты стабильности логических сумм и тесты производительности.
Завершённость проекта
Проект полностью завершён:
-
Код опубликован на GitHub под лицензией MIT.
-
Сборка выполняется стандартной командой через PGXS.
-
Установка — стандартная
CREATE EXTENSION. -
Документация — пояснительная записка на 40 страниц.
-
Тестирование — все тесты успешно пройдены.
-
Готовность — расширение готово к использованию в производственных средах.
Актуальность: PostgreSQL является одной из наиболее распространённых СУБД в корпоративном секторе. Однако встроенные средства контроля целостности (page checksums, WAL) работают преимущественно на физическом уровне и не позволяют проверять логическое содержимое данных после реорганизации (VACUUM FULL, CLUSTER, REINDEX). Отсутствие инструментов для многоуровневой проверки целостности создаёт риски при миграциях, репликации и аудите данных. Разработанное расширение закрывает этот функциональный пробел.
Экономическая полезность: расширение позволяет:
-
Снизить затраты на проверку целостности данных за счёт исключения необходимости полного сравнения таблиц через
pg_dump(экономия времени и дискового пространства). -
Сократить время верификации реплик — логические суммы позволяют сравнить основную базу и реплику без передачи всех строк.
-
Бесплатное использование — код распространяется под лицензией MIT, что исключает лицензионные отчисления в отличие от коммерческих решений.
Социальная полезность: разработанное расширение является открытым и доступно для всех пользователей PostgreSQL. Оно способствует повышению надёжности систем хранения данных, помогая предотвращать потерю и искажение информации в медицинских, финансовых и государственных информационных системах. Расширение может использоваться для обеспечения требований к целостности данных при прохождении сертификации и соответствия регуляторным стандартам (152-ФЗ). Открытый исходный код позволяет сообществу разработчиков участвовать в доработке и совершенствовании инструмента.
Масштабируемость
-
Линейная масштабируемость подтверждена тестами до 1 млн строк.
-
Время выполнения растёт линейно с объёмом данных, коэффициент постоянен.
-
Отсутствие блокировок позволяет параллельную работу других пользователей.
-
Архитектура модульная, легко добавляются новые уровни и методы доступа.
Взаимодействие с другими системами
-
Стандартный SQL-интерфейс — интеграция с любыми клиентами PostgreSQL.
-
Совместимость с системами мониторинга (Prometheus, Zabbix) через SQL-запросы.
-
Открытый код под лицензией MIT — легко адаптируется под любые задачи.
Мобильность
-
Кроссплатформенность — работает на Linux, macOS, Windows.
-
Сборка через стандартную систему PGXS — установка на любую платформу.
-
Переносимость данных — логические суммы стабильны при миграциях.
Все проектные решения обоснованы архитектурой PostgreSQL и стандартами сообщества:
-
Алгоритм хеширования FNV-1a — уже используется в ядре PostgreSQL для page checksums, обеспечивает детерминизм, высокую скорость и совместимость.
-
Язык C — единственный способ получить прямой доступ к внутреннему API PostgreSQL (буферный кеш, страницы, кортежи, системные каталоги), обеспечивает максимальную производительность и интеграцию.
-
Блокировки AccessShareLock — минимальный уровень блокировок, не конфликтует с DML-операциями и позволяет работать в многопользовательской среде.
-
Сборка через PGXS — стандартная инфраструктура сборки расширений PostgreSQL, обеспечивает кроссплатформенность и простоту установки.
-
Разделение физического и логического режимов — обусловлено различными задачами: обнаружение повреждений (физический) и проверка неизменности содержимого (логический).
-
Обработка NULL через 0xFFFFFFFF — обеспечивает детерминированную обработку NULL, отличную от любых реальных данных.
Выбранные решения гарантируют производительность, совместимость, безопасность и расширяемость разработанного расширения.
Существующие инструменты PostgreSQL (page checksums, amcheck, pg_row_hashes) решают лишь отдельные задачи контроля целостности и не предоставляют комплексного многоуровневого решения. Разработанное расширение pg_checksums впервые предлагает:
-
Вычисление контрольных сумм на пяти уровнях: ячейка, строка, таблица, индекс, база данных.
-
Два режима: физический (для обнаружения повреждений) и логический (устойчивый к VACUUM FULL, CLUSTER, REINDEX).
-
Поддержку всех типов индексов (B‑tree, Hash, GiST, GIN, SP‑GiST, BRIN) и всех основных типов данных PostgreSQL.
Аналоги (page checksums, amcheck, pg_row_hashes) либо ограничены одним уровнем, либо не поддерживают логические суммы, либо не охватывают все типы индексов. Таким образом, pg_checksums является уникальным решением, не имеющим полных аналогов в экосистеме PostgreSQL.