Vad är MySQL Master-Master Replication?
MySQL Master-Master-replikering lägger till hastighet och redundans för aktiva webbplatser. Med replikering fungerar två separata MySQL-servrar som ett kluster. Databasklustring är särskilt användbart för webbplatskonfigurationer med hög tillgänglighet. Använd två separata linoder för att konfigurera databasreplikering, var och en med privata IPv4-adresser.
ObsDen här guiden är skriven för en icke-rootanvändare. Kommandon som kräver förhöjda privilegier har prefixet
sudo
. Om du inte är bekant medsudo
kommandot kan du läsa vår guide för användare och grupper.Den här guiden är skriven för Debian 9, Ubuntu 18.04 och Ubuntu 20.04.
Om du är osäker på vilken version av MySQL som har installerats på ditt system när du följer stegen nedan, anger du följande kommando:
mysql --version
Installera MySQL
-
Använd följande kommandon för att installera MySQL på var och en av linoderna:
sudo apt-get update sudo apt-get upgrade -y sudo apt-get install mysql-server mysql-client
-
Kör kommandot MySQL säker installation. Du kommer att bli ombedd att skapa ett root-lösenord. Det rekommenderas att du väljer ja på alla frågorna:
mysql_secure_installation
Redigera MySQL:s konfiguration
-
Redigera
/etc/mysql/my.cnf
fil på var och en av linoderna. Lägg till eller ändra följande värden:Server 1:
- Fil:/ etc/mysql/my.cnf
1 2 3 4 5 6 7 8 9 10 11
[mysqld] server_id = 1 log_bin = /var/log/mysql/mysql-bin.log log_bin_index = /var/log/mysql/mysql-bin.log.index relay_log = /var/log/mysql/mysql-relay-bin relay_log_index = /var/log/mysql/mysql-relay-bin.index expire_logs_days = 10 max_binlog_size = 100M log_replica_updates = 1 auto-increment-increment = 2 auto-increment-offset = 1
Obs Om du använder MySQL 8.0.25 eller tidigare, byt ut
log_replica_updates
medlog_slave_updates
(inom både Server 1 och 2). Se MySQL-dokumentationen för detaljer.Server 2:
- Fil:/ etc/mysql/my.cnf
1 2 3 4 5 6 7 8 9 10 11
[mysqld] server_id = 2 log_bin = /var/log/mysql/mysql-bin.log log_bin_index = /var/log/mysql/mysql-bin.log.index relay_log = /var/log/mysql/mysql-relay-bin relay_log_index = /var/log/mysql/mysql-relay-bin.index expire_logs_days = 10 max_binlog_size = 100M log_replica_updates = 1 auto-increment-increment = 2 auto-increment-offset = 2
Obs Om du använder MySQL 8.0.25 eller tidigare, byt ut
log_replica_updates
medlog_slave_updates
(inom både Server 1 och 2). Se MySQL-dokumentationen för detaljer. -
Redigera
bind-address
konfiguration för att använda de privata IP-adresserna för var och en av linoderna.- Fil:/ etc/mysql/my.cnf
1
bind-address = x.x.x.x
-
När du är klar, starta om MySQL-applikationen:
sudo systemctl restart mysql
Skapa replikeringsanvändare
-
Logga in på MySQL på var och en av linoderna:
mysql -u root -p
-
Konfigurera replikeringsanvändarna på varje Linode. Ersätt
x.x.x.x
med den privata IP-adressen för den motsatta Linode ochpassword
med ett starkt lösenord:MySQL8 och över
CREATE USER 'replication'@'x.x.x.x' IDENTIFIED BY 'password'; GRANT REPLICATION SLAVE ON *.* TO 'replication'@'x.x.x.x';
Under MySQL8
GRANT REPLICATION SLAVE ON *.* TO 'replication'@'x.x.x.x' IDENTIFIED BY 'password';
-
Kör följande kommando för att testa konfigurationen. Använd den privata IP-adressen för motstående Linode:
mysql -u replication -p -h x.x.x.x -P 3306
Detta kommando bör ansluta dig till fjärrserverns MySQL-instans.
Konfigurera databasreplikering
-
När du är inloggad på MySQL på Server 1, fråga masterstatus:
SHOW MASTER STATUS;
Notera fil- och positionsvärdena som visas:
mysql> SHOW MASTER STATUS; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000001 | 277 | | | +------------------+----------+--------------+------------------+ 1 row in set (0.00 sec)
-
På Server 2 vid MySQL-prompten, ställ in replikfunktionaliteten för den databasen. Ersätt
x.x.x.x
med den privata IP-adressen från den första servern. Ersätt även värdet försource_log_file
med filvärdet från föregående steg och värdet försource_log_pos
med positionsvärdet.MySQL 8.0.22 eller senare:
STOP REPLICA; CHANGE REPLICATION SOURCE TO source_host='x.x.x.x', source_port=3306, source_user='replication', source_password='password', source_log_file='mysql-bin.000001', source_log_pos=106; START REPLICA;
MySQL 8.0.22 eller tidigare:
STOP SLAVE; CHANGE MASTER TO master_host='x.x.x.x', master_port=3306, master_user='replication', master_password='password', master_log_file='mysql-bin.000001', master_log_pos=106; START SLAVE;
-
På Server 2, fråga huvudstatusen. Notera fil- och positionsvärdena igen.
SHOW MASTER STATUS;
-
Ställ in replikdatabasstatus på Server 1, med liknande kommandon som i steg 2. När du anger kommandona, använd IP-adressen för Server 2 och fil- och positionsvärdena som du just samlade in i föregående steg.
-
Testa genom att skapa en databas och infoga en rad:
Server 1:
create database test; create table test.flowers (`id` varchar(10));
Server 2:
show tables in test;
När du frågar bör du se tabellerna från Server 1 replikerade på Server 2. Grattis, du har nu ett MySQL Master-Master-kluster!
Mer information
Du kanske vill konsultera följande resurser för ytterligare information om detta ämne. Även om dessa tillhandahålls i hopp om att de kommer att vara användbara, vänligen observera att vi inte kan garantera noggrannheten eller aktualiteten hos externt värdmaterial.
- MySQL-referenshandböcker