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.