Realizacje

dane

Baza produkcyjna w kontenerze bez stałego wolumenu

Baza produkcyjna stała w kontenerze. Restart, drain węzła albo nowy obraz zostawiał pusty katalog danych. Aplikacja wstawała. Dane nie. W tym case study pokazujemy, dlaczego stan bazy nie może żyć w warstwie zapisu obrazu i jak ułożyliśmy wolumen, kopię i ćwiczenie restore.

Ilustracja: zespół przy monitorze i baza w kontenerze bez podłączonego wolumenu

PVC

Dane poza warstwą kontenera

RPO

Kopia i restore w kalendarzu

Drain

Restart i przeniesienie bez utraty zbioru

Z tego case study dowiesz się

  • dlaczego baza w kontenerze bez wolumenu traci dane przy restarcie
  • czym różni się usługa bezstanowa od silnika z katalogiem InnoDB
  • jak opisać PersistentVolumeClaim, drain i drugi tor kopii
  • jak ćwiczyć restore na kopii środowiska, nie na produkcji

Klient utrzymywał bazę produkcyjną tak, jak API i workera: jako kontener. Manifest albo compose wyglądał spójnie. Restart, rolling update i drain węzła były zwykłymi operacjami platformy. Po jednym z takich ruchów katalog danych wrócił do stanu z obrazu. Aplikacja wstawała. Dane nie.

Z czym przyszedł klient

Silnik bazy był poprawnie opisany w pliku konfiguracyjnym. Brakowało miejsca, w którym ten plik i te dane miały przeżyć kontener. Nie było PersistentVolumeClaim. Nie było osobnego volume na hoście. Baza siedziała obok usług bezstanowych, więc dostała ten sam cykl życia.

Jak wyglądała kopia

Kopia, jeśli w ogóle istniała, leżała poza rytmem. Nikt nie odtwarzał jej na kopii środowiska. Zespół dowiadywał się o luce, gdy pod wracał z nowym identyfikatorem, a katalog był pusty. Czasem pomagał dump z laptopa. Czasem nie.

To nie był błąd silnika. InnoDB, WAL i katalog danych robiły to, do czego są zaprojektowane. Problem siedział w tym, że stan żył w warstwie zapisu obrazu, która znika razem z kontenerem.

Dlaczego to pęka przy restarcie

Kontener ma cykl życia krótszy niż baza. Nowy obraz, inny node, evict, rolling update: każdy z tych ruchów może skasować warstwę zapisu. Baza trzyma stan. Stan musi stać na wolumenie z klasą storage, z polityką dostępu i z miejscem na wzrost.

Operacja platformy, utrata zbioru

Upgrade obrazu, przeniesienie poda i restart hosta wyglądają jak zwykła praca klastra. Dla bazy są utratą zbioru, jeśli pliki silnika nie leżą poza kontenerem. Restore bez wcześniejszego testu jest wtedy zgadywaniem, nie procedurą.

W manifeście usługa bezstanowa i baza wyglądają podobnie: obraz, port, zmienne. Różnica wychodzi dopiero przy restarcie. Jedna wstaje pusta i to jest poprawne. Druga wstaje pusta i to jest incydent.

Jak to ułożyliśmy

Wydzieliliśmy dane ze ścieżki kontenera. Baza dostała wolumen: PersistentVolumeClaim, klasa storage, rozmiar i wzrost zapisane w manifeście. Deploy i restart nie ruszają plików silnika. Drain węzła ma kolejność: flush, odłączenie, start na nowym nodzie z tym samym wolumenem.

Drugi tor, nie tylko PVC

Sam wolumen nie kończy tematu. Dołożyliśmy dump logiczny w kalendarzu i snapshot wolumenu. Restore odpalamy na kopii środowiska, nie na produkcji. RPO i RTO są zapisane. Runbook aktualizacji mówi, w jakiej kolejności schodzi pod, jak czeka na flush i jak wraca.

PVC rozwiązuje przeżycie restartu. Ćwiczenie restore rozwiązuje pytanie, czy kopia w ogóle daje się odtworzyć. Oba są w zakresie, bo klient przyszedł po utracie danych, nie po samym manifeście.

Skutek

Baza przeżywa restart, przeniesienie na inny węzeł i wymianę obrazu. Dane są na wolumenie. Kopia ma właściciela. Restore ma datę w kalendarzu. Ten sam układ opisujemy w usłudze bezpieczeństwa danych.

Podsumowanie

Baza w kontenerze jest dopuszczalna, gdy stan leży na wolumenie, a kopia ma ćwiczenie. Traktowanie silnika jak workera bezstanowego kończy się pustym katalogiem w momencie, który z punktu widzenia platformy wygląda na sukces.

Napisz do nas