Implementierung der Docker-Bereitstellung eines MySQL-Clusters

Implementierung der Docker-Bereitstellung eines MySQL-Clusters

Nachteile einer Single-Node-Datenbank

  • Große Internetprogramme haben eine große Benutzerbasis, daher muss die Architektur speziell entwickelt werden
  • Eine Single-Node-Datenbank kann die Leistungsanforderungen nicht erfüllen
  • Die Single-Node-Datenbank ist nicht redundant ausgelegt und kann Hochverfügbarkeitsanforderungen nicht erfüllen.

Leistungsengpass bei MySQL mit einem einzigen Knoten

Das Geschäftsvolumen der WeChat-Rotumschläge zum Frühlingsfest 2016 war riesig und die Datenbank stand unter großer Belastung

Gängige MySQL-Clusterlösungen

Bei der Einführung der MySQL-Clusterlösung wird die Verwendung von PXC empfohlen, da eine schwache Konsistenz zu Problemen führt. Beispielsweise zeigt die Datenbank von Knoten A an, dass mein Kauf erfolgreich war, aber die Datenbank von Knoten B zeigt an, dass er nicht erfolgreich war. Das ist problematisch. Die PXC-Lösung meldet Ihnen den Erfolg erst, wenn alle Knoten erfolgreich geschrieben wurden. Es handelt sich um eine bidirektionale Synchronisierung mit Lese- und Schreibzugriff, die Replikation jedoch ist unidirektional. Zur Kommunikation sind Ports zwischen Datenbanken verschiedener Knoten geöffnet. Wenn dieser Port von der Firewall geschlossen ist, wird PXC die Synchronisierung nicht erfolgreich durchführen und Ihnen keine Erfolgsmeldung zurückgeben.

Replikation

  • Es ist schnell, kann aber nur eine schwache Konsistenz garantieren. Es eignet sich zum Speichern von Daten mit geringem Wert, wie Protokollen, Posts, Nachrichten usw.
  • Bei einer Master-Slave-Struktur werden an den Master geschriebene Daten mit dem Slave synchronisiert und können vom Slave gelesen werden. An den Slave geschriebene Daten können jedoch nicht mit dem Master synchronisiert werden.
  • Bei der asynchronen Replikation gibt der Master dem Client bei erfolgreichem Schreibvorgang eine Erfolgsmeldung zurück. Die Synchronisierung des Slaves kann jedoch fehlschlagen, sodass kein Lesen vom Slave möglich ist.

PXC (Percona XtraDB-Cluster)

  • Es ist langsam, kann aber eine hohe Konsistenz gewährleisten. Es eignet sich zum Speichern hochwertiger Daten wie Bestellungen, Kunden, Zahlungen usw.
  • Die Datensynchronisierung erfolgt bidirektional. Das Schreiben von Daten auf einem beliebigen Knoten wird mit allen anderen Knoten synchronisiert, und Daten können auf jedem Knoten gleichzeitig gelesen und geschrieben werden.
  • Bei der synchronen Replikation wird beim Schreiben von Daten auf einen beliebigen Knoten die Erfolgsmeldung erst dann an den Client zurückgegeben, wenn alle Knoten erfolgreich synchronisiert wurden. Die Transaktion wird entweder auf allen Knoten gleichzeitig festgeschrieben oder nicht festgeschrieben.

Es wird empfohlen, dass PXC PerconaServer verwendet (eine verbesserte Version von MySQL mit deutlich verbesserter Leistung).

Die starke Datenkonsistenz von PXC

Synchrone Replikation, Transaktionen werden entweder gleichzeitig an alle Clusterknoten übermittelt oder nicht übermittelt. Die Replikation erfolgt asynchron, wodurch keine Datenkonsistenz garantiert werden kann.

Einführung in die PXC-Clusterinstallation

Installieren Sie den PXC-Cluster in Docker, indem Sie das offizielle PXC-Image im Docker-Repository verwenden: https://hub.docker.com/r/percona/percona-xtradb-cluster

1. Laden Sie das PXC-Image aus dem offiziellen Docker-Repository herunter:

Docker-Pull Percona/Percona-XtraDB-Cluster

Oder lokal installieren

Docker laden < /home/soft/pxc.tar.gz

Installation abgeschlossen:

[root@localhost ~]# Docker-Pull Percona/Percona-Xtradb-Cluster
Standard-Tag verwenden: latest
Es wird versucht, das Repository docker.io/percona/percona-xtradb-cluster abzurufen ... 
aktuell: Abrufen von docker.io/percona/percona-xtradb-cluster
ff144d3c0ab1: Ziehen abgeschlossen 
eafdff1524b5: Pull abgeschlossen 
c281665399a2: Ziehen abgeschlossen 
c27d896755b2: Pull abgeschlossen 
c43c51f1cccf: Ziehen abgeschlossen 
6eb96f41c54d: Ziehen abgeschlossen 
4966940ec632: Ziehen abgeschlossen 
2bafadcea292: Ziehen abgeschlossen 
3c2c0e21b695: Ziehen abgeschlossen 
52a8c2e9228e: Ziehen abgeschlossen 
f3f28eb1ce04: Ziehen abgeschlossen 
d301ece75f56: Ziehen abgeschlossen 
3d24904bec3c: Ziehen abgeschlossen 
1053c2982c37: Ziehen abgeschlossen 
Zusammenfassung: sha256:17c64dacbb9b62bd0904b4ff80dd5973b2d2d931ede2474170cbd642601383bd
Status: Neueres Image für docker.io/percona/percona-xtradb-cluster:latest heruntergeladen
[root@localhost ~]# Docker-Bilder
REPOSITORY TAG BILD ID ERSTELLT GRÖSSE
docker.io/percona/percona-xtradb-cluster latest 70b3670450ef vor 2 Monaten 408 MB

2. Benennen Sie das Bild um: (der Name ist zu lang, benennen Sie es um)

Docker-Tag Percona/Percona-XtraDB-Cluster: neuestes pxc

Anschließend kann das Originalbild gelöscht werden

[root@localhost ~]# Docker-Bilder
REPOSITORY TAG BILD ID ERSTELLT GRÖSSE
docker.io/percona/percona-xtradb-cluster latest 70b3670450ef vor 2 Monaten 408 MB
pxc latest 70b3670450ef vor 2 Monaten 408 MB
docker.io/java latest d23bdf5b1b1b vor 2 Jahren 643 MB
[root@localhost ~]# docker rmi docker.io/percona/percona-xtradb-cluster
Ohne Tag: docker.io/percona/percona-xtradb-cluster:latest
Nicht markiert: docker.io/percona/percona-xtradb-cluster@sha256:17c64dacbb9b62bd0904b4ff80dd5973b2d2d931ede2474170cbd642601383bd
[root@localhost ~]# Docker-Bilder
REPOSITORY TAG BILD ID ERSTELLT GRÖSSE
pxc latest 70b3670450ef vor 2 Monaten 408 MB
docker.io/java latest d23bdf5b1b1b vor 2 Jahren 643 MB

3. Erstellen Sie aus Sicherheitsgründen ein internes Docker-Netzwerk für den PXC-Cluster

# Erstellen Sie ein Netzwerksegment docker network create --subnet=172.18.0.0/24 net1
# Zeigen Sie das Netzwerksegment Docker Network Inspection Net1 an
# Löschen Sie das Netzwerksegment# docker network rm net1

4. Erstellen Sie ein Docker-Volume:
Bei der Verwendung von Docker sollten Geschäftsdaten mithilfe der Verzeichniszuordnung auf dem Hostcomputer gespeichert werden, sodass die Daten unabhängig vom Container sein können. Der PXC im Container kann das Zuordnungsverzeichnis jedoch nicht direkt verwenden. Die Lösung besteht darin, das Docker-Volume zum Zuordnen zu verwenden

# Erstellen Sie ein Datenvolumen mit dem Namen v1, --name kann weggelassen werden docker volume create --name v1

Datenvolumen anzeigen

Docker-Inspektion v1

Ergebnis:

[root@localhost ~]# Docker-Inspektion v1
[
  {
    "Treiber": "lokal",
    "Beschriftungen": {},
    "Mountpoint": "/var/lib/docker/volumes/v1/_data",#Dies ist der Speicherort auf dem Hostcomputer"Name": "v1",
    "Optionen": {},
    "Geltungsbereich": "lokal"
  }
]

Löschen eines Datenvolumens

Docker-Volume RM v1

Erstellen Sie 5 Datenvolumes

# Erstellen Sie 5 Datenvolumes docker volume create --name v1
Docker-Volume erstellen --Name v2
Docker-Volume erstellen --Name v3
Docker-Volume erstellen --Name v4
Docker-Volume erstellen --Name v5

5. Erstellen Sie 5 PXC-Container:

# Erstellen Sie 5 PXC-Container, um einen Cluster zu bilden. # Der erste Knoten docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -v v1:/var/lib/mysql --name=node1 --network=net1 --ip 172.18.0.2 pxc
# Warten Sie nach dem Start des ersten Knotens einen Moment, bis MySQL gestartet ist.

# Zweiter Knoten Docker-Ausführung -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=node1 -v v2:/var/lib/mysql --name=node2 --net=net1 --ip 172.18.0.3 pxc
# Der dritte Knoten docker run -d -p 3308:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=node1 -v v3:/var/lib/mysql --name=node3 --net=net1 --ip 172.18.0.4 pxc
# Der vierte Knoten docker run -d -p 3309:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=node1 -v v4:/var/lib/mysql --name=node4 --net=net1 --ip 172.18.0.5 pxc
# Der fünfte Knoten docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=node1 -v v5:/var/lib/mysql --name=node5 --net=net1 --ip 172.18.0.6 pxc

Überprüfen:

[root@localhost ~]# docker ps
CONTAINER ID BILD BEFEHL ERSTELLT STATUS PORTS NAMEN
f4708ce32209 pxc "/entrypoint.sh " Vor etwa einer Minute Aktiv Vor etwa einer Minute 4567-4568/tcp, 0.0.0.0:3309->3306/tcp node4
bf612f9586bc pxc "/entrypoint.sh " vor 17 Minuten Aktiv seit 17 Minuten 4567-4568/tcp, 0.0.0.0:3310->3306/tcp node5
9fdde5e6becd pxc "/entrypoint.sh " vor 17 Minuten Aktiv seit 17 Minuten 4567-4568/tcp, 0.0.0.0:3308->3306/tcp node3
edd5794175b6 pxc "/entrypoint.sh " vor 18 Minuten Aktiv seit 18 Minuten 4567-4568/tcp, 0.0.0.0:3307->3306/tcp node2
33d842de7f42 pxc "/entrypoint.sh " vor 21 Minuten Aktiv seit 21 Minuten 0.0.0.0:3306->3306/tcp, 4567-4568/tcp node1

Die Notwendigkeit des Datenbank-Lastausgleichs

Obwohl ein Cluster erstellt wird, wird kein Datenbanklastenausgleich verwendet. Ein einzelner Knoten verarbeitet alle Anforderungen, was zu hoher Last und schlechter Leistung führt.

Senden Sie Anfragen gleichmäßig an jeden Knoten im Cluster.

  • Alle Anfragen werden an einen einzelnen Knoten gesendet, der überlastet ist und eine geringe Leistung aufweist, während andere Knoten im Leerlauf sind.
  • Durch die Verwendung von Haproxy zum Lastenausgleich können Anforderungen gleichmäßig an jeden Knoten gesendet werden, mit geringer Einzelknotenlast und guter Leistung.

Vergleich von Lastausgleichs-Middleware

Beim Lastenausgleich wird zunächst ein Datenbankcluster verwendet. Wenn fünf Cluster hinzugefügt werden und jede Anforderung an den ersten Cluster gerichtet ist, kann die erste Datenbank ausfallen. Daher ist es eine bessere Lösung, Anforderungen an verschiedene Knoten zu richten. Dies erfordert Middleware zur Weiterleitung. Zu den besseren Middlewares gehören nginx und haproxy. Nginx unterstützt Plug-Ins, hat aber nur das TCP/IP-Protokoll unterstützt. haproxy ist eine alte Middleware-Weiterleitungssoftware. Wenn Sie Haproxy verwenden möchten, können Sie das Image von der offiziellen Website herunterladen und anschließend das Image konfigurieren (schreiben Sie die Konfigurationsdatei selbst, da dieses Image keine Konfigurationsdatei hat. Ordnen Sie nach der Konfiguration den Ordner beim Ausführen des Images zu. Die Konfigurationsdatei öffnet 3306 (Datenbankanforderung und greift dann basierend auf der Überprüfung der Heartbeat-Erkennung auf verschiedene Datenbanken zu, 8888 überwacht den Datenbankcluster)). Die Konfigurationsdatei legt Benutzer fest (Benutzer führen eine Heartbeat-Erkennung in der Datenbank durch, bestimmen, welcher Datenbankknoten inaktiv ist, und greifen dann auf die inaktiven Knoten zu), verschiedene Algorithmen (wie Round-Robin-Training), die maximale Anzahl von Verbindungen, die Zeit usw. sowie die Clusterüberwachung. Führen Sie das Image aus, nachdem die Konfigurationsdatei geschrieben wurde. Geben Sie nach erfolgreicher Ausführung des Images die Startkonfigurationsdatei des Containers ein. Tatsächlich gibt haprocy auch eine Datenbankinstanz zurück (diese speichert jedoch keine Daten, sondern leitet nur Anfragen weiter), die zum Überprüfen anderer Knoten verwendet wird.

Installieren Sie Haproxy

1. Ziehen Sie das Haproxy-Image aus dem Docker-Repository: https://hub.docker.com/_/haproxy

Docker zieht Haproxy
[root@localhost ~]# Docker-Bilder
REPOSITORY TAG BILD ID ERSTELLT GRÖSSE
docker.io/haproxy latest 11fa4d7ff427 vor 11 Tagen 72,2 MB

2. Erstellen Sie eine Haproxy-Konfigurationsdatei. Zur Verwendung durch Haproxy-Container (im Docker wird keine Konfigurationsdatei generiert, wir müssen die Konfigurationsdatei selbst auf dem Hostcomputer erstellen)
Weitere Informationen zur Konfigurationsdatei finden Sie unter: https://www.cnblogs.com/wyt007/p/10829184.html

# Verwenden Sie beim Starten des Containers die Verzeichniszuordnungstechnologie, damit der Container die Konfigurationsdatei touch /home/soft/haproxy/haproxy.cfg lesen kann.

haproxy.cfg

# haproxy.cfg
weltweit
  #Arbeitsverzeichnis chroot /usr/local/etc/haproxy
  #Protokolldatei, verwenden Sie das lokale Protokollgerät (/var/log/local5) im rsyslog-Dienst, Ebeneninfo
  Protokoll 127.0.0.1 local5 info
  #Daemon-Prozess, der Daemon ausführt

Vorgabewerte
  globales Protokoll
  Modus http
  #Protokollformatoption httplog
  #Zeichnen Sie den Heartbeat-Erkennungsdatensatz des Lastausgleichs nicht in der Protokolloption dontlognull auf
  #Verbindungstimeout (Millisekunden)
  Timeout Verbindung 5000
  #Client-Timeout (Millisekunden)
  Timeout-Client 50000
  #Server-Timeout (Millisekunden)
  Timeout-Server 50000

#Überwachungsschnittstelle listen admin_stats
  #Überwachung der Schnittstellenzugriffs-IP und der Portbindung 0.0.0.0:8888
  #Zugriffsprotokollmodus http
  #URI relative Adresse Statistik URI /dbs
  #Statistikbericht formatstats realm Global\ statistics
  #Login-Kontoinformationen Statistiken Auth Admin:abc123456
#Datenbank-Lastausgleich, Proxy-MySQL abhören
  #Zugriffs-IP und Port-Bind 0.0.0.0:3306 
  #Netzwerkprotokollmodus TCP
  #Lastausgleichsalgorithmus (Round-Robin-Algorithmus)
  # Polling-Algorithmus: Roundrobin
  #Gewichtsalgorithmus: static-rr
  # Algorithmus für geringste Verbindung: leastconn
  #Quell-IP-Algorithmus anfordern: Quelle 
  Rundenturnier
  #Protokollformatoption tcplog
  #Erstellen Sie einen Haproxy-Benutzer ohne Berechtigungen in MySQL und legen Sie das Kennwort leer. Haproxy verwendet dieses Konto, um die Heartbeat-Erkennung für die MySQL-Datenbankoption mysql-check user haproxy durchzuführen.
  Server MySQL_1 172.18.0.2:3306 Gewicht prüfen 1 maxconn 2000 
  Server MySQL_2 172.18.0.3:3306 Gewicht prüfen 1 maxconn 2000 
  Server MySQL_3 172.18.0.4:3306 Gewicht prüfen 1 maxconn 2000 
  Server MySQL_4 172.18.0.5:3306 Gewicht prüfen 1 maxconn 2000
  Server MySQL_5 172.18.0.6:3306 Gewicht prüfen 1 maxconn 2000
  #Verwenden Sie Keepalive, um tote Links zu erkennen Option tcpka

3. Erstellen Sie ein leeres Passwort und einen nicht privilegierten Benutzer haproxy im Datenbankcluster, damit Haproxy eine Heartbeat-Erkennung für die MySQL-Datenbank durchführen kann

Erstellen Sie den Benutzer „haproxy“@„%“, identifiziert durch „“;

4. Erstellen Sie einen Haproxy-Container (Name=h1 für hohe Verfügbarkeit)

# Hier müssen Sie --privileged hinzufügen
docker run -it -d -p 4001:8888 -p 4002:3306 -v /home/soft/haproxy:/usr/local/etc/haproxy --name h1 --net=net1 --ip 172.18.0.7 --privileged haproxy

5. Geben Sie den Container ein

docker exec -it h1 bash

6. Starten Sie Haproxy im Container Bash

haproxy -f /usr/local/etc/haproxy/haproxy.cfg

Als Nächstes können Sie die Haproxy-Überwachungsschnittstelle im Browser öffnen, Port 4001 und der Benutzername admin und das Passwort abc123456 sind in der Konfigurationsdatei definiert.
Ich habe http://192.168.63.144:4001/dbs besucht und musste mich mit meinem Benutzernamen und Passwort anmelden (eine kleine Anmerkung: Ich habe die Standardanmeldung verwendet und mein Chrome war aus irgendeinem Grund blockiert, also habe ich am Ende Firefox verwendet).

Zu diesem Zeitpunkt hängen wir einen Docker-Knoten manuell auf und sehen uns die Änderungen an (wir werden feststellen, dass er als aufgehängt angezeigt wird).

8. Haproxy speichert keine Daten, es leitet sie nur weiter. Sie können eine Haproxy-Verbindung in der Datenbank herstellen, Port 4002, Benutzername und Passwort sind Benutzername und Passwort des Datenbankclusters

Warum Dual-Machine-Hot-Standby verwenden?

Single-Node-Haproxy hat keine hohe Verfügbarkeit und muss redundant ausgelegt sein.

Duale Maschinen bedeuten zwei Anforderungsverarbeitungsprogramme, z. B. zwei Haproxy. Wenn eines ausfällt, kann das andere übernehmen. Unter Hot-Standby verstehe ich Keepalive. Installieren Sie Keepalive im Haproxy-Container.

Virtuelle IP-Adresse

Das Linux-System kann mehrere IP-Adressen in einer Netzwerkkarte definieren und diese Adressen mehreren Anwendungen zuweisen. Diese Adressen sind virtuelle IPs. Die wichtigste Technologie der Hot-Standby-Lösung für zwei Maschinen von Haproxy ist die virtuelle IP.

Der Schlüssel ist die virtuelle IP. Definieren Sie eine virtuelle IP und installieren Sie dann das Keepalive-Image jeweils auf zwei Haproxy-Servern. Da Haproxy auf dem Ubuntu-System läuft, wird für die Installation apt-get verwendet. Die Funktion von Keepalive besteht darin, die virtuelle IP zu beschlagnahmen. Die beschlagnahmte IP ist der primäre Server, die nicht beschlagnahmte IP ist der Backup-Server. Dann führen die beiden Keepalive-Server eine Heartbeat-Erkennung durch (d. h., sie erstellen einen Benutzer, um zu testen, ob die andere Partei noch aktiv ist. Es gibt auch eine Heartbeat-Erkennung zwischen MySQL-Clustern). Wenn es auflegt, wird die IP beschlagnahmt. Bevor Sie Keepalive starten, müssen Sie daher zunächst die Konfigurationsdatei bearbeiten und Angaben dazu machen, wie das Preemption-Verfahren durchgeführt wird, wie das Gewicht lautet, was die virtuelle IP-Adresse ist und was der erstellte Benutzer übermittelt. Nach der Konfiguration und dem Start können Sie durch Pingen prüfen, ob alles korrekt ist, und dann die virtuelle IP der LAN-IP zuordnen.

Verwenden von Keepalived zum Implementieren von Hot-Standby

  • Virtuelle IP definieren
  • Starten Sie zwei Haproxy-Container in Docker und installieren Sie in jedem Container das Keepalived-Programm (im Folgenden als KA bezeichnet).
  • Zwei KAs konkurrieren um die virtuelle IP. Wenn einer sie bekommt, wartet der andere. Derjenige, der sie bekommt, wird der primäre Server sein, und derjenige, der sie nicht bekommt, wird der Backup-Server sein.
  • Zwischen den beiden KAs wird eine Heartbeat-Erkennung durchgeführt. Wenn der Backup-Server keine Heartbeat-Antwort vom Primärserver erhält, bedeutet dies, dass der Primärserver ausgefallen ist. Dann kann der Backup-Server um die virtuelle IP konkurrieren und weiterarbeiten.
  • Wir senden Datenbankanfragen an die virtuelle IP. Wenn ein Haproxy ausfällt, kann ein anderer übernehmen.

Нaproxy-Hot-Standby-Lösung für zwei Maschinen

Erstellen Sie zwei Haproxy in Docker und erfassen Sie die virtuelle IP in Docker über Keepalived

Auf die virtuelle IP in Docker kann vom externen Netzwerk aus nicht zugegriffen werden. Daher müssen Sie den Host Keepalived verwenden, um sie einer virtuellen IP zuzuordnen, auf die vom externen Netzwerk aus zugegriffen werden kann.

Installieren Sie Keepalived

1. Rufen Sie den Haproxy-Container auf und installieren Sie Keepalived:

$ docker exec -it h1 bash
apt-get-Aktualisierung
apt-get installieren keepalived

2. Keepalived-Konfigurationsdatei (Keepalived.conf):
Die Konfigurationsdatei von Keepalived ist /etc/keepalived/keepalived.conf.

# vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
  Status MASTER # Die Identität von Keepalived (der MASTER-Dienst muss die IP beschlagnahmen, und der BACKUP-Server wird die IP nicht beschlagnahmen).
  Schnittstelle eth0 # Docker-Netzwerkkartengerät, auf dem sich die virtuelle IP befindet virtual_router_id 51 # Virtuelle Routing-Kennung, die virtuellen Routing-Kennungen von MASTER und BACKUP müssen konsistent sein. Von 0 bis 255
  Priorität 100 # MASTER hat ein höheres Gewicht als BACKUP. Je größer die Zahl, desto höher die Priorität. advert_int 1 # Das Zeitintervall für die Synchronisierungsprüfung zwischen MASTER- und BACKUP-Knoten in Sekunden muss zwischen Master und Backup konsistent sein. Authentifizierung { # Authentifizierungsmethode für Master-Slave-Server. Für eine normale Kommunikation müssen Master und Slave dasselbe Passwort verwenden. auth_type PASS
    Auth_Passwort 123456
  }
  virtual_ipaddress { #Virtuelle IP. Sie können mehrere virtuelle IP-Adressen festlegen, eine 172.18.0.201 pro Zeile
  }
}

3. Starten Sie Keepalived

Dienst Keepalived Start

Nach dem erfolgreichen Start können Sie mit ip a überprüfen, ob die virtuelle IP in der Netzwerkkarte erfolgreich ist. Darüber hinaus können Sie die virtuelle IP 172.18.0.201 im Hostcomputer erfolgreich anpingen.

4. Sie können die obigen Schritte befolgen, um einen weiteren Haproxy-Container zu erstellen. Beachten Sie, dass der zugeordnete Host-Port nicht wiederholt werden kann und die Haproxy-Konfiguration dieselbe ist. Installieren Sie dann Keepalived im Container. Die Konfiguration ist grundsätzlich dieselbe (das Prioritätsgewicht kann geändert werden). Auf diese Weise wird grundsätzlich die Haproxy-Hot-Standby-Lösung für zwei Maschinen implementiert. Der Befehl lautet wie folgt:

Erstellen Sie einen Haproxy-Container (Name=h2 für hohe Verfügbarkeit)

# Hier müssen Sie --privileged hinzufügen
docker run -it -d -p 4003:8888 -p 4004:3306 -v /home/soft/haproxy:/usr/local/etc/haproxy --name h2 --net=net1 --ip 172.18.0.8 --privileged haproxy

Betreten des Containers

docker exec -it h2 bash

Starten Sie Haproxy im Container Bash

haproxy -f /usr/local/etc/haproxy/haproxy.cfg

Als Nächstes können Sie die Haproxy-Überwachungsschnittstelle im Browser öffnen, Port 4003. Der Benutzername admin und das Passwort abc123456 sind in der Konfigurationsdatei definiert.
Ich habe http://192.168.63.144:4003/dbs besucht und musste mich mit meinem Benutzernamen und Passwort anmelden (eine kleine Anmerkung: Ich habe die Standardanmeldung verwendet und mein Chrome war aus irgendeinem Grund blockiert, also habe ich am Ende Firefox verwendet).

Installieren Sie Keepalived:

apt-get-Aktualisierung
apt-get installieren keepalived

Keepalived-Konfigurationsdatei (Keepalived.conf):
Die Konfigurationsdatei von Keepalived ist /etc/keepalived/keepalived.conf.

# vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
  Status MASTER # Die Identität von Keepalived (der MASTER-Dienst muss die IP beschlagnahmen, und der BACKUP-Server wird die IP nicht beschlagnahmen).
  Schnittstelle eth0 # Docker-Netzwerkkartengerät, auf dem sich die virtuelle IP befindet virtual_router_id 51 # Virtuelle Routing-Kennung, die virtuellen Routing-Kennungen von MASTER und BACKUP müssen konsistent sein. Von 0 bis 255
  Priorität 100 # MASTER hat ein höheres Gewicht als BACKUP. Je größer die Zahl, desto höher die Priorität. advert_int 1 # Das Zeitintervall für die Synchronisierungsprüfung zwischen MASTER- und BACKUP-Knoten in Sekunden muss zwischen Master und Backup konsistent sein. Authentifizierung { # Authentifizierungsmethode für Master-Slave-Server. Für eine normale Kommunikation müssen Master und Slave dasselbe Passwort verwenden. auth_type PASS
    Auth_Passwort 123456
  }
  virtual_ipaddress { #Virtuelle IP. Sie können mehrere virtuelle IP-Adressen festlegen, eine 172.18.0.201 pro Zeile
  }
}

Starten Sie Keepalived

Dienst Keepalived Start

Nach dem erfolgreichen Start können Sie mit ip a überprüfen, ob die virtuelle IP in der Netzwerkkarte erfolgreich ist. Darüber hinaus können Sie die virtuelle IP 172.18.0.201 im Hostcomputer erfolgreich anpingen.

Implementierung des externen Netzwerkzugriffs auf virtuelle IP

Sehen Sie sich die aktuelle LAN-IP-Zuweisung an:

yum installiere nmap -y
nmap -sP 192.168.1.0/24

Installieren Sie Keepalived auf dem Host

yum installiere Keepalived

Die Keepalived-Konfiguration des Hosts ist wie folgt (/etc/keepalived/keepalived.conf):

vrrp_instance VI_1 {
  Zustand MEISTER
#Dies ist die Netzwerkkarte des Hosts. Mit ip a können Sie überprüfen, welche Schnittstelle ens33 die aktuell auf Ihrem Computer verwendete Netzwerkkarte ist.
  virtuelle_Router_ID 100
  Priorität 100
  Anzeige_int 1
  Authentifizierung
    Authentizitätstyp PASS
    Auth_Passwort 1111
  }
  virtuelle_IP-Adresse {
#Dies ist eine virtuelle IP-Adresse auf einem angegebenen Host-Rechner. Sie muss sich im selben Netzwerksegment wie die Netzwerkkarte des Host-Rechners befinden.
#Die IP meiner Host-Netzwerkkarte ist 192.168.63.144, daher ist die angegebene virtuelle IP 160
      192.168.63.160
  }
}
 
#Akzeptieren Sie den Port für die Überwachung der Datenquelle. Der Webseitenzugriff verwendet den virtuellen Server 192.168.63.160 8888 {
  Verzögerungsschleife 3
  lb_algo rr 
  lb_kind NAT
  Persistenzzeitüberschreitung 50
  Protokoll TCP
# Leiten Sie die empfangenen Daten an das Netzwerksegment und den Port des Docker-Dienstes weiter. Da sie an den Docker-Dienst gesendet werden, müssen die Daten mit den Daten des Docker-Dienstes real_server 172.18.0.201 8888 { übereinstimmen.
    Gewicht 1
  }
}
 
#Datenbankdatenport akzeptieren. Der Host-Datenbankport ist 3306, daher muss dieser auch mit dem Host-Datenakzeptanzport virtual_server 192.168.63.160 3306 { übereinstimmen.
  Verzögerungsschleife 3
  lb_algo rr 
  lb_kind NAT
  Persistenzzeitüberschreitung 50
  Protokoll TCP
#Ebenso müssen der Port und die IP-Adresse der an den Dienst weitergeleiteten Datenbank mit den Daten im Docker-Dienst real_server 172.18.0.201 3306 { übereinstimmen.
    Gewicht 1
  }
}

Starten Sie den Keepalived-Dienst

Dienst Keepalived Start
#Dienst Keepalived-Status
#Dienst Keepalived stoppen

Danach können andere Computer über die Ports 8888 und 3306 der virtuellen IP 192.168.63.160 auf die entsprechenden Ports 172.18.0.201 im Host-Docker zugreifen.

So suspendieren Sie den PXC-Cluster

vi /etc/sysctl.conf
#Fügen Sie net.ipv4.ip_forward=1 zur Datei systemctl restart network hinzu

Dann suspendieren Sie die virtuelle Maschine

Hot-Backup-Daten

Kaltes Backup

  • Cold Backup ist eine Sicherungsmethode, bei der die Datenbank geschlossen ist. Normalerweise werden dabei die Datendateien kopiert.
  • Es handelt sich um eine einfache und sichere Sicherungsmethode und es ist keine Sicherung möglich, während die Datenbank ausgeführt wird.
  • Große Websites können ihren Betrieb nicht schließen, um Daten zu sichern. Daher ist ein Cold Backup nicht die beste Wahl.

Hot-Backup

Beim Hot Backup handelt es sich um eine Datensicherung im laufenden Systembetrieb.

Gängige Hot-Backup-Lösungen für MySQL sind LVM und XtraBackup

  • LVM: Linux-Befehl zur Partitionssicherung, kann jede Datenbank sichern, sperrt die Datenbank jedoch und kann nur gelesen werden; außerdem ist der Befehl komplex
  • XtraBackup: Keine Tabellensperre nötig und kostenlos

XtraBackup

XtraBackup ist ein Online-Hot-Backup-Tool auf Basis von InnoDB. Es ist Open Source und kostenlos, unterstützt Online-Hot-Backup, benötigt wenig Speicherplatz und kann MySQL-Datenbanken sehr schnell sichern und wiederherstellen.

  • Die Tabelle wird während des Sicherungsvorgangs nicht gesperrt, was schnell und zuverlässig ist
  • Der Backup-Prozess unterbricht die laufenden Transaktionen nicht
  • Backup-Daten werden komprimiert und beanspruchen weniger Speicherplatz

Voll-Backup und inkrementelles Backup

  • Vollständiges Backup: Sichern Sie alle Daten. Der Sicherungsvorgang dauert lange und benötigt viel Speicherplatz. Das erste Backup sollte eine Vollsicherung sein
  • Inkrementelles Backup: Sichern Sie nur die geänderten Daten. Die Sicherungszeit ist kurz und der belegte Speicherplatz gering. Nach dem zweiten Mal inkrementelles Backup verwenden

PXC-Vollsicherung

Die Sicherung sollte in einem Container eines PXC-Knotens durchgeführt werden, die Sicherungsdaten sollten jedoch auf der Host-Maschine gespeichert werden. Daher wird die Verzeichniszuordnungstechnologie verwendet. Erstellen Sie zunächst ein neues Docker-Volume:

Docker-Volume erstellt Backup

Wählen Sie einen PXC-Knoten node1 aus, stoppen und löschen Sie seinen Container und erstellen Sie dann einen node1-Container mit der hinzugefügten Backup-Verzeichniszuordnung neu

Docker stoppt Knoten1
docker rm node1 # Datenbankdaten werden im Docker-Volume v1 gespeichert und gehen nicht verloren # Parameteränderungen:
# 1. -e CLUSTER_JOIN=node2;Ursprünglich sind andere Knoten dem Cluster über Knoten1 beigetreten. Jetzt wird Knoten1 neu erstellt und Sie müssen einen anderen Knoten auswählen, der dem Cluster beitritt# 2. -v Backup:/Data;Ordnen Sie das Docker-Volume-Backup dem /data-Verzeichnis des Containers zudocker run -d -u root -p 3306:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=node2 -v v1:/var/lib/mysql -v Backup:/Data --network=net1 --ip 172.18.0.2 --name=node1 pxc

Installieren Sie percona-xtrabackup-24
im Container node1 percona-xtrabackup-24

docker exec -it node1 bash
apt-get-Aktualisierung
apt-get installiere percona-xtrabackup-24

Anschließend können Sie mit dem folgenden Befehl eine vollständige Sicherung durchführen. Die gesicherten Daten werden im Verzeichnis /data/backup/full gespeichert:

mkdir /Daten/Sicherung
mkdir /Daten/Backup/voll
#Nicht empfohlen, veraltet innobackupex --backup -u root -p abc123456 --target-dir=/data/backup/full
xtrabackup --backup -uroot -pabc123456 --target-dir=/data/backup/full

In der offiziellen Dokumentation wird nicht mehr die Verwendung innobackupex empfohlen, sondern stattdessen der Befehl xtrabackup .

Vollständige PXC-Wiederherstellung

Die Datenbank kann im laufenden Betrieb gesichert werden, jedoch nicht im laufenden Betrieb wiederhergestellt werden, da es sonst zu Konflikten zwischen Geschäftsdaten und wiederhergestellten Daten kommt.

Um beim PXC-Cluster Datensynchronisierungskonflikte zwischen Knoten während des Wiederherstellungsprozesses zu vermeiden, müssen wir zunächst den ursprünglichen Cluster auflösen und die Knoten löschen. Erstellen Sie dann einen neuen Knoten mit einer leeren Datenbank, führen Sie die Wiederherstellung durch und richten Sie schließlich weitere Clusterknoten ein.

Vor der Wiederherstellung müssen Sie die im Hot Backup gespeicherten, nicht festgeschriebenen Transaktionen zurücksetzen und MySQL nach der Wiederherstellung neu starten.

Stoppen und löschen Sie alle Knoten im PXC-Cluster

Docker stoppen Knoten1 Knoten2 Knoten3 Knoten4 Knoten5
Docker RM Knoten1 Knoten2 Knoten3 Knoten4 Knoten5
Docker-Volumen RM V1 V2 V3 V4 V5

Befolgen Sie die vorherigen Schritte, um den Container node1 neu zu erstellen, den Container aufzurufen und eine Kaltwiederherstellung durchzuführen.

# Volume erstellen Docker-Volume erstellen v1
# Einen Container erstellen docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -v v1:/var/lib/mysql -v backup:/data --name=node1 --network=net1 --ip 172.18.0.2 pxc
# Geben Sie den Container als Root ein docker exec -it -uroot node1 bash
# Daten löschen rm -rf /var/lib/mysql/*
# Vorbereitungsphase xtrabackup --prepare --target-dir=/data/backup/full/
# Führen Sie eine Kaltwiederherstellung durch xtrabackup --copy-back --target-dir=/data/backup/full/
# Ändern Sie den Besitzer der wiederhergestellten Datenbankdatei chown -R mysql:mysql /var/lib/mysql
# Nach dem Verlassen des Containers den Container neu starten docker stop node1
Docker startet Knoten1

Dies ist das Ende dieses Artikels über die Implementierung der Docker-Bereitstellung eines MySQL-Clusters. Weitere relevante Inhalte zur Docker-Bereitstellung eines MySQL-Clusters finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen!

Das könnte Sie auch interessieren:
  • So erstellen Sie einen MySQL PXC-Cluster
  • Bereitstellung eines MySQL-Hochverfügbarkeitsclusters und Implementierung eines Failovers
  • MySQL 5.7-Clusterkonfigurationsschritte
  • Detaillierte Schritte zur Installation von MySQL mit Cluster-RPM
  • Detaillierte Erläuterung des MySQL-Clusters: Implementierung einer Master- und einer Slave-Architektur
  • So stellen Sie MySQL 5.7- und 8.0-Master-Slave-Cluster mit Docker bereit
  • Detaillierte Erläuterung der Galera-Cluster-Bereitstellung im Clustermodus von MySQL
  • Beispiel zum Erstellen eines MySQL-Clusters mit Docker
  • Tutorial zur grundlegenden Bereitstellung von MySQL Cluster
  • So erstellen Sie einen MySQL-Cluster mit hoher Verfügbarkeit und Leistung

<<:  Detaillierte Erläuterung der Vue3-Kapselungsfunktion für Nachrichtenaufforderungsinstanzen

>>:  Einführung in die MySQL-Gesamtarchitektur

Artikel empfehlen

Sprechen Sie über nextTick in Vue

Wenn sich die Daten ändern, wird die DOM-Ansicht ...

Detaillierte Schritte zur Installation von Mysql5.7.19 mit yum auf Centos7

In der Yum-Quelle von Centos7 ist standardmäßig k...

Ubuntu-Grundlagen-Tutorial: apt-get-Befehl

Vorwort Der Befehl apt-get ist ein Paketverwaltun...

Beispielanalyse zum Exportieren, Importieren und Kopieren von Docker-Images

Die erste Lösung besteht darin, das Bild in ein ö...

Der gesamte Prozess der Konfiguration von Hive-Metadaten für MySQL

Gehen Sie im Hive-Installationsverzeichnis in das...

Erklären Sie kurz die Verwendung von „group by“ in SQL-Anweisungen

1. Übersicht Gruppieren nach bedeutet, Daten nach...

Lernen Sie schnell die MySQL-Grundlagen

Inhaltsverzeichnis SQL verstehen SELECT verstehen...

Vorgang zur Zeitzonenanpassung im Docker-Container

Wie kann ich überprüfen, ob die Zeitzone des Dock...

So ändern Sie die Längenbeschränkung von group_concat in MySQL

In MySQL gibt es eine Funktion namens „group_conc...

TypeScript-Dekorator-Definition

Inhaltsverzeichnis 1. Konzept 1.1 Definition 1.2 ...

Lassen Sie uns im Detail darüber sprechen, wie der NodeJS-Prozess beendet wird

Inhaltsverzeichnis Vorwort Aktiver Rückzug Ausnah...

Implementierungscode für den MySQL-Protokolltrigger

SQL-Anweisung DROP-TRIGGER WENN EXISTIERT sys_men...

Implementierung der MySQL-Dezimaldatentypkonvertierung

Kürzlich stieß ich auf eine Datenbank mit folgend...