Внешнее хранение двоичных данных Rbytea
- Тип данных rbytea
- Установка расширения
- Функции для работы с типом rbytea
- Фоновый процесс очистки устаревших копий
- Параметры конфигурации расширения
Тип данных rbytea
Тип данных rbytea предназначен для хранения двоичных данных. Он аналогичен типу bytea, с той лишь разницей, что сами данные хранятся не в табличном пространстве базы, а во внешнем хранилище. В качестве внешнего хранилища в текущей версии QHB выступает файловая система. Это может быть смонтированный в определенную точку файловой системы сервера внешний том или символическая ссылка.
Основной целью расширения является вынос двоичных данных из таблиц базы данных в нетранзакционное хранилище, тем самым разгрузив базу данных (зачастую двоичные данные имеют большой объем, который занимает значительный процент от общего размера базы, усложняя администрирование и обслуживание).
Тип данных rbytea в записи базы данных оставляет только небольшой заголовок, в котором содержатся служебные поля и ссылка на файл во внешнем хранилище. В качестве ссылки используется тип данных uuid, а генерация случайных идентификаторов использует возможности модуля pgcrypto.
Данные во внешнем хранилище могут быть зашифрованы алгоритмом Кузнечик.
Установка расширения
Установка расширения производится командой CREATE EXTENSION:
CREATE EXTENSION rbytea CASCADE;
Установку должен запускать суперпользователь баз данных. Эту команду следует запускать в той базе данных, в которой предполагается использовать модуль. Для работы фонового процесса необходимо обеспечить предварительную загрузку разделяемой библиотеки расширения, указав к конфигурации параметр:
shared_preload_libraries = 'librbytea'
Описание параметров расширения приведены ниже в разделе Параметры конфигурации расширения.
Функции для работы с типом rbytea
Имя | Тип результата | Описание |
---|---|---|
uuid(col rbytea) | uuid | Получить идентификатор данных |
len(col rbytea) | bigint | Получить длину данных в байтах |
len_full(col rbytea) | bigint | Получить длину в байтах данных с учетом выравнивания для шифрования |
qss_mode(col rbytea) | bigint | Возвращает признак шифрования данных (1) или его отсутствия (0) |
md5sum(col rbytea) | text | Возвращает md5 сумму данных |
sha256sum(col rbytea) | text | Возвращает sha256 сумму данных |
md5store(col rbytea) | text | Возвращает md5 сумму зашифрованных данных во внешнем хранилище |
sha256store(col rbytea) | text | Возвращает sha256 сумму зашифрованных данных во внешнем хранилище |
rvacuum() | bigint | Выполняет очистку устаревших данных в хранилище |
Фоновый процесс очистки устаревших копий
Поскольку на файловую систему не распространяется транзакционность базы данных, во внешнем хранилище могут оставаться данные полей таблиц типа rbytea, которые были удалены или сохранены в незаконченных, отмененных транзакциях. Поэтому периодически запускается фоновый процесс очистки, который проходит по некоторому диапазону транзакций, очищая данные. При этом файлы перемещаются в каталог TRASH, который создается для каждой базы данных, указанной в параметре rbytea.databases_for_vacuuming.
После каждого запуска максимальный номер транзакции запоминается и при следующем запуске используется как нижняя граница диапазона сканирования. В качестве верхней границы диапазона сканирования используется последняя завершенная транзакция.
Параметры запуска указаны в разделе ниже.
Параметры конфигурации расширения
Для работы расширений нужно установить несколько параметров в конфигурационном файле:
Определение каталога (точки монтирования файловой системы / тома) для сохранения образов данных
rbytea.filesystem_storage_path = '/mnt/fs'
Двоичные данные будут сохраняться в данном каталоге сервера. Для каждой базы будет создаваться свой подкаталог (по oid базы), а внутри него, во множестве подкаталогов, — собственно файлы с данными.
Имена вложенных каталогов от каталога базы данных до файла будут составлять uuid типа rbytea, а расширение файла — номер транзакции, в которой данные впервые появились в системе.
Каталог должен быть доступен на чтение и запись в него для пользователя, от имени которого запускается сервер базы данных.
По умолчанию, если параметр опущен или пуст, каталогом для сохранения двоичных данных назначается <каталог базы данных>/rbytea.
Загрузка разделяемой библиотеки при старте QHB:
shared_preload_libraries = 'librbytea'
Данный параметр обеспечивает загрузку разделяемой библиотеки при старте QHB и инициализацию фонового процесса для очистки устаревших образов. В противном случае автоочистка устаревших образов производится не будет.
Примечание
Если параметр shared_preload_libraries уже содержит указание на загрузку других библиотек, нужно не перезаписать его значение, а добавить через разделитель librbytea.
Интервал запуска фонового процесса очистки
rbytea.worker_restart_time = 86400
Фоновый процесс не работает постоянно. Поскольку данные достаточно статичны, не требуется запускать процесс очистки слишком часто. Задержка от окончания предыдущего запуска до следующего запуска задается в данном параметре.
Значение указано в секундах. По умолчанию параметр устанавливается в значение 86 400 секунд (сутки).
Задание баз данных для фонового процесса очистки
rbytea.databases_for_vacuuming = 'qhb'
Параметр указывает, какие базы данных подлежат очистке. Указываются названия баз данных через запятую. Главный процесс базы данных будет запускать столько фоновых процессов очистки, сколько баз данных перечислено в данном параметре.
Включение фонового шифрования
rbytea.filesystem_qss_mode = 0
Если в системе доступно фоновое шифрование при записи на диск, данный параметр позволяет зашифровывать также и двоичные данные rbytea. Для шифрования параметр необходимо установить в значение 1.
При шифровании данные дополняются (выравниваются) до границы 16-байтных блоков, поэтому функции len(rbytea) и len_full(rbytea) для одних и тех же данных могут возвращать разное значение. А функции md5store(rbytea) и sha256store(rbytea) подсчитывают контрольные суммы для зашифрованных данных, дополненных до границы 16-байтного блока.
Вопросы смены ключа шифрования должны решаться администратором базы данных.
По умолчанию этот параметр устанавливается в значение 0.