1. Einführung in PXC 1.1 Einführung in PXCPXC ist eine MySQL-Hochverfügbarkeitsclusterlösung. Im Vergleich zur herkömmlichen Clusterarchitektur, die auf dem Master-Slave-Replikationsmodus basiert, besteht das herausragendste Merkmal von PXC darin, dass es das lange kritisierte Problem der Datenreplikationsverzögerung löst und grundsätzlich eine Echtzeitsynchronisierung erreichen kann. Darüber hinaus ist die Beziehung zwischen den Knoten gleich. PXC legt größten Wert auf die Datenkonsistenz. Bei der Verarbeitung von Dingen führt es diese entweder auf allen Knoten aus oder überhaupt nicht. Sein Implementierungsmechanismus bestimmt, dass es bei der Verarbeitung der Konsistenz sehr streng ist, wodurch auch die Datenkonsistenz des MySQL-Clusters perfekt sichergestellt werden kann. 1.2 PXC-Funktionen und Vorteile
Der größte Vorteil von PXC: starke Konsistenz und keine Synchronisationsverzögerung 1.3 Einschränkungen und Nachteile von PXC
1.4 Unterschiede zwischen PXC und Replikation
1.5 Gemeinsame PXC-Anschlüsse
Glossar:
2. Üben 2.1 Aufbau eines PXC-ClustersIm Gegensatz zu MySQL stellt PXC offiziell Docker-Images bereit, sodass wir problemlos einen PXC-Cluster erstellen können. 1) Laden Sie das Docker-Image herunter Docker-Pull Percona/Percona-XtraDB-Cluster: 5.7 Benennen Sie das Bild um Docker-Tag Percona/Percona-XtraDB-Cluster:5.7 pxc:5.7 3) Löschen Sie das Originalbild Docker RMI Percona/Percona-XtraDB-Cluster: 5.7 Erstellen Sie ein Docker-Netzwerk zur unabhängigen Nutzung des PXC-Clusters Docker-Netzwerk, PXC-Netzwerk erstellen Erstellen Sie ein Datenvolumen für die spätere Einbindung Docker-Volume erstellen --Name v1 Docker-Volume erstellen --Name v2 Docker-Volume erstellen --Name v3 Hinweis: PXC-Container unterstützen nur die Bereitstellung von Datenträgern, nicht die Bereitstellung von Verzeichnissen. Erstellen des ersten Knotens docker run -di --name=pn1 --net=pxc-network -p 9000:3306 -v v1:/var/lib/mysql --privileged -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=cluster1 -e XTRABACKUP_PASSWORD=123456 pxc:5.7 Da das Hinzufügen weiterer Knoten dem ersten Knoten zugeordnet werden muss, müssen Sie warten, bis die Datenbank gestartet wird. Überprüfen Sie die Protokolle über Docker-Protokolle pn1. Wenn die folgende Ausgabe erscheint, beweist dies, dass der Start erfolgreich war:
Hinweis: Verwenden Sie nicht das Schlüsselwort PXC im Namen CLUSTER_NAME, da der Start sonst fehlschlägt. Verbinden Sie den zweiten Knoten docker run -di --name=pn2 --net=pxc-network -p 9001:3306 -v v2:/var/lib/mysql --privileged -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=cluster1 -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=pn1 pxc:5.7 Es ist zu beachten, dass ab dem zweiten Knoten der Parameter CLUSTER_JOIN=pn1 hinzugefügt werden muss, um eine Synchronisierung mit dem Knoten pn1 anzuzeigen, da sonst der Container pn1 automatisch geschlossen wird. Wenn der PXC-Cluster mehr als zwei Knoten enthält, gibt es kein Konzept eines Masterknotens. Der letzte Knoten, der den Cluster verlässt, wird zum primären Knoten, und der Wert des Attributs safe_to_bootstrap in der Datei /var/lib/mysql/grastate.dat wird von 0 auf 1 gesetzt, um anzuzeigen, dass der Knoten der primäre Knoten ist. 8) Fügen Sie den dritten Knoten hinzu docker run -di --name=pn3 --net=pxc-network -p 9002:3306 -v v3:/var/lib/mysql --privileged -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=cluster1 -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=pn2 pxc:5.7 Sie können sehen, dass unser CLUSTER_JOIN dieses Mal der pn2-Container ist, was beweist, dass unsere gerade getätigte Aussage richtig ist, nämlich dass es kein Konzept eines Masterknotens gibt, wenn ein PXC-Cluster mehr als zwei Knoten enthält. 9) Geben Sie den Knoten pn1 ein docker exec -it pn1 /usr/bin/mysql -uroot -p123456 Status anzeigen mysql> Status wie „wsrep%“ anzeigen; +----------------------------------+-------------------------------------------------+ | Variablenname | Wert | +----------------------------------+-------------------------------------------------+ | wsrep_local_state_uuid | 068dd5e8-cedd-11e9-904d-466e75bd8fe1 | | wsrep_protokoll_version | 9 | | wsrep_last_applied | 16 | | wsrep_last_committed | 16 | | wsrep_repliziert | 0 | | wsrep_replicated_bytes | 0 | | wsrep_repl_keys | 0 | | wsrep_repl_keys_bytes | 0 | | wsrep_repl_data_bytes | 0 | | wsrep_repl_other_bytes | 0 | | wsrep_empfangen | 10 | | wsrep_received_bytes | 800 | | wsrep_local_commits | 0 | | wsrep_local_cert_failures | 0 | | wsrep_local_replays | 0 | | wsrep_local_send_queue | 0 | | wsrep_local_send_queue_max | 1 | | wsrep_local_send_queue_min | 0 | | wsrep_local_send_queue_avg | 0,000000 | | wsrep_local_recv_queue | 0 | | wsrep_local_recv_queue_max | 2 | | wsrep_local_recv_queue_min | 0 | | wsrep_local_recv_queue_avg | 0,100000 | | wsrep_local_cached_downto | 0 | | wsrep_flow_control_paused_ns | 0 | | wsrep_flow_control_paused | 0,000000 | | wsrep_flow_control_sent | 0 | | wsrep_flow_control_recv | 0 | | wsrep_flow_control_interval | [ 173, 173 ] | | wsrep_flow_control_interval_low | 173 | | wsrep_flow_control_interval_high | 173 | | wsrep_flow_control_status | AUS | | wsrep_cert_deps_distance | 0,000000 | | wsrep_apply_oooe | 0,000000 | | wsrep_apply_oool | 0,000000 | | wsrep_apply_window | 0,000000 | | wsrep_commit_oooe | 0,000000 | | wsrep_commit_oool | 0,000000 | | wsrep_commit_window | 0,000000 | | wsrep_lokaler_status | 4 | | wsrep_local_state_comment | Synchronisiert | | wsrep_cert_index_size | 0 | | wsrep_cert_bucket_count | 22 | | wsrep_gcache_pool_size | 1592 | | wsrep_causal_reads | 0 | | wsrep_cert_interval | 0,000000 | | wsrep_open_transactions | 0 | | wsrep_open_connections | 0 | | wsrep_ist_receive_status | | | wsrep_ist_receive_seqno_start | 0 | | wsrep_ist_receive_seqno_current | 0 | | wsrep_ist_receive_seqno_end | 0 | | wsrep_incoming_addresses | 172.19.0.2:3306,172.19.0.3:3306,172.19.0.4:3306| | wsrep_cluster_gewicht | 3 | | wsrep_desync_count | 0 | | wsrep_evs_delayed | | | wsrep_evs_Ausschlussliste | | | wsrep_evs_repl_latency | 0/0/0/0/0 | | wsrep_evs_state | BETRIEBSBEREIT | | wsrep_gcomm_uuid | 11ed51e2-cedd-11e9-b362-af453a7ac074 | | wsrep_cluster_conf_id | 3 | | wsrep_cluster_größe | 3 | | wsrep_cluster_state_uuid | 068dd5e8-cedd-11e9-904d-466e75bd8fe1 | | wsrep_cluster_status | Primär | | wsrep_connected | EIN | | wsrep_local_bf_aborts | 0 | | wsrep_local_index | 0 | | wsrep_Anbietername | Galera | | wsrep_provider_vendor | Codership Oy <[email protected]> | | wsrep_provider_version | 3.37(rff05089) | | wsrep_ready | EIN | +----------------------------------+-------------------------------------------------+ 71 Zeilen im Satz (0,06 Sek.) Sie können sehen, dass der Wert von wsrep_incoming_addresses die IP-Adresse unserer drei Container ist | wsrep_incoming_addresses | 172.19.0.2:3306,172.19.0.3:3306,172.19.0.4:3306 | Überprüfung der Clusterintegrität:
Knotenstatusprüfung:
Integritätsprüfung der Replikation:
Erkennen von langsamen Netzwerkproblemen:
Anzahl der Konflikte oder Deadlocks:
2.2 Überprüfung der Clustersynchronisierung Erstellen Sie einen Datenbanktest auf Knoten 1 mysql> Datenbanktest erstellen; Abfrage OK, 1 Zeile betroffen (0,02 Sek.) Ansicht auf Knoten 2: mysql> Datenbanken anzeigen; +--------------------+ | Datenbank | +--------------------+ | Informationsschema | |mysql | | Leistungsschema | |System| | Prüfung | +--------------------+ 5 Zeilen im Satz (0,00 Sek.) Erstellen Sie eine Tabelle auf Knoten 2 mysql> Test verwenden; Datenbank geändert mysql> Tabelle sys_user erstellen (ID int, Name varchar (30)); Abfrage OK, 0 Zeilen betroffen (0,11 Sek.) 4) Zeigen Sie die Tabellenstruktur auf Knoten 3 an mysql> Test verwenden; Einlesen von Tabelleninformationen zur Vervollständigung von Tabellen- und Spaltennamen Sie können diese Funktion deaktivieren, um einen schnelleren Start mit -A zu erhalten Datenbank geändert mysql> Tabellen anzeigen; +----------------+ | Tabellen_im_Test | +----------------+ |Sys_Benutzer| +----------------+ 1 Zeile im Satz (0,00 Sek.) Daten auf Knoten drei einfügen mysql> in sys_user-Werte einfügen (1, 'a'); FEHLER 1105 (HY000): Percona-XtraDB-Cluster verbietet die Verwendung von DML-Befehlen für eine Tabelle (test.sys_user) ohne expliziten Primärschlüssel mit pxc_strict_mode = ENFORCING oder MASTER Da ohne einen angezeigten Primärschlüssel keine Daten eingefügt werden können, ändern wir die folgende Tabellenstruktur: Tabelle sys_user ändern, Primärschlüssel (ID) hinzufügen; Daten einfügen: mysql> in sys_user-Werte einfügen (1, 'a'); Abfrage OK, 1 Zeile betroffen (0,05 Sek.) 6) Tabellendaten in Knoten 1 anzeigen mysql> wähle * von sys_user; +----+------+ | Ich würde | Name | +----+------+ | 1 | ein | +----+------+ 1 Zeile im Satz (0,00 Sek.) Es ist ersichtlich, dass die Daten der drei Knoten normal synchronisiert sind und alle lesbar und beschreibbar sind. 2.3 Hinzufügen von DatenbankknotenoperationenWenn die Datenbank nicht ausreicht, müssen wir normalerweise Datenbankknoten hinzufügen, um den Druck zu verteilen. Lassen Sie uns den Vorgang zum Hinzufügen neuer Knoten demonstrieren. Erstellen eines Datenvolumens Docker-Volume erstellen --Name v4 2) Einen neuen Container hinzufügen docker run -di --name=pn4 --net=pxc-network -p 9003:3306 -v v4:/var/lib/mysql --privileged -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=cluster1 -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=pn3 pxc:5.7 Beachten Sie, dass CLUSTER_JOIN dieses Mal pn3 beitritt. Geben Sie Knoten 4 ein, um Daten anzuzeigen mysql> Datenbanken anzeigen; +--------------------+ | Datenbank | +--------------------+ | Informationsschema | |mysql | | Leistungsschema | |System| | Prüfung | +--------------------+ 5 Zeilen im Satz (0,00 Sek.) mysql> Test verwenden; Einlesen von Tabelleninformationen zur Vervollständigung von Tabellen- und Spaltennamen Sie können diese Funktion deaktivieren, um einen schnelleren Start mit -A zu erhalten Datenbank geändert mysql> Tabellen anzeigen; +----------------+ | Tabellen_im_Test | +----------------+ |Sys_Benutzer| +----------------+ 1 Zeile im Satz (0,00 Sek.) mysql> wähle * von sys_user; +----+------+ | Ich würde | Name | +----+------+ | 1 | ein | +----+------+ 1 Zeile im Satz (0,00 Sek.) Sie sehen, dass auch die bisherigen Daten automatisch synchronisiert werden. 2.4 Ausfallbetrieb Schließen Sie den Node-pn4-Container, da dies zu Ausfallzeiten führt Docker stoppt PN4 Überprüfen Sie den Clusterstatus auf Knoten pn2 mysql> Status wie „wsrep%“ anzeigen; ...... | wsrep_lokaler_status | 4 | | wsrep_local_state_comment | Synchronisiert | | wsrep_cert_index_größe | 3 | ...... | wsrep_incoming_addresses | 172.19.0.4:3306,172.19.0.3:3306,172.19.0.2:3306 | Sie können sehen, dass der Cluster 4 Knoten haben sollte, jetzt aber normalerweise nur 3 verbunden sind. 3) Führen Sie Änderungsvorgänge am Knoten pn2 durch mysql> aktualisiere sys_user setze Name='b', wobei ID=1 ist; Abfrage OK, 1 Zeile betroffen (0,00 Sek.) Übereinstimmende Zeilen: 1 Geändert: 1 Warnungen: 0 Starten Sie den Node-PN4-Container [root@VM_0_15_centos ~]# Docker startet pn4 Geben Sie den Container pn4 ein, um zu prüfen, ob der Änderungsvorgang synchronisiert ist docker exec -it pn4 /usr/bin/mysql -uroot -p123456 mysql> Test verwenden; Einlesen von Tabelleninformationen zur Vervollständigung von Tabellen- und Spaltennamen Sie können diese Funktion deaktivieren, um einen schnelleren Start mit -A zu erhalten Datenbank geändert mysql> wähle * von sys_user; +----+------+ | Ich würde | Name | +----+------+ | 1 | b | +----+------+ 1 Zeile im Satz (0,00 Sek.) Sie können sehen, dass der Knoten dem Cluster normal beigetreten ist und die Daten synchronisiert wurden. pn4 ist ein Container, der durch den Eintritt in den PXC-Cluster in Form eines designierten Masterknotens erstellt wird. Was passiert, wenn pn1 direkt einen Container mit sich selbst als Masterknoten startet? Lassen Sie uns dies demonstrieren: Fahren Sie den pn1-Knoten herunter. Docker stoppt PN1 Fügen Sie ein Datenelement in den Knoten pn2 ein. mysql> in sys_user-Werte einfügen('2','c'); Abfrage OK, 1 Zeile betroffen (0,01 Sek.) Starten Sie den Knoten pn1 Docker starten pn1 Warten Sie eine Minute und überprüfen Sie die Container-Startliste Docker ps -a Es wurde festgestellt, dass der Knoten pn1 nicht gestartet wurde CONTAINER ID BILD ...... STATUSNAMEN fa123563e787 pxc:5.7 ...... Beendet (1) Vor etwa einer Minute pn1 Überprüfen Sie das Fehlerprotokoll: Docker-Protokolle pn1 Die Ausnahmeinformationen lauten wie folgt:
Ins Chinesische übersetzt:
Die Fehlermeldung ist offensichtlich, denn der Knoten pn1 ist nicht der letzte, der den Cluster verlässt und kann nicht als Masterknoten gestartet werden. Möchte man ihn als Masterknoten starten, muss man den Parameter safe_to_bootstrap in der Datei grastate.dat auf 1 setzen. Es ist jedoch zu beachten, dass der gestartete Container keine Verbindung zum vorherigen Cluster hat, da andere Knoten im Cluster nicht heruntergefahren werden, und die Daten nicht synchronisiert werden. Lassen Sie uns das überprüfen: Den Pfad anzeigen, in dem das Datenvolumen gespeichert ist Docker-Volumeninspektion v1 [ { "Erstellt am": "2019-09-05T09:22:22+08:00", "Treiber": "lokal", "Beschriftungen": {}, "Einhängepunkt": "/var/lib/docker/volumes/v1/_data", "Name": "v1", "Optionen": {}, "Geltungsbereich": "lokal" } ] Gehen Sie in das Datenträgerverzeichnis und prüfen Sie, ob dort eine Datei grastate.dat vorhanden ist. [root@VM_0_15_centos ~]# cd /var/lib/docker/volumes/v1/_data [root@VM_0_15_centos _data]# ll insgesamt 323444 -rw-r----- 1 1001 1001 56 5. September 08:34 auto.cnf -rw------- 1 1001 1001 1680 5. September 08:34 ca-key.pem -rw-r--r-- 1 1001 1001 1120 5. September 08:34 ca.pem -rw-r--r-- 1 1001 1001 1120 5. September 08:34 client-cert.pem -rw------- 1 1001 1001 1676 5. September 08:34 client-key.pem -rw-r----- 1 1001 1001 2 5. September 08:34 fa123563e787.pid -rw-r----- 1 1001 1001 134219048 5. September 09:22 galera.cache -rw-r----- 1 1001 1001 113 5. September 09:21 grastate.dat -rw-r----- 1 1001 1001 1300 5. September 08:34 ib_buffer_pool -rw-r----- 1 1001 1001 79691776 5. September 09:15 ibdata1 -rw-r----- 1 1001 1001 50331648 5. September 09:15 ib_logfile0 -rw-r----- 1 1001 1001 50331648 5. September 08:34 ib_logfile1 -rw-r----- 1 1001 1001 12582912 5. September 08:38 ibtmp1 -rw-r----- 1 1001 1001 34751 5. September 08:38 innobackup.backup.log drwxr-x--- 2 1001 1001 4096 5. September 08:34 mysql drwxr-x--- 2 1001 1001 4096 5. September 08:34 performance_schema -rw------- 1 1001 1001 1676 5. September 08:34 private_key.pem -rw-r--r-- 1 1001 1001 452 5. September 08:34 public_key.pem -rw-r--r-- 1 1001 1001 1120 5. September 08:34 server-cert.pem -rw------- 1 1001 1001 1676 5. September 08:34 server-key.pem drwxr-x--- 2 1001 1001 12288 5. September 08:34 sys drwxr-x--- 2 1001 1001 4096 5. September 09:07 Test -rw-r--r-- 1 1001 1001 143 5. Sep 09:22 version_info -rw-r----- 1 1001 1001 3932160 5. September 09:15 xb_doublewrite Bearbeiten einer Datei vim grastate.dat Ändern Sie den Parameterwert safe_to_bootstrap auf 1, speichern Sie und beenden Sie # GALERA hat den Status gespeichert Version: 2.1 UUID: 068dd5e8-cedd-11e9-904d-466e75bd8fe1 Sequenznummer: 20 sicher_zum_Booten: 1 Starten Sie den pn1-Container neu Docker starten pn1 Betreten Sie den Container und sehen Sie sich die Daten an docker exec -it pn1 /usr/bin/mysql -uroot -p123456 mysql> Test verwenden; Einlesen von Tabelleninformationen zur Vervollständigung von Tabellen- und Spaltennamen Sie können diese Funktion deaktivieren, um einen schnelleren Start mit -A zu erhalten Datenbank geändert mysql> wähle * von sys_user; +----+------+ | Ich würde | Name | +----+------+ | 1 | b | +----+------+ 1 Zeile im Satz (0,01 Sek.) Es wurde festgestellt, dass die Daten nicht synchronisiert sind. Wie kann also der Knoten pn1 zum Cluster hinzugefügt werden? Wir können den pn1-Container direkt löschen und den Container durch Hinzufügen des Knotens neu erstellen. Und da wir die Containerdaten zuvor auf dem Datenvolumen bereitgestellt haben, besteht kein Risiko eines Datenverlusts. Gehen wir es so an: Löschen Sie den pn1-Container Docker stoppt PN1 Docker RM PN1 Treten Sie dem Cluster als Slave-Knoten bei docker run -di --name=pn1 --net=pxc-network -p 9000:3306 -v v1:/var/lib/mysql --privileged -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=cluster1 -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=pn2 pxc:5.7 Warten Sie, bis der Container initialisiert ist 3) Geben Sie den Container ein und prüfen Sie, ob die Daten synchronisiert sind docker exec -it pn1 /usr/bin/mysql -uroot -p123456 mysql> Test verwenden; Einlesen von Tabelleninformationen zur Vervollständigung von Tabellen- und Spaltennamen Sie können diese Funktion deaktivieren, um einen schnelleren Start mit -A zu erhalten Datenbank geändert mysql> wähle * von sys_user; +----+------+ | Ich würde | Name | +----+------+ | 1 | b | | 2 | c | +----+------+ 2 Zeilen im Satz (0,00 Sek.) Die Daten wurden synchronisiert. Dies ist das Ende dieses Artikels über die Schritte zum Erstellen eines MySQL PXC-Clusters. Weitere Informationen zum Erstellen eines MySQL PXC-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:
|
<<: Kreatives „Über uns“-Webseitendesign
【Frage】 Die INSERT-Anweisung ist eine der am häuf...
1. Von der offiziellen Website herunterladen und ...
In diesem Artikel finden Sie den spezifischen Cod...
Vorwort Vor vielen Jahren war ich ein Neuling auf...
Wirkung html <div Klasse="sp-container&qu...
In diesem Artikel wird der spezifische JavaScript...
Als Reaktion auf die Popularität von nodejs haben...
Inhaltsverzeichnis 1. Projektintegration 1. CDN-I...
Die lokale Umgebung ist Windows 10 + WSL2 (Ubuntu...
Überblick Ein Index ist eine vom DBMS basierend a...
Vorwort In diesem Artikel wird erläutert, wie Sie...
Inhaltsverzeichnis Vorwort 1. Nginx + Tomcat 2. K...
Vorwort Ich habe in letzter Zeit das Gefühl, dass...
MySQL Limit kann Datenbankdaten segmentweise abfr...
Inhaltsverzeichnis 1. Prototyp 2. Prototypenkette...