Chroń swoje dane za pomocą kopii zapasowych CockRoach

Opublikowany: 2019-07-24

Gdy firma zacznie się skalować, zacznie gromadzić dane w znacznie szybszym tempie. Niezbędne jest zaplanowanie sytuacji awaryjnych z odpowiednią procedurą tworzenia kopii zapasowych i przywracania tych danych.

Wyobraź sobie, jak katastrofalne jest wymazanie wszystkich danych użytkownika bez planu przywrócenia ich do działającego stanu.

Dzisiaj poprowadzę Cię przez prosty plan tworzenia kopii zapasowych i przywracania, wykorzystujący niektóre technologie, których używamy w Justuno. CockRoachDB, Google Cloud Storage i Golang a Google stworzyły język programowania.

Jeśli nie słyszałeś o CockRoachDB, ale pracowałeś z innymi systemami baz danych, takimi jak Postgres lub MySQL, poczujesz się jak w domu. CockRoach ma tę dodatkową zaletę, że jest systemem rozproszonym zgodnie z GitHub, „jest zbudowany na transakcyjnym i silnie spójnym magazynie klucz-wartość. Skaluje się w poziomie, wytrzymuje awarie dysków, maszyn, szaf, a nawet centrum danych przy minimalnych zakłóceniach w opóźnieniach i bez ręcznej interwencji, a także obsługuje wysoce spójne transakcje ACID”.

Jeśli chcesz kontynuować, przejdź do przewodnika instalacji CockRoach i skorzystaj z bezpłatnej 30-dniowej wersji próbnej wersji Enterprise lokalnie. Ponadto musisz zarejestrować konto Google Cloud Storage i zainstalować Golang w swoim systemie.

Po skonfigurowaniu przejdź do konsoli GCS i zacznij od utworzenia projektu.

CockRoach Utwórz projekt

Następnie zobaczysz ekran z napisem Utwórz wiadro, kliknij tę opcję.

Karalucha Utwórz wiadro

Musisz wybrać unikalną nazwę, region, lokalizację oraz ustawić uprawnienia na poziomie obiektu i zasobnika. Jeśli się powiedzie, powinieneś zobaczyć obraz podobny do mojego poniżej. Ponownie twoje ustawienia będą się różnić w zależności od przypadku użycia, ale podążanie za nimi, używanie ustawień domyślnych jest w porządku.

Ustawienia projektu CockRoach

Następnie musisz zająć się niektórymi ustawieniami konfiguracji bazy danych, które umożliwią przesyłanie kopii zapasowych CockRoach bezpośrednio do pamięci w chmurze Google. Jeśli nie jesteś zainteresowany wykorzystaniem GCS. CockRoach obsługuje również adresy URL plików kopii zapasowych Amazon, Azure, HTTP i NFS/Local. Więcej informacji można znaleźć tutaj.

Otwórz menu znajdujące się po lewej stronie ekranu i wybierz API i usługi oraz opcję Poświadczenia. Powinieneś teraz zobaczyć ekran z napisem Utwórz poświadczenia. W tym celu interesuje nas klucz konta usługi.

Poświadczenia CockRoach

Na następnym ekranie wybierzesz Nowe konto usługi; utworzyć nazwę konta usługi; wybierz typ roli i upewnij się, że wybrałeś JSON jako typ klucza. W tym konkretnym samouczku wybiorę projekt i właściciela. W środowisku produkcyjnym będziesz potrzebować bardziej restrykcyjnej roli.

Zrzut ekranu karalucha

Po zakończeniu automatyczne pobieranie powinno rozpocząć się od zawartości JSON, która powinna wyglądać podobnie do poniższego obrazu.

KogutPłoć JSON

Następnie, korzystając z wybranego narzędzia, połącz się z instancją karalucha, wolę SQLPro dla Postgres. Możesz połączyć się z instancją Cockroach za pomocą większości sterowników Psql. Jeśli chcesz połączyć się przez terminal, jeśli uruchomisz instancję lokalną, możesz uruchomić:

=> karaluch sql –niepewny –host=localhost

Pierwszą rzeczą, którą będziesz chciał zrobić, to zaktualizować plik cloudstorage.gs.default.key o zawartość pliku JSON.

Zawartość JSON CockRoach

Sprawdź najpierw aktualne ustawienie, jak na powyższym obrazku:

POKAŻ USTAWIENIE KLASTRA cloudstorage.gs.default.key;

Następnie ustawię gs.default.key na zawartość mojego pliku JSON:

USTAW USTAWIENIE KLASTRA cloudstorage.gs.default.key = 'Zawartość Json'

Teraz, gdy przeszliśmy przez konfigurację i konfigurację, nadszedł czas, aby przejść do zabawnych rzeczy, rzeczywistego kodu.

Zacznij od stworzenia projektu Go; Nazwałem mojego kierownika zapasowego. Następnie utwórz plik main.go w katalogu głównym, w katalogu menedżera i plik o nazwie crdb.go w katalogu menedżera. Katalog menedżera będzie zawierał logikę aplikacji, a struktura plików powinna wyglądać podobnie do mojej.

Katalog menedżerów karaluchów

Następnie musimy zainstalować kilka pakietów, otworzyć terminal i przejść do katalogu głównego projektu. Uruchom następujące:

przejdź do „github.com/lib/pq”

przejdź do „bazy danych/SQL”

wejdź na github.com/lib/pq

przejdź do „cloud.google.com/go/storage”

wejdź na „github.com/snabb/isoweek”

Po ich zainstalowaniu ustawimy kilka stałych na górze naszego pliku, aby nawiązać połączenie z bazą danych. Tymi stałymi będą host, port, użytkownik, hasło i nazwa bazy danych.

Stałe karaluchy

Wewnątrz main użyjemy stałych, które właśnie ustawiliśmy, aby zbudować ciąg połączenia psql i spróbować nawiązać połączenie z naszą bazą danych. Jeśli wystąpi błąd, wpadamy w panikę.

Połączenie psql CockRoach

Twój plik powinien wyglądać podobnie do mojego, ale z twoimi stałymi pasującymi do twojej konfiguracji. Śmiało i uruchom aplikację, uruchamiając w terminalu:

“idź, biegnij main.go”

Jeśli nie wystąpią żadne błędy, masz dobre połączenie.

Uruchom aplikację CockRoach

Opuść na chwilę main.go i przejdź do utworzonego wcześniej pliku crdb.go. Skopiuj to, co widzisz na poniższym obrazku, zanim przejdziemy do tego, co się dzieje.

CockRoach crdb.go

Najpierw zadeklaruj nazwę pakietu i początek pliku:

Menedżer pakietów

Zacznij od stworzenia interfejsu o nazwie CrdbManager. Jeśli nie znasz interfejsów, pozwalają one określić wymagane zachowanie. W tym przypadku koncentrujemy się na tworzeniu kopii zapasowych naszych danych, wykonywaniu przyrostowych kopii zapasowych i przywracaniu.

CockRoach CrdbManager

Następnie utwórz: crdbManagerStruct{}

Struktura cdb CockRoach

Możesz myśleć o strukturach jak o obiektach w innych językach. Zwykle tworzysz klasę, a następnie jawnie stwierdzasz, że klasa zaimplementuje utworzony interfejs. Ale w Go stosujesz metody z poniższą składnią, a Go wywnioskuje, że twoja struktura jest typu interface.

Składnia struktury CockRoach

Zanim zaczniemy tworzyć kod zapasowy, należy pamiętać o kilku dziwactwach związanych z karaluchem. Cockroach zapewnia dwie formy tworzenia kopii zapasowych: pełną i przyrostową. Pełne kopie zapasowe są proste i wymagają podania nazwy bazy danych oraz lokalizacji przechowywania w chmurze Google.

Np.: BACKUP BAZY DANYCH DO 'gs://acme-co-backup/database-bank-2017-03-27-weekly' OD SYSTEMU TIME '-10s';

Przyrostowe kopie zapasowe mogą być nieco trudniejsze, ponieważ wymagają wyszczególnienia wszystkich poprzednich pełnych i przyrostowych kopii zapasowych. Najpierw musisz zadeklarować, gdzie będzie przechowywana kopia zapasowa, a następnie wymienić wszystkie poprzednie kopie zapasowe, zaczynając od pełnej, a następnie od następnej przyrostowej

Np.: BACKUP BAZY DANYCH DO 'gs://acme-co-backup/db/bank/2017-03-29-nightly' OD CZASU SYSTEMU '-10s' PRZYROST OD 'gs://acme-co-backup/ database-bank-2017-03-27-weekly”, „gs://acme-co-backup/database-bank-2017-03-28-nightly”;

Mając to na uwadze, od Ciebie zależy utworzenie schematu przechowywania, który pozwoli ci dynamicznie utworzyć powyższe polecenie. W tym przykładzie utworzymy schemat, który będzie wykonywał codzienne kopie zapasowe, a pierwsza kopia zapasowa w tygodniu będzie pełną kopią zapasową i użyjemy schematu nazewnictwa rok-miesiąc-dzień. Na przykład nasza pierwsza kopia zapasowa miałaby nazwę: 2019-7-8-full, a następny dzień to 2019-07-9-night. Wszystkie kopie zapasowe z danego tygodnia będą przechowywane w tygodniowym katalogu dir kończącym się na „weekly” pod tą nazwą bazy danych. Na przykład:

2019-7-8-weekly/dbName/2019-7-8-pełna i nocna lokalizacja

byłoby

2019-7-8-tydzień/dbNazwa/2019-7-9-nocny.

Teraz utwórz nowy katalog w katalogu głównym naszego projektu o nazwie util i utwórz plik o nazwie util.go; twoja struktura katalogów powinna wyglądać jak moja poniżej.

Struktura katalogu CockRoach

Nasz plik util.go będzie zawierał helpery, które automatycznie wygenerują nasze wartości tygodniowe, nocne i pełne. Twój util.go powinien wyglądać jak na poniższym zrzucie ekranu.

CockRoach util.go

Wróćmy do naszego pliku crdb.go. Musimy dodać trochę importów, dostosuj swój kod, aby przypominał obrazek poniżej.

Dostosowanie kodu cdb CockRoach

Zaktualizowałem sygnatury interfejsów CrdManager do teraz, z wyjątkiem instancji DB i nazwy bazy danych. Utworzyłem również vars co tydzień, weekFull i nightly, wywołując metody util, które stworzyliśmy wcześniej, plus const, które będą przechowywać naszą nazwę kopii zapasowej w chmurze Google.

Aktualizacja CockRoach CrdbManager

Teraz możemy przejść do metody tworzenia kopii zapasowych.

Metoda tworzenia kopii zapasowej CockRoach

Nasza metoda tworzenia kopii zapasowej przyjmie wartość instancji bazy danych oraz bazę danych, której kopię zapasową tworzymy, jako parametr. Następnie wygenerujemy lokalizację zapisu kopii zapasowej, jak omówiono wcześniej. Pamiętaj, że katalog tygodniowy przyjmuje nazwę początku tygodnia, wszystkie kolejne pełne i przyrostowe są przechowywane pod tym katalogiem przez cały tydzień. Twoja wygenerowana lokalizacja gsStorage powinna wyglądać tak:

gs://test-crdb-backup/2019-7-8-weekly/testdb/2019-7-8-full

Wygeneruj pełne zapytanie do uruchomienia, wykonaj je i wpadnij w panikę, jeśli zapytanie się nie powiedzie. Zwróć uwagę, że zapytanie kończy się na:

`'OD CZASU SYSTEMU '-10S';`

Karaluch zaleca rozpoczęcie tworzenia kopii zapasowej sprzed 10 sekund. Teraz możemy przejść do metody przyrostowej kopii zapasowej.

Przyrostowa kopia zapasowa CockRoach

Tworzenie przyrostowej kopii zapasowej rozpoczyna się od wygenerowania naszej lokalizacji przyrostowego zapisu gcs, tak jak to właśnie zrobiliśmy. Tym razem po utworzeniu zapytania będziemy potrzebować listy poprzednich kopii zapasowych, aby utworzyć pełne zapytanie. Odbywa się to poprzez wywołanie metody listDir i jest sprawdzane jako ostatnie.

Po przejrzeniu listy kopii zapasowych zakończysz generowanie zapytania i uruchomisz je. Jeśli zawiedzie panika i ostatecznie, twoje zapytanie powinno wyglądać podobnie do tego poniżej:

BACKUP BAZY DANYCH DO 'gs://test-crdb-backup/2019-7-8-weekly/testdb/2019-7-10-nightly' OD DNIA

CZAS SYSTEMOWY '-10s' PRZYROST OD 'gs://test-crdb-backup/2019-7-8-weekly/testdb/2019-7-8-full',

'gs://test-crdb-backup/2019-7-8-weekly/testdb/2019-7-9-nightly;

Następna jest metoda przywracania.

Metoda przywracania karaluchów

Przywracanie jest podobne do tworzenia przyrostowej kopii zapasowej. Wygenerujemy zapytanie, następnie wywołamy listę dirs i dołączymy listę bazy danych do naszego oryginalnego zapytania. Następnie uruchom zapytanie i wpadnij w panikę, jeśli nasze zapytanie się nie powiedzie.

Pamiętaj, że w przypadku odtwarzania przyrostowego i przywracania kolejność tworzenia kopii zapasowej ma znaczenie. Rozpocznij od pełnej kopii zapasowej, następnie od następnej kopii przyrostowej, a następnie od kopii przyrostowych. Jeśli nie zamówisz ich poprawnie, przywracanie i tworzenie kopii przyrostowych nie powiedzie się. Jeśli chcesz uzyskać więcej informacji na temat funkcji przywracania, kliknij tutaj.

Teraz przechodzimy do naszej metody List listDir.

CockRoach Listdir Metoda

Pierwszą rzeczą, którą zauważysz, jest to, że listDir nie jest pisany wielkimi literami, ponieważ metody pisane małymi literami są prywatne w Go. Ponieważ listDir jest pomocnikiem w naszych metodach interfejsu, nie ma potrzeby, aby metoda była publiczna.

Najpierw zaczniemy od utworzenia obiektu zasobnika, którego użyjemy do przeszukiwania naszych obiektów pamięci masowej. Następnie utwórz zapytanie wskazujące na naszą cotygodniową kopię zapasową dla tej konkretnej instancji bazy danych. Stamtąd wygeneruj kawałek Dirs. Następnie uruchom sprawdzanie, aby upewnić się, że pełna kopia zapasowa znajduje się na pierwszym miejscu w naszym wycinku, a jeśli nie, odwróć ten wycinek.

Widziałem dziwne zachowanie podczas umieszczania Dirs w pamięci Google w chmurze. Czasami wywołanie zwraca listę w kolejności rosnącej, a następnie malejącej. Nie spiesz się z tą metodą, koncentrując się na dwukrotnym sprawdzeniu listy zwrotów dirs we właściwej kolejności.

Innym podejściem może być zmiana schematu nazewnictwa i dodanie znacznika czasu jako części nazwy katalogu. W takiej sytuacji możesz iterować po liście dir i upewnić się, że pliki są prawidłowo uporządkowane według czasu rosnącego. Metoda listDir będzie w dużym stopniu zależeć od projektu magazynu schematu. Ponownie, jeśli twój listDir nie jest poprawnie uporządkowany, przywracanie i tworzenie kopii przyrostowych nie powiedzie się!

Przyjrzyjmy się jeszcze raz plikowi main.go.

CockRoach plik main.go

Upewnij się, że aktualizujesz listę importów i że wszystkie stałe są odpowiednio wypełnione. Pod const dodaj następujący kod.

Dodano kod pliku main.go CockRoach

Najpierw utwórz grupę zmiennych dla argumentów wiersza poleceń, które dyktują logikę naszej aplikacji. Jedna flaga polecenia to „operacja” z opcjami wartości tworzenia kopii zapasowej, przywracania lub przyrostu. Druga to baza danych dla nazwy bazy danych i tabeli w przypadku wywoływania operacji przywracania. Nasza logika połączenia z bazą danych pozostaje taka sama, a poniżej tworzymy naszą instancję dbManager, aby przeanalizować argumenty wiersza poleceń, które przekazaliśmy do aplikacji. Następnie wykonaj przywracanie kopii zapasowej lub przyrostowe w zależności od wywołanej operacji. Jeśli nie masz doświadczenia z flagami wiersza poleceń, możesz znaleźć więcej informacji tutaj. Po uruchomieniu aplikacji twoje polecenie powinno wyglądać następująco:

idź uruchom main.go -operation=backup -database=dbName

Końcowe przemyślenia

To nie jest aplikacja gotowa do produkcji. To tylko wersja demonstracyjna, która pomoże Ci rozpocząć proces myślowy i pozwoli Ci zaoszczędzić czas dzięki konfiguracji. W całej tej aplikacji, gdy napotkaliśmy jakąkolwiek formę błędu, po prostu nazywaliśmy panikę, co zmusza aplikację do zamknięcia. W środowisku produkcyjnym chciałbyś sobie z tym poradzić inaczej, dodając jakąś formę rejestrowania lub rodzaj logiki powiadomień, taki jak zdarzenie e-mail lub SMS, aby poinformować Cię o statusie zadania.

Ta aplikacja zakłada, że ​​ręcznie przekazujesz każdą nazwę bazy danych do swojej aplikacji. Chociaż można to zrobić, pisząc skrypt, który przekazuje te wartości, a następnie konfiguruje zadanie cron, aby uruchomić skrypt, istnieje lepsze podejście. Moją sugestią jest napisanie kodu wykonującego kopię zapasową każdej bazy danych w twojej instancji Cockroacha, wywołując „pokaż bazy danych”, iterując po zwróconym wyniku i wywołując metodę tworzenia kopii zapasowej. Nie zapominaj, że możesz skonfigurować zadanie crona, aby codziennie uruchamiać aplikację Go.

Na koniec ważne jest, aby pamiętać, że podczas uruchamiania przywracania na stole Karaluch zakłada, że ​​Twoja tabela nie istnieje. Jeśli spróbujesz uruchomić przywracanie w tabeli i teraźniejszości tabeli, pojawi się błąd. Należy pamiętać o kolejności uruchamiania przywracania na tabelach z ograniczeniami klucza obcego. Jeśli spróbujesz przywrócić tabelę, która ma ograniczenie klucza obcego, ale Twoja druga tabela nie istnieje, napotkasz problemy.

Możesz uruchomić przywracanie, dodając:

`Z pomijaniem_brakujących_kluczy_zagranicznych'

Spowoduje to usunięcie ograniczeń klucza obcego, ale pamiętaj, aby później dodać ograniczenia klucza obcego.

Mamy nadzieję, że ten post rzuci trochę światła na sposób tworzenia kopii zapasowych i przywracania danych firmy w przypadku awarii. Upewnienie się, że jesteś gotowy i przygotowany, pomoże zminimalizować wpływ i szybko przywrócić działanie.