Пользовательские данные хранятся в двух довольно больших (> 1 ПБ) кластерах хранения OpenStack Swift. Пусть они будут Кластер А и Кластер B.
Кроме того, есть несколько PoPs которые должны взаимодействовать с этими данными. Серверы в этих PoP фактически бездисковые, что означает, что на них не хранятся и не загружаются пользовательские данные. PoP можно сгруппировать в общий мир регионы (например. Северная Америка, Южная Африка, Центральная Европа и другие.).
Некоторые точки доступа находятся на довольно большом расстоянии от конечных точек Swift любого из кластеров, что приводит к нежелательной задержке. Чтобы несколько смягчить это, я хочу настроить сервер шлюза кеширования в каждом из регионов, который будет кэшировать запросы чтения / записи в ближайший кластер.
В настоящее время клиенты в любом из PoP получают доступ к пользовательским данным через постоянно подключенный быстрая виртуальная файловая система, который представляет собой модуль 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.
Вопрос в том: Как я могу настроить кэширующий сервер на использование всех доступных ресурсов (выделенный раздел кеша, RAM) для максимально активного кеширования и максимального количества данных перед записью в точку монтирования svfs? В основном это сводится к следующему: как я могу кэшировать каталог в Linux?
Если возможно, операции чтения и записи должны быть объединены, а размеры блоков в запросах FUSE должны быть не менее 128 КБ, если это возможно, чтобы максимизировать пропускную способность и минимизировать задержку, если кеш-память должна записывать в кластер.
Приложение 1: Я переключил модуль монтирования кластера с svfs на S3QL на нескольких серверах. Кэширование S3QL немного улучшило производительность. Я постараюсь получить некоторые данные о производительности для полноты картины.
Я действительно не специалист в этой области (но это точно интересно!).
В последнее время я смотрел в основном на dm-cache для LVM с SSD для его кэширующей части. Вот пример текста из readhat, в котором есть хороший обзор, но он не привязан к RH: https://www.redhat.com/en/blog/improving-read-performance-dm-cache
Если внутренние механизмы Linux (например, cachefs
он же cachefilesd
) не работают И у вас есть бюджет, вы можете посмотреть ВСЗП (глобальные файловые службы). Это устройства, предназначенные для агрессивного кэширования NFS (и CIFS), чтобы попытаться скрыть задержки, обычно связанные с подключениями WAN.