Rbytea
Rbytea — внешнее хранение двоичных данных.
Тип данных rbytea
Тип данных rbytea предназначен для хранения двоичных данных. Он аналогичен типу bytea, с той лишь разницей, что сами данные хранятся не в табличном пространстве базы, а во внешнем хранилище. В качестве внешнего хранилища в текущей версии QHB выступает файловая система. Это может быть смонтированный в определенную точку файловой системы сервера внешний том или символическая ссылка.
Основной целью расширения является вынос двоичных данных из таблиц базы данных в нетранзакционное хранилище, тем самым разгрузив базу данных (зачастую двоичные данные имеют большой объем, который занимает значительный процент от общего размера базы, усложняя администрирование и обслуживание).
Тип данных rbytea в записи базы данных оставляет только небольшой заголовок, в котором содержатся служебные поля и ссылка на файл во внешнем хранилище. В качестве ссылки используется тип данных uuid, а генерация случайных идентификаторов использует возможности модуля pgcrypto.
Данные во внешнем хранилище могут быть зашифрованы алгоритмом Кузнечик.
Установка расширения
Установка расширения производится командой CREATE EXTENSION
:
CREATE EXTENSION rbytea CASCADE;
Установку должен запускать суперпользователь баз данных. Эту команду следует запускать в той базе данных, в которой предполагается использовать модуль. Для работы фонового процесса необходимо обеспечить предварительную загрузку разделяемой библиотеки расширения, указав к конфигурации параметр:
shared_preload_libraries = 'librbytea'
Описание параметров расширения приведены ниже в параграфе Параметры конфигурации расширения.
Функции для работы с типом rbytea
Имя | Тип результата | Описание |
---|---|---|
uuid(rbytea) | uuid | Возвращает идентификатор данных |
len(rbytea) | bigint | Возвращает длину данных в байтах |
qss_mode(rbytea) | bigint | Возвращает признак зашифрования данных или его отсутствия |
md5(rbytea) | text | Возвращает md5 сумму данных |
sha256(rbytea) | text | Возвращает sha256 сумму данных |
ext_file_dir(rbytea) | text | Возвращает каталог хранения данных (абсолютный или от $PGDATA) |
ext_file_path(rbytea) | text | Возвращает полное имя файла хранения данных (путь абсолютный или от $PGDATA) |
trash_file_dir(rbytea) | text | Возвращает каталог хранения удалённых данных (абсолютный или от $PGDATA) |
trash_file_path(rbytea) | text | Возвращает полное имя файла хранения удалённых данных (путь абсолютный или от $PGDATA) |
txid_created(rbytea) | bigint | Возвращает идентификатор транзакции, во время которой были созданы данные |
rvacuum() | bigint | Выполняет очистку устаревших данных в хранилище |
Фоновый процесс очистки устаревших копий
Поскольку на файловую систему не распространяется транзакционность базы данных, во внешнем хранилище могут оставаться данные полей таблиц типа rbytea, которые были удалены или сохранены в незаконченных, отмененных транзакциях. Поэтому периодически запускается фоновый процесс очистки, который проходит по некоторому диапазону транзакций, очищая данные. При этом файлы перемещаются в каталог TRASH, который создается для каждой базы данных, указанной в параметре rbytea.databases_for_vacuuming.
После каждого запуска максимальный номер транзакции запоминается и при следующем запуске используется как нижняя граница диапазона сканирования. В качестве верхней границы диапазона сканирования используется последняя завершенная транзакция.
Параметры запуска указаны в параграфе ниже.
Особенности функционирования расширения rbytea
Rbytea в кластере и при использовании шифрования
При работе расширения в кластере существуют некоторые ограничения.
Каталог (точки монтирования файловой системы/тома) для сохранения образов данных, задаваемый в параметре rbytea.filesystem_storage_path, см. Параметры конфигурации расширения Rbytea, может:
- указывать на каталог в рамках одного локального хоста и использоваться исключительно этим одним хостом кластера,
- или на некоторый каталог сетевого файлового хранилища, используемого сразу всеми хостами кластера.
В первом случае, образы данных будут доступны только на данном конкретном хосте, где они и были созданы, и обращение к данным на других хостах кластера будет приводить к ошибке. Но, в данном случае, возможно использование шифрование данных с использованием QSS.
Во втором случае, образы данных будут доступны на всех хостах кластера, но использование шифрования в текущей версии QHB и расширения rbytea запрещено, поскольку каждый хост кластера обязан использовать свои рабочие ключи QSS, и зашифрованные одним ключом данные будут недоступны на других хостах (попытка чтения будет приводить к ошибке).
Обновление расширения с предыдущих версий
Версия расширения rbytea версии 1.2 существенно отличается от предыдущих версий расширения. Из-за этого нет возможности провести обновление расширения с ранних версий на текущую с использованием команды
ALTER EXTENSION rbytea UPDATE TO '1.2';
Возможно только удаление расширения предыдущей версии и создание уже с текущей версией командой
CREATE EXTENSION rbytea CASCADE;
При этом необходимо позаботиться о сохранении образов данных, если нет цели их полного пересоздания с потерей.
Это можно сделать миграцией
- через тип данных bytea,
- через сохранение образов на диске, где они размещались до миграции (если они не были зашифрованы),
- или через дамп, если образы данных были зашифрованы.
Подробные шаги такой миграции остаются на усмотрение администратора БД.
Разработчики QHB планируют разработку инструментария поддержки таких миграций в одном их следующих релизов.
Параметры конфигурации расширения
Для работы расширения нужно установить несколько параметров в конфигурационном файле (подробную информацию см. в подразделе Параметры конфигурации расширения Rbytea).