niedziela, 8 sierpnia 2010

ISM - Inteligenty system storage - czyli jak EMC definiuje macierz dyskową

Intelligent Storage System


Intelligent Storage System ( ISS ) jest macierzą RAID z wbudowanymi dodatkowymi opcjami i możliwościami , które pozwalają na utrzymanie dużej wydajności oraz optymalizację ruchu I/O z i na dyski.

Zalety jakie ISS ma w porównaniu do JBODów i "zwykłych" macierzy RAID:
  • Zwiększona pojemność,
  • Zwiększona wydajność,
  • Łatwiejsze zarządzanie,
  • Zwiększona dostępność i ochrona danych,
  • Zwiększone wsparcie dla procesów zachowania ciągłości ( Bussiness Continuity ),
  • Zwiększone bezpieczeństwo i kontrola nad dostępem do danych

ISS, składa się z 4 kluczowych elementów:
  • frond end
  • cache
  • back end
  • physical disks
Żądanie I/O wysłane przez hosta najpierw przychodzi na porty front endu , potem idzie do cache-a , a następnie poprzez back-end zostaje wysłane na dyski fizyczne.


Front End

Front end jest interfejsem pomiędzy macierzą a hostem. Składa się z dwóch głównych komponentów:
Portów front-endowych i kontrolerów front-endowych. Front-end port pozwala hostowi podłączyć się do ISSa. Każdy port jest w stanie obsłużyć jeden wybrany protokół transportu ( np: SCSI , FC , iSCSI itd.)
Front-end kontroler kieruje dane do i z cachu poprzez wewnętrzną magistralę danych. Kiedy dane zostają nagrane w cache kontroler wysyła do hosta potwierdzenie.
Kontrolery optymalizują ruch I/O używając algorytmów kolejkowania poleceń ( command queuing algorithms)

Front End Command Queuing

Kolejkowanie danych (command quequing) jest funkcjonalnością zaimplementowaną w front-end kontrolerach. Pozwala ona na zmianę kolejności żądań I/O jakie są wysyłane na dyski w porównaniu do tej w jakiej przyszły od strony hosta.
Najbardziej znane algorytmy kolejkowania są następujące:
  • First In First Out (FIFO) - standardowy algorytm ( czy raczej jego brak) , polecenia są wykonywane w takiej kolejności w jakiej przybyły do kontrolera
  • Seek Time Optimization - Kolejność wykonywania poleceń jest zmieniana w taki sposób aby ograniczyć do minimum ruch głowicy R/W.
  • Access Time Optimization - Kolejność wykonywania poleceń jest zmieniana w taki sposób aby zminimalizować czas dostępu do danych. Algorytm bierze pod uwagę ruch głowicy oraz ruch obrotowy talerza aby ustalić optymalną kolejność wykonywania poleceń.


Cache

Zadaniem cache jest przyśpieszyć i zoptymalizować wydajność przetwarzania żądań I/O. Jest zbudowany z pamięci półprzewodnikowej, na której dane są tymczasowo zapisywane, aby zmniejszyć czas potrzebny do obsługi żądań I/O ze strony hosta. Użycie pamięci cache pozwala na szybsze obsłużenie I/O.

Write cache:

Operacje zapisu umieszczane w cache są obsługiwane ( z punktu widzenia hosta ) dużo szybciej niż gdyby miały zapisywane na dyskach. Dodatkowo "niewielkie" zapisy mogą być łączone w cache w większe, sekwencyjne i zapisywane na dyskach dużymi partiami.
Operacje zapisu w cache mogą być zaimplementowane w następujący sposób:
  • Write-back cache - dane są umieszczane w cache i od razu potwierdzenie jest wysyłane do hosta. Później zapisane dane są wysyłane na dyski fizyczne (de-staged). Operacje zapisu są dużo szybsze, ale istnieje niebezpieczeństwo, utraty danych, w wypadku awarii cache.
  • Write-through cache - dane są umieszczane w cache i natychmiast zapisywane na dysku, po czym potwierdzenie jest wysyłane do hosta. Operacje te trwają dłużej , ale szansa utraty danych jest znacznie zredukowana.
Cache może być pominięty, jeżeli żądanie I/O jest bardzo duże.Jeżeli pojedyncze I/O przekroczy pewną ustawioną wielkość zwaną "write aside size", to dane są zapisywane bezpośrednio na dysk.

Read cache:

Kiedy host wysyła żądanie odczytu, front-end kontroler sprawdza czy potrzebne dane są w cache. Jeżeli tak, to nazywamy taką sytuację "read cache hit" lub "read hit" i dane są przesyłane bezpośrednio do hosta, bez angażowania dysków. Jeżeli danych nie ma w cache, to mamy do czynienia z "cache miss" i trzeba sięgnąć do dysków. Back end kontroler pobiera wymagane dane, po czym zapisuje je na cache , z cache dane idą do oczekującego na nie hosta. Cache miss zwiększa czas odpowiedzi. Jeżeli żadania odczytu są sekwencyjne, wtedy macierz używa algorytmu nazywanego pre-fetch lub read-ahead.  Polega on na pobraniu większej ilości danych, niż to potrzeba i umieszczeniu ich w cache. Wielkość "nadmiarowych" danych może być stała "fixed pre-fetch" lub zmienna "variable pre-fetch". Wydajność odczytu mierzy się często współczynikiem "read hit ratio"  lub "hit rate" zwykle wyrażonym w %.

Algorytmy zarządzania cache:

Cache ma ograniczoną wielkość , dlatego bardzo ważne jest aby dane które się w nim znajdują, były danymi, do których często sięga host. Istnieją dwa główne algorytmy zarządzania i czyszczenia cache:

  • Least Recently Used (LRU):  z cache usuwane są te strony pamięci, które nie były wykorzystywane przez długi czas.Ten algorytm zakłada, że dane, które długo nie były potrzebne hostowi, dalej nie będą używane.
  • Most Recently Used (MRU): Ten algorytm usuwa z pamięci te dane, które ostatnio były używane. Opiera się na założeniu, że skoro host "poprosił" o pewne dane, to nie będzie ich ponownie potrzebował.

Cache: Watermarking

Jeżeli cache zaczyna się wypełniać, system musi usunąć (flushing) z niego tzw: dirty pages, czyli te dane które jeszcze nie zostały zapisane na dyski. Na macierzy ustawia się dwa znaczniki, wysoki (high watermark) i niski (low watermark). Wysoki znacznik mówi w którym momencie ( w jakim % zajętości cache ) macierz zaczyna zrzucać dirty pages na dyski , niski znacznik mówi przy jakiej zajętości ten proces się kończy.


Ogólnie macierz stosuje 3 rodzaje "czyszczenia cache":
  • idle flushing - zachodzi, gdy poziom utylizacji cache jest pomiędzy low a high watermarkiem
  • high watermark flushing - zachodzi, gdy współczynik utylizacji jest większy niż high watermark. Macierz przeznacza wtedy dodatkowe zasoby do przyśpieszenia zrzucanie danych na dyski.
  • Forced flushing - zachodzi, gdy współczynik utylizacji cache zbliża się do 100%. Jest to najintensywniejsze i najbardziej obciążające wydajność czyszczenie.
Burst smoothing - absorbowanie przez cache dużych nagłych i chwilowych wzrostów I/O (bursting)

Cache Data Protection

Utrata danych znajdujących się w cache przed ich nagraniem na dysk powoduje, że dane te są tracone niedwracalnie. Aby się przed tym zabezpieczyć stosuje się 2 metody ochrony:
  • Cache mirroring : Każdy zapis do cache jest przechowywany w dwóch odrębnych miejscach, na dwóch niezależnych kartach/układach. Mirrorowany jest jedynie write cache,  read cache zawsze jest nagrany na dyskach, więc nie ma potrzeby aby go dublować. Przy mirrorowaniu cache, należy uważac na cache coherency, czyli zapewnienie, że jest on w obydwu miejscach identyczny.
  • Cache vaulting :  W razie awarii zasilania ISS mają baterie, które podtrzymują działanie cache. Jednak w przypadku przedłużającego się braku zasilania, mogą one się rozładować, co w efekcie doprowadziło by do utraty danych. Aby temu zapobiec, macierz ma specjalny zestaw dysków, zwanych vault drives, na który przegrywana jest zawartość cache, w przypadku utraty zasilania.


Back End

Back end jest interfejsem pomiędzy cache, a fizycznymi dyskami. Składa się z dwóch komponentów: back end portów i back end kontrolerów. Kontrolery są używane do przesyłania danych z cache na dyski, odługują także wykrywanie i korekcję błędów, oraz zapewniają funkcjonalność tworzenia struktur RAIDowych. Dla zapewnienia większej wydajności, oraz dostępności ISS zwykle posiada parę kontrolerów i wiele portów.


RAID Sets and LUNs

Dyski fizyczne lub grupy dysków w RAIDzie mogą być podzielone (logicznie) na kawałki zwane logicznymi wolumenami lub LUNami (Logical Unit Number). LUN jest tym co zostaje wystawione do hosta i prezentuje mu się jako fizyczny dysk. W rzeczywistości LUN zajmuje po kawałku każdego dysku jaki wchodzi w skład Grupy RAIDowej na której się znajduje. Rozmiar LUNa może być zwiększony poprzez połączenie go z innym LUNem. Taka nowa struktura nosi nazwę meta-LUN.



LUN Masking

Maskowanie to przydzielanie dostępu hostom do poszczególnych LUNów.





Dotarliśmy na koniec pierwszej partii (sekcji) materiału przeznaczonego dla ISMa. Przed nami jeszcze trzy...
Skomplikowanie i ilość materiału w nich myślę, że będzie podobna - czyli sprawy raczej elementarne czasem ze wchodzeniem dość głęboko w szczegóły i definicje.
Moduł, który zaczniemy przerabiać w następnym wpisie ma tytuł: Storage Networking Technologies and Virtualization


4 komentarze:

  1. Czy LUN to jest to samo co partycja dysku, z różnicą że LUN może być zbudowany z np dwóch dysków?

    System operacyjny widzi LUNa jak normalny dysk?

    OdpowiedzUsuń
  2. Pojęcie LUNa jest trochę takim "tworem" storage, którego większość używa raczej na "wyczucie" niż bazując na dokładnej definicji (która jest związana z protokołem SCSI)

    To co Ty opisujesz to takie dość dobre "czucie" czym LUN jest.
    LUN jest pewnym wirtualnym tworem, który definiujemy na macierzy a potem prezentujemy do serwera (OSa) jako dysk.
    Przykładowo - serwer potrzebuje 200GB, na macierzy mamy 10 dysków po 100GB każdy. Nasz LUN może być złożony z 10 kawałków po 20GB z każdego dysku. Tak stworzony LUN jest prezentowany serwerowi, który nie zdaje sobie sprawy jak on jest zbudowany - dla niego jest to po prostu dysk o pojemności 200GB.

    OdpowiedzUsuń
  3. Chciałem jeszcze dodać, że to co napisane powyżej to jest to co potocznie nazwyamy LUNem kiedy mówimy o macierzach i zasobach z nich udostępnianych.
    Nie jest to formalna definincja LUNa, która opiera się na czym innym i nie jest powiązana wyłącznie z macierzami dyskowymi.

    OdpowiedzUsuń