sql >> Databasteknik >  >> RDS >> Mysql

Hur man konfigurerar Source-Replica Replication i MySQL

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

  1. 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.

  2. 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.

  3. 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 prefixet sudo . Om du inte är bekant med sudo 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:

  1. Installera MySQL.
  2. Konfigurera MySQL-källdatabasen.
  3. Konfigurera en ny MySQL-användare för repliken.
  4. Förbered MySQL-data för replikering.
  5. Konfigurera MySQL Replica Database.
  6. 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:

  1. Uppgradera linoderna.

     sudo apt-get update && sudo apt-get upgrade
    
  2. Installera MySQL-servern och klientapplikationerna på både käll- och replikservrarna.

     sudo apt-get install mysql-server mysql-client -y
    
  3. Konfigurera säkerhetsalternativen, inklusive root-lösenordet, med mysql_secure_installation kommando.

     sudo mysql_secure_installation
    
  4. 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 port 3306 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.

  1. 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 en includedir direktiv.

  2. Ö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>
        
  3. Avkommentera eller lägg till raderna för server-id och log-bin . Ställ in server-id till 1 och log-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 raden binlog_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
        
  4. Starta om MySQL-tjänsten.

     sudo systemctl restart mysql
    
  5. 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.

  1. Gå in i MySQL-skalet.

     sudo mysql -u root -p
    
  2. 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ör REPLICA_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.
  3. 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.

  1. Stanna kvar i MySQL-skalet och töm privilegierna för att ladda om beviljandetabellerna utan att starta om databasen.

     FLUSH PRIVILEGES;
    
  2. 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.
  3. 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)
  4. 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 .
  5. Tillbaka i det ursprungliga MySQL-skalet, lås upp källdatabasen.

     UNLOCK TABLES;
    
  6. Avsluta MySQL-skalet.

     QUIT;
    
  7. 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.

  1. Öppna MySQL-huvudfilen, vanligtvis på /etc/mysql/mysql.conf.d/mysqld.cnf , och ändra bind-adress för att matcha replikserverns IP-adress.

    Fil:/ etc/mysql/mysql.conf.d/mysqld.cnf
    1
    2
    
    bind-address  = xx.xx.xx.xx
        
  2. Avkommentera eller lägg till raderna för server-id och log-bin . server-id måste vara inställd på 2 på repliken, medan log-bin variabel måste ställas in på /var/log/mysql/mysql-bin.log . Lägg till en variabel för relay-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 filen binlog_do_db =database_name . För att konfigurera mer än en replik, numrera server-id värden på ett sekventiellt ökande sätt. Till exempel skulle en andra replik ha ett server-id av 3 .
    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
        
  3. Starta om MySQL-tjänsten för att införliva ändringarna.

     sudo systemctl restart mysql
    
  4. 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
  5. (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.

  1. 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
    
  2. Logga in på MySQL-skalet.

     sudo mysql -u root -p
    
  3. Stoppa repliken.

     STOP REPLICA;
    
  4. Ange ÄNDRA REPLIKATIONSKÄLLA kommando, tillsammans med följande detaljer. Ersätt IP-adressen för källdatabasservern i stället för source_ip_address . För SOURCE_USER och SOURCE_PASSWORD , ange replikans användarnamn och lösenordsinformation från i avsnittet Konfigurera en ny MySQL-användare för replika. För SOURCE_LOG_FILE och SOURCE_LOG_POS värden, ange informationen du spelade in från VISA 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.
  5. Starta om repliken.

     START REPLICA;
    
  6. Verifiera statusen för repliken. Repliken ska vänta på händelser, och det ska inte finnas någon Last_IO_Error eller Last_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

  1. Doctrine Query Language få max/senaste raden per grupp

  2. Använda Microsoft DiskSpd för att testa ditt lagringsundersystem

  3. PSQL kommandoradsargument i DO-skript

  4. SQLRecoverableException:I/O-undantag:Anslutningsåterställning