Sales

Hoe Configureer je MySQL Master-Slave Replikatie?

Fatih Çevik

Fatih Çevik

PlusClouds Auteur

MySQL Master-Slave Replikasyonu nasıl yapılır ?

Voordat we naar het gedeelte over hoe het te doen gaan, laten we kort de vereisten bespreken.

  • We hebben minimaal 2 fysieke of virtuele machines nodig. In dit artikel zullen we twee Debian 10 virtuele machines gebruiken. We raden ten zeerste aan om dezelfde distributies te gebruiken. Beide virtuele machines moeten dezelfde MySQL-versie geïnstalleerd hebben.
  • Firewall configuratie met ufw.
  • Voor de communicatie tussen de master- en slave-machines is een geïnstalleerde en gesynchroniseerde NTP-server op beide vereist.

Aangezien we kort over de vereisten hebben gesproken, kunnen we doorgaan naar het configuratiegedeelte.

1. NTP-configuratie

Onze eerste stap zal zijn om op beide machines dezelfde NTP-configuratie in te stellen. Als je het nog niet hebt geïnstalleerd, kun je NTP-server installeren met de onderstaande opdracht.

apt -y install ntp

Nu zullen we de NTP-servers die we hebben geïnstalleerd configureren zodat ze met elkaar gesynchroniseerd zijn. In dit artikel zullen we de Aziatische NTP-servers gebruiken.

*nano /etc/ntp.conf*
server 0.asia.pool.ntp.org iburst
server 1.asia.pool.ntp.org iburst
server 2.asia.pool.ntp.org iburst
server 3.asia.pool.ntp.org iburst

Na het bewerken van het conf-bestand, slaan we het op en herstarten we de NTP-service.

*/etc/init.d/ntp restart*

2. Machines Moeten Elkaar Herkennen

Alle servers die we gebruiken moeten elkaar herkennen en zonder problemen met elkaar kunnen communiceren. Als beschikbaar, kun je local DNS gebruiken. In ons voorbeeld zullen we het hosts-bestand configureren omdat we geen DNS hebben.

*nano /etc/hosts*
master_server_ip master_server_hostname
slave_server_ip slave_server_hostname

Vergeet niet dat alle configuraties die we maken op alle servers volledig moeten worden uitgevoerd VERGEET DIT NIET.

3. Firewall-configuratie

Als je het nog niet hebt geïnstalleerd, moet je eerst ufw installeren met de onderstaande opdracht.

apt -y install ufw

Als je verbinding maakt via SSH, moet je na installatie eerst toegang verlenen tot de SSH-poort. Anders kun je je SSH-verbinding verliezen wanneer je de ufw-service start.

ufw allow 22
ufw allow from slave_server_ip to any port 3306
systemctl enable ufw
systemctl start ufw
ufw enable

We hebben eerst toestemming gegeven voor poort 22, dat wil zeggen SSH-poort; de regel die we hebben geschreven is de toestemming voor poort 3306, die door MySQL wordt gebruikt. Vergeet niet het slave_server_ip-gedeelte te vervangen door het IP-adres van je slave-machine.

Als alles tot nu toe in orde is, kunnen we nu beginnen met de configuratie van onze masterserver.

4. Masterserver-configuratie

In Debian 10 bevindt het configuratiebestand voor de MySQL-server zich onder **mysqld.cnf** in de map **/etc/mysql/mysql.conf.d/**. We openen het eerst met de **nano** editor op onze masterserver. Als je een andere editor verkiest, kun je die ook gebruiken.

nano /etc/mysql/mysql.conf.d/mysqld.cnf

Na het openen van het bestand passen we eerst het verbindingsadres aan. Als de regel erbij staat, pas deze aan, als deze er niet bij staat, voeg deze dan zelf toe.

bind-address = master_server_ip

Na het aanpassen van de bind-address, zoek je de regel **server-id**. Als deze er niet staat, voeg deze dan zoals hierboven toe. Je kunt de waarde 1 geven, deze waarde moet uniek zijn voor elke server.

server-id = 1

Na deze stap moeten we de locatie van het MySQL-binary logbestand opgeven. Als dit pad niet wordt opgegeven, is de binary logfunctie inactief en kan je slave-server het logbestand niet lezen, waardoor deze niet weet wat er gerepliceerd moet worden. We geven het pad als volgt op.

log_bin = /var/log/mysql/mysql-bin.log

Tenslotte moeten we de database of databases opgeven die gerepliceerd moeten worden.

binlog_do_db = testdb

Na het aanbrengen van de wijzigingen sla je op door achtereenvolgens op de toetsen CTRL + X, Y en ENTER te drukken.

Na het afsluiten herstarten we de MySQL-service.

systemctl restart mysql

We hebben het configuratiedeel van onze masterserver afgerond, maar voordat we verder gaan naar onze slave-server moeten we nog een paar kleine dingen doen. We moeten een gebruiker aanmaken waartoe de slave-server toegang heeft voor replicatie. We gaan verder met de MySQL-shell.

mysql -u root -p
CREATE USER 'slave_user'@'slave_server_ip' IDENTIFIED WITH mysql_native_password BY 'password';
Let op dat deze opdracht aangeeft dat de slave-gebruiker de mysql native password authenticatie-plugin zal gebruiken. In plaats daarvan is het ook mogelijk om de caching_sha2_password te gebruiken, wat de standaard authenticatiemechanisme van MySQL is, maar hiervoor moet een versleutelde verbinding tussen de master- en slave-server worden opgezet. Dit soort configuratie is ideaal voor productieomgevingen, maar een versleutelde verbindingconfiguratie is niet opgenomen in deze handleiding.
GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'slave_server_ip';
FLUSH PRIVILEGES;

Zo hebben we de configuratie van de masterserver afgerond. Hoewel onze configuratie klaar is, verlaat de MySQL-shell niet direct. In de volgende stap zullen we belangrijke informatie over het binary logbestand van onze database verkrijgen.

MySQL past replicatie toe door database-events regel voor regel te kopiëren vanuit het binary logbestand van de bron en elke gebeurtenis op de slave-server toe te passen. Daarom moeten we bij het configureren aan de slave-server de naam van het binary logbestand van de masterserver en de coördinaten die een specifieke locatie in dit bestand beschrijven, opgeven.


Om ervoor te zorgen dat geen enkele gebruiker gegevens wijzigt tijdens het verkrijgen van de coördinaten, moeten we de database tijdelijk vergrendelen.
FLUSH TABLES WITH READ LOCK;

Voer vervolgens de volgende code uit om de status van de binary logbestanden te bekijken.

SHOW MASTER STATUS;

```

+------------------+----------+--------------+------------------+-------------------+

| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |

+------------------+----------+--------------+------------------+-------------------+

| mysql-bin.000001 | 899 | testdb | | |

+------------------+----------+--------------+------------------+-------------------+

1 row in set (0.00 sec)

```

Je zult een soortgelijke uitvoer verkrijgen.

Als er nog geen database op je masterserver is, verwijder dan eerst de vergrendeling en maak een database aan.

UNLOCK TABLES;
CREATE DATABASE testdb;

Na deze stap is ons werk op de masterserver gedaan. Vergeet de informatie over het binary logbestand die we in de bovenstaande uitvoer hebben gekregen absoluut niet. We zullen het binnenkort gebruiken op onze slave-server.

5. Slave-serverconfiguratie

In dit gedeelte wijzigen we het configuratiebestand op een vergelijkbare manier als we dat op de masterserver hebben gedaan. We gaan de stappen snel door omdat ze hierboven zijn uitgelegd.

nano /etc/mysql/mysql.conf.d/mysqld.cnf
server-id = 2
log_bin = /var/log/mysql/mysql-bin.log
binlog_do_db = testdb

Tenslotte voegen we de relay-log-directive toe die het pad naar het relay logbestand op onze slave-server definieert.

relay-log = /var/log/mysql/mysql-relay-bin.log

Na het aanbrengen van de wijzigingen herstarten we ook hier de MySQL-service.

systemctl restart mysql

We zijn nu klaar om de replicatie te testen. We loggen in op de MySQL-shell op onze slave-server.

mysql -u root -p

Het is nu tijd voor het replicatieproces. We voeren de benodigde informatie in om de slave-server bekend te maken bij de masterserver.

CHANGE REPLICATION SOURCE TO
SOURCE_HOST='master_server_ip',
SOURCE_USER='slave_user',
SOURCE_PASSWORD='password',
SOURCE_LOG_FILE='mysql-bin.000001',
SOURCE_LOG_POS=899;
START REPLICA;

Als alle stappen correct zijn uitgevoerd, zullen alle wijzigingen die in de **testdb** database op de masterserver worden aangebracht ook naar onze slave-server gaan.

SHOW REPLICA STATUS\G

Op onze slave-server kunnen we de replicatiestatus zien met de bovenstaande opdracht.

```

*************************** 1. row ***************************

Replica_IO_State: Waiting for master to send event

Source_Host: 'slave_server_ip'

Source_User: slave_user

Source_Port: 3306

Connect_Retry: 60

Source_Log_File: mysql-bin.000001

Read_Source_Log_Pos: 1273

Relay_Log_File: mysql-relay-bin.000003

Relay_Log_Pos: 729

Relay_Source_Log_File: mysql-bin.000001

```

Je zult een soortgelijke uitvoer verkrijgen. Nu hebben we een MySQL-replicatie opgezet met een Master-Slave-relatie. Je kunt het testen door een tabel aan je database op de masterserver toe te voegen.