Jak skonfigurować serwer NFS, który buforuje udział sieciowy?

14

Dane użytkownika są przechowywane w dwóch dość dużych (> 1 PB) klastrach pamięci OpenStack Swift. Niech będą Cluster i Cluster B .

Ponadto istnieje kilka punktów PoP, które muszą wchodzić w interakcje z tymi danymi. Serwery w tych punktach PoP są w zasadzie bezdyskusyjne, co oznacza, że ​​żadne dane użytkownika nie są na nich przechowywane ani nigdy do nich pobierane. Punkty PoP można pogrupować według regionów świata (np. Ameryka Północna , Afryka Południowa , Europa Środkowa i in.).

Niektóre punkty PoP znajdują się dość daleko od Szybkich punktów końcowych któregokolwiek z klastrów, wprowadzając niepożądane opóźnienie. Aby nieco to złagodzić, chcę skonfigurować serwer bramy pamięci podręcznej w każdym regionie, który będzie buforował żądania r / w do najbliższego klastra.

Obecnie klienci w dowolnym punkcie dostępowym uzyskują dostęp do danych użytkownika przez zamontowany na stałe szybki wirtualny system plików , który jest modułem FUSE, który montuje Swift Object Storage jako urządzenie blokowe (mniej więcej). Jednak svfs nie jest wcale tak stabilny, a w przyszłości klienci powinni uzyskiwać dostęp do serwerów pamięci podręcznej przez NFS.

Oto schemat jednej gałęzi pożądanej architektury:

+------------------+                +------------------+    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|
                                    +------------------+          +------------------+

Znam podstawy konfiguracji NFS i svfs.

Pytanie brzmi : w jaki sposób mogę skonfigurować serwer buforujący, aby używał wszystkich dostępnych zasobów (wyznaczonej partycji pamięci podręcznej, pamięci RAM) do buforowania tak agresywnie i jak największej ilości danych przed zapisaniem do punktu montowania svfs? Zasadniczo sprowadza się do: Jak mogę buforować katalog w systemie Linux?

Jeśli to możliwe, odczyty i zapisy powinny być skonsolidowane, a rozmiary bloków w żądaniach FUSE powinny wynosić co najmniej 128k, jeśli to możliwe, aby zmaksymalizować przepustowość i zminimalizować opóźnienia, jeśli pamięć podręczna musi zapisać w klastrze.

Dodatek 1 : Na kilku serwerach zmieniłem moduł montowania klastra z svfs na S3QL. Buforowanie S3QL nieco poprawiło wydajność. Spróbuję uzyskać pewne dane dotyczące wydajności dla kompletności.

mınxomaτ
źródło
możesz spróbować włączyć pamięć podręczną fs na klientach NFS: cyberciti.biz/faq/…
kofemann
Proszę spojrzeć na serverfault.com/a/441443/345699 . Być może pomoże to w twoim zadaniu
Steven K7FAQ,

Odpowiedzi:

1

Jeśli nieodłączne mechanizmy linuksowe (jak cachefsaka cachefilesd) nie działają ORAZ masz budżet, możesz spojrzeć na WAFS (usługi plików rozległych). Są to urządzenia zaprojektowane do agresywnego buforowania NFS (i CIFS), aby spróbować ukryć opóźnienia zwykle związane z łączami WAN.

chrześcijanin
źródło
1

Naprawdę nie jestem ekspertem w tej dziedzinie (ale z pewnością jest to interesujące!).

To, czego ostatnio szukałem, to głównie pamięć podręczna dm dla LVM, z dyskami SSD dla części buforującej. Oto przykładowy tekst z readhat, który ma dobry przegląd, ale nie jest powiązany z RH: https://www.redhat.com/en/blog/improving-read-performance-dm-cache

Fredrik Lundhag
źródło