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
Heute werde ich Sie durch die Geschichte von ext4...
1. Einleitung ● Zufälliges Schreiben führt dazu, ...
Es gibt zwei Arten von geplanten Tasks im Linux-S...
Als Front-End-Affe werden wir, sei es während ein...
Umgebung: VMware VCSA 6.7 (VMware-VCSA-all-6.7.0-...
Sortierproblem Ich habe kürzlich auf Geek Time „4...
Inhaltsverzeichnis Grundlegende Syntax für Multi-...
1. Installieren Sie ffmpeg unter Centos Linux 1. ...
Heute werden wir einen einfachen Fall durchgehen ...
Es gibt wahrscheinlich ebenso viele modulare Lösu...
Während dieser Zeit habe ich Docker studiert und ...
Wenn es sich bei der Verwendung des Flex-Layouts ...
Vorwort: Beim Entwerfen einer Tabelle in MySQL em...
Das Thema, das ich heute mit Ihnen teilen möchte,...
VMware-Vorbereitung CentOS-Vorbereitung, hier ist...