MySQL är ett relationsdatabashanteringssystem som är ett av de mest populära projekten med öppen källkod. Även om MySQL är känt för sin stabilitet är det ännu mer tillförlitligt om replikering av källreplik är konfigurerad. Vid replikering är en MySQL-server vanligtvis betecknad som källa . En källa skickar alla databasändringar och datauppdateringar till en eller flera repliker databasservrar. MySQL:s datareplikeringsprocedur är flexibel och replikservrarna behöver inte vara permanent anslutna till källan. Den här guiden förklarar hur du konfigurerar replikering av källreplikdata i MySQL.
Så fungerar MySQL-datareplikering
Replikeringsprocessen lagrar data i källdatabasen först och kopierar dem sedan till valfria repliker. Efter att den har bearbetat instruktionen spårar källdatabasservern förändringen i en binär logg. Loggen fungerar som en sekventiell registrering av alla ändringar av databasstrukturen och innehållet. VÄLJ
satser registreras inte eftersom de inte ändrar databasens innehåll.
Uppdateringar sker asynkront, så replikerna behöver inte vara kontinuerligt anslutna. Detta står i kontrast till de synkrona arkitekturerna hos system med hög tillförlitlighet. Om realtidssynkronisering krävs rekommenderar MySQL att du använderNDB-klustret .
Varje replik hämtar data från källan genom att begära innehållet i källans binära logg. Repliken tillämpar sedan påståendena i ordning, och återuppspelar effektivt händelserna som inträffade på källan. Varje replik är oberoende och håller reda på sin nuvarande position med den binära källloggen. Dessutom kan varje replik synkroniseras med källan enligt sitt eget schema. Data kan läsas från vilken som helst av servrarna, inklusive replikerna.
MySQL tillåter en hög grad av granularitet. Det är möjligt att replikera över vissa databaser eller till och med specifika tabeller i en databas. Standardreplikeringsformatet är Statementsbaserad replikering (SBR), där hela SQL-satsen replikeras. Men Radbaserad replikering (RBR) finns också. Detta format replikerar raderna som har ändrats. Det är också möjligt att konfigurera mer komplicerade många-till-många-konfigurationer. Se MySQL-dokumentationen för mer information om de olika replikeringsalternativen.
Obs MySQL hänvisade tidigare till Source-Replica Replication som "Master-Slave Replication". MySQL-organisationen ändrade nyligen terminologin och förklarade deras resonemang i terminologiuppdateringen. Den äldre termen "mästare" har ändrats till "källa", medan en "slav" nu kallas för en "replika". De gamla termerna kan fortfarande visas i vissa kommandon och utdataskärmar medan MySQL uppdaterar sin kodbas. Den här guiden använder MySQL:s föredragna termer genom hela instruktionerna.
Fördelar med MySQL-datareplikering
Att aktivera replikering av källreplik ger många betydande fördelar jämfört med ett icke-redundant system. Listan nedan ger en översikt över några fördelar:
-
Det är lätt att skapa en live-säkerhetskopia när som helst. Eftersom replikeringsprocessen är asynkron, kan replikering ske enligt vilket schema som helst. Replikerna behöver inte hållas synkroniserade med källan för att fungera tillförlitligt.
-
Att lägga till en replik kan öka drifttiden och tillförlitligheten för hela systemet. Primär kontroll kan växla över till repliken om underhåll krävs eller om källdatabasen inte är tillgänglig.
-
Varje replik tillhandahåller en annan läsbar instans av databasen. Detta tillåter datautvinning eller analysprogram att fråga efter repliken utan att belasta den ursprungliga källdatabasen.
-
Denna arkitektur ökar skalbarhet och prestanda. Databas läser och
SELECT
uttalanden kan balanseras mellan servrarna, vilket minskar latensen. -
Tredje parter kan få skrivskyddad åtkomst till en databas via en replika och behöver inte längre tillgång till källan. En replikdatabas kan skapas på begäran när den behövs och förstöras när den inte längre behövs. Denna teknik förbättrar säkerheten och säkerställer att det är omöjligt att manipulera originaldata.
Innan du börjar
-
Om du inte redan har gjort det, skapa ett Linode-konto och Compute Instance. Se våra guider Komma igång med Linode och Skapa en beräkningsinstans.
-
Följ vår guide för att ställa in och säkra en beräkningsinstans för att uppdatera ditt system. Du kanske också vill ställa in tidszonen, konfigurera ditt värdnamn, skapa ett begränsat användarkonto och förstärka SSH-åtkomsten.
-
Du måste ha minst två separata linoder för att konfigurera MySQL käll-replik replikering. En Linode är värd för källdatabasen, medan en annan nod är nödvändig för replikservern.
Obs Stegen i den här guiden är skrivna för en icke-rootanvändare. Kommandon som kräver förhöjda privilegier har prefixetsudo
. Om du inte är bekant medsudo
kommandot, se guiden för Linux-användare och -grupper.
Konfigurera Source-Replica Replication i MySQL
För att konfigurera replikering av källreplik måste MySQL installeras på två separata servrar som kan kommunicera med varandra. Dessa instruktioner är inriktade på Ubuntu-distributionen men är generellt tillämpliga för alla Linux-distributioner. Processen består av följande steg:
- Installera MySQL.
- Konfigurera MySQL-källdatabasen.
- Konfigurera en ny MySQL-användare för repliken.
- Förbered MySQL-data för replikering.
- Konfigurera MySQL Replica Database.
- Importera de replikerade MySQL-data och aktivera replikering.
Installera MySQL
Om MySQL inte redan är tillgängligt på båda linoderna, installera det med följande steg:
-
Uppgradera linoderna.
sudo apt-get update && sudo apt-get upgrade
-
Installera MySQL-servern och klientapplikationerna på både käll- och replikservrarna.
sudo apt-get install mysql-server mysql-client -y
-
Konfigurera säkerhetsalternativen, inklusive root-lösenordet, med
mysql_secure_installation
kommando.sudo mysql_secure_installation
-
Om du använder en brandvägg som
ufw
, se till att den tillåter MySQL-trafik. Lägg till följande regel för att öppna port3306
på brandväggen.ufw allow mysql
Konfigurera MySQL Source Database
För att aktivera MySQL-replikering, redigera några variabler i MySQL-huvudkonfigurationsfilen. Gör följande ändringar i källdatabasens konfiguration.
-
Leta reda på den huvudsakliga MySQL-konfigurationsfilen på källdatabasservern. Den här filen finns vanligtvis på
/etc/mysql/mysql.conf.d/mysqld.cnf
. Men i tidigare installationer kan den finnas på/etc/my.cnf
eller/etc/mysql/my.cnf
. Den kan också refereras från en av filerna via enincludedir
direktiv. -
Öppna MySQL-konfigurationsfilen och ändra
bind-adress
till källserverns IP-adress.- Fil:/ etc/mysql/mysql.conf.d/mysqld.cnf
1 2
bind-address = <source_ip_address>
-
Avkommentera eller lägg till raderna för
server-id
ochlog-bin
. Ställ inserver-id
till1
ochlog-bin
till/var/log/mysql/mysql-bin.log
.Obs Se till att
skip_networking
variabel deklareras inte någonstans. Kommentera det om det visas i den här filen. För att replikera en enskild databas, lägg till radenbinlog_do_db =
till filen.- Fil:/ etc/mysql/mysql.conf.d/mysqld.cnf
1 2 3
server-id = 1 log_bin = /var/log/mysql/mysql-bin.log
-
Starta om MySQL-tjänsten.
sudo systemctl restart mysql
-
Verifiera statusen för MySQL och se till att den är
aktiv
.sudo systemctl status mysql
mysql.service - MySQL Community Server Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled) Active: active (running) since Sun 2021-05-30 13:06:47 UTC; 1 day 1h ago
Konfigurera en ny MySQL-användare för replikan
Du måste skapa en ny användare på källservern för att representera repliken. Nya användare skapas i MySQL-skalet.
-
Gå in i MySQL-skalet.
sudo mysql -u root -p
-
Lägg till en användare för replikkontot med MySQL
CREATE USER
syntax. Användarnamnet måste bestå av namnet på replikkontot, en@
symbol och replikserverns IP-adress. Välj ett säkrare lösenord för kontot i stället förREPLICA_PASSWORD
.CREATE USER 'replica_account_name'@'replica_ip_address‘ IDENTIFIED WITH sha256_password BY 'REPLICA_PASSWORD';
Obs För att tillåta repliken att kunna ansluta från vilken adress som helst, ange användaren som
'replica_account_name'@'%'
.%
symbolen representerar vilken adress eller domän som helst. Detta ger extra flexibilitet på bekostnad av viss säkerhet. -
Ge replikeringsrättigheter till fjärrreplikanvändaren.
GRANT REPLICATION SLAVE ON *.* TO 'replica_account_name'@'replica_ip_address';
Förbered MySQL-data för replikering
Vid det här laget är det nödvändigt att spola och låsa källdatabasen för att iscensätta data för replikering.
-
Stanna kvar i MySQL-skalet och töm privilegierna för att ladda om beviljandetabellerna utan att starta om databasen.
FLUSH PRIVILEGES;
-
Lås databasen för att frysa databasen på en stabil punkt från vilken du kan exportera data. Låt MySQL-klienten vara igång tills du exporterar databasen. Om du anger ett skrivkommando eller avslutar MySQL-skalet frigörs låset.
FLUSH TABLES WITH READ LOCK;
Varning Detta kommando blockerar alla commits till källdatabasen. Exportera data innan du tillåter källan att bearbeta fler åtaganden. Annars kan replikdatabasen bli skadad eller inkonsekvent med källdatabasen. Slutför de två återstående stegen i det här avsnittet så snart som möjligt.
-
Verifiera statusen för databasen med följande kommando. Detta kommando visar den aktuella loggfilen tillsammans med positionen för den sista posten i denna fil. Registrera denna information eftersom det krävs för att initiera replikering på repliken senare.
SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000002 | 1301 | | | | +------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)
-
Använd Linux-skalet från en annan konsol, exportera databasen med
mysqldump
verktyg. Välj ett minnesvärt namn för målfilen. Inkludera–master-data
alternativ för att lägga till information om loggfilen och positionen för den aktuella posten i loggen.sudo mysqldump -u root -p -–all-databases -–master-data > databasecopy.sql
Obs För att exportera en enskild databas, inkludera
--opt
alternativ istället för -–alla-databaser
. -
Tillbaka i det ursprungliga MySQL-skalet, lås upp källdatabasen.
UNLOCK TABLES;
-
Avsluta MySQL-skalet.
QUIT;
-
Kopiera den exporterade databasfilen till replikdatabasservern med
ftp
,scp
, eller någon annan metod för att överföra filen.scp databasecopy.sql [email protected]<replica_ip_address>
Konfigurera MySQL Replica Database
Följande konfiguration bör tillämpas på replikdatabaskonfigurationen. För att installera MySQL på replikservern, se avsnittet Installera MySQL.
-
Öppna MySQL-huvudfilen, vanligtvis på
/etc/mysql/mysql.conf.d/mysqld.cnf
, och ändrabind-adress
för att matcha replikserverns IP-adress.- Fil:/ etc/mysql/mysql.conf.d/mysqld.cnf
1 2
bind-address = xx.xx.xx.xx
-
Avkommentera eller lägg till raderna för
server-id
ochlog-bin
.server-id
måste vara inställd på2
på repliken, medanlog-bin
variabel måste ställas in på/var/log/mysql/mysql-bin.log
. Lägg till en variabel förrelay-log
och ställ in den till/var/log/mysql/mysql-relay-bin.log
.Obs Se till att
skip_networking
variabeln är inte inställd någonstans i den här filen. För att replikera en enskild databas, lägg till följande direktiv i filenbinlog_do_db =database_name
. För att konfigurera mer än en replik, numreraserver-id
värden på ett sekventiellt ökande sätt. Till exempel skulle en andra replik ha ettserver-id
av3
.- Fil:/ etc/mysql/mysql.conf.d/mysqld.cnf
1 2 3 4
server-id = 2 log_bin = /var/log/mysql/mysql-bin.log relay-log = /var/log/mysql/mysql-relay-bin.log
-
Starta om MySQL-tjänsten för att införliva ändringarna.
sudo systemctl restart mysql
-
Verifiera statusen för MySQL och se till att den är
aktiv
.sudo systemctl status mysql
mysql.service - MySQL Community Server Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset:> Active: active (running) since Mon 2021-05-31 16:29:48 UTC; 6s ago
-
(Valfritt ) MySQL rekommenderar att du använder SSL för att ansluta till källan för ökad säkerhet. Mer information om att konfigurera SSL finns i MySQL SSL-dokumentationen. RSA-installationsverktyget kan användas för att påskynda denna process.
Importera de replikerade MySQL-data och aktivera replikering
Nästa steg är att importera kopian av databasdata, ställa in replikeringskällan och starta om replikdatabasservern. Repliken bör då vara synkroniserad och redo att användas.
-
Ange följande kommando från Linux-skalet för att importera källdatabasen. Ange databasnamnet som används för att exportera data tidigare.
sudo mysql -u root -p < databasecopy.sql
-
Logga in på MySQL-skalet.
sudo mysql -u root -p
-
Stoppa repliken.
STOP REPLICA;
-
Ange
ÄNDRA REPLIKATIONSKÄLLA
kommando, tillsammans med följande detaljer. Ersätt IP-adressen för källdatabasservern i stället försource_ip_address
. FörSOURCE_USER
ochSOURCE_PASSWORD
, ange replikans användarnamn och lösenordsinformation från i avsnittet Konfigurera en ny MySQL-användare för replika. FörSOURCE_LOG_FILE
ochSOURCE_LOG_POS
värden, ange informationen du spelade in frånVISA MASTERSTATUS;
kommando.CHANGE REPLICATION SOURCE TO SOURCE_HOST='source_ip_address',SOURCE_USER='replica_account_name', SOURCE_PASSWORD='REPLICA_PASSWORD', SOURCE_LOG_FILE='log_file_name', SOURCE_LOG_POS=log_position;
Obs För att använda SSL för anslutningen, som MySQL rekommenderar, lägg till attributet
SOURCE_SSL=1
till kommandot. Mer information om att använda SSL i en käll-replik-replikeringskontext finns i MySQL-dokumentationen. -
Starta om repliken.
START REPLICA;
-
Verifiera statusen för repliken. Repliken ska vänta på händelser, och det ska inte finnas någon
Last_IO_Error
ellerLast_Error
evenemang.Slave_SQL_Running_State
posten bör ange att repliken har läst reläloggen.SHOW REPLICA STATUS\G
Slave_IO_State: Waiting for master to send event Master_Host: 178.79.153.39 Master_User: replica Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000006 Read_Master_Log_Pos: 156 Relay_Log_File: mysql-relay-bin.000006 Relay_Log_Pos: 371 Relay_Master_Log_File: mysql-bin.000006 Slave_IO_Running: Yes Slave_SQL_Running: Yes .. Last_Errno: 0 Last_Error: .. 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: 1 Master_UUID: 5bed9d10-c140-11eb-bc63-f23c92a2a6ac Master_Info_File: mysql.slave_master_info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Testa MySQL Source-Replica Replication
Om källdatabasen redan var ifylld innan repliken instansierades krävs extra testning. I det här fallet kontrollerar du att databaserna och tabellerna som finns på källan finns på repliken efter att data har importerats. I VISA REPLIKSTATUS
visas, Slave_SQL_Running_State
posten bör vara Slaven har läst all relälogg
.
För att verifiera att replikeringen sker korrekt, skapa en ny databas eller tabell på källan. Efter några sekunder bör den nya posten finnas på repliken. Validera förekomsten av databasen med hjälp av VISA DATABASER;
kommando. För att bekräfta närvaron av en tabell, växla till databasen med ANVÄND databasnamn;
, och ange VISA TABELLER;
. Det är också en bra idé att köra VISA REPLICA STATUS
kommando och granska utdata för eventuella fel. Last_Error
och Last_IO_Error
fälten ska vara tomma och repliken ska förbli ansluten.
Läs mer om MySQL Source-Replica Replication
Den bästa källan för information om replikering av källreplik är den officiella MySQL-dokumentationen. Detta avsnitt om replikering innehåller mer omfattande information om arkitekturen och installationsprocessen. MySQL-forumen kan också vara till hjälp.
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-dokumentation