MySQL je systém pro správu relačních databází, který je jedním z nejoblíbenějších open-source projektů. Přestože je MySQL známé svou stabilitou, je ještě spolehlivější, pokud je nakonfigurována replikace zdroj-replika. Při replikaci je obvykle jeden MySQL server označen jako zdroj . Zdroj odesílá jakékoli změny databáze a aktualizace dat do jedné nebo více replik databázové servery. Postup replikace dat MySQL je flexibilní a replikační servery nemusí být trvale připojeny ke zdroji. Tato příručka vysvětluje, jak nakonfigurovat replikaci dat zdrojové repliky v MySQL.
Jak funguje replikace dat MySQL
Proces replikace nejprve uloží data do zdrojové databáze a poté je zkopíruje do všech replik. Po zpracování instrukce sleduje zdrojový databázový server změnu v binárním protokolu. Protokol slouží jako sekvenční záznam všech změn ve struktuře a obsahu databáze. VYBRAT
příkazy se nezaznamenávají, protože nemění obsah databáze.
Aktualizace probíhají asynchronně, takže repliky nemusí být neustále připojeny. To kontrastuje se synchronními architekturami vysoce spolehlivých systémů. Pokud je vyžadována synchronizace v reálném čase, MySQL doporučuje použít NDB Cluster .
Každá replika stahuje data ze zdroje vyžádáním obsahu binárního protokolu zdroje. Replika pak použije příkazy v pořadí a efektivně přehraje události, ke kterým došlo ve zdroji. Každá replika je nezávislá a sleduje svou aktuální pozici se zdrojovým binárním logem. Každá replika se navíc může synchronizovat se zdrojem podle vlastního plánu. Data lze číst z kteréhokoli ze serverů, včetně replik.
MySQL umožňuje vysoký stupeň granularity. Je možné replikovat přes určité databáze nebo dokonce konkrétní tabulky v rámci databáze. Výchozí formát replikace je Replikace založená na příkazu (SBR), ve kterém je replikován celý SQL příkaz. Nicméně Row Based Replication (RBR) je také k dispozici. Tento formát replikuje řádky, které byly změněny. Je také možné konfigurovat složitější konfigurace many-to-many. Další informace o různých možnostech replikace naleznete v dokumentaci MySQL.
Poznámka MySQL dříve označovalo replikaci zdrojové repliky jako „hlavní-podřízenou replikaci“. Organizace MySQL nedávno změnila terminologii a vysvětlila své úvahy v aktualizaci aterminologie. Starší termín „master“ byl změněn na „source“, zatímco „slave“ je nyní označován jako „replika“. Staré termíny se mohou stále objevovat v určitých příkazech a výstupních zobrazeních, zatímco MySQL aktualizuje svou kódovou základnu. Tato příručka používá v pokynech preferované výrazy MySQL.
Výhody replikace dat MySQL
Povolení replikace zdrojové repliky nabízí mnoho významných výhod oproti neredundantnímu systému. Níže uvedený seznam poskytuje přehled některých výhod:
-
Je snadné vytvořit živou záložní kopii kdykoli. Protože proces replikace je asynchronní, replikace může probíhat podle libovolného plánu. Aby repliky fungovaly spolehlivě, nemusí být synchronizovány se zdrojem.
-
Přidání repliky může zvýšit dobu provozuschopnosti a spolehlivost celého systému. Primární řízení se může přepnout na repliku, pokud je vyžadována údržba nebo je zdrojová databáze nedostupná.
-
Každá replika poskytuje další čitelnou instanci databáze. To umožňuje programům pro dolování nebo analýzu dat dotazovat se na repliku bez dalšího zatížení původní zdrojové databáze.
-
Tato architektura zvyšuje škálovatelnost a výkon. Databáze se načte a
VYBERE
příkazy mohou být mezi servery vyváženy, což snižuje latenci. -
Třetí strany mohou získat přístup pouze pro čtení k databázi prostřednictvím repliky a již nevyžadují přístup ke zdroji. Replika databáze může být vytvořena na vyžádání, když je požadována, a zničena, když již není potřeba. Tato technika zvyšuje bezpečnost a zajišťuje, že není možné manipulovat s původními daty.
Než začnete
-
Pokud jste tak ještě neučinili, vytvořte si účet Linode a Compute Instance. Podívejte se na naše příručky Začínáme s Linode a Vytvoření výpočetní instance.
-
Při aktualizaci systému postupujte podle našeho průvodce nastavením a zabezpečením výpočetní instance. Můžete také chtít nastavit časové pásmo, nakonfigurovat název hostitele, vytvořit omezený uživatelský účet a posílit přístup SSH.
-
Ke konfiguraci replikace zdrojové repliky MySQL musíte mít alespoň dva samostatné linody. Jeden Linode hostí zdrojovou databázi, zatímco další uzel je nezbytný pro replikační server.
Poznámka Kroky v této příručce jsou napsány pro uživatele bez oprávnění root. Příkazy, které vyžadují zvýšená oprávnění, mají předponusudo
. Pokud neznátesudo
naleznete v příručce Uživatelé a skupiny Linuxu.
Konfigurace replikace zdroje v MySQL
Pro konfiguraci replikace zdrojové repliky musí být MySQL nainstalována na dvou samostatných serverech, které spolu mohou komunikovat. Tyto pokyny jsou zaměřeny na distribuci Ubuntu, ale jsou obecně použitelné pro všechny distribuce Linuxu. Proces se skládá z následujících kroků:
- Nainstalujte MySQL.
- Nakonfigurujte zdrojovou databázi MySQL.
- Nakonfigurujte nového uživatele MySQL pro repliku.
- Připravte data MySQL pro replikaci.
- Nakonfigurujte databázi replik MySQL.
- Importujte replikovaná data MySQL a aktivujte replikaci.
Instalovat MySQL
Pokud MySQL ještě není k dispozici na obou Linodech, nainstalujte ji pomocí následujících kroků:
-
Upgradujte Linodes.
sudo apt-get update && sudo apt-get upgrade
-
Nainstalujte server MySQL a klientské aplikace na zdrojový i replikační server.
sudo apt-get install mysql-server mysql-client -y
-
Nakonfigurujte možnosti zabezpečení, včetně hesla uživatele root, pomocí
mysql_secure_installation
příkaz.sudo mysql_secure_installation
-
Pokud používáte firewall, jako je
ufw
, ujistěte se, že umožňuje provoz MySQL. Přidejte následující pravidlo k otevření portu3306
na firewallu.ufw allow mysql
Konfigurace zdrojové databáze MySQL
Chcete-li povolit replikaci MySQL, upravte některé proměnné v hlavním konfiguračním souboru MySQL. Proveďte následující změny konfigurace zdrojové databáze.
-
Vyhledejte hlavní konfigurační soubor MySQL na zdrojovém databázovém serveru. Tento soubor se obvykle nachází na adrese
/etc/mysql/mysql.conf.d/mysqld.cnf
. V dřívějších instalacích však může být umístěn na/etc/my.cnf
nebo/etc/mysql/my.cnf
. Může být také odkazováno z jednoho ze souborů prostřednictvímincludedir
směrnice. -
Otevřete konfigurační soubor MySQL a změňte
bind-address
na IP adresu zdrojového serveru.- Soubor:/ etc/mysql/mysql.conf.d/mysqld.cnf
1 2
bind-address = <source_ip_address>
-
Odkomentujte nebo přidejte řádky pro
server-id
alog-bin
. Nastavteid serveru
až1
alog-bin
na/var/log/mysql/mysql-bin.log
.Poznámka Zajistěte
skip_networking
proměnná není nikde deklarována. Zakomentujte jej, pokud se objeví v tomto souboru. Chcete-li replikovat jednu databázi, přidejte řádekbinlog_do_db =
do souboru.- Soubor:/ etc/mysql/mysql.conf.d/mysqld.cnf
1 2 3
server-id = 1 log_bin = /var/log/mysql/mysql-bin.log
-
Restartujte službu MySQL.
sudo systemctl restart mysql
-
Ověřte stav MySQL a ujistěte se, že je
aktivní
.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
Konfigurace nového uživatele MySQL pro repliku
Na zdrojovém serveru musíte vytvořit nového uživatele, který bude reprezentovat repliku. Noví uživatelé se vytvářejí v prostředí MySQL.
-
Vstupte do prostředí MySQL.
sudo mysql -u root -p
-
Přidejte uživatele pro účet repliky pomocí MySQL
CREATE USER
syntax. Uživatelské jméno se musí skládat z názvu účtu repliky,@
a IP adresa replikačního serveru. Zvolte bezpečnější heslo pro účet namístoREPLICA_PASSWORD
.CREATE USER 'replica_account_name'@'replica_ip_address‘ IDENTIFIED WITH sha256_password BY 'REPLICA_PASSWORD';
Poznámka Chcete-li, aby se replika mohla připojit z libovolné adresy, zadejte uživatele jako
'replica_account_name'@'%'
.%
symbol představuje jakoukoli adresu nebo doménu. To poskytuje extra flexibilitu na úkor určitého zabezpečení. -
Udělte práva replikace uživateli vzdálené repliky.
GRANT REPLICATION SLAVE ON *.* TO 'replica_account_name'@'replica_ip_address';
Příprava dat MySQL pro replikaci
V tomto okamžiku je nutné vyprázdnit a uzamknout zdrojovou databázi, aby bylo možné připravit data pro replikaci.
-
Zůstaňte v prostředí MySQL a vyprázdněte oprávnění k opětovnému načtení tabulek grantů bez restartování databáze.
FLUSH PRIVILEGES;
-
Uzamkněte databázi, aby se databáze zmrazila na stabilním místě, ze kterého lze exportovat data. Nechte klienta MySQL spuštěného, dokud databázi neexportujete. Zadáním libovolného příkazu zápisu nebo opuštěním prostředí MySQL se zámek uvolní.
FLUSH TABLES WITH READ LOCK;
Pozor Tento příkaz blokuje všechna potvrzení do zdrojové databáze. Exportujte data, než zdroji umožníte zpracovat další potvrzení. V opačném případě by se replikovaná databáze mohla poškodit nebo by mohla být nekonzistentní se zdrojovou databází. Co nejdříve dokončete zbývající dva kroky v této části.
-
Ověřte stav databáze pomocí následujícího příkazu. Tento příkaz zobrazí aktuální soubor protokolu spolu s pozicí posledního záznamu v tomto souboru. Zaznamenejte si tyto informace, protože je nutné později zahájit replikaci na replice.
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)
-
Pomocí linuxového shellu z jiné konzole exportujte databázi pomocí
mysqldump
nářadí. Vyberte zapamatovatelný název pro cílový soubor. Zahrňte–master-data
možnost přidat informace o souboru protokolu a pozici aktuálního záznamu do protokolu.sudo mysqldump -u root -p -–all-databases -–master-data > databasecopy.sql
Poznámka Chcete-li exportovat jednu databázi, zahrňte
--opt
spíše než -–all-databases
. -
Zpět v původním prostředí MySQL odemkněte zdrojovou databázi.
UNLOCK TABLES;
-
Ukončete prostředí MySQL.
QUIT;
-
Zkopírujte exportovaný databázový soubor na replikovaný databázový server pomocí
ftp
,scp
, nebo jiný způsob přenosu souboru.scp databasecopy.sql [email protected]<replica_ip_address>
Konfigurace databáze replik MySQL
Následující konfigurace by měla být použita pro konfiguraci replikované databáze. Chcete-li nainstalovat MySQL na replikovaný server, viz část Instalace MySQL.
-
Otevřete hlavní soubor MySQL, který se obvykle nachází na adrese
/etc/mysql/mysql.conf.d/mysqld.cnf
a změňtebind-address
aby odpovídala IP adrese replikačního serveru.- Soubor:/ etc/mysql/mysql.conf.d/mysqld.cnf
1 2
bind-address = xx.xx.xx.xx
-
Odkomentujte nebo přidejte řádky pro
server-id
alog-bin
.ID serveru
musí být nastaveno na2
na replice, zatímcolog-bin
proměnná musí být nastavena na/var/log/mysql/mysql-bin.log
. Přidejte proměnnou prorelay-log
a nastavte jej na/var/log/mysql/mysql-relay-bin.log
.Poznámka Zajistěte
skip_networking
proměnná není nikde v tomto souboru nastavena. Chcete-li replikovat jednu databázi, přidejte následující direktivu do souborubinlog_do_db =database_name
. Chcete-li nakonfigurovat více než jednu repliku, očíslujteid-serveru
hodnoty postupně rostoucím způsobem. Například druhá replika by mělaid serveru
z3
.- Soubor:/ 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
-
Restartujte službu MySQL, aby se změny začlenily.
sudo systemctl restart mysql
-
Ověřte stav MySQL a ujistěte se, že je
aktivní
.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
-
(Volitelné ) MySQL doporučuje používat SSL pro připojení ke zdroji pro větší bezpečnost. Další informace o konfiguraci SSL naleznete v dokumentaci MySQL SSL. Nástroj pro nastavení RSA lze použít k urychlení tohoto procesu.
Importovat replikovaná data MySQL a aktivovat replikaci
Dalším krokem je import kopie databázových dat, nastavení zdroje replikace a restartování replikovaného databázového serveru. Replika by pak měla být synchronizovaná a připravená k použití.
-
Zadejte následující příkaz z prostředí Linux pro import zdrojové databáze. Zadejte název databáze použité k exportu dat dříve.
sudo mysql -u root -p < databasecopy.sql
-
Přihlaste se do prostředí MySQL.
sudo mysql -u root -p
-
Zastavte repliku.
STOP REPLICA;
-
Zadejte
ZMĚNIT ZDROJ REPLICACE
příkaz spolu s následujícími podrobnostmi. Nahraďte IP adresu zdrojového databázového serveru místosource_ip_address
. ProSOURCE_USER
aSOURCE_PASSWORD
, zadejte uživatelské jméno a heslo repliky z v části Konfigurace nového uživatele MySQL pro repliku. ProSOURCE_LOG_FILE
aSOURCE_LOG_POS
hodnoty, zadejte informace, které jste zaznamenali zSHOW MASTER STATUS;
příkaz.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;
Poznámka Chcete-li pro připojení použít SSL, které doporučuje MySQL, přidejte atribut
SOURCE_SSL=1
na příkaz. Další informace o používání SSL v kontextu replikace zdrojové repliky lze nalézt v dokumentaci MySQL. -
Restartujte repliku.
START REPLICA;
-
Ověřte stav repliky. Replika by měla čekat na události a neměla by existovat žádná
Last_IO_Error
neboLast_Error
Události.Slave_SQL_Running_State
položka by měla uvádět, že replika přečetla protokol přenosu.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
Test replikace zdroje MySQL a repliky
Pokud byla zdrojová databáze již naplněna před vytvořením instance repliky, je vyžadováno další testování. V tomto případě po importu dat ověřte, že databáze a tabulky, které existují ve zdroji, jsou v replice přítomny. V ZOBRAZIT STAV REPLIKY
zobrazení Slave_SQL_Running_State
položka by měla znít Slave přečetl celý protokol relé
.
Chcete-li ověřit, zda replikace probíhá správně, vytvořte ve zdroji novou databázi nebo tabulku. Po několika sekundách by měla být na replice přítomna nová položka. Ověřte přítomnost databáze pomocí SHOW DATABASES;
příkaz. Pro potvrzení přítomnosti tabulky přepněte do databáze pomocí USE databasename;
a zadejte ZOBRAZIT TABULKY;
. Je také dobré spustit ZOBRAZIT STAV REPLIKA
a prozkoumejte výstup, zda neobsahuje nějaké chyby. Last_Error
a Last_IO_Error
pole by měla být prázdná a replika by měla zůstat připojená.
Další informace o replikaci zdrojové repliky MySQL
Nejlepším zdrojem informací o replikaci zdrojové repliky je oficiální dokumentace MySQL. Část o replikaci obsahuje rozsáhlejší informace o architektuře a procesu instalace. Užitečná mohou být také fóra MySQL.
Další informace
Další informace o tomto tématu můžete získat v následujících zdrojích. Přestože jsou poskytovány v naději, že budou užitečné, vezměte prosím na vědomí, že nemůžeme ručit za přesnost nebo aktuálnost externě hostovaných materiálů.
- Dokumentace MySQL