PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

So überwachen Sie PostgreSQL, das in einem Docker-Container ausgeführt wird:Teil Eins

Überwachung ist die Aktion des Beobachtens und Prüfens über einen bestimmten Zeitraum, um zu sehen, wie sich das, was Sie überwachen, entwickelt und verhält. Sie tun dies, damit Sie alle notwendigen Änderungen vornehmen können, um sicherzustellen, dass die Dinge ordnungsgemäß funktionieren. Es ist wichtig, dass Prozesse überwacht werden, um gute Einblicke in die Aktivitäten zu gewinnen, die durchgeführt werden, um eine effiziente Lösung zu planen, zu organisieren und zu betreiben.

Docker ist ein Programm, das entwickelt wurde, um als Builder zu fungieren, der bereit ist, die Frage zu beantworten:„Wird die Software auf meinem Computer ausgeführt?“ Es setzt im Grunde verschiedene Teile zusammen und schafft so ein Modell, das einfach zu lagern und zu transportieren ist. Das Modell, auch Container genannt, kann an jeden Computer versendet werden, auf dem Docker installiert ist.

In diesem Artikel stellen wir Docker vor, beschreiben einige Möglichkeiten der Konfiguration und vergleichen sie. Außerdem kommt PostgreSQL ins Spiel, und wir werden es auf intelligente Weise in einem Docker-Container bereitstellen, und schließlich werden wir die Vorteile sehen, die ClusterControl bieten kann, um wichtige Metriken über PostgreSQL und das Betriebssystem außerhalb davon zu überwachen.

Docker-Übersicht

Wenn Docker startet, erstellt es eine neue Netzwerkverbindung, um die Übertragung von Daten zwischen zwei Endpunkten zu ermöglichen, genannt Bridge, und hier werden standardmäßig neue Container gespeichert.

Im Folgenden werden wir Details zu dieser Brücke sehen und diskutieren, warum es keine gute Idee ist, sie in der Produktion zu verwenden.

$ docker network inspect bridge
Inspizieren der Docker-Standardbrücke docker0.

Bitte beachten Sie die eingebetteten Optionen, denn wenn Sie einen Container ausführen, ohne das gewünschte Netzwerk anzugeben, stimmen Sie damit überein.

Bei dieser Standardnetzwerkverbindung verlieren wir einige gute Vorteile des Netzwerks, wie z. B. DNS. Stellen Sie sich vor, Sie möchten auf Google zugreifen. Welche Adresse bevorzugen Sie, www.google.com oder 172.217.165.4?

Ich weiß nicht, wie es Ihnen geht, aber ich bevorzuge die frühere Wahl, und um ehrlich zu sein, tippe ich das „www.“ nicht ein.

Benutzerdefiniertes Bridge-Netzwerk

Wir wollen also DNS in unserer Netzwerkverbindung und den Vorteil der Isolierung, denn stellen Sie sich das Szenario vor, in dem Sie verschiedene Container innerhalb desselben Netzwerks bereitstellen.

Wenn wir einen Docker-Container erstellen, können wir ihm einen Namen geben, oder Docker macht es für uns, indem es zwei Wörter, die durch Unterstriche oder „_“ verbunden sind, randomisiert.

Wenn wir kein benutzerdefiniertes Bridge-Netzwerk verwenden, könnte es in Zukunft zu einem Problem in der Mitte der IP-Adressen kommen, da wir eindeutig keine Maschinen sind und bedenken, dass diese Werte hart und fehleranfällig sein können.

Das Erstellen einer benutzerdefinierten Bridge oder eines benutzerdefinierten Bridge-Netzwerks ist sehr einfach.

Bevor wir unser erstes erstellen, öffnen wir zum besseren Verständnis des Prozesses ein neues Terminal, geben einen Linux-Befehl des Pakets iproute2 ein und vergessen es jetzt.

$ ip monitor all
Initialisieren eines Terminals zum Überwachen des Netzwerkverkehrs im Docker-Host.

Dieses Terminal wird nun die Netzwerkaktivität abhören und dort anzeigen.

Sie haben vielleicht schon einmal Befehle wie „ifconfig“ oder „netstat“ gesehen, und ich sage Ihnen, dass sie seit 2001 veraltet sind. Das Paket net-tools wird immer noch häufig verwendet, aber nicht mehr aktualisiert.

Jetzt ist es an der Zeit, unser erstes benutzerdefiniertes Netzwerk zu erstellen, also öffnen Sie ein anderes Terminal und geben Sie ein:

$ docker network create --driver bridge br-db
Erstellen des benutzerdefinierten Bridge-Netzwerks „br-db“.

Diese sehr lange Mischung aus Buchstaben und Zahlen wird UUID oder Universally Unique IDentifier genannt. Es bedeutet im Grunde, dass das Netzwerk erfolgreich erstellt wurde.

Der vorgegebene Name für unser erstes manuell erstelltes Netzwerk war „br-db“ und muss am Ende des Befehls stehen, aber davor haben wir das Argument „-driver“ und dann den Wert „bridge“. , warum?

In der Community Edition stellt Docker drei verschiedene Treiber zur Verfügung:Bridge, Host und None. Zum Zeitpunkt der Erstellung, wie hier, ist die Standardeinstellung Bridge und muss nicht angegeben werden, aber wir lernen dazu.

Wenn Sie alles mit mir gemacht haben, schauen Sie sich das andere Terminal an, denn ich erkläre Ihnen, was los ist.

Docker hat das Netzwerk mit dem Namen „br-db“ erstellt, aber dieses wird nur von ihm so genannt.

Auf der anderen Seite dieser benutzerdefinierten Brücke befindet sich eine weitere Ebene, das Betriebssystem. Der Vorname für dasselbe Bridge-Netzwerk hat sich geändert und wird zu einer Darstellung der Nomenklatur für Bridge, „br“, gefolgt von den ersten 12 Zeichen des obigen UUID-Werts in Rot.

Änderungen der Docker-IP-Adresse überwachen.

Mit unserer neuen Netzwerkverbindung haben wir ein Subnetz, Gateway und Broadcast.

Das Gateway ist, wie der Name schon sagt, der Ort, an dem der gesamte Datenverkehr von Paketen zwischen den Bridge-Endpunkten stattfindet, und es heißt „inet“ für das Betriebssystem, wie Sie sehen können.

Broadcast steht für die letzte IP-Adresse und ist dafür verantwortlich, bei Bedarf den gleichen Datenverkehr für alle IP-Adressen im Subnetz zu senden.

Sie sind in Netzwerkverbindungen immer vorhanden, und deshalb haben wir am Anfang der Ausgabe den Wert „[ADDR]“. Dieser Wert stellt Änderungen der IP-Adresse dar und ist wie ein Ereignis, das für die Überwachung der Netzwerkaktivität ausgelöst wird, da wir eine neue Netzwerkverbindung erstellt haben!

Docker-Container

Bitte besuchen Sie den Docker-Hub und sehen Sie, dass das, was dort ist, als Docker-Image bekannt ist und im Grunde das Skelett des Containers (Modells) ist.

Docker-Images werden von Dockerfiles generiert und enthalten alle Informationen, die zum Erstellen eines Containers erforderlich sind, um die Wartung und Anpassung zu vereinfachen.

Wenn Sie sich den Docker-Hub genau ansehen, ist leicht zu erkennen, dass das PostgreSQL-Image namens postgres unterschiedliche Tags und Versionen hat, und wenn Sie keines davon angeben, wird der Standardwert verwendet, der neueste, aber vielleicht in Wenn Sie in Zukunft verschiedene PostgreSQL-Container benötigen, die zusammenarbeiten, möchten Sie möglicherweise, dass sie in derselben Version vorliegen.

Lassen Sie uns jetzt unseren ersten richtigen Container erstellen, denken Sie an die Notwendigkeit des Arguments „--network“, oder es wird in der Standardbrücke bereitgestellt.

$ docker container run --name postgres-1 --network br-db -e POSTGRES_PASSWORD=5af45Q4ae3Xa3Ff4 -p 6551:5432 -d postgres
Ausführen eines PostgreSQL-Containers im Netzwerk "br-db".

Wieder die UUID, Erfolg und im anderen Terminal, was ist los?

Netzwerkschnittstellenänderungen ist das Ereignis, das gerade stattfindet, oder einfach „[LINK]“. Alles nach dem „veth“ können Sie vergessen, vertrauen Sie mir, der Wert ändert sich immer, wenn der Container neu gestartet wird oder ähnliches passiert.

Änderungen der Docker-Netzwerkschnittstelle überwachen.

Die andere Option „-e POSTGRES_PASSWORD=?“ steht für Environment und ist nur verfügbar, wenn PostgreSQL-Container ausgeführt werden, es konfiguriert das Passwort für das Superuser-Konto in der Datenbank namens postgres.

Veröffentlichen ist der lange Name für den „-p 6551:5432“-Parameter und bewirkt im Grunde, dass der Betriebssystem-Port 6551 bidirektional an den Port 5432 des Containers gebunden wird.

Last but not least ist die Detach-Option „-d“ wichtig, die dafür sorgt, dass der Container unabhängig von diesem Terminal läuft.

Der Docker-Image-Name muss am Ende stehen, dem gleichen Muster der Netzwerkerstellung folgend, alle Argumente und Optionen links haben und am Ende das Wichtigste, in diesem Fall, der Image-Name.

Denken Sie daran, dass die Container im Subnetz des Netzwerks gehalten werden und auf IP-Adressen stehen, die für jeden von ihnen zulässig sind, und sie werden niemals an der ersten oder letzten Adresse sein, da Gateway und Broadcast immer dort sein werden.

Wir haben die Details der erstellten Brücke gezeigt, und jetzt werden diese Details von jedem der Endpunkte angezeigt, die von ihnen gespeichert werden.

$ docker network inspect br-db
Inspizieren der benutzerdefinierten Docker-Netzwerkschnittstelle „br-db“.
$ brctl show
Anzeigen von Informationen über das benutzerdefinierte Bridge-Netzwerk durch den Docker-Host.

Wie Sie sehen können, unterscheiden sich die Netzwerk- und Containernamen, wobei der zweite vom Betriebssystem als Schnittstelle erkannt wird und „veth768ff71“ heißt, und der von uns vergebene ursprüngliche Name „postgres-1“ für Docker.

Im Docker-Befehl ist es möglich, die IP-Adresse für den zuvor erstellten Container, das Subnetz, das mit dem übereinstimmt, was in dem anderen gerade geöffneten Terminal angezeigt wurde, und schließlich die leeren Optionen für dieses benutzerdefinierte Netzwerk zu notieren.

Der Linux-Befehl „brctl show“ ist Teil des Pakets bridge-utils, und wie der Name schon sagt, besteht sein Zweck darin, eine Reihe von Tools zum Konfigurieren und Verwalten von Linux-Ethernet-Bridges bereitzustellen.

Ein weiteres benutzerdefiniertes Bridge-Netzwerk

Wir werden bald über DNS sprechen, aber es war sehr gut, die Dinge für uns in Zukunft einfacher zu machen. Großartige Konfigurationen werden das Leben des DBA in der Zukunft leichter machen.

Bei Netzwerken ist es dasselbe, sodass wir ändern können, wie das Betriebssystem Subnetze, die Adresse und den Netzwerknamen erkennt, indem wir zum Zeitpunkt der Erstellung weitere Argumente hinzufügen.

$ docker network create --driver bridge --subnet 172.23.0.0/16 -o “com.docker.network.bridge.name”=”bridge-host” bridge-docker
Erstellen einer benutzerdefinierten Bridge-Netzwerkschnittstelle mit benutzerdefinierten Optionen.
$ ip route show
Anzeigen der Docker-Routing-Tabelle.

Mit diesem Linux-Befehl sehen wir fast dasselbe wie mit dem anderen Befehl zuvor, aber anstatt die „veth“-Schnittstellen für jedes Netzwerk aufzulisten, haben wir jetzt einfach dieses „linkdown“, das diejenigen anzeigt, die leer sind.

Die gewünschte Subnet-Adresse wurde als Argument angegeben, und ähnlich wie bei der Environment-Option für die Containererstellung haben wir für network das „-o“ gefolgt von dem Schlüssel-Wert-Paar. In diesem Fall sagen wir Docker, dass er dem Betriebssystem mitteilen soll, dass er das Netzwerk als „Bridge-Host“ bezeichnen soll.

Die Existenz dieser drei Netzwerke kann auch in Docker überprüft werden, geben Sie einfach ein:

$ docker network ls
Anzeigen von Netzwerkschnittstellen auf Docker Engine.

Nun haben wir bereits besprochen, dass die Werte dieser „veth“ für die Container keine Rolle spielen, und ich werde es Ihnen in der Praxis zeigen.

Die Übung besteht darin, den aktuellen Wert zu überprüfen, dann den Container neu zu starten und dann erneut zu überprüfen. Dazu benötigen wir eine Mischung aus zuvor verwendeten Linux-Befehlen und Docker-Befehlen, die hier neu, aber sehr einfach sind:

$ brctl show
$ docker container stop postgres-1
$ docker container start postgres-1
$ brctl show
Überprüfen, wie "iptables" die Containernamen für den Docker-Host flüchtig macht.

Wenn der Container gestoppt wird, muss die IP-Adresse freigegeben werden, um bei Bedarf eine neue zu erhalten, und das erinnert daran, wie wichtig DNS sein kann.

Das Betriebssystem vergibt diese Namen für die Schnittstellen jedes Mal, wenn ein Container in einer IP-Adresse steht, und sie werden mithilfe des Pakets iptables generiert, das bald durch das neue Framework namens nftables ersetzt wird.

Es wird nicht empfohlen, diese Regeln zu ändern, aber es stehen Tools zur Verfügung, die bei Bedarf bei deren Visualisierung helfen, z. B. dockerveth.

Container-Neustartrichtlinie

Wenn wir das Docker-Programm oder sogar den Computer neu starten, bleiben die von ihm erstellten Netzwerke im Betriebssystem erhalten, aber leer.

Container haben eine sogenannte Container Restart Policy, und dies ist ein weiteres sehr wichtiges Argument, das zum Zeitpunkt der Erstellung angegeben wird. Die Verfügbarkeit von PostgreSQL als Produktionsdatenbank ist entscheidend, und so kann Docker dabei helfen.

$ docker container run --name postgres-2 --network bridge-docker --restart always -e POSTGRES_PASSWORD=5af45Q4ae3Xa3Ff4 -p 6552:5432 -d postgres
Festlegen der Container-Neustartrichtlinie zum Zeitpunkt der Erstellung.

Sofern Sie ihn nicht manuell stoppen, ist dieser Container „postgres-2“ immer verfügbar.

Zum besseren Verständnis werden die laufenden Container angezeigt und das Docker-Programm neu gestartet, dann wieder der erste Schritt:

$ docker container ls
$ systemctl restart docker
$ docker container ls
Überprüfen der Container-Neustartrichtlinie in "postgres-2".

Nur der Container „postgres-2“ läuft, der andere Container „postgres-1“ startet nicht alleine. Weitere Informationen dazu finden Sie in der Docker-Dokumentation.

Domain Name System (DNS)

Ein Vorteil des benutzerdefinierten Bridge-Netzwerks ist sicherlich die Organisation, da wir so viele erstellen können, wie wir möchten, um neue Container auszuführen und sogar alte zu verbinden, aber ein weiterer Vorteil, den wir bei der Verwendung der Docker-Standardbrücke nicht haben, ist DNS.

Wenn Container miteinander kommunizieren müssen, kann es für den DBA mühsam sein, sich die IP-Adressen zu merken, und wir haben dies bereits am Beispiel von www.google.com und 172.217.165.4 besprochen. DNS löst dieses Problem nahtlos und ermöglicht die Interaktion mit Containern unter Verwendung der von uns zum Zeitpunkt der Erstellung angegebenen Namen, wie „postgres-2“, anstelle der IP-Adresse „172.23.0.2“.

Mal sehen, wie es funktioniert. Wir erstellen zu Demonstrationszwecken einen weiteren Container im selben Netzwerk namens „postgres-3“, dann installieren wir das Paket iputils-ping, um Datenpakete an den Container „postgres-2“ zu übertragen, natürlich unter seinem Namen .

$ 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

Zum besseren Verständnis teilen wir es in Teile auf. In den folgenden Ausgaben zeigt der blaue Pfeil an, wenn der Befehl innerhalb eines Containers ausgeführt wird, und in Rot im Betriebssystem.

Ausführen eines temporären Containers zum Testen des von der benutzerdefinierten Bridge-Netzwerkschnittstelle bereitgestellten DNS.
$ apt-get update && apt-get install -y iputils-ping
Installieren des Pakets "iputils-ping" zum Testen des DNS.
$ ping postgres-2
zeigt, dass DNS erfolgreich funktioniert.

Zusammenfassung

PostgreSQL läuft innerhalb von Docker, und seine Verfügbarkeit ist inzwischen garantiert. Bei Verwendung innerhalb eines benutzerdefinierten Bridge-Netzwerks können die Container mit vielen Vorteilen wie DNS, benutzerdefinierten Subnetzadressen und Betriebssystemnamen für die Netzwerke einfacher verwaltet werden.

Wir haben Details über Docker gesehen und wie wichtig es ist, sich über aktualisierte Pakete und Frameworks auf dem Betriebssystem im Klaren zu sein.