Файловые хранилища

Система предоставляет несколько вариантов хранения файлов, прикрепляемых к объектам в процессе работы:

  • База данных.
  • Файловая система на сервере приложения.
  • Хранилище, работающее по протоколу S3, например, Amazon S3, Ceph.
  • Любое файловое хранилище через groovy-модуль.

Основываясь на опыте эксплуатации информационных систем на основе SMP, рекомендуем всегда настраивать хранение файлов вне базы данных. Хранение файлов в базе данных приложения допустимо для небольших инсталляций и в качестве временного решения на начальном этапе эксплуатации при условии последующего скорейшего перемещения файлов в отдельное хранилище.

Параметры файловых хранилищ настраиваются в конфигурационном файле системы — file-storage.xml. В конфигурационном файле можно указать одно или несколько файловых хранилищ. Только одно хранилище файлов может быть активным, т.е. доступным для записи файлов.

Раздельное хранение файлов настройки и пользовательских файлов

По умолчанию все файлы хранятся в базе данных.

Если настроено файловое хранилище, то пользовательские файлы загружаются в активное файловое хранилище.

К пользовательским файлам относятся:

  • файлы, добавленные в контенте "Список файлов";
  • файлы, добавленный к объекту (кнопка "Добавить файл");
  • файлы, добавленные как значение атрибута "Файл";
  • экземпляры отчетов в контенте "Список отчетов";
  • изображения, добавляемые в атрибутах типа "Текст в формате RTF";
  • файлы входящих писем.

Файлы настройки, загружаемые через интерфейс администратора (системные файлы), всегда хранятся в базе данных.

К системным файлам относятся:

  • шаблоны отчетов;
  • изображения элементов справочников;
  • логотипы;
  • фавикон;
  • изображения в значениях по умолчанию атрибутов типа "Текст в формате RTF".

Место хранения файла хранится в базе данных (параметр storage в таблице TBL_FILE). Для системных файлов всегда пусто, т.к. они хранятся в базе данных. Для пользовательских и временных файлов всегда заполнено названием файлового хранилища.

Настройка файлового хранилища

Чтобы настроить хранение файлов вне базы данных, выполните следующие действия::

  1. Создайте конфигурационный файл file-storage.xml, см. Конфигурационный файл file-storage.xml.

    Если настройки использования хранилища ssl-ключей отличаются от настройки по умолчанию (указана java опция -Djavax.net.ssl.trustStore), то при использовании S3-файлового хранилища необходимо установить java-опцию -Dcom.amazonaws.sdk.disableCertChecking=true

  2. Примените изменения в файле 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>

Необязательный параметр.

Регулирует возможность "склеивания" файлов. Склеивание файлов — процедура присвоения одного хеша и одного соответствующего контента целой группе файлов, если среди загруженных присутствуют файлы с одинаковым контентом.

Возможные значения:

  • true (по умолчанию) — при загрузке файлов с одинаковым контентом (дубликатов), этим файлам присваивается один хеш и один соответствующий контент;
  • false — при загрузке файлов с одинаковым контентом (дубликатов), каждому новому загруженному файлу присваивается свой контент и хеш

Перед переключением параметра <deduplication> c false на true необходимо выполнять команду api.fileStorage.shrink(), см. api.fileStorage Работа с файловыми хранилищами

Код файлового хранилища

тег <code>

Код используется для указания активного хранилища

Описание файлового хранилища

тег <description>

Путь до хранилища в файловой системе

тег <path>

Только для хранения файлов в файловой системе.

Директория, указанная в этом параметре, должна существовать и быть пустой.

После применения конфигурации в данном каталоге будет создана структура для хранения файлов

Сжатие

тег <compress>

Параметр, определяющий автоматическое сжатие файлов, загружаемых в хранилище.

При изменении параметра у существующего хранилища, автоматического сжатия ранее загруженных файлов не производится (для сжатия необходимо выполнить скрипт, см. Операции с файловыми хранилищами).

В базе данных все файлы хранятся в сжатом виде

Тип хранилища

тег <type>

Необязательный параметр.

Тип хранилища, позволяет выбрать в качестве хранилища файловую систему или Amazon S3.

Возможные варианты:

  • disk — используется файловая система;
  • s3 — AWScredentials должны быть сконфигурированы;
  • groovy — groovyExtendedStorage должен быть сконфигурирован, необходим groovy-модуль с реализацией

Код s3endpoint

тег <s3endpoint>

Необязательный параметр

Код s3endpoint, где описаны параметры подключения

Имя бакета в S3

тег <bucketName>

Необязательный параметр

Имя бакета в S3. Если его не существует, то он будет создан

Правило именования:

  • Имя бакета не должно содержать меньше 3 или больше 63 символов
  • Имя бакета может содержать символы в нижнем регистре, цифры или точку
  • Каждая часть имени бакета, разделенная точкой должна начинаться с символа в нижнем регистре или цифры и оканчиваться на символ в нижнем регистре или цифру

Структура S3 хранилища

тег <hierarchical>

Необязательный параметр.

Структура каталогов для файлового хранилища S3.

Возможные значения:

  • false (по умолчанию) — плоская структура;
  • true — иерархическая структура

Пример: <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 приводит к временным блокировкам таблиц, поэтому должно проводиться в часы наименьшей нагрузки.

Перемещение файлового хранилища в файловой системе

Перемещение файлового хранилища в файловой системе может выполняться двумя способами.

  • Перемещение каталога хранилища и изменение конфигурации приложения.

    1. Остановите приложение.

    2. Переместите каталог файлового хранилища в нужное место.

    3. Измените путь до файлового хранилища в конфигурационном файле file-storage.xml.

    4. Запустите приложение.

    Достоинства: простота, отсутствие необходимости множить файловые хранилища.

    Недостатки: простой приложения.

  • Создание нового хранилища, перемещение в него файлов, отключение старого хранилища, удаление старого хранилища.

    1. Создайте каталог хранилища в файловой системе.

    2. Добавьте блок с описанием хранилища в конфигурационном файле file-storage.xml.

    3. Измените активное хранилище в конфигурационном файле file-storage.xml на новое. После применения настроек новые файлы будут помещаться в новое файловое хранилище.

    4. Примените настройки с помощью:

      api.fileStorage.reload()

    5. Запустите перенос файлов из старого файлового хранилища в новое с помощью:

      api.fileStorage.moveAll('oldStorageCode', 'newStorageCode')

    6. Когда перенос будет завершен и в старом файловом хранилище не останется файлов, удалите блок с описанием старого хранилища в конфигурационном файле file-storage.xml.

    7. Примените настройки с помощью:

      api.fileStorage.reload()

    8. Удалите каталог со старым файловым хранилищем. Перед удалением рекомендуется сделать его резервную копию на случай, если не все файлы были перемещены в новое хранилище.

    Достоинства: все операции производятся при запущенном приложении.

    Недостатки: перемещение файлового хранилища таким способом требует больше времени.

См. также: