sql >> Database >  >> RDS >> Mysql

Bron-replica-replicatie configureren in MySQL

DeMySQL is een relationeel databasebeheersysteem dat een van de meest populaire open-sourceprojecten is. Hoewel bekend om zijn stabiliteit, is MySQL nog betrouwbaarder als replicatie van bronreplica is geconfigureerd. Bij replicatie wordt één MySQL-server doorgaans aangeduid als de bron . Een bron stuurt eventuele databasewijzigingen en gegevensupdates naar een of meer replica database-servers. De procedure voor gegevensreplicatie van MySQL is flexibel en de replicaservers hoeven niet permanent verbonden te zijn met de bron. In deze handleiding wordt uitgelegd hoe u bronreplica-gegevensreplicatie in MySQL configureert.

Hoe MySQL-gegevensreplicatie werkt

Het replicatieproces slaat eerst gegevens op in de brondatabase en kopieert deze vervolgens naar eventuele replica's. Nadat de instructie is verwerkt, volgt de brondatabaseserver de wijziging in een binair logboek. Het logboek dient als een sequentiële registratie van alle wijzigingen in de databasestructuur en -inhoud. SELECT statements worden niet opgenomen omdat ze de inhoud van de database niet veranderen.

Updates gebeuren asynchroon, zodat de replica's niet continu verbonden hoeven te zijn. Dit in tegenstelling tot de synchrone architecturen van zeer betrouwbare systemen. Als realtime synchronisatie vereist is, raadt MySQL aan om deNDB-cluster te gebruiken .

Elke replica haalt gegevens uit de bron door de inhoud van het binaire logboek van de bron op te vragen. De replica past de instructies vervolgens in volgorde toe, waardoor de gebeurtenissen die zich op de bron hebben voorgedaan, effectief worden afgespeeld. Elke replica is onafhankelijk en houdt zijn huidige positie bij met het binaire bronlogboek. Bovendien kan elke replica volgens zijn eigen schema synchroniseren met de bron. Gegevens kunnen worden gelezen van alle servers, inclusief de replica's.

MySQL maakt een hoge mate van granulariteit mogelijk. Het is mogelijk om over bepaalde databases of zelfs specifieke tabellen binnen een database te repliceren. De standaard replicatie-indeling is Replicatie op basis van verklaringen (SBR), waarin de volledige SQL-instructie wordt gerepliceerd. Echter, Replicatie op basis van rij (RBR) is ook beschikbaar. Deze indeling repliceert de rijen die zijn gewijzigd. Het is ook mogelijk om meer gecompliceerde veel-op-veel configuraties te configureren. Raadpleeg de MySQL-documentatie voor meer informatie over de verschillende replicatie-opties.

Opmerking MySQL verwees eerder naar Source-Replica Replication als "Master-Slave-replicatie". De MySQL-organisatie heeft onlangs de terminologie gewijzigd en hun redenering uitgelegd in de aterminologie-update. De oudere term "master" is veranderd in "source", terwijl een "slave" nu een "replica" wordt genoemd. De oude termen kunnen nog steeds verschijnen in bepaalde opdrachten en uitvoerschermen terwijl MySQL de codebase bijwerkt. Deze handleiding gebruikt de voorkeurstermen van MySQL in de instructies.

Voordelen van MySQL-gegevensreplicatie

Het inschakelen van bronreplica-replicatie biedt veel belangrijke voordelen ten opzichte van een niet-redundant systeem. De onderstaande lijst geeft een overzicht van enkele voordelen:

  • Het is gemakkelijk om op elk moment een live back-up te maken. Omdat het replicatieproces asynchroon is, kan replicatie volgens elk schema plaatsvinden. De replica's hoeven niet synchroon te worden gehouden met de bron om betrouwbaar te werken.

  • Het toevoegen van een replica kan de uptime en betrouwbaarheid voor het hele systeem verhogen. Primaire controle kan overschakelen naar de replica als onderhoud nodig is of de brondatabase niet beschikbaar is.

  • Elke replica biedt een ander leesbaar exemplaar van de database. Hierdoor kunnen datamining- of analyseprogramma's de replica opvragen zonder de originele brondatabase extra te belasten.

  • Deze architectuur verhoogt de schaalbaarheid en prestaties. Database leest en SELECT verklaringen kunnen worden gebalanceerd tussen de servers, waardoor de latentie wordt verminderd.

  • Derden kunnen via een replica alleen-lezen toegang krijgen tot een database en hebben geen toegang meer nodig tot de bron. Een replicadatabase kan op aanvraag worden gemaakt wanneer dit nodig is en kan worden vernietigd wanneer het niet langer nodig is. Deze techniek verbetert de veiligheid en zorgt ervoor dat het onmogelijk is om met de originele gegevens te knoeien.

Voordat u begint

  1. Als je dit nog niet hebt gedaan, maak dan een Linode-account en Compute Instance aan. Zie onze handleidingen Aan de slag met Linode en Een rekeninstantie maken.

  2. Volg onze handleiding voor het instellen en beveiligen van een rekeninstantie om uw systeem bij te werken. Mogelijk wilt u ook de tijdzone instellen, uw hostnaam configureren, een beperkt gebruikersaccount maken en SSH-toegang versterken.

  3. U moet ten minste twee afzonderlijke Linodes hebben om MySQL-bronreplica-replicatie te configureren. Eén Linode host de brondatabase, terwijl een ander knooppunt nodig is voor de replicaserver.

Opmerking De stappen in deze handleiding zijn geschreven voor een niet-rootgebruiker. Opdrachten die verhoogde bevoegdheden vereisen, worden voorafgegaan door sudo . Als u niet bekend bent met de sudo commando, zie de handleiding voor Linux-gebruikers en -groepen.

Bronreplica-replicatie configureren in MySQL

Om bronreplica-replicatie te configureren, moet MySQL worden geïnstalleerd op twee afzonderlijke servers die met elkaar kunnen communiceren. Deze instructies zijn gericht op de Ubuntu-distributie, maar zijn algemeen toepasbaar op alle Linux-distributies. Het proces bestaat uit de volgende stappen:

  1. Installeer MySQL.
  2. Configureer de MySQL-brondatabase.
  3. Configureer een nieuwe MySQL-gebruiker voor de replica.
  4. Maak de MySQL-gegevens klaar voor replicatie.
  5. Configureer de MySQL Replica Database.
  6. Importeer de gerepliceerde MySQL-gegevens en activeer replicatie.

MySQL installeren

Als MySQL nog niet beschikbaar is op beide Linodes, installeer het dan met de volgende stappen:

  1. Upgrade de Linodes.

     sudo apt-get update && sudo apt-get upgrade
    
  2. Installeer de MySQL-server en clienttoepassingen op zowel de bron- als replicaservers.

     sudo apt-get install mysql-server mysql-client -y
    
  3. Configureer de beveiligingsopties, inclusief het root-wachtwoord, met behulp van de mysql_secure_installation commando.

     sudo mysql_secure_installation
    
  4. Als u een firewall zoals ufw . gebruikt , zorg ervoor dat het MySQL-verkeer doorlaat. Voeg de volgende regel toe om poort 3306 te openen op de firewall.

     ufw allow mysql
    

Configureer de MySQL-brondatabase

Om MySQL-replicatie in te schakelen, bewerkt u enkele variabelen in het hoofdconfiguratiebestand van MySQL. Breng de volgende wijzigingen aan in de configuratie van de brondatabase.

  1. Zoek het belangrijkste MySQL-configuratiebestand op de brondatabaseserver. Dit bestand is meestal te vinden op /etc/mysql/mysql.conf.d/mysqld.cnf . In eerdere installaties kan het zich echter bevinden op /etc/my.cnf of /etc/mysql/my.cnf . Er kan ook naar worden verwezen vanuit een van de bestanden via een includedir richtlijn.

  2. Open het MySQL-configuratiebestand en wijzig het bind-address naar het IP-adres van de bronserver.

    Bestand:/ etc/mysql/mysql.conf.d/mysqld.cnf
    1
    2
    
    bind-address  = <source_ip_address>
        
  3. Verwijder commentaar of voeg de regels toe voor server-id en log-bin . Stel de server-id in naar 1 , en log-bin naar /var/log/mysql/mysql-bin.log .

    Opmerking Zorg ervoor dat de skip_networking variabele wordt nergens gedeclareerd. Geef commentaar als het in dit bestand voorkomt. Om een ​​enkele database te repliceren, voegt u de regel binlog_do_db = <database_name> toe naar het bestand.
    Bestand:/ etc/mysql/mysql.conf.d/mysqld.cnf
    1
    2
    3
    
    server-id  = 1
    log_bin  = /var/log/mysql/mysql-bin.log
        
  4. Start de MySQL-service opnieuw.

     sudo systemctl restart mysql
    
  5. Controleer de status van MySQL en zorg ervoor dat deze active is .

     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

Configureer een nieuwe MySQL-gebruiker voor de replica

U moet een nieuwe gebruiker op de bronserver maken om de replica te vertegenwoordigen. Nieuwe gebruikers worden aangemaakt in de MySQL-shell.

  1. Voer de MySQL-shell in.

     sudo mysql -u root -p
    
  2. Voeg een gebruiker toe voor het replica-account met behulp van de MySQL CREATE USER syntaxis. De gebruikersnaam moet bestaan ​​uit de naam van het replica-account, een @ symbool en het IP-adres van de replicaserver. Kies een veiliger wachtwoord voor het account in plaats van REPLICA_PASSWORD .

     CREATE USER 'replica_account_name'@'replica_ip_address‘ IDENTIFIED WITH sha256_password BY 'REPLICA_PASSWORD';
    
    Opmerking Om de replica in staat te stellen verbinding te maken vanaf elk adres, specificeert u de gebruiker als 'replica_account_name'@'%' . De % symbool staat voor elk adres of domein. Dit zorgt voor extra flexibiliteit ten koste van enige beveiliging.
  3. Verleen replicatierechten aan de externe replicagebruiker.

     GRANT REPLICATION SLAVE ON *.* TO 'replica_account_name'@'replica_ip_address';
    

Maak de MySQL-gegevens klaar voor replicatie

Op dit punt is het noodzakelijk om de brondatabase leeg te maken en te vergrendelen om de gegevens klaar te maken voor replicatie.

  1. Blijf in de MySQL-shell en verwijder de rechten om de toekenningstabellen opnieuw te laden zonder de database opnieuw te starten.

     FLUSH PRIVILEGES;
    
  2. Vergrendel de database om de database te bevriezen op een stabiel punt van waaruit de gegevens kunnen worden geëxporteerd. Houd de MySQL-client actief totdat u de database exporteert. Door een schrijfopdracht in te voeren of de MySQL-shell te verlaten, wordt de vergrendeling opgeheven.

     FLUSH TABLES WITH READ LOCK;
    
    Let op Deze opdracht blokkeert alle commits naar de brondatabase. Exporteer de gegevens voordat u de bron toestaat om nog meer vastleggingen te verwerken. Anders kan de replicadatabase beschadigd raken of niet meer overeenkomen met de brondatabase. Voltooi de twee resterende stappen in dit gedeelte zo snel mogelijk.
  3. Controleer de status van de database met de volgende opdracht. Deze opdracht geeft het huidige logbestand weer samen met de positie van het laatste record in dit bestand. Noteer deze informatie omdat het nodig is om de replicatie later op de replica te starten.

     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. Gebruik de Linux-shell van een andere console en exporteer de database met de mysqldump hulpmiddel. Selecteer een gedenkwaardige naam voor het doelbestand. Voeg de –master-data toe optie om informatie over het logbestand en de positie van het huidige record aan het logbestand toe te voegen.

     sudo mysqldump -u root -p -–all-databases -–master-data > databasecopy.sql
    
    Opmerking Om een ​​enkele database te exporteren, voegt u de --opt <database_name> . toe optie in plaats van -–all-databases .
  5. Ontgrendel de brondatabase terug in de originele MySQL-shell.

     UNLOCK TABLES;
    
  6. Verlaat de MySQL-shell.

     QUIT;
    
  7. Kopieer het geëxporteerde databasebestand naar de replicadatabaseserver met behulp van ftp , scp , of een andere methode om het bestand over te zetten.

     scp databasecopy.sql [email protected]<replica_ip_address>
    

Configureer de MySQL Replica Database

De volgende configuratie moet worden toegepast op de configuratie van de replicadatabase. Zie de sectie MySQL installeren om MySQL op de replicaserver te installeren.

  1. Open het hoofd MySQL-bestand, meestal te vinden op /etc/mysql/mysql.conf.d/mysqld.cnf , en verander het bind-address om overeen te komen met het IP-adres van de replicaserver.

    Bestand:/ etc/mysql/mysql.conf.d/mysqld.cnf
    1
    2
    
    bind-address  = xx.xx.xx.xx
        
  2. Verwijder commentaar of voeg de regels toe voor server-id en log-bin . De server-id moet zijn ingesteld op 2 op de replica, terwijl de log-bin variabele moet zijn ingesteld op /var/log/mysql/mysql-bin.log . Voeg een variabele toe voor relay-log en stel het in op /var/log/mysql/mysql-relay-bin.log .

    Opmerking Zorg ervoor dat de skip_networking variabele is nergens in dit bestand ingesteld. Om een ​​enkele database te repliceren, voegt u de volgende instructie toe aan het bestand binlog_do_db = database_name . Om meer dan één replica te configureren, nummer de server-id waarden in een opeenvolgend toenemende manier. Een tweede replica zou bijvoorbeeld een server-id . hebben van 3 .
    Bestand:/ 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. Start de MySQL-service opnieuw om de wijzigingen op te nemen.

     sudo systemctl restart mysql
    
  4. Controleer de status van MySQL en zorg ervoor dat deze active is .

     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. (Optioneel ) MySQL raadt het gebruik van SSL aan om verbinding te maken met de bron voor meer veiligheid. Meer informatie over het configureren van SSL vindt u in de MySQL SSL-documentatie. DeRSA-configuratietool kan worden gebruikt om dit proces te versnellen.

Importeer de gerepliceerde MySQL-gegevens en activeer replicatie

De volgende stap is om de kopie van de databasegegevens te importeren, de replicatiebron in te stellen en de replicadatabaseserver opnieuw te starten. De replica zou dan synchroon moeten zijn en klaar voor gebruik.

  1. Voer de volgende opdracht uit de Linux-shell in om de brondatabase te importeren. Geef de databasenaam op die is gebruikt om de gegevens eerder te exporteren.

     sudo mysql -u root -p < databasecopy.sql
    
  2. Log in op de MySQL-shell.

     sudo mysql -u root -p
    
  3. Stop de replica.

     STOP REPLICA;
    
  4. Voer de CHANGE REPLICATION SOURCE in commando, samen met de volgende details. Vervang het IP-adres van de brondatabaseserver in plaats van source_ip_address . Voor SOURCE_USER en SOURCE_PASSWORD , voer de gebruikersnaam en het wachtwoord van de replica in in de sectie Een nieuwe MySQL-gebruiker configureren voor de replica. Voor de SOURCE_LOG_FILE en SOURCE_LOG_POS waarden, voert u de informatie in die u hebt vastgelegd van de SHOW MASTER STATUS; commando.

     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;
    
    Opmerking Om SSL te gebruiken voor de verbinding, die MySQL aanbeveelt, voegt u het kenmerk SOURCE_SSL=1 toe naar de opdracht. Meer informatie over het gebruik van SSL in een bron-replica-replicatiecontext is te vinden in de MySQL-documentatie.
  5. Start de replica opnieuw.

     START REPLICA;
    
  6. Controleer de status van de replica. De replica moet wachten op gebeurtenissen en er mag geen Last_IO_Error zijn of Last_Error evenementen. De Slave_SQL_Running_State invoer moet aangeven dat de replica het relaislogboek heeft gelezen.

     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

MySQL-bronreplica-replicatie testen

Als de brondatabase al was gevuld voordat de replica werd geïnstantieerd, zijn extra tests vereist. Controleer in dit geval of de databases en tabellen die in de bron aanwezig zijn, aanwezig zijn op de replica nadat de gegevens zijn geïmporteerd. In de SHOW REPLICA STATUS display, de Slave_SQL_Running_State invoer moet Slave has read all relay log .

Om te controleren of de replicatie correct plaatsvindt, maakt u een nieuwe database of tabel op de bron. Na een paar seconden moet de nieuwe vermelding op de replica aanwezig zijn. Valideer de aanwezigheid van de database met behulp van de SHOW DATABASES; opdracht. Om de aanwezigheid van een tabel te bevestigen, schakelt u naar de database met USE databasename; , en voer SHOW TABLES; . Het is ook een goed idee om de SHOW REPLICA STATUS . uit te voeren commando en controleer de uitvoer op eventuele fouten. De Last_Error en Last_IO_Error velden moeten leeg zijn en de replica moet verbonden blijven.

Meer informatie over MySQL Source-Replica-replicatie

De beste bron voor informatie over bronreplica-replicatie is de officiële MySQL-documentatie. De sectie over replicatie bevat uitgebreidere informatie over de architectuur en het installatieproces. De MySQL-forums kunnen ook nuttig zijn.

Meer informatie

U kunt de volgende bronnen raadplegen voor aanvullende informatie over dit onderwerp. Hoewel deze worden verstrekt in de hoop dat ze nuttig zullen zijn, houd er rekening mee dat we niet kunnen instaan ​​voor de nauwkeurigheid of tijdigheid van extern gehost materiaal.

  • MySQL-documentatie

  1. De rollen gebruiken die zijn veranderd in MySQL 8.0

  2. Alleen PostgreSQL in het geheugen uitvoeren

  3. Oracle 11g op Mac OS X

  4. Hoe kan ik in SQL Server bepalen of een dateTime-bereik een ander overlapt?