Heim > Datenbank > MySQL-Tutorial > So wenden Sie die MySQL GTID-Replikation an

So wenden Sie die MySQL GTID-Replikation an

PHPz
Freigeben: 2023-05-27 11:25:43
nach vorne
687 Leute haben es durchsucht

So wenden Sie die MySQL GTID-Replikation an

Seit MySQL 5.6.5 wurde eine auf Global Transaction Identifier (GTID) basierende Replikationsmethode eingeführt. GTID stellt sicher, dass jede an die Hauptdatenbank im Cluster übermittelte Transaktion eine eindeutige Kennung hat. Diese Methode stärkt die Primärsicherungskonsistenz, Fehlerwiederherstellung und Fehlertoleranzfähigkeiten der Datenbank.

Was ist GTID

GTID (Global Transaction ID) ist die Nummer für eine übermittelte Transaktion und eine weltweit eindeutige Nummer. GTID besteht eigentlich aus UUID+TID. Die UUID ist die eindeutige Kennung einer MySQL-Instanz. Der Wert von TID steigt monoton mit jeder übermittelten Transaktion und zeichnet die Anzahl der Transaktionen auf, die auf dieser Instanz übermittelt wurden.

Das Folgende ist die spezifische Form einer GTID: 3E11FA47-71CA-11E1-9E33-C80AA9429562:23. Der Doppelpunkt trennt die UUID vorne und die TID hinten.

Die GTID-Sammlung kann durch Kommas getrennte Transaktionen von mehreren MySQL-Instanzen enthalten.

Wenn die Bereiche mehrerer Transaktionssequenznummern von derselben MySQL-Instanz stammen, sollte jeder Bereich durch einen Doppelpunkt getrennt werden. Zum Beispiel: e6954592-8dba-11e6-af0e-fa163e1cf111:1-5:11-18,e6954592-8dba-11e6-af0e-fa163e1cf3f2:1-27.

Was sind die GTID-Verbesserungen? Bei falscher Angabe können Daten weggelassen werden, was zu Dateninkonsistenzen führt. Mit Hilfe von GTID können die anderen Slave-Datenbanken von MySQL im Falle einer Master-Slave-Umschaltung automatisch den richtigen Replikationsspeicherort in der neuen Master-Datenbank finden, was die Wartung des Clusters unter komplexen Replikationstopologien erheblich vereinfacht und das Auftreten von Fehlern reduziert Manuelles Festlegen von Replikationsstandorten. Risiko eines Missbrauchs. Die Verwendung der GTID-basierten Replikation verringert das Risiko von Dateninkonsistenzen, indem bereits ausgeführte Transaktionen ausgeschlossen werden.

Basierend auf dem gtid-Satz kann die Hauptbibliothek genau erkennen, welche Daten in der Slave-Bibliothek fehlen, und gibt nicht mehr oder weniger Daten an die Slave-Bibliothek weiter, um eine Verschwendung von Netzwerkbandbreite zu vermeiden.

Mysql Master-Slave-Struktur hat für GTID keinen Vorteil im Fall von einem Master und einem Slave. Die Vorteile der Struktur mit mehr als 2 Mastern liegen jedoch äußerst auf der Hand und es können neue ausgetauscht werden ohne Datenverlust.

Hinweis

: Führen Sie vor dem Erstellen der Master-Slave-Replikation einige Vorgänge (z. B. Datenbereinigung usw.) auf einer Instanz durch, die über GTID zum Master wird. Hierbei handelt es sich um Vorgänge, die vor der Einrichtung des Master-Slave-Servers ausgeführt werden und auch auf den Slave-Server kopiert werden, was dazu führt, dass die Replikation fehlschlägt. Das heißt, die Replikation über GTID beginnt immer mit dem frühesten Transaktionsprotokoll, auch wenn diese Vorgänge vor der Replikation ausgeführt werden. Wenn Sie beispielsweise einige Bereinigungsvorgänge zum Löschen und Löschen auf Server1 und dann einen Änderungsvorgang auf Server2 durchführen, führt Server2 auch Bereinigungsvorgänge auf Server1 durch.

So funktioniert GTID

Wenn eine Transaktion auf der Seite der Hauptbibliothek ausgeführt und übermittelt wird, wird eine GTID erstellt wird generiert und gemeinsam im Binlog-Protokoll aufgezeichnet.
  1. Nachdem das Binlog an den Slave übertragen und im Relaylog des Slaves gespeichert wurde, lesen Sie den Wert dieser GTID und legen Sie die Variable gtid_next fest, die dem Slave die nächste GTID mitteilt Wert ausgeführt werden.
  2. Der SQL-Thread erhält die GTID aus dem Relay-Protokoll und vergleicht dann das Binlog auf der Slave-Seite, um zu sehen, ob es die GTID hat.
  3. Wenn ein Datensatz vorhanden ist, bedeutet dies, dass die Transaktion mit der GTID ausgeführt wurde und der Slave ihn ignoriert.
  4. Wenn kein Datensatz vorhanden ist, führt der Slave die GTID-Transaktion aus und zeichnet die GTID in seinem eigenen Binlog auf. Er prüft andere Sitzungsbestände, bevor er die Transaktion liest und ausführt Diese GTID stellt sicher, dass sie nicht wiederholt ausgeführt wird.
  5. Erstellen mit einer Master- und einer Slave-GTID-Kopie
Host-Planung:

#🎜 🎜 #master:Docker,Port 3312

  • Slave:Docker,Port 3313

  • Masterkonfiguration#🎜 🎜#

    Der Inhalt der Konfigurationsdatei my.cnf lautet wie folgt:
  • $ cat /home/mysql/docker-data/3313/conf/my.cnf
    # For advice on how to change settings please see
    # http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html
    
    [mysqld]
    #
    # Remove leading # and set to the amount of RAM for the most important data
    # cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
    # innodb_buffer_pool_size = 128M
    #
    # Remove leading # to turn on a very important data integrity option: logging
    # changes to the binary log between backups.
    # log_bin
    #
    # Remove leading # to set options mainly useful for reporting servers.
    # The server defaults are faster for transactions and fast SELECTs.
    # Adjust sizes as needed, experiment to find the optimal values.
    # join_buffer_size = 128M
    # sort_buffer_size = 2M
    # read_rnd_buffer_size = 2M
    #datadir=/home/mysql/docker-data/3307/data
    #socket=/home/mysql/docker-data/3307/mysql.sock
    
    character_set_server=utf8
    init_connect='SET NAMES utf8'
    
    # Disabling symbolic-links is recommended to prevent assorted security risks
    symbolic-links=0
    
    #log-error=/home/mysql/docker-data/3307/logs/mysqld.log
    #pid-file=/home/mysql/docker-data/3307/mysqld.pid
    lower_case_table_names=1
    server-id=1403311
    log-bin=mysql-bin
    binlog-format=ROW
    auto_increment_increment=1
    auto_increment_offset=1
    # 开启gtid
    gtid_mode=ON
    enforce-gtid-consistency=true
    
    #rpl_semi_sync_master_enabled=1
    #rpl_semi_sync_master_timeout=10000
    Nach dem Login kopieren
Erstellen Sie eine Docker-Instanz:

$ docker run --name mysql3312 -p 3312:3306 --privileged=true -ti -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=order -e MYSQL_USER=user -e MYSQL_PASSWORD=pass -v /home/mysql/docker-data/3312/conf:/etc/mysql/conf.d -v /home/mysql/docker-data/3312/data/:/var/lib/mysql -v /home/mysql/docker-data/3312/logs/:/var/log/mysql -d mysql:5.7
Nach dem Login kopieren

Fügen Sie einen Benutzer zum Kopieren und Autorisieren hinzu:

mysql> GRANT REPLICATION SLAVE,FILE,REPLICATION CLIENT ON *.* TO 'repluser'@'%' IDENTIFIED BY '123456';
Query OK, 0 rows affected, 1 warning (0.01 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.01 sec)
Nach dem Login kopieren

Slave-Konfiguration

Der Inhalt der Konfigurationsdatei my.cnf stimmt mit der Master-ID überein, um sie eindeutig zu halten.

Docker-Instanz erstellen:

$ docker run --name mysql3313 -p 3313:3306 --privileged=true -ti -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=order -e MYSQL_USER=user -e MYSQL_PASSWORD=pass -v /home/mysql/docker-data/3313/conf:/etc/mysql/conf.d -v /home/mysql/docker-data/3313/data/:/var/lib/mysql -v /home/mysql/docker-data/3313/logs/:/var/log/mysql -d mysql:5.7
Nach dem Login kopieren

GTID-Synchronisierung aktivieren:

mysql> change master to master_host='172.23.252.98',master_port=3310,master_user='repluser',master_password='123456',master_auto_position=1;
Query OK, 0 rows affected, 2 warnings (0.02 sec)

mysql> start slave;
Query OK, 0 rows affected (0.02 sec)
Nach dem Login kopieren

Status anzeigen:

mysql> show master status;
+------------------+----------+--------------+------------------+----------------------------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                      |
+------------------+----------+--------------+------------------+----------------------------------------+
| mysql-bin.000008 |      154 |              |                  | cd2eaa0a-7a59-11ec-b3b4-0242ac110002:1 |
+------------------+----------+--------------+------------------+----------------------------------------+
1 row in set (0.00 sec)

mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 172.23.252.98
                  Master_User: repluser
                  Master_Port: 3312
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000006
          Read_Master_Log_Pos: 419
               Relay_Log_File: 5dfbef024732-relay-bin.000003
                Relay_Log_Pos: 632
        Relay_Master_Log_File: mysql-bin.000006
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 419
              Relay_Log_Space: 846
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File:
           Master_SSL_CA_Path:
              Master_SSL_Cert:
            Master_SSL_Cipher:
               Master_SSL_Key:
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 1403311
                  Master_UUID: cd2eaa0a-7a59-11ec-b3b4-0242ac110002
             Master_Info_File: /var/lib/mysql/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind:
      Last_IO_Error_Timestamp:
     Last_SQL_Error_Timestamp:
               Master_SSL_Crl:
           Master_SSL_Crlpath:
           Retrieved_Gtid_Set: cd2eaa0a-7a59-11ec-b3b4-0242ac110002:1
            Executed_Gtid_Set: cd2eaa0a-7a59-11ec-b3b4-0242ac110002:1
                Auto_Position: 1
         Replicate_Rewrite_DB:
                 Channel_Name:
           Master_TLS_Version:
1 row in set (0.00 sec)
Nach dem Login kopieren

bei master.order Daten in die Tabelle einfügen:

mysql> insert into t_order values(4,"V");
Nach dem Login kopieren

Es wurde festgestellt, dass die Daten mit dem Slave synchronisiert wurden:

mysql> select * from order.t_order;
+------+------+
| id   | name |
+------+------+
|    4 | V    |
+------+------+
3 rows in set (0.00 sec)
Nach dem Login kopieren

Stoppen Sie zuerst den Slave und fügen Sie dann Daten in die Tabelle „master.order“ ein :

mysql> insert into t_order values(5,"X");
Nach dem Login kopieren
#🎜🎜 #Dann starten Sie den Slave erneut und stellen fest, dass die Daten automatisch synchronisiert wurden:

mysql> stop slave;
Query OK, 0 rows affected (0.01 sec)

mysql> select * from order.t_order;
+------+------+
| id   | name |
+------+------+
|    4 | V    |
+------+------+
3 rows in set (0.00 sec)

mysql> start slave;
Query OK, 0 rows affected (0.02 sec)

mysql> select * from order.t_order;
+------+------+
| id   | name |
+------+------+
|    4 | V    |
|    5 | X    |
+------+------+
4 rows in set (0.00 sec)
Nach dem Login kopieren

Probleme aufgetreten

Slave-Status auf dem Slave anzeigen server:

Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work.
Nach dem Login kopieren

Überprüfen Sie zunächst, ob die server_id von Master und Slave konsistent sind. Wenn sie konsistent sind, ändern Sie das Feld server_id in der my.cnf-Datei:

mysql> show variables like 'server_id';
Nach dem Login kopieren

Überprüfen Sie dann ob die UUID von Master und Slave konsistent sind:

mysql> show variables like '%uuid%';
Nach dem Login kopieren

Wenn die UUID konsistent ist, ändern Sie die Datei auto.cnf im Datenverzeichnis, kopieren Sie das gesamte Datenverzeichnis und kopieren Sie auch die Datei auto.cnf . Die UUID der Datenbank wird darin aufgezeichnet. Die UUID jeder Bibliothek sollte unterschiedlich sein.

Das obige ist der detaillierte Inhalt vonSo wenden Sie die MySQL GTID-Replikation an. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:yisu.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage