Jaki jest prawidłowy sposób odzyskiwania po błędach ZFS po awarii zasilania?

0

Kilka razy miałem nagłą utratę zasilania, co sprawiło, że pula ZFS była bezużyteczna aż do pełnego ponownego uruchomienia systemu. Planuję uzyskać UPS, aby uniknąć problemów w przyszłości, ale wydaje się, że powinien istnieć sposób na rozwiązanie tak prostego problemu bez pełnego zamknięcia systemu.

Odtworzenie problemu jest bardzo proste: moja pula ZFS działa na dwóch dyskach twardych podłączonych przez USB. Jest to stan, gdy pula działa poprawnie:

$ sudo zpool status
pool: tank
state: ONLINE
  scan: scrub repaired 0 in 1h36m with 0 errors on Sun Dec 11 02:00:22 2016
config:

NAME                                                STATE     READ WRITE CKSUM
tank                                                ONLINE       0     0     0
  mirror-0                                          ONLINE       0     0     0
    usb-ST4000DM_000-1F2168_000000000000-0:0-part1  ONLINE       0     0     0
    usb-ST3000DM_001-1E6166_000000000000-0:1-part1  ONLINE       0     0     0

Jeśli wyłączę zasilanie dysków USB bez zatrzymywania ZFS, a następnie ponownie włączę zasilanie po kilku sekundach, pojawią się następujące problemy: Jeśli spróbuję LS w punkcie montowania ZFS, zawiesi się na czas nieokreślony, wymagając ode mnie zamknij terminal. (Proces ls pozostanie jak zombie). Każdy komputer podłączony do serwera nfs za pośrednictwem samby również się zawiesi, jeśli spróbuje uzyskać dostęp do udostępnionego katalogu.

Status będzie teraz wyglądał następująco:

$ sudo zpool status
  pool: tank
 state: UNAVAIL
status: One or more devices are faulted in response to IO failures.
action: Make sure the affected devices are connected, then run 'zpool clear'.
   see: http://zfsonlinux.org/msg/ZFS-8000-HC
  scan: scrub repaired 0 in 1h36m with 0 errors on Sun Dec 11 02:00:22 2016
config:

NAME                                                STATE     READ WRITE CKSUM
tank                                                UNAVAIL      0     0     0  insufficient replicas
  mirror-0                                          UNAVAIL      0     0     0  insufficient replicas
    usb-ST4000DM_000-1F2168_000000000000-0:0-part1  UNAVAIL      0     0     0
    usb-ST3000DM_001-1E6166_000000000000-0:1-part1  UNAVAIL      0     0     0

pomimo faktu, że dyski USB zostały ponownie włączone.

Wypróbowałem następujące polecenia, aby rozwiązać problem.

$ sudo zpool clear tank
cannot clear errors for tank: I/O error

$ sudo zfs unmount tank
cannot open 'tank': pool I/O is currently suspended

# Note: Because other computers were trying to access the zfs share via     samba, there are zombie processes, which is why an export won't work.

$ sudo zpool export tank
umount: /tank: target is busy
    (In some cases useful info about processes that
     use the device is found by lsof(8) or fuser(1).)
cannot unmount '/tank': umount failed

$ sudo zpool export -f tank
umount: /tank: target is busy
    (In some cases useful info about processes that
     use the device is found by lsof(8) or fuser(1).)
cannot unmount '/tank': umount failed

# Tried this just for kicks, and got the expected result.
$ sudo zpool import -nfF tank
cannot import 'tank': a pool with that name already exists
use the form 'zpool import <pool | id> <newpool>' to give it a new name

Spędziłem kilka godzin czytając podobne posty od ludzi, ale wydaje się, że żaden z nich nie rozwiązał dokładnie tego problemu. Po ponownym uruchomieniu komputera z systemem ZFS wszystkie błędy znikną, martwe procesy zostaną usunięte, a wszystko wróci do normy.

Ale musi być czystszy sposób na rozwiązanie tego problemu. Jakieś sugestie?

EDYCJA: Prawdopodobnie powinienem to wyjaśnić. Serwer, do którego podłączone są dyski, jest przemienionym laptopem, więc ma wewnętrzny zasilacz. Dlatego w przypadku normalnej pracy w przypadku awarii zasilania dyski USB mogą utracić zasilanie, a następnie ponownie pojawić się bez ponownego uruchamiania serwera / laptopa.

klfwip
źródło

Odpowiedzi:

2

W tej chwili nie mogę odtworzyć twojego scenariusza, ale pierwszą rzeczą, której spróbowałbym po takiej awarii, jest zpool reopenpula i ewentualnie zpool onlineurządzenie (urządzenia), jeśli to konieczne. Na przykład, kiedy masz

$ sudo zpool status
  pool: tank
 state: UNAVAIL
status: One or more devices are faulted in response to IO failures.
action: Make sure the affected devices are connected, then run 'zpool clear'.
   see: http://zfsonlinux.org/msg/ZFS-8000-HC
  scan: scrub repaired 0 in 1h36m with 0 errors on Sun Dec 11 02:00:22 2016
config:

NAME                                                STATE     READ WRITE CKSUM
tank                                                UNAVAIL      0     0     0  insufficient replicas
  mirror-0                                          UNAVAIL      0     0     0  insufficient replicas
    usb-ST4000DM_000-1F2168_000000000000-0:0-part1  UNAVAIL      0     0     0
    usb-ST3000DM_001-1E6166_000000000000-0:1-part1  UNAVAIL      0     0     0

możesz spróbować

$ sudo zpool reopen tank

a jeśli to nie wszystko całkowicie wyjaśni

$ sudo zpool online tank 'usb-ST4000DM_000-1F2168_000000000000-0:0-part1'
$ sudo zpool online tank 'usb-ST3000DM_001-1E6166_000000000000-0:1-part1'

Jest całkowicie możliwe, że po prostu zpool reopen $POOLprzywróci pulę do pracy, ponieważ instruuje ZFS, aby ponownie otworzyć wszystkie urządzenia powiązane z pulą. (Strona podręcznika opisuje to zwięźle jako Ponownie otwórz wszystkie vdev związane z pulą. Nie wiem, czy uruchomi skanowanie vdev, czy po prostu spróbuje ponownie otworzyć pod znanymi już nazwami.) Tak długo, jak urządzenia są nadal znajduje się pod tymi samymi nazwami, powinno to wystarczyć i może wystarczyć, jeśli urządzenia są znane pod alternatywnymi nazwami (jeśli wykonywane jest skanowanie vdev).

Nadal możesz potrzebować zpool clearpóźniej błędów we / wy, ale zależy to od tego, czy ZFS miał czas je zarejestrować. Jeśli oba dyski zginą, prawdopodobnie ZFS nie miał czasu zarejestrować błędów na dyskach, więc zpool clearnie powinno być potrzebne.

Poza tym możesz także sprawdzić failmodewłaściwość pool ( zpool get failmode tank). Wygląda na to, że twoja pula jest obecnie dostępna, failmode=waitale w twoim przypadku failmode=continuemoże być bardziej odpowiednie. Zobacz man 8 zpoolopis różnych wartości failmodewłaściwości.

CVn
źródło
1
Ponownie otwórz prowadzi do: „nie można ponownie otworzyć„ zbiornika ”: puli We / Wy jest obecnie zawieszone”, online prowadzi do „nie można online usb-ST4000DM_000-1F2168_000000000000-0: 0-part1: puli We / Wy jest obecnie zawieszone”, i wyczyść przewody na „nie można usunąć błędów dla zbiornika: błąd we / wy”. Wiem, że urządzenia są faktycznie podłączone, ponieważ jedno z nich ma drugą partycję, z której mogę czytać i pisać. Ustawienie trybu awaryjnego nie pomaga, ponieważ zapisy nadal będą blokowane. Dzięki jednak.
klfwip
@klfwip Można oczywiście ustawić tryb awaryjny, gdy pula działa normalnie.
CVn
Cóż, mogę włączyć opcję „kontynuuj”, co pozwoli na wyświetlanie i czytanie plików. Ale jeśli moje rozumienie dokumentów ZFS jest prawidłowe, tryb oznacza tylko, że odczytywanie jest dozwolone, ale zapisywanie kończy się niepowodzeniem z błędem EIO. Dlatego nadal będę musiał ponownie uruchomić serwer, zanim udział będzie znów w pełni użyteczny.
klfwip