1. Beschreibung Früher haben wir über die Installation und Konfiguration von MySQL, die Verwendung von MySQL-Anweisungen und die Sicherung und Wiederherstellung von MySQL-Daten gesprochen. Dieses Mal stellen wir die Master-Slave-Replikation, die Lese-/Schreibtrennung und MHA mit hoher Verfügbarkeit von MySQL vor. Die Umgebung ist wie folgt: Master:CentOS7_x64 mysql5.721 172.16.3.175 db1 Architekturdiagramm: veranschaulichen: Bei der Konfiguration des Tests wurden der Firewall-Header und die Selinux-Sicherheitsrichtlinie aus Komfortgründen deaktiviert. 2. Master-Slave-Replikationskonfiguration Eine Masterdatenbank, N Slave-Knoten; auf dem Slave-Knoten werden zwei Threads gestartet, und Binlog-Protokolle werden über den Slave_IO_Running-Thread und das Konto mit Berechtigungen auf dem Master-Knoten vom Masterdatenbankknoten auf den lokalen Knoten kopiert, und Binlog-Protokolle können lokal über den Slave_SQL_Running-Thread ausgeführt werden, um eine Inhaltssynchronisierung des Master-Slave-Knotens zu erreichen; Masterkonfiguration: egrep -v '(^$|^#)' /usr/local/mysql/etc/my.cnf [mysqld] datadir=/data1/mysqldb socket=/tmp/mysql.sock Schlüsselpuffergröße = 16 M max_allowed_packet = 16M Thread-Stapel = 192 KB Thread-Cache-Größe = 8 query_cache_limit = 1M Abfrage-Cachegröße = 64 M query_cache_type = 1 symbolische Links = 0 innodb_file_per_table=EIN skip_name_resolve=EIN Server-ID = 1 log_bin = /data1/mysqldb/mysql-bin.log [mysqld_safe] log-error=/usr/local/mysql/logs/error.log pid-Datei=/data1/mysqldb/mysql.pid !includedir /usr/local/mysql/etc/my.cnf.d Erstellen Sie ein Synchronisierungskonto für den Slave-Knoten: mysql > gewähre Replikationsclient, Replikations-Slave auf *.* an 'repluser'@'172.16.3.%', identifiziert durch 'replpass'; mysql > Berechtigungen leeren; mysql > Master-Protokolle anzeigen; +------------------+------------+ | Protokollname | Dateigröße | +------------------+------------+ |mysql-bin.000001 | 622 |
Slave-Knoten: egrep -v '(^$|^#)' /usr/local/mysql/etc/my.cnf [mysqld] datadir=/data1/mysqldb socket=/data1/mysqldb/mysql.sock Schlüsselpuffergröße = 16 M max_allowed_packet = 16M Thread-Stapel = 192 KB Thread-Cache-Größe = 8 query_cache_limit = 1M Abfrage-Cachegröße = 64 M query_cache_type = 1 symbolische Links = 0 innodb_file_per_table=EIN skip_name_resolve=EIN server-id = 11 #Slave-Knoten-ID. Jeder Slave-Knoten hat ein anderes relay_log = relay-log schreibgeschützt = EIN [mysqld_safe] log-error=/usr/local/mysql/log/error.log pid-Datei=/var/run/mysql/mysql.pid !includedir /usr/local/mysql/etc/my.cnf.d Starten Sie die MySQL-Datenbank Hinweis: Die Server-ID-Werte der beiden Slave-Knoten sind unterschiedlich; alles andere ist gleich; daher wird auf dem Slave-Knoten nur eine Konfigurationsdatei angezeigt; Beide Slaves müssen synchronisiert und gestartet sein mysql > ÄNDERN SIE MASTER IN MASTER_HOST="172.16.3.175",MASTER_USER="repluser",MASTER_PASSWORD="replpass",MASTER_PORT=3306,MASTER_LOG_FILE="mysql-bin.000001",MASTER_LOG_POS=622; mysql > start slave; #Slave-Knoten starten () #Den Status des Slave-Knotens anzeigenmysql > SHOW SLAVE STATUS; *************************** 1. Reihe *************************** Slave_IO_State: Wartet darauf, dass der Master ein Ereignis sendet Master_Host: 172.16.3.175 #MasterknotenMaster_Benutzer: repluser #SynchronisierungskontoMaster_Port: 3306 Verbindungswiederholung: 60 Master_Log_File:mysql-bin.000001 Read_Master_Log_Pos: 622 Relay-Log-Datei: relay-log.000001 Relay_Log_Pos: 582 Relay_Master_Log_File: mysql-bin.000001 Slave_IO_Running: Ja #Synchronisierungsthread ist normal Slave_SQL_Running: Ja #Lokaler Schreibthread ist normal Replicate_Do_DB: #Synchronisierungsfilter ist leer (Sie können nur eine oder einige Bibliotheken synchronisieren) Replicate_Ignore_DB: #Nicht synchronisierte Datenbank Replicate_Do_Table: Tabelle_Ignorieren_replizieren: Wild_Do_Tabelle replizieren: Tabelle_Wild_Ignore_replizieren: Last_Errno: 0 #Der letzte Synchronisationsfehler 0 zeigt eine normale Synchronisation an Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 622 Relay_Log_Space: 615 Until_Condition: Keine Bis_Log_Datei: Bis_Log_Pos: 0 Master_SSL_Allowed: Nein Master_SSL_CA_Datei: Master_SSL_CA_Pfad: Master_SSL_Zertifikat: Master_SSL_Chiffre: Master_SSL_Schlüssel: Sekunden_Hinter_Master: 0 Master_SSL_Verify_Server_Cert: Nein Last_IO_Errno: 0 Letzter_E/A-Fehler: Last_SQL_Errno: 0 Letzter_SQL_Fehler: Server-IDs replizieren_ignorieren: Master_Server_Id: 1 Master_UUID: 57017c43-36e3-11e8-ac76-080027393fc7 Master_Info_Datei: /data1/mysqldb/master.info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Slave hat alle Relay-Logs gelesen; wartet auf weitere Updates Master_Retry_Count: 86400 Master_Bind: Zeitstempel des letzten IO-Fehlers: Letzter_SQL_Fehler_Zeitstempel: Master_SSL_Crl: Master_SSL_Crlpfad: Abgerufenes_Gtid_Set: Ausgeführtes_Gtid_Set: Auto_Position: 0 DB replizieren_neu schreiben: Kanalname: Master_TLS_Version: 1 Zeile im Satz (0,00 Sek.) FEHLER: Keine Abfrage angegeben Testen der Master-Slave-Synchronisation Testdaten auf dem Master einspielen, Daten modifizieren und prüfen, ob die Daten im Slave konsistent sind; [root@db1 ~]# mysql < Testdb.sql Melden Sie sich bei der Datenbank an [root@db1 ~]# mysql -uroot -p mysql> Datenbanken anzeigen; +--------------------+ | Datenbank | +--------------------+ Studie | +--------------------+ 5 Zeilen im Satz (0,00 Sek.) ###Study-Testdatenbank erfolgreich importiertmysql> Study verwenden; Datenbank geändert mysql> Tabellen anzeigen; +-----------------+ | Tabellen_im_Arbeitszimmer | +-----------------+ | Klasse | | Kurs | | Teil | | Punktzahl | | Studentin | |tb31| |tb32| | Lehrer | | Prüfung1 | | Prüfung 2 | | Benutzerinfo | +-----------------+ 11 Zeilen im Satz (0,00 Sek.) #Löschen Sie die Tabellen test1 und test2 Slave-Ansicht vom Knoten mysql> Tabellen anzeigen; +-----------------+ | Tabellen_im_Arbeitszimmer | +-----------------+ | Klasse | | Kurs | | Teil | | Punktzahl | | Studentin | |tb31| |tb32| | Lehrer | | Benutzerinfo | +-----------------+ 9 Zeilen im Satz (0,00 Sek.) Die Daten können normal synchronisiert werden. Beachten Sie, dass die Master-Slave-Synchronisierung nur beim ersten Mal manuell gestartet werden muss. Danach wird sie automatisch mit dem MySQL-Dienst gestartet. Die Master-Slave-Synchronisierungsarchitektur erleichtert nur die Datensynchronisierung. Wenn kein Drittanbietertool beteiligt ist, müssen Sie dies im Programm tun, um eine Lese-/Schreibtrennung zu erreichen, was unvermeidlich ist. Wenn ein Fehler auftritt, müssen Sie die Daten manuell synchronisieren. Hier wird ProxySQL verwendet, um eine Lese-/Schreibtrennung durchzuführen. 3. ProxySQL-Lese-/Schreibtrennung Die Konfiguration der Master-Slave-Replikation wurde oben abgeschlossen. Dies ist jedoch nur eine Grundkonfiguration, zu der ein ProxySQL hinzukommt, um eine Trennung von MySQL-Lese- und Schreibvorgängen zu erreichen. ProxySQL ähnelt der siebenschichtigen Proxy-Routing-Funktion von Haproxy und unterstützt den Datenbankproxy des MySQL-Protokolls. Es wurde von DBAs für DBAs entwickelt. Benutzeranforderungen werden an ProxySQL gesendet. Wenn es sich um eine Schreibanforderung handelt, wird sie an den Masterknoten gesendet. Leseanforderungen werden an die Slave-Knotengruppe gesendet. Auf diese Weise wird eine Trennung von Lese- und Schreibvorgängen erreicht. Bis zu einem gewissen Grad wird der IO-Druck der Masterdatenbank reduziert. [root@proxysql ~]# yum installiere proxysql-1.3.6-1-centos7.x86_64.rpm -y [root@proxysql ~]# rpm -ql proxysql /etc/init.d/proxysql /etc/proxysql.cnf #Hauptkonfigurationsdatei /usr/bin/proxysql /usr/share/proxysql/tools/proxysql_galera_checker.sh /usr/share/proxysql/tools/proxysql_galera_writer.pl Die Konfiguration ist wie folgt: Bevor Sie ProxySQL konfigurieren, müssen Sie auf dem Masterknoten ein autorisiertes Konto konfigurieren, damit ProxySQL auf dem Master- und Slaveknoten ausgeführt werden kann. Darüber hinaus muss das MySQL-Clienttool auf ProxySQL mit dem auf dem Master- und Slaveknoten übereinstimmen. proxysql.cnf-Konfiguration [root@proxysql ~]# egrep -v '(^$|^#)' /etc/proxysql.cnf Datenverzeichnis="/var/lib/proxysql" admin_variables= { admin_credentials="admin:admin" #proxysqls eigener administrativer Benutzername und Passwort mysql_ifaces="127.0.0.1:6032;/tmp/proxysql_admin.sock" } mysql_variables= { threads=4 #Anzahl der Threads, es wird empfohlen, mit der Anzahl der CPU-Kerne übereinzustimmen max_connections=2048 #Maximale Verbindung default_query_delay=0 default_query_timeout=36000000 have_compress=true poll_timeout=2000 interfaces="0.0.0.0:3306;/tmp/proxysql.sock" #Externe Schnittstelle default_schema="information_schema" Stapelgröße=1048576 server_version="5.5.30" Verbindungstimeout_Server = 3000 monitor_username="Monitor" monitor_password="Monitor" monitor_history=600000 Monitor-Verbindungsintervall = 60000 monitor_ping_interval=10000 Monitor_Nur-Lese-Intervall = 1500 Monitor_Nur-Lese-Timeout = 500 ping_interval_server_msec=120000 ping_timeout_server=500 commands_stats=true session_sort=true connect_retries_on_failure=10 } #####Konfiguration von Master- und Slave-Knotenmysql_servers = ( { Adresse = "172.16.3.175" # kein Standard, erforderlich. Wenn Port 0 ist, wird die Adresse als Unix Socket Domain interpretiert port = 3306 # kein Standard, erforderlich. Wenn Port 0 ist, wird die Adresse als Unix Socket Domain interpretiert hostgroup = 1 # Setzt den Gruppennummernstatus = "ONLINE" # Standard: ONLINE Gewicht = 1 # Standard: 1 Komprimierung = 0 # Standard: 0 max_connections = 200 ###Definieren Sie die maximale Anzahl von Verbindungen}, { Adresse = "172.16.3.235" # kein Standard, erforderlich. Wenn Port 0 ist, wird die Adresse als Unix Socket Domain interpretiert port = 3306 # kein Standard, erforderlich. Wenn Port 0 ist, wird die Adresse als Unix Socket Domain interpretiert hostgroup = 2 # kein Standard, erforderlich Status = "ONLINE" # Standard: ONLINE Gewicht = 1 # Standard: 1 Komprimierung = 0 # Standard: 0 max_verbindungen=1000 }, { Adresse = "172.16.3.241" # kein Standard, erforderlich. Wenn Port 0 ist, wird die Adresse als Unix Socket Domain interpretiert port = 3306 # kein Standard, erforderlich. Wenn Port 0 ist, wird die Adresse als Unix Socket Domain interpretiert hostgroup = 2 # kein Standard, erforderlich Status = "ONLINE" # Standard: ONLINE Gewicht = 1 # Standard: 1 Komprimierung = 0 # Standard: 0 max_verbindungen=1000 } ) mysql_users: ( { Benutzername = "myadmin" # kein Standard, erforderlich Passwort = "mypass" # Standard: '' default_hostgroup = 1 # Standard: 0 max_verbindungen=1000 default_schema="Test" aktiv = 1 #Aktivieren oder nicht} ) mysql_query_rules: ( ) Planer = ( ) mysql_replication_hostgroups= ( { writer_hostgroup=1 #Schreibgruppennummer 1 definieren reader_hostgroup=2 #Lesegruppennummer 2 definieren Kommentar="Test-Repl 1" #Kommentarinhalt} ) Starten Sie den ProxySQL-Dienst
Testen von ProxySQL Simulieren Sie die Verwendung der Datenbank durch ProxySQL [root@proxysql] # mysql -h172.16.3.175 -umyadmin -pmypass mysql: [Warnung] Die Verwendung eines Passworts in der Befehlszeilenschnittstelle kann unsicher sein. Willkommen beim MySQL-Monitor. Befehle enden mit ; oder \g. Ihre MySQL-Verbindungs-ID lautet 17406 Serverversion: 5.7.21-log MySQL Community Server (GPL) Copyright (c) 2000, 2018, Oracle und/oder seine Tochtergesellschaften. Alle Rechte vorbehalten. Oracle ist eine eingetragene Marke der Oracle Corporation und/oder ihrer Tochtergesellschaften. Andere Namen können Marken ihrer jeweiligen Eigentümer. Geben Sie „help;“ oder „\h“ ein, um Hilfe zu erhalten. Geben Sie „\c“ ein, um die aktuelle Eingabeanweisung zu löschen. MySQL> mysql > Datenbanken anzeigen; mysql> Datenbanken anzeigen; +--------------------+ | Datenbank | +--------------------+ | Informationsschema | |mysql | | Leistungsschema | | studieren | |System| +--------------------+ 5 Zeilen im Satz (0,00 Sek.) ###Löschen Sie die Daten zwischen 6 und 12 in der Studiendatenbank user_info. Vor dem Löschen: mysql> wähle * aus Benutzerinfo; +-----+-------+------+--------+----------+ | Nid | Name | Alter | Geschlecht | Teil_NID | +-----+-------+------+--------+----------+ | 1 | san | 20 | männlich | 1 | | 2 | dong | 29 | männlich | 2 | | 4 | Ling | 28 | Männlich | 4 | | 5 | lang | 28 | männlich | 3 | | 6 | Dong | 30 | männlich | 1 | | 7 | b | 11 | weiblich | 1 | | 8 | c | 12 | Weiblich | 1 | | 9 | d | 18 | Weiblich | 4 | | 10 | e | 22 | Männlich | 3 | | 11 | w | 23 | männlich | 2 | | 12 | dongy | 22 | männlich | 1 | +-----+-------+------+--------+----------+ 11 Zeilen im Satz (0,00 Sek.) Nach dem Löschen: mysql> lösche aus user_info, wobei nid >6 und nid <12; Abfrage OK, 5 Zeilen betroffen (0,03 Sek.) mysql> wähle * aus Benutzerinfo; +-----+-------+------+--------+----------+ | Nid | Name | Alter | Geschlecht | Teil_NID | +-----+-------+------+--------+----------+ | 1 | san | 20 | männlich | 1 | | 2 | dong | 29 | männlich | 2 | | 4 | Ling | 28 | Männlich | 4 | | 5 | lang | 28 | männlich | 3 | | 6 | Dong | 30 | männlich | 1 | | 12 | dongy | 22 | männlich | 1 | +-----+-------+------+--------+----------+ 6 Zeilen im Satz (0,00 Sek.) Beim Überprüfen der Master- und Slave-Knoten werden Sie feststellen, dass die obigen Abfrage- und Änderungsdaten zur Verarbeitung durch ProxySQL korrekt an das Backend weitergeleitet werden. Masterknoten: Ähnlich wie das Folgende: [root@db1 ~]# tcpdump -i enp0s3 -nn TCP-Port 3306 tcpdump: ausführliche Ausgabe unterdrückt, verwenden Sie -v oder -vv für die vollständige Protokolldekodierung lauscht auf enp0s3, Verbindungstyp EN10MB (Ethernet), Erfassungsgröße 262144 Bytes 18:04:34.678861 IP 172.16.3.254.42191 > 172.16.3.175.3306: Flags [S], Sequenz 3385407732, Win 29200, Optionen [mss 1460,sackOK,TS val 17576713 ecr 0,nop,wscale 7], Länge 0 18:04:34.678908 IP 172.16.3.175.3306 > 172.16.3.254.42191: Flags [S.], Sequenz 1579426335, ack 3385407733, Win 28960, Optionen [mss 1460,sackOK,TS val 29413673 ecr 17576713,nop,wscale 7], Länge 0 18:04:34.680902 IP 172.16.3.254.42191 > 172.16.3.175.3306: Flags [.], ack 1, win 229, Optionen [nop,nop,TS val 17576715 ecr 29413673], Länge 0 18:04:34.681264 IP 172.16.3.175.3306 > 172.16.3.254.42191: Flags [P.], Sequenz 1:83, ack 1, Win 227, Optionen [nop,nop,TS val 29413675 ecr 17576715], Länge 82 .... Vom Knoten: Ähnlich wie das Folgende: [root@db2 data1]# tcpdump -i enp0s3 -nn TCP-Port 3306 tcpdump: ausführliche Ausgabe unterdrückt, verwenden Sie -v oder -vv für die vollständige Protokolldekodierung lauscht auf enp0s3, Verbindungstyp EN10MB (Ethernet), Erfassungsgröße 262144 Bytes 18:02:57.932043 IP 172.16.3.254.42733 > 172.16.3.235.3306: Flags [S], Sequenz 76520456, Win 29200, Optionen [mss 1460,sackOK,TS val 17479189 ecr 0,nop,wscale 7], Länge 0 ........... ProxySQL-Befehlszeilenverwaltungsschnittstelle: unterstützt Laufzeitänderungen [root@proxysql]# mysql -u admin -padmin -h 127.0.0.1 -P6032 --prompt='Admin> ' Admin > Datenbanken anzeigen; +-----+---------+-------------------+ | Sequenz | Name | Datei | +-----+---------+-------------------+ | 0 | Haupt- | | | 2 | Festplatte | /var/lib/proxysql/proxysql.db | | 3 | Statistiken | | | 4 | überwachen | | +-----+---------+-------------------+ 4 Zeilen im Satz (0,00 Sek.) Die oben genannten Statistiken, Monitore und Hauptdaten werden alle aus der Konfigurationsdateidatenbank abgerufen. Sie können auf ähnliche Weise wie die MySQL-Laufzeitumgebung ohne Neustart geändert werden. Bisher wurde unsere Lese-/Schreibtrennungsarchitektur basierend auf der ProxySQL-Master-/Slave-Replikation fertiggestellt. Das könnte Sie auch interessieren:
|
<<: Detaillierte Erklärung dieses Zeigeproblems in der JavaScript-Funktion
>>: Eine kurze Einführung in Protobuf und ein Installationstutorial in der Ubuntu 16.04-Umgebung
Inhaltsverzeichnis 1. Vue-Listener-Array 2. Situa...
Die Attribute des <TD>-Tags werden verwende...
Dieser Artikel veranschaulicht anhand von Beispie...
1. Grundlinien 2. Spezialeffekte (die Effekte sin...
Warum die Dateisteuerung verschönern? Stellen Sie ...
1. Laden Sie den MySQL-JDBC-Treiber (mysql-connec...
transformieren und übersetzen Transformieren bezi...
In diesem Artikel wird hauptsächlich die Layoutme...
1. Konvertieren Sie das JSON-Objekt in eine JSON-...
Webserver 1. Der Webserver schaltet unnötige IIS-...
Inhaltsverzeichnis MySql8.0 Fehler bei der Transa...
mysql erhält statistische Daten innerhalb eines b...
INSERT INTO hk_test(Benutzername, Passwort) VALUE...
Versionsnummer verbergen Die Versionsnummer wird ...
Zunächst: Was ist ein Box-Collapse? Elemente, die...