Пользовательские данные хранятся в двух довольно больших (> 1 ПБ) хранилищах OpenStack Swift. Пусть они будут Кластер А и кластер В .
Кроме того, есть несколько PoP, которые должны взаимодействовать с этими данными. Серверы в этих PoP практически бездисковые, то есть пользовательские данные не хранятся и не загружаются на них. ПП могут быть сгруппированы в общие регионы мира (например, Северная Америка , Южная Африка , Центральная Европа и др.).
Некоторые PoP довольно далеко от конечных точек Swift любого из кластеров, что создает нежелательную задержку. Чтобы несколько смягчить это, я хочу настроить сервер шлюза кэширования в каждом из регионов, который будет кэшировать запросы на удаленный доступ к ближайшему кластеру.
В настоящее время клиенты в любом из PoP получают доступ к данным пользователя через постоянно смонтированную виртуальную файловую систему swift , которая представляет собой модуль FUSE, который монтирует Swift Object Storage в качестве блочного устройства (более или менее). Однако svfs не так уж и стабилен, и в будущем клиенты должны получать доступ к серверам кеша через NFS.
Это схема одной ветви желаемой архитектуры:
+------------------+ +------------------+ NFS +------------------+
| Cluster A | SVFS | Region 1 Cache +----------> R1 PoP a Client |
| +----------------> | | |
|Persistent Storage| |Ephemeral Storage+----+ |Generates R/W Load|
+-----------------++ +------------------+ | +------------------+
| |
| +------------------+ | NFS +------------------+
| SVFS | Region 2 Cache | +-----> R1 PoP b Client |
+-----------------> | | |
|Ephemeral Storage| |Generates R/W Load|
+------------------+ +------------------+
Я знаком с основами настройки NFS и svfs.
Вопрос заключается в следующем : как настроить сервер кэширования для использования всех доступных ресурсов (выделенный раздел кэша, ОЗУ) для максимально агрессивного кеширования и максимально возможного объема данных перед записью в точку монтирования svfs? В основном это сводится к следующему: Как я могу кэшировать каталог в Linux?
Если возможно, операции чтения и записи должны быть объединены, а размеры блоков в запросах FUSE должны быть не менее 128 КБ, если это возможно, чтобы максимизировать пропускную способность и минимизировать задержку, если кэш должен выполнять запись в кластер.
Приложение 1 : Я переключил модуль монтирования кластера с svfs на S3QL на нескольких серверах. Кеширование S3QL немного улучшило производительность. Я постараюсь получить некоторые данные о производительности для полноты.
источник
Ответы:
Если встроенные механизмы linux (например,
cachefs
akacachefilesd
) не работают и у вас есть бюджет, вы можете посмотреть на WAFS (глобальные файловые службы). Это устройства, предназначенные для агрессивного кеширования NFS (и CIFS), чтобы скрыть задержки, обычно связанные с каналами WAN.источник
Я действительно не эксперт в этой области (но это, безусловно, интересно!).
В последнее время я смотрел в основном на dm-кеш для LVM, а для кеширующей части - SSD. Вот пример текста из readhat, который имеет хороший обзор, но он не привязан к RH: https://www.redhat.com/en/blog/improving-read-performance-dm-cache
источник