Файловые хранилища
Система предоставляет несколько вариантов хранения файлов, прикрепляемых к объектам в процессе работы:
- База данных.
- Файловая система на сервере приложения.
- Хранилище, работающее по протоколу S3, например, Amazon S3, Ceph.
- Любое файловое хранилище через groovy-модуль.
Основываясь на опыте эксплуатации информационных систем на основе SMP, рекомендуем всегда настраивать хранение файлов вне базы данных. Хранение файлов в базе данных приложения допустимо для небольших инсталляций и в качестве временного решения на начальном этапе эксплуатации при условии последующего скорейшего перемещения файлов в отдельное хранилище.
Параметры файловых хранилищ настраиваются в конфигурационном файле системы — file-storage.xml. В конфигурационном файле можно указать одно или несколько файловых хранилищ. Только одно хранилище файлов может быть активным, т.е. доступным для записи файлов.
Раздельное хранение файлов настройки и пользовательских файлов
По умолчанию все файлы хранятся в базе данных.
Если настроено файловое хранилище, то пользовательские файлы загружаются в активное файловое хранилище.
К пользовательским файлам относятся:
- файлы, добавленные в контенте "Список файлов";
- файлы, добавленный к объекту (кнопка "Добавить файл");
- файлы, добавленные как значение атрибута "Файл";
- экземпляры отчетов в контенте "Список отчетов";
- изображения, добавляемые в атрибутах типа "Текст в формате RTF";
- файлы входящих писем.
Файлы настройки, загружаемые через интерфейс администратора (системные файлы), всегда хранятся в базе данных.
К системным файлам относятся:
- шаблоны отчетов;
- изображения элементов справочников;
- логотипы;
- фавикон;
- изображения в значениях по умолчанию атрибутов типа "Текст в формате RTF".
Место хранения файла хранится в базе данных (параметр storage в таблице TBL_FILE). Для системных файлов всегда пусто, т.к. они хранятся в базе данных. Для пользовательских и временных файлов всегда заполнено названием файлового хранилища.
Настройка файлового хранилища
Чтобы настроить хранение файлов вне базы данных, выполните следующие действия::
-
Создайте конфигурационный файл file-storage.xml, см. Конфигурационный файл file-storage.xml.
Если настройки использования хранилища ssl-ключей отличаются от настройки по умолчанию (указана java опция -Djavax.net.ssl.trustStore), то при использовании S3-файлового хранилища необходимо установить java-опцию -Dcom.amazonaws.sdk.disableCertChecking=true
-
Примените изменения в файле file-storage.xml, для этого перезапустите Tomcat — Linux или выполните скрипт в консоли приложения:
api.fileStorage.reload()
Конфигурационный файл file-storage.xml
Конфигурационный файл для настройки файловых хранилищ.
В конфигурационном файле file-storage.xml настраивается количество файловых хранилищ, их тип, активное хранилище и прочие характеристики.
Наличие файла не обязательно.
Путь к файлу
Файл создается и хранится в каталоге, путь к которому указан в параметре -Dext.prop.dir виртуальной машины Java. Например, Dext.prop.dir=/opt/nausd4/conf.
Параметры файлового хранилища
| Характеристика | Блок или тег в файле | Описание |
|---|---|---|
| Число файловых хранилищ | количество блоков <storage> |
Число файловых хранилищ соответствует количеству блоков. Можно настроить одно или несколько файловых хранилищ |
| Активное хранилище | тег <active> |
Хранилище, в котором размещаются файлы при добавлении. Другие хранилища будут хранить ранее добавленные в них файлы. Если активное хранилище не указано (тег <active> </active> удален вместе с содержимым), то файлы будут помещаться в базу данных |
|
Включение механизма "склеивания" файлов" |
тег <deduplication> |
Необязательный параметр. Регулирует возможность "склеивания" файлов. Склеивание файлов — процедура присвоения одного хеша и одного соответствующего контента целой группе файлов, если среди загруженных присутствуют файлы с одинаковым контентом. Возможные значения:
Перед переключением параметра <deduplication> c false на true необходимо выполнять команду api.fileStorage.shrink() |
|
Код файлового хранилища |
тег <code> |
Код используется для указания активного хранилища |
|
Описание файлового хранилища |
тег <description> |
– |
|
Путь до хранилища в файловой системе |
тег <path> |
Только для хранения файлов в файловой системе. Директория, указанная в этом параметре, должна существовать и быть пустой. После применения конфигурации в данном каталоге будет создана структура для хранения файлов |
|
Сжатие |
тег <compress> |
Параметр, определяющий автоматическое сжатие файлов, загружаемых в хранилище. При изменении параметра у существующего хранилища, автоматического сжатия ранее загруженных файлов не производится (для сжатия необходимо выполнить скрипт, см. Операции с файловыми хранилищами). В базе данных все файлы хранятся в сжатом виде |
|
Тип хранилища |
тег <type> |
Необязательный параметр. Тип хранилища, позволяет выбрать в качестве хранилища файловую систему или Amazon S3. Возможные варианты:
|
|
Код s3endpoint |
тег <s3endpoint> |
Необязательный параметр Код s3endpoint, где описаны параметры подключения |
|
Имя бакета в S3 |
тег <bucketName> |
Необязательный параметр Имя бакета в S3. Если его не существует, то он будет создан Правило именования:
|
|
Структура S3 хранилища |
тег <hierarchical> |
Необязательный параметр. Структура каталогов для файлового хранилища S3. Возможные значения:
Пример: <hierarchical>false</hierarchical> |
Параметры настройки хранилища, работающего по протоколу S3 (Amazon S3, Ceph)
| Характеристика | Блок или тег в файле | Описание |
|---|---|---|
| Список конфигураций для S3 | тег <s3endpoints> |
Необязательный параметр Настройка различных доступов к S3. Должен быть, если есть хотя бы одно S3 хранилище |
| Конфигурация S3 хранилища | тег <s3endpoint> |
Необязательный параметр Настройка доступа к S3, параметр заполняется, если есть хотя бы одно S3 хранилище |
|
Код |
тег <code> |
Уникальный код для данного s3endpoint |
| Ключ доступа к S3 | тег <accessKey> | AccessKey из реквизитов доступа к S3 |
|
Секретный ключ доступа к S3 |
тег <secretKey> |
SecretKey из реквизитов доступа к S3 |
|
Адрес S3 хранилища |
тег <url> |
Необязательный параметр. Указывается только при использовании S3-хранилища, отличного от AWS S3. Пример: <url>https://ceph-storage.domain.local/</url> |
|
Количество попыток |
тег <numberOfAttempts> |
Только для хранения файлов в S3. Число, обозначающее сколько раз подряд операции должны прерваться по тайм-ауту, чтобы файловое хранилище заблокировалось на определенное время |
|
Таймаут для операции |
тег <taskTimeout> |
Только для хранения файлов в S3. Таймаут выполнения действия в файловом хранилище в миллисекундах |
|
Время блокировки |
тег <rampDownPeriod> |
Только для хранения файлов в S3. Время в миллисекундах, на которое нужно заблокировать файловое хранилище, если numberOfAttempts раз подряд выполнение операций прерывалось по таймауту |
Параметры настройки хранилища, работающего через groovy-модуль
| Характеристика | Блок или тег в файле | Описание |
|---|---|---|
| Конфигурация groovy хранилища | тег <groovyExtendedStorage> |
Необязательный параметр Настройка доступа к groovy-файловому хранилищу. Должен быть, если есть хотя бы одно хранилище типа groovy |
| Название модуля | тег <module> |
Название модуля, который содержит реализацию взаимодействия с файловым хранилищем |
|
Метод, возвращающий реализацию FileStorageCRUD |
тег <method> |
Метод, который должен возвращать реализацию интерфейса ru.naumen.core.server.filestorage.spi.storages.FileStorageCRUD |
|
Параметры инициализации |
тег <initParams> |
Параметры передаваемые в метод указанный в теге method |
Интерфейс Interface FileStorageCRUD
Интерфейс для основных операций с внешним файловым хранилищем предназначен для реализации в groovy-модуле.
-
create
java.lang.String create(DtObject file, java.io.InputStream content)
Создание файла во внешнем хранилище.
Параметры:
- file — БО файл;
- content — содержимое файла
Возвращает идентификатор файла.
-
delete
void delete(java.lang.String id)
Параметр:
- id — идентификатор файла.
-
exists
boolean exists(java.lang.String id)
Проверить существование файла.
Параметр:
- id — идентификатор файла.
Возвращает true, если файл существует во внешнем хранилище.
-
getFilePath
java.lang.String getFilePath(java.lang.String uuid)
Получить идентификатор файла во внешнем хранилище.
Параметр:
- uuid — идентификатор БО типа file.
Возвращает идентификатор файла во внешнем хранилище.
-
read
java.io.InputStream read(java.lang.String id)
Получить содержимое файла.
Параметр:
- id — идентификатор файла.
Возвращает содержимое файла.
-
saveFilePath
void saveFilePath(java.lang.String uuid, java.lang.String externalId)
Параметры:
- uuid — идентификатор БО типа file;
- externalId — идентификатор файла во внешнем хранилище
-
update
void update(java.lang.String id, DtObject file, java.io.InputStream content)
Обновить содержимое файла во внешнем хранилище.
Параметры:
- id — идентификатор файла;
- file — БО файл;
- content — содержимое файла.
Примеры
Операции с файловыми хранилищами
Сжатие всех файлов, ранее добавленных в файловое хранилище
Для сжатия всех файлов, ранее добавленных в файловое хранилище, в консоли интерфейса технолога выполните скрипт:
api.fileStorage.compressAll('storageCode')
где storageCode — код файлового хранилища либо null, если необходимо сжать файлы в хранилище расположенном в базе (null указывается без кавычек).
Перемещение файлов, ранее добавленных в файловое хранилище
Для перемещения всех ранее добавленных файлов из одного хранилища в другое, в консоли интерфейса технолога выполните скрипт:
api.fileStorage.moveAll('oldStorageCode', 'newStorageCode')
где:
- oldStorageCode — код файлового хранилища либо null. Если файлы переносятся из хранилища, расположенного в базе, вместо кода нужно указать null (указывается без кавычек);
- newStorageCode — код файлового хранилища. Если файлы переносятся в хранилище, расположенное в базе, вместо кода нужно указать null (указывается без кавычек).
При переносе файлов из несжатого хранилище в сжатое, все переносимые файлы сжимаются. При переносе файлов из сжатого хранилище в несжатое, все переносимые файлы распаковываются.
Особенности переноса файлов из базы данных в файловое хранилище. После переноса файлов из базы данных в файловое хранилище, база данных не уменьшится в размере автоматически (СУБД отметит место для себя как освобожденное, но не вернет его операционной системе). При необходимости освобождения места на диске с базой данных необходимо выполнить следующее:
- Для MS SQL Server воспользуйтесь командой SHRINKDATABASE или выполните shrink database из интерфейса SQL Managment Studio.
- Для Oracle выполните resize для нужного datafile.
- Для Postgresql выполните vacuumlo, а затем vacuum full. Внимание! Выполнение vacuum full приводит к временным блокировкам таблиц, поэтому должно проводиться в часы наименьшей нагрузки.
Перемещение файлового хранилища в файловой системе
Перемещение файлового хранилища в файловой системе может выполняться двумя способами.
-
Перемещение каталога хранилища и изменение конфигурации приложения.
-
Остановите приложение.
-
Переместите каталог файлового хранилища в нужное место.
-
Измените путь до файлового хранилища в конфигурационном файле file-storage.xml.
-
Запустите приложение.
Достоинства: простота, отсутствие необходимости множить файловые хранилища.
Недостатки: простой приложения.
-
-
Создание нового хранилища, перемещение в него файлов, отключение старого хранилища, удаление старого хранилища.
-
Создайте каталог хранилища в файловой системе.
-
Добавьте блок с описанием хранилища в конфигурационном файле file-storage.xml.
-
Измените активное хранилище в конфигурационном файле file-storage.xml на новое. После применения настроек новые файлы будут помещаться в новое файловое хранилище.
-
Примените настройки с помощью:
api.fileStorage.reload()
-
Запустите перенос файлов из старого файлового хранилища в новое с помощью:
api.fileStorage.moveAll('oldStorageCode', 'newStorageCode')
-
Когда перенос будет завершен и в старом файловом хранилище не останется файлов, удалите блок с описанием старого хранилища в конфигурационном файле file-storage.xml.
-
Примените настройки с помощью:
api.fileStorage.reload()
-
Удалите каталог со старым файловым хранилищем. Перед удалением рекомендуется сделать его резервную копию на случай, если не все файлы были перемещены в новое хранилище.
Достоинства: все операции производятся при запущенном приложении.
Недостатки: перемещение файлового хранилища таким способом требует больше времени.
-
См. также:
-
api.fileStorage Работа с файловыми хранилищами
Описание всех скриптовых методов для операций с файловыми хранилищами
-
Скрипты, выполняемые в консоли
Скрипты выполняются в консоли интерфейса администратора.