PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak monitorować działanie PostgreSQL w kontenerze Docker:część pierwsza

Monitorowanie to czynność polegająca na obserwowaniu i sprawdzaniu przez pewien okres czasu, aby zobaczyć, jak rozwija się i działa monitorowany element. Robisz to, aby móc wprowadzić wszelkie niezbędne zmiany, aby zapewnić prawidłowe działanie. Niezbędne jest monitorowanie procesów w celu uzyskania dobrego wglądu w wykonywane czynności w celu zaplanowania, zorganizowania i uruchomienia wydajnego rozwiązania.

Docker to program stworzony do działania jako builder gotowy do odpowiedzi na pytanie „Czy oprogramowanie będzie działać na moim komputerze?” Zasadniczo łączy ze sobą różne części, tworząc model łatwy do przechowywania i transportu. Model, znany również jako kontener, może zostać wysłany do dowolnego komputera z zainstalowanym Dockerem.

W tym artykule zostaniemy wprowadzeni do Dockera, opisując niektóre sposoby konfiguracji i porównując je. Ponadto do gry wchodzi PostgreSQL, który w inteligentny sposób wdrożymy w kontenerze Docker, a na koniec zobaczymy korzyści, jakie może zapewnić ClusterControl, aby monitorować kluczowe wskaźniki dotyczące PostgreSQL i systemu operacyjnego poza nim.

Omówienie dokera

Po uruchomieniu Docker tworzy nowe połączenie sieciowe, aby umożliwić transmisję danych między dwoma punktami końcowymi, zwanymi mostami, i tutaj domyślnie przechowywane są nowe kontenery.

Poniżej zobaczymy szczegóły dotyczące tego mostu i omówimy, dlaczego nie jest to dobry pomysł na produkcję.

$ docker network inspect bridge
Sprawdzanie domyślnego docker0 mostka platformy Docker.

Zwróć uwagę na wbudowane opcje, ponieważ jeśli uruchomisz kontener bez określenia żądanej sieci, zgodzisz się z nim.

Na tym domyślnym połączeniu sieciowym tracimy kilka dobrych zalet sieci, takich jak DNS. Wyobraź sobie, że chcesz uzyskać dostęp do Google, który adres wolisz, www.google.com czy 172.217.165.4?

Nie wiem jak wy, ale wolę wcześniejszy wybór i szczerze mówiąc nie wpisuję „www.”.

Sieć mostkowa zdefiniowana przez użytkownika

Dlatego chcemy DNS w naszym połączeniu sieciowym i korzyści z izolacji, ponieważ wyobraź sobie scenariusz, w którym wdrażasz różne kontenery w tej samej sieci.

Kiedy tworzymy kontener Dockera, możemy nadać mu nazwę lub Docker robi to za nas losując dwa słowa połączone podkreśleniem lub „_”.

Jeśli nie użyjemy sieci mostków zdefiniowanych przez użytkownika, w przyszłości może wystąpić problem w środku adresów IP, ponieważ wyraźnie nie jesteśmy maszynami i pamiętaj, że te wartości mogą być trudne i podatne na błędy.

Tworzenie niestandardowego mostka lub sieci mostków zdefiniowanej przez użytkownika jest bardzo łatwe.

Zanim utworzymy nasz pierwszy, aby lepiej zrozumieć proces, otwórzmy nowy terminal, wpiszmy polecenie Linuksa pakietu iproute2 i zapomnijmy już o tym.

$ ip monitor all
Inicjowanie terminala w celu monitorowania ruchu sieciowego na hoście platformy Docker.

Ten terminal będzie teraz nasłuchiwał aktywności sieciowej i tam wyświetlał.

Być może widziałeś już wcześniej polecenia takie jak „ifconfig” lub „netstat” i mówię ci, że są one przestarzałe od 2001 roku. Pakiet net-tools jest nadal powszechnie używany, ale nie jest już aktualizowany.

Teraz nadszedł czas, aby utworzyć naszą pierwszą niestandardową sieć, więc otwórz inny terminal i wpisz:

$ docker network create --driver bridge br-db
Tworzenie sieci mostów zdefiniowanej przez użytkownika „br-db”.

Ta bardzo długa kombinacja liter i cyfr nazywa się UUID lub Universally Unique IDentifier. Zasadniczo oznacza to, że sieć została pomyślnie utworzona.

Nazwa naszej pierwszej ręcznie utworzonej sieci brzmiała „br-db” i musi znajdować się w końcowej części polecenia, ale wcześniej mamy argument „„-driver”, a następnie wartość „bridge” , dlaczego?

W wersji Community Docker udostępnia trzy różne sterowniki:most, host i brak. W momencie tworzenia, takim jak ten, domyślnym jest most i nie trzeba go określać, ale uczymy się o tym.

Jeśli zrobiłeś ze mną wszystko, spójrz na drugi terminal, ponieważ wyjaśnię, co się z tobą dzieje.

Docker stworzył sieć o nazwie „br-db”, ale jest ona nazywana w ten sposób tylko przez niego.

Po drugiej stronie utworzonego niestandardowego mostu znajduje się kolejna warstwa, system operacyjny. Zmieniła się podana nazwa tej samej sieci mostów i staje się reprezentacją nomenklatury mostu „br”, po której następuje pierwsze 12 znaków powyższej wartości UUID, w kolorze czerwonym.

Monitorowanie zmian adresów IP platformy Docker.

Dzięki naszemu nowemu połączeniu sieciowemu mamy podsieć, bramę i transmisję.

Brama, jak sama nazwa wskazuje, to miejsce, w którym cały ruch pakietów odbywa się między punktami końcowymi mostu i jak widać, nazywa się „inet” dla systemu operacyjnego.

Transmisja znajduje się na ostatnim adresie IP i jest odpowiedzialna za wysyłanie tego samego ruchu danych dla wszystkich adresów IP w podsieci, gdy jest to konieczne.

Są one zawsze obecne w połączeniach sieciowych, dlatego na początku wyjścia mamy wartość „[ADDR]”. Ta wartość reprezentuje zmiany adresu IP i jest jak uruchamianie zdarzenia w celu monitorowania aktywności sieciowej, ponieważ utworzyliśmy nowe połączenie sieciowe!

Kontener Dockera

Odwiedź Docker Hub i zobacz, że to, co tam jest, jest znane jako obraz Dockera i jest w zasadzie szkieletem kontenera (modelu).

Obrazy Docker są generowane przez pliki Dockerfile i zawierają wszystkie informacje potrzebne do utworzenia kontenera, aby ułatwić jego konserwację i dostosowywanie.

Jeśli zajrzysz uważnie do Docker Hub, łatwo zauważyć, że obraz PostgreSQL, zwany postgres, ma różne tagi i wersje, a jeśli nie określisz jednego z nich, zostanie użyty domyślny, najnowszy, ale może w przyszłości, jeśli potrzebujesz różnych kontenerów PostgreSQL współpracujących ze sobą, możesz chcieć, aby były w tej samej wersji.

Stwórzmy teraz nasz pierwszy właściwy kontener, pamiętaj o potrzebie argumentu „--sieć”, w przeciwnym razie zostanie on wdrożony w domyślnym moście.

$ docker container run --name postgres-1 --network br-db -e POSTGRES_PASSWORD=5af45Q4ae3Xa3Ff4 -p 6551:5432 -d postgres
Uruchamianie kontenera PostgreSQL w sieci „br-db”.

Znowu UUID, sukces i co się dzieje w drugim terminalu?

Zmiany interfejsu sieciowego to wydarzenie, które ma miejsce właśnie teraz, lub po prostu „[LINK]”. Wszystko po „weth”, o czym możesz zapomnieć, zaufaj mi, wartość zawsze zmienia się po ponownym uruchomieniu kontenera lub coś podobnego.

Monitorowanie zmian interfejsu sieciowego platformy Docker.

Druga opcja „-e POSTGRES_PASSWORD=?” oznacza Środowisko i jest dostępne tylko podczas uruchamiania kontenerów PostgreSQL, konfiguruje hasło dla konta superużytkownika w bazie danych, zwanego postgres.

Publikowanie to długa nazwa parametru „-p 6551:5432” i zasadniczo powoduje, że port 6551 systemu operacyjnego jest dwukierunkowo powiązany z portem 5432 kontenera.

Ostatnią, ale nie mniej ważną, jest opcja Odłącz, „-d”, która sprawia, że ​​kontener działa niezależnie od tego terminala.

Nazwa obrazu Docker musi być na końcu, zgodnie z tym samym wzorcem tworzenia sieci, ze wszystkimi argumentami i opcjami po lewej stronie, a na końcu najważniejszą rzeczą, w tym przypadku nazwą obrazu.

Pamiętaj, że kontenery są przechowywane w podsieci sieciowej, na adresach IP dozwolonych dla każdego z nich i nigdy nie będą znajdować się w pierwszym ani ostatnim adresie, ponieważ brama i transmisja będą tam zawsze.

Pokazaliśmy szczegóły utworzonego mostu, a teraz będą wyświetlane przez każdy z punktów końcowych, które są przez nie przechowywane.

$ docker network inspect br-db
Kontrola zdefiniowanego przez użytkownika interfejsu sieciowego platformy Docker „br-db”.
$ brctl show
Wyświetlanie informacji o sieci mostków zdefiniowanych przez użytkownika przez host platformy Docker.

Jak widać, nazwy sieci i kontenerów różnią się, ponieważ drugi jest rozpoznawany jako interfejs przez system operacyjny, zwany „veth768ff71”, a oryginalna nazwa nadana przez nas „postgres-1” dla Dockera.

W poleceniu Docker można zanotować adres IP kontenera utworzonego wcześniej, podsieć pasującą do tej, która pojawiła się w innym terminalu otwartym chwilę temu, a na koniec opcje puste dla tej sieci niestandardowej.

Polecenie Linux „brctl show” jest częścią pakietu bridge-utils i jak sama nazwa wskazuje, jego celem jest dostarczenie zestawu narzędzi do konfiguracji i zarządzania mostami Linux Ethernet.

Inna niestandardowa sieć mostów

Wkrótce porozmawiamy o DNS, ale bardzo dobrze ułatwiło nam to w przyszłości. Świetne konfiguracje ułatwiają życie DBA w przyszłości.

Z sieciami jest tak samo, więc możemy zmienić sposób, w jaki system operacyjny rozpoznaje adres podsieci i nazwę sieci, dodając więcej argumentów w czasie tworzenia.

$ docker network create --driver bridge --subnet 172.23.0.0/16 -o “com.docker.network.bridge.name”=”bridge-host” bridge-docker
Tworzenie interfejsu sieciowego mostka zdefiniowanego przez użytkownika z opcjami niestandardowymi.
$ ip route show
Wyświetlanie tabeli routingu platformy Docker.

Dzięki temu poleceniu Linuksa możemy zobaczyć prawie to samo, co poprzednie polecenie, ale teraz zamiast wymieniać interfejsy „veth” dla każdej sieci, po prostu mamy to „linkdown” wyświetlające te, które są puste.

Pożądany adres podsieci został określony jako argument i podobnie jak w przypadku opcji Environment do tworzenia kontenera, dla sieci mamy „-o”, po którym następuje para klucza i wartości. W tym przypadku mówimy Dockerowi, aby powiedział systemowi operacyjnemu, że powinien wywołać sieć jako „host-most”.

Istnienie tych trzech sieci można również zweryfikować w Dockerze, wystarczy wpisać:

$ docker network ls
Wyświetlanie interfejsów sieciowych w Docker Engine.

Teraz omówiliśmy wcześniej, że wartości tych „weth” dla pojemników nie mają znaczenia i pokażę ci w praktyce.

Ćwiczenie polega na zweryfikowaniu bieżącej wartości, a następnie ponownym uruchomieniu kontenera, a następnie ponownej weryfikacji. Aby to zrobić, będziemy potrzebować kombinacji poleceń Linuksa używanych wcześniej oraz poleceń Dockera, które są tutaj nowe, ale bardzo proste:

$ brctl show
$ docker container stop postgres-1
$ docker container start postgres-1
$ brctl show
Sprawdzenie, jak „iptables” powoduje, że nazwy kontenerów są niestabilne dla hosta platformy Docker.

Gdy kontener zostanie zatrzymany, adres IP musi być wolny, aby w razie potrzeby otrzymać nowy, i to jest przypomnienie, jak ważny może być DNS.

System operacyjny nadaje te nazwy interfejsom za każdym razem, gdy kontener znajduje się w adresie IP i są one generowane przy użyciu pakietu iptables, który wkrótce zostanie zastąpiony przez nowy framework o nazwie nftables.

Nie zaleca się zmiany tych reguł, ale istnieją narzędzia, które w razie potrzeby pomagają w ich wizualizacji, takie jak dockerveth.

Zasady ponownego uruchamiania kontenera

Kiedy ponownie uruchamiamy program Docker, a nawet komputer, utworzone przez niego sieci pozostają w systemie operacyjnym, ale są puste.

Kontenery mają tak zwaną politykę ponownego uruchamiania kontenera i jest to kolejny bardzo ważny argument określony podczas tworzenia. PostgreSQL, jako produkcyjna baza danych, jego dostępność jest kluczowa i właśnie w ten sposób Docker może w tym pomóc.

$ docker container run --name postgres-2 --network bridge-docker --restart always -e POSTGRES_PASSWORD=5af45Q4ae3Xa3Ff4 -p 6552:5432 -d postgres
Określanie zasad ponownego uruchamiania kontenera w czasie tworzenia.

Jeśli nie zatrzymasz go ręcznie, ten kontener „postgres-2” będzie zawsze dostępny.

Aby lepiej to zrozumieć, uruchomione kontenery zostaną wyświetlone, a program Docker zrestartowany, a następnie ponownie pierwszy krok:

$ docker container ls
$ systemctl restart docker
$ docker container ls
Sprawdzanie zasad ponownego uruchamiania kontenera w „postgres-2”.

Działa tylko kontener „postgres-2”, inny kontener „postgres-1” nie uruchamia się sam. Więcej informacji na ten temat można znaleźć w dokumentacji platformy Docker.

System nazw domen (DNS)

Jedną z zalet sieci User-Defined Bridge Network jest z pewnością organizacja, ponieważ możemy tworzyć tyle, ile chcemy, uruchamiać nowe kontenery, a nawet łączyć stare, ale inną korzyścią, której nie mamy przy użyciu domyślnego mostka Docker, jest DNS.

Gdy kontenery muszą się ze sobą komunikować, może być uciążliwe dla administratora baz danych zapamiętywanie adresów IP, co omówiliśmy wcześniej na przykładzie www.google.com i 172.217.165.4. DNS bezproblemowo rozwiązuje ten problem, umożliwiając interakcję z kontenerami przy użyciu ich nazw podanych przez nas w czasie tworzenia, takich jak „postgres-2”, zamiast adresu IP „172.23.0.2”.

Zobaczmy, jak to działa. Stworzymy kolejny kontener tylko w celach demonstracyjnych w tej samej sieci o nazwie „postgres-3”, następnie zainstalujemy pakiet iputils-ping do przesyłania pakietów danych do kontenera „postgres-2”, oczywiście używając jego nazwy .

$ docker container run --name postgres-3 --network bridge-docker --restart always -e POSTGRES_PASSWORD=5af45Q4ae3Xa3Ff4 -p 6553:5432 -d postgres
$ docker container exec -it postgres-3 bash

Dla lepszego zrozumienia podzielmy to na części, w poniższych danych wyjściowych niebieska strzałka wskaże, kiedy polecenie jest wykonywane w kontenerze, a czerwona w systemie operacyjnym.

Uruchamianie tymczasowego kontenera w celu przetestowania DNS dostarczanego przez interfejs sieciowy mostka zdefiniowanego przez użytkownika.
$ apt-get update && apt-get install -y iputils-ping
Instalacja pakietu „iputils-ping” do testowania DNS.
$ ping postgres-2
Pokazuje, że DNS działa poprawnie.

Podsumowanie

PostgreSQL działa wewnątrz Dockera, a jego dostępność jest już gwarantowana. W przypadku użycia wewnątrz zdefiniowanej przez użytkownika sieci mostowej, kontenerami można łatwiej zarządzać z wieloma korzyściami, takimi jak DNS, niestandardowe adresy podsieci i nazwy systemów operacyjnych dla sieci.

Widzieliśmy szczegóły dotyczące Dockera i znaczenie bycia świadomym zaktualizowanych pakietów i frameworków w systemie operacyjnym.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Funkcja SQL jest bardzo powolna w porównaniu z zapytaniem bez opakowania funkcji

  2. PHP i Postgres:łapanie błędów?

  3. Wysoka dostępność PostgreSQL dzięki architekturze Master-Slave i Master-Master

  4. Jak upsertować pandy DataFrame do tabeli PostgreSQL?

  5. Zarządzanie PostgreSQL Commitfest