Архитектура

ELiS построена на базе Модули Drupal, расширяющих стандартную поставку CMS Drupal7.

Приложения ELiS подключаются к сайту и забирают информацию из него используя API на базе JSON.

Работа всего ПО осуществляется под управлением ОС Linux. Для полнотекстового поиска используется движок Sphinx, который работает лучше и существенно быстрее стандартного поискового механизма Drupal. Внешний вид сайта построен с использованием Material Design.

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

Преимущества архитектуры ELiS перед аналогами

Использование Drupal в качестве ядра позволяет:

  1. Использовать тысячи бесплатных модулей Drupal для расширения функционала ELiS
  2. Привлекать веб-студии знакомые с Drupal для добавления специфичного функционала, снижая тем самым зависимость от разработчиков ELiS
  3. Создать полнофункциональный сайт, объединив на одном ресурсе информационный сайт и электронную библиотеку

Приципы работы

Информация о всех загружаемых документах хранится в нодах Drupal. Соответственно, на каждый документ генерируется нода определенного типа: для книги это ebook, для презентации presentation, для видео myvideo и т.д. Кроме этого, на каждую страницу PDF-файла генерируются ноды страниц типа ebookpage и эти ноды связываются с нодой книги с помощью CCK-поля типа Node Reference.

Для каждого типа контента создаются дополнительные CCK-поля, привязанные к нодам, в которых хранится служебная информация необходимая для корректной работы ELiS. Такие служебные поля заводятся при инсталляции системы и их нельзя удалять т.к. это может привести к нарушению целостности или функциональности загруженных документов.

Danger

Никогда не удаляйте служебные (созданные для работы ELiS) CCK-поля!

Когда пользователь открывает страницу сайта (ноду), модули ELiS перехватывают стандартный вывод Drupal и изменяют его, например, вставляя плеер книги или презентации. Внедрением в стандартный вывод Drupal обеспечивается защита книг.

Расширение функционала сайта

Любой существующий тип документов загруженных в ELiS можно расширять добавлением других CCK-полей. Так, например, для книги можно создать CCK-поле authorImage и прикрепить фотографии авторов.

Расширение функционала сайта не скажется на работе приложений ELiS.

Например, если вам требуется добавить в каталог произволные статьи, можно создать новый тип материалов, добавить к нему служебное CCK-поле *родительский каталог*.

Warning

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

Рендеринг PDF-файлов

Книги в формате PDF рендерятся на стороне сервера в разрешении, оптимальном для пользовательского устройства. Такой подход позволяет при наилучшем качестве уменьшить потребление сетевого трафика, что особенно актуально для низкоскоростных сетей и мобильных устройств.

Платой за такую оптимизацию является высокая нагрузка на процессор в момент выдачи страницы в заданном разрешении. Сгенерированные страницы кешируются на стороне сервера в папке /mnt/tmpfs для ускорения повторной выдачи страницы.

Нагрузка

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

Большие библиотеки

Архитектура электронной библиотеки ELiS для больших нагрузок

Архитектура ELiS для больших нагрузок

Виртуальные машины

В целях упрощения управления и резервного копирования, все сервера поставляются в виде образов виртуальных машин.

Безопасность

Все пользователи и библиотекари находятся во внешнем периметре. Для них доступны только 80, 443 порты балансировщика нагрузки. Доступ в защитный периметр имеет только администратор. Все сервера управляются по SSH.

Сервера приложений

Все запросы с балансировщика нагрузки попадают в кластер однотипных серверов приложений. Сервера приложений выполняют большую часть задач для работы ELiS, включая конвертацию страниц, авторизацию и проверку прав доступа, отдачу страниц в браузер и на мобильные устройства. На серверах приложений установлен Drupal7, php-fpm, nginx.

Сервера приложений генерируют большую нагрузку на центральный процессор, особенно при генерации страницы под устройство пользователя. Для увеличения числа обслуживаемых клиентов можно включить большее число серверов в кластер.

Все сервера приложений идентичны друг другу и их увеличение можно производить клонированием базового образа виртуальной машины.

Основная реляционная база данных

Drupal хранит большую часть информации о сайте и реализованном в ELiS функционале в базе данных MariaDB. Эта центральная база данных, обращение к которой происходит при каждом скачивании страницы или открытии сайта. Для работы с сотнями одновременных обращений необходимо позаботиться об высокой производительности сервера, оснастив его большим объемом ОЗУ и промышленными SSD-дисками.

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

Кеш

Для получения полной информации по книге с 1000 страниц в основную базу данных будет сделано около 5000 запросов. Время выполнения запросов на ненагруженном сервере составит около 1-2 секунд. Для снижения нагрузки на основную базу данных и уменьшения времени генерации страницы единожды загруженная книга сохраняется в кеше и, при следующем обращении, структура книги достается сразу из кеша. В качестве кеша с возможностью обращения по сети используется высокопроизводительная NoSQL база данных Redis. Redis сохраняет закешированные данные в ОЗУ и, с некоторым интервалом, сохраняет снимок памяти на диск.

Логи обращения к страницам

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

Достоинством MongoDB является возможность отложенной записи, когда отдача рисунка осуществляется без ожидания фактической записи логов в базу данных и высокая производительность при большом числе обращений. Благодаря технологии mmap, MongoDB пытается разместить и сохранить записи базы данных в ОЗУ после первого обращения, за счет чего существенно снижается нагрузка на файловую систему при чтении и ускоряются выборки. Для хранения данных также рекомендуется использовать SSD и большой размер оперативной памяти.

Поиск

Поисковые возможности реляционных баз данных плохо масштабируются на большие объемы текстов. В больших библиотеках для реализации поиска используются специализированные поисковые движки. В ELiS используется отечественный поисковый движок Sphinx, обеспечивающий корректный учет морфологии русского языка и позволяющий осуществлять горизонтальное масштабирование по мере необходимости. Первоночально из загруженных книг на сервере приложений вынимается текст и сохраняется в основной базе данных. Раз в сутки Sphinx обходит основную базу данных и заново иднексирует все полные тексты.

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

При большой нагрузке на поиск можно установить несколько серверов Sphinx и распределять поисковую нагрузку между серверами.

Система хранения

В ELiS можно выделить три типа файлов и применять к ним различные политики хранения.

  1. Файлы для постоянного хранения. Это сами книги и обложки к ним. Эти файлы удалять нельзя.
  2. Регенерируемые файлы, рекомендуемые к постоянному хранению. Эти файлы можно удалить, но рекомендуется их хранить для уменьшения времени выдачи страницы книги пользователям. К регенерируемым файлам относятся страницы книг с расширениями png, svg, jpg, webp в директории с PDF-файлом книги.
  3. Кеш отданных страниц. При показе страницы может потребоваться наложение защитных меток, водяных знаков и приведение страницы к запрошенному разрешению. Результаты этих преобразований сохраняются в отдельной директории и могут быть безопасно удалены в любой момент. В виду того, что при активном обращении таких файлов будет очень много, они должны периодически удаляться, для чего предусмотрен соответствующий скрипт.

Файлы из политик 1 и 2 обязаны храниться на общей для всех серверов приложений файловой системе. Для файлов из политики 3 допустимо использование локальных дисков серверов приложений (желательно использование SSD).

В больших библиотеках размер файловой системы будет составлять десятки терабайт и получить его на одном сервере нельзя. При этом можно использовать два подхода:

  1. Покупка промышленной системы хранения большой емкости и монтирование этой емкости по NFS к серверам приложений.
  2. Использование кластерной файловой системы, такой как GlusterFS.

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