Hej!
Kiedys ruszalem temat bezpiecznego niszczenia danych, teraz bezpieczne przechowywanie... ale ograniczmy sie tylko do niezawodnosci systemu plikow i rozwiazan dyskowych.
Znam ext2/ext3, znam ReiserFS, znam XFS bardzo slabo... JFS nie znam a wielu chwali... za to poznalem ZFS od Sun'a i jestem mile zaskoczony... Potraktujcie to jako ciekawostke - nic wiecej. Jesli ktos chce cos wiecej zobaczyc to prosze o info - moze damy rade cos pokombinowac - na pewno moj Sun wrocil on-line na razie i mozna sie z nim polaczyc... moze nawet odpale pare wirtualnych stref aby mozna bylo sie pobawic nieco via ssh i poduczyc... zobaczymy.
Zanim opisze ZFS - prosba do znajacych JFS - podzielcie sie wrazeniami.
Glowny problem polega na tym, ze planujac system przydzielamy jakas tam przestrzen dyskowa... a co jesli nie trafimy? Trzeba bedzie dodac jakos... to zostaje nam dodac dyski i podmontowywac partycje w katalogach? Do tej porty tak bylo... Stad tez pojawiaja sie systemy plikow ktore nie sa stricte zwiazane z partycjami, czyli system plikow to nie partycja ale na przyklad kilka partycji fizycznych. W ten sposob systemy jak JFS czy ZFS moga rosnac.
Obsluge wielkich przestrzeni dyskowych pozwala w linuxie robic LVM - mozemy logiczna przestrzen miec rozciagnieta na fizyczne napedy i tak dodawac jednosteczki skladowe do jednej lub drugiej wirtualnej partycji (w sensie systemu plikow) - jesli ten oczywiscie to obsluguje...
Najbardziej eleganckie i proste w obsludze rozwiazanie jakie widzialem do tej pory to ZFS. Mam software RAID1 na Linuxie zrobiony w jednym z moich serwerow - dziala super... mam sprzetowy RAID0, RAID1 i RAID5 na innych serwerach, zaleznie od potrzeb, ale ZFS mnie zaskoczylo.
ZFS nie zna pojecia dysku - zna pojecie urzadzenia dodanego do puli dyskowej (doslownie 'pool'). Urzadzenia dodaje sie do puli pojedynczo albo dodatkowo traktujac je mirror'em lub 'raidz' - mirror jak nazwa mowi trzyma te same dane na 2 dyskach i taki jeden wirtualny niby dodaje do pool'a, raidz robi cos jak RAID5 ale na 2 sposoby.
W normalnym RAID5 trzeba miec minimum 3 dyski - jak 1 padnie to drugi nadal dziala a reszta danych jest na trzecim - tzw. dysku parzystosci. Jak mamy 9 dyskow w macierzy to w RAID5 8 dyskow daje nam pojemnosc na dane a 9 to parzystosc. Jak padna nam 2 dyski to stracilismy wszystko. To mniej wiecej odpowiednik raidz1... ale jest tryb raidz2 - prawie identyko ale ma 2 dyski parzystosci.
Ogolnie mowiac dodajemy do pool'a dyski jako pojedyncze, mirrory na 2 lub wiecej dyskach lub raidz na 3 i wiecej... Taki pool ma jakas sobie pojemnosc i w ramach tego pool'a tworzymy system plikow ZFS nadajac mu nazwe i podajac np inny punkt montowania. Teraz dodajemy w ramach tego samego pool'a kolejny system plikow... i widzimy (df -h) ze pool ma na przyklad 2GB miejsca i kazdy system plikow w pool'u ma tez 2GB miejsca dostepne. Chodzi o to, ze system plikow nie zna pojecia partycji - on jest przypisany do pool'a a nie partycji o stalym rozmiarze.
Teraz aby uniknac problemow... ZFS pozwala na ograniczenie wielkosci systemu plikow - klasyczna quota - 1 parametr do polecenia zfs (zfs set quota=200m pool_testowy/fs_testowy1) i po sprawie, mamy 200mb max. Jesli jednak mamy grupe userow uzywajacych tego samego pool'a (kazdy katalog domowy to osobny zystem ZFS) i kazdy moze niby uzyc cala pojemnosc pool'a to jak zagwarantowac minimalny udzial? ZFS dostarcza i to - system rezerwacji miejsca dyskowego. Miejsce zarezerwowane przez admina w jednym systemie plikow (np home jednego z userow) jest traktowane jak zajete w pool'u - jakby tam pliki - tak prosto. Do tego dodajmy jeszcze moze kompresje... ot kolejnny parametr i wszystkie pliki sa kompresowane w locie.
ZFS zapisuje calosc w postaci transakcji ale obiektowej - nie jak inne systemy "zapisz blok XY, XZ i ZZ - OK" transakcja wykonana a dane rozwalone. Nawet sprzetowy RAID nie daje gwarancji tak na dobra sprawe. ZFS traktuje logiczny ciag zmian jako pojedyncza operacje i albo wszystko albo nic - nie ma nadpisywania plikow - kazdy zapis istniejacego pliku to wykonanie kopii i dopiero wtedy zmiana naglowka aby wskazywal na kopie a nie podmiana fragmentow pliku jak to robia inne systemy. Jest to tak zwane Copy-on-Write.
Idzmy dalej... mamy userow, nudzi im sie bardzo...dysk zapchali i chca wiecej miejsca. Pool sie wyczerpal - trzeba rozbudowac... wiec do pool'a mozna dodac kolejne urzadzenia i pozwolic systemom plikow w nim nadal rosnac - ZFS sam bedzie wiedzial jak rozlokowac dane. Do tego mozna z urzadzen stworzyc raidz wiec dane beda rozciagniete po calej grupie dyskow. Mamy 4 dyski na starcie i dane sa zapisywane na 4 na raz... pozniej dodamy piaty, to nowe dane (CoW) beda zapisywane juz na 5 dyskach... dynamicznie sie dopasowuje do sytuacji. Oczywiscie jak w kazdym RAID mozna dodac dyski hot-spare
Wazne jest to, ze dyski moga byc roznej pojemnosci, roznego typu itd. ZFS bardzo lubi tani sprzet i widac daje calkiem spore mozliwosci... a tych jeszcze nie koniec.
Jak teraz zrobic backup - blyskawiczny backup plikow... Solaris ma takie cos jak snapshot - cos jak fotografia systemu plikow, tak jak on wygladal w danej chwili. ZFS ma to samo - robi snapshot zmian od poprzedniego snapshot'u. User moze zmienic plik, skasowac... a poprzednie wersje nadal znalezc w /.zfs/snapshots/<nazwa_pool'a>/<nazwa_fs>/plik_ktorego_szukam i sam go przywrocic. Admin moze przywrocic caly system plikow jednym poleceniem (zfs restore moj_pool/moj_fs@<nazwa_snapshotu>) i calosc wraca na miejsce, do identycznego stanu jak bylo, z datami plikow wlacznie. Cala operacja trwa <1sek - tak samo jak tworzenie systemu plikow o pojemnosci nawet paruset GB - ZFS jest bardzo szybki.
Dla podsumowania tego co napisalem pare "screen'ow tekstowych".
Kod:
-bash-3.00# zpool list
NAME SIZE USED AVAIL CAP HEALTH ALTROOT
hackpl 976M 223M 753M 22% ONLINE -
-bash-3.00# zpool status
pool: hackpl
state: ONLINE
scrub: none requested
config:
NAME STATE READ WRITE CKSUM
hackpl ONLINE 0 0 0
/export/ZFS-media/hackpl-01 ONLINE 0 0 0
/export/ZFS-media/hackpl-02 ONLINE 0 0 0
/export/ZFS-media/hackpl-03 ONLINE 0 0 0
/export/ZFS-media/hackpl-04 ONLINE 0 0 0
errors: No known data errors
Jak widac caly pool sklada sie z 4 wirtualnych (symulowanych) dyskow 256MB kazdy - to na razie tylko test... Taki pool zostal podpiety do strefy (solaris zone) jako dataset - dzieki temu admin strefy moze tworzyc sobie sam systemy plikow.
Kod:
root@hackpl:/$ zfs list
NAME USED AVAIL REFER MOUNTPOINT
hackpl 223M 721M 24.5K /hackpl
hackpl/gsg9 57K 99.9M 57K /export/home/gsg9
hackpl/javaman 29.5K 100M 29.5K /export/home/javaman
hackpl/mateo 28K 100M 28K /export/home/mateo
hackpl/shared-storage 223M 33.4M 223M /export/shared-storage
root@hackpl:/$ zfs set quota=none hackpl/javaman
root@hackpl:/$ zfs list
NAME USED AVAIL REFER MOUNTPOINT
hackpl 223M 721M 24.5K /hackpl
hackpl/gsg9 57K 99.9M 57K /export/home/gsg9
hackpl/javaman 29.5K 721M 29.5K /export/home/javaman
hackpl/mateo 28K 100M 28K /export/home/mateo
hackpl/shared-storage 223M 33.4M 223M /export/shared-storage
Tutaj widac (pogrubilem) gdzie jest co... i jak javaman ma zdjeta quote jaka jest roznica Te same wyniki zwraca 'df -h'. Jesli beda jakies pytania, bedzie ciag dalszy :P na przyklad wiecej info o snapshotach... postaram sie przygotowac tez dla zainteresowanych jedna strefe na ktorej bedziecie mogli sie bawic z uprawnieniami root'a i testowac jak dziala ZFS ale to kwestia paru dni zanim bede mial czas.