Heim  >  Artikel  >  Datenbank  >  Die MySQL-Datenbankgruppenreplikation birgt die Gefahr, die IP-Adresse auszunutzen

Die MySQL-Datenbankgruppenreplikation birgt die Gefahr, die IP-Adresse auszunutzen

黄舟
黄舟Original
2017-02-07 11:42:352959Durchsuche

Einführung

Die Replikationsfunktion von MySQL Version 5.7.17 hat eine neue Funktion eingeführt, die Shining-Star-Funktion Group Replicatioin. Natürlich ist es unabdingbar, etwas Erfahrung im Erstellen und Testen zu haben, aber während des Erstellungsprozesses sind wir auf Fallstricke im Zusammenhang mit dem Hostnamen gestoßen. Im Folgenden wird erläutert, wie man es erstellt und wie man dieser Gefahr begegnet.

2

Es wird erwartet

, zwei Instanzen 3306 und 3307 auf der virtuellen Maschine 192.168.56.102 und eine Instanz 3308 auf 192.168.56.105 zu erstellen. Entsprechend den Merkmalen müssen Sie einen Knoten als Knoten zum Starten der Gruppenreplikation auswählen. In diesem Artikel wird 3306 als Startknoten ausgewählt.

3

Erstellen Sie

Instanz 192.168.56.102:3306

my.cnf-Schlüsselinhalt:

[mysqld3306]
gtid-mode=on
enforce-gtid-consistency=on
 
master-info-repository=table
relay-log-info-repository=table
 
binlog-checksum=none
log-slave-updates=on
binlog-format=row
 
transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="2dc52aec-cfea-11e6-95f3-080027264cfa"
loose-group_replication_start_on_boot=off # 开机启动OFF
loose-group_replication_local_address="192.168.56.102:33061"
loose-group_replication_group_seeds="192.168.56.102:33061,192.168.56.102:33071,192.168.56.105:33081"
loose-group_replication_bootstrap_group=off # 作为首个启动OFF

Hinweis:

1. Die in der Konfiguration aufgeführten Ports sind erforderlich und werden nicht verwendet.

2. Das Format von Gruppenname ist UUID. Sie können select uuid(); in MySQL ausführen, um eine zu erhalten.

Erstellen Sie ein Kopierkonto:

mysql> set sql_log_bin=0;
mysql> create user 'group_repl'@'%' identified by 'group_repl';
mysql> grant replication slave on *.* to 'group_repl'@'%';
mysql> flush privileges;
mysql> set sql_log_bin=1;

Erstellen Sie einen Kopierkanal:

mysql> change master to master_user='group_repl',master_password='group_repl' for channel 'group_replication_recovery';


Plugin laden:

mysql> install plugin group_replication soname 'group_replication.so';

Gruppenreplikation als ersten Knoten starten:

mysql> set @@global.group_replication_bootstrap_group=1;
mysql> start group_replication;
mysql> set @@global.group_replication_bootstrap_group=0;
mysql> select * from performance_schema.replication_group_members\G
*************************** 1. row ***************************
CHANNEL_NAME: group_replication_applier
   MEMBER_ID: 4f987d01-cff0-11e6-9afa-080027264cfa
 MEMBER_HOST: localhost
 MEMBER_PORT: 3306
MEMBER_STATE: ONLINE

Instanzen 192.168.56.102:3307 und 192.168.56.105:3308

Die meisten Vorgänge der übrigen Instanzen sind die gleichen wie 102:3306. Nur die verschiedenen Teile sind unten aufgeführt:

1. In my.cnf sind die Parameter von 102:3307:

loose-group_replication_local_address="192.168.56.102:33071",105:3308的参数:loose-group_replication_local_address="192.168.56.105:33081";

2. Nach dem Erstellen des Replikationskontos, dem Replizieren des Kanals und dem Laden des Plug-Ins müssen sowohl 102:3307 als auch 105:3308 nur Folgendes ausführen: starte group_replication;.

4

Überprüfen

Um zu überprüfen, ob Sie der Gruppenreplikation beitreten möchten, fragen Sie einfach die Tabelle performance_schema.replication_group_members ab. Das Folgende ist die Situation, in der 102:3307 der Gruppe beitritt:

mysql> select * from performance_schema.replication_group_members\G
*************************** 1. row ***************************
CHANNEL_NAME: group_replication_applier
   MEMBER_ID: 4f987d01-cff0-11e6-9afa-080027264cfa
 MEMBER_HOST: localhost
 MEMBER_PORT: 3306
MEMBER_STATE: ONLINE
*************************** 2. row ***************************
CHANNEL_NAME: group_replication_applier
   MEMBER_ID: d8f7405d-cff1-11e6-b449-080027264cfa
 MEMBER_HOST: localhost
 MEMBER_PORT: 3307
MEMBER_STATE: ONLINE

Sie können sehen, dass bereits zwei Knoten die Gruppe bilden, nämlich 102:3306 und 102:3307.

5

Problem

Als ich anfing, 105:3308 beizutreten, ist ein Fehler aufgetreten. Es wurde festgestellt, dass 3308 der Gruppe nicht beitreten konnte:

mysql> select * from performance_schema.replication_group_members;
*************************** 1. row ***************************
CHANNEL_NAME: group_replication_applier
   MEMBER_ID: 4f987d01-cff0-11e6-9afa-080027264cfa
 MEMBER_HOST: localhost
 MEMBER_PORT: 3306
MEMBER_STATE: ONLINE
*************************** 2. row ***************************
CHANNEL_NAME: group_replication_applier
   MEMBER_ID: 645aef9a-d000-11e6-a756-080027d54077
 MEMBER_HOST: localhost
 MEMBER_PORT: 3308
MEMBER_STATE: RECOVERING
*************************** 3. row ***************************
CHANNEL_NAME: group_replication_applier
   MEMBER_ID: d8f7405d-cff1-11e6-b449-080027264cfa
 MEMBER_HOST: localhost
 MEMBER_PORT: 3307
MEMBER_STATE: ONLINE

Aus dem Fehlerprotokoll:

...
2017-01-02T17:35:02.123501Z 32 [Note] 'CHANGE MASTER TO FOR CHANNEL 'group_replication_recovery' executed'. 
Previous state master_host=&#39;<NULL>&#39;, master_port= 0, master_log_file=&#39;&#39;, master_log_pos= 4, master_bind=&#39;&#39;. 
New state master_host=&#39;localhost&#39;, master_port= 3306, master_log_file=&#39;&#39;, master_log_pos= 4, master_bind=&#39;&#39;.
...
2017-01-02T17:35:02.133661Z 34 [ERROR] Slave I/O for channel &#39;group_replication_recovery&#39;: error connecting to master &#39;group_repl@localhost:3306&#39; - retry-time: 60
  retries: 1, Error_code: 2003
...

Es kann vermutet werden, dass das Problem bei MEMBER_HOST liegt, also ändern Sie den Hostnamen in die IP-Adresse. Nach Tests wurde festgestellt, dass dies machbar ist:

mysql> select * from performance_schema.replication_group_members\G
*************************** 1. row ***************************
CHANNEL_NAME: group_replication_applier
   MEMBER_ID: 4f987d01-cff0-11e6-9afa-080027264cfa
 MEMBER_HOST: 192.168.56.102
 MEMBER_PORT: 3306
MEMBER_STATE: ONLINE
*************************** 2. row ***************************
CHANNEL_NAME: group_replication_applier
   MEMBER_ID: 645aef9a-d000-11e6-a756-080027d54077
 MEMBER_HOST: 192.168.56.105
 MEMBER_PORT: 3308
MEMBER_STATE: ONLINE
*************************** 3. row ***************************
CHANNEL_NAME: group_replication_applier
   MEMBER_ID: d8f7405d-cff1-11e6-b449-080027264cfa
 MEMBER_HOST: 192.168.56.102
 MEMBER_PORT: 3307
MEMBER_STATE: ONLINE

Unter tatsächlichen Umständen ist es jedoch unmöglich, den Hostnamen auf IP festzulegen. Nach vielen Versuchen habe ich herausgefunden, dass dieses Problem auf folgende Weise gelöst werden kann:

1. Legen Sie unterschiedliche Hostnamen für verschiedene physische Maschinen (virtuelle Maschinen) fest.

2 /hosts ermöglicht Ping zwischen physischen Maschinen (virtuellen Maschinen) über Hostnamen.

Nach Abschluss der oben genannten Arbeiten überprüfen Sie abschließend die Gruppenmitglieder:

mysql> select * from performance_schema.replication_group_members
\G*************************** 1. row ***************************
CHANNEL_NAME: group_replication_applier
   MEMBER_ID: 4f987d01-cff0-11e6-9afa-080027264cfa
 MEMBER_HOST: local-102
 MEMBER_PORT: 3306
MEMBER_STATE: ONLINE
*************************** 2. row ***************************
CHANNEL_NAME: group_replication_applier
   MEMBER_ID: 645aef9a-d000-11e6-a756-080027d54077
 MEMBER_HOST: local-105
 MEMBER_PORT: 3308
MEMBER_STATE: ONLINE
*************************** 3. row ***************************
CHANNEL_NAME: group_replication_applier
   MEMBER_ID: d8f7405d-cff1-11e6-b449-080027264cfa
 MEMBER_HOST: local-102
 MEMBER_PORT: 3307
MEMBER_STATE: ONLINE

Problem gelöst. Beachten Sie außerdem, dass selbst Instanzen unter einer physischen Maschine (virtuellen Maschine) eine Zuordnungsbeziehung zwischen Hostname und IP haben müssen, um eine Gruppe zu bilden. Der Grund dafür, dass in der oben genannten Localhost-Situation Gruppen unter derselben physischen Maschine gebildet werden können, liegt darin, dass das System standardmäßig eine Zuordnungsbeziehung von 127.0.0.1 zu Localhost hat.

6

Zusammenfassung

Das obige Problem tritt auf, weil MySQL beim Konfigurieren der Replikation direkt den Hostnamen des Betriebssystems anstelle der üblicherweise verwendeten IP-Adresse verwendet Bug, und jemand hat ein paar Tage früher als ich eine Bug-Anfrage an die offizielle Website gesendet. Es wird empfohlen, bei der Konfiguration der Gruppenreplikation und vor der Behebung des Fehlers zu überprüfen, ob die Zuordnungsbeziehung zwischen dem Hostnamen und der IP-Adresse festgelegt ist.


Das oben Genannte ist die Gefahr, die beim Einrichten der MySQL-Datenbankgruppenreplikation und beim Zugriff auf die IP-Adresse besteht. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.org). php.cn)!


Stellungnahme:
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
Vorheriger Artikel:MySQL-Dateien, ProtokolleNächster Artikel:MySQL-Dateien, Protokolle