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.
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.
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
#🎜 🎜 #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
$ 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
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)
$ 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
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)
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)
mysql> insert into t_order values(4,"V");
mysql> select * from order.t_order; +------+------+ | id | name | +------+------+ | 4 | V | +------+------+ 3 rows in set (0.00 sec)
mysql> insert into t_order values(5,"X");
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)
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.
Ü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';
mysql> show variables like '%uuid%';
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!