Google Cloud SQL pro MySQL je plně spravovaná databázová služba, která vám pomůže nastavit, udržovat, spravovat a spravovat vaše relační databáze MySQL na platformě Google Cloud Platform. Mezi Cloud SQL a standardní funkcí MySQL však existují rozdíly, jako je omezená kontrola, omezené zdroje, datová lokalita, rozpočet a zabezpečení, které mohou ovlivnit vaše konečné rozhodnutí odejít z instancí Google Cloud SQL a hostit databázovou službu na místo toho infrastruktura prostor.
Tento blogový příspěvek vás provede online migrací z Google Cloud SQL na místní server. Naší cílovou databází na místním serveru je server Debian, ale kroky a postupy platí i pro ostatní verze Linuxu, pokud jsou balíčky správně nainstalovány.
Naše instance Google Cloud MySQL běží na MySQL 5.7 a potřebujeme:
- Replikační podřízený uživatel vytvořený na hlavním serveru.
- Podřízená jednotka musí být nainstalována se stejnou hlavní verzí jako hlavní.
- Pro geografickou replikaci musí být z bezpečnostních důvodů povoleno SSL.
Vzhledem k tomu, že Google Cloud ve výchozím nastavení umožňoval replikaci GTID pro MySQL, provedeme migraci založenou na tomto schématu replikace. Pokyny popsané v tomto příspěvku by tedy měly fungovat i v instancích MySQL 8.0.
Vytvoření podřízeného uživatele replikace
Nejprve musíme vytvořit replikačního slave uživatele v naší instanci Google Cloud SQL. Přihlaste se do Google Cloud Platform -> Databáze -> SQL -> vyberte instanci MySQL -> Uživatelé -> Přidat uživatelský účet a zadejte požadované údaje:
202.187.194.255 je podřízená veřejná IP adresa umístěná v našem on- prostory, které se budou z této instance replikovat. Jak vidíte, neexistuje žádná konfigurace oprávnění, protože uživatelé vytvoření z tohoto rozhraní budou mít nejvyšší oprávnění, která může Google Cloud SQL nabídnout (téměř vše kromě SUPER a FILE). K ověření oprávnění můžeme použít následující příkaz:
mysql> SHOW GRANTS FOR [email protected]\G
*************************** 1. row ***************************
Grants for [email protected]: GRANT SELECT, INSERT, UPDATE, DELETE, CREATE,
DROP, RELOAD, SHUTDOWN, PROCESS, REFERENCES, INDEX, ALTER, SHOW DATABASES,
CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT,
CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER,
CREATE TABLESPACE ON *.* TO 'slave'@'202.187.194.255' WITH GRANT OPTION
Zdá se, že náš uživatel typu slave má požadované oprávnění ke spuštění jako slave (REPLICATION SLAVE).
Provedení zálohy mysqldump
Než vytvoříme externí zálohu mysqldump, musíme nakonfigurovat SSL certifikáty klienta kvůli riziku připojení instance přes veřejnou síť. Chcete-li to provést, přejděte na Připojení -> Konfigurace klientských certifikátů SSL -> Vytvořit klientský certifikát:
Stáhněte si výše uvedené soubory (server-ca.pem, client-cert. pem a client-key.pem) a uložte je na podřízeném serveru. Tyto certifikáty použijeme k bezpečnému připojení k hlavnímu zařízení z podřízeného serveru. Pro zjednodušení procesu budou všechny výše uvedené certifikáty a klíčový soubor umístěny do adresáře s názvem „gcloud-certs“:
$ mkdir -p /root/gcloud-certs # put the certs/key here
Ujistěte se, že jsou správná oprávnění, zejména soubor soukromého klíče client-key.pem:
$ chmod 600 /root/gcloud-certs/client-key.pem
Nyní jsme připraveni bezpečně provést zálohu mysqldump z naší instance Google Cloud SQL MySQL 5.7:
$ mysqldump -uroot -p \
-h 35.198.197.171 \
--ssl-ca=/root/gcloud-certs/server-ca.pem \
--ssl-cert=/root/gcloud-certs/client-cert.pem \
--ssl-key=/root/gcloud-certs/client-key.pem \
--single-transaction \
--all-databases \
--triggers \
--routines > fullbackup.sql
Mělo by se zobrazit následující varování:
"Upozornění:Částečný výpis ze serveru, který má GTID, bude ve výchozím nastavení obsahovat GTID všech transakcí, dokonce i těch, které změnily potlačené části databáze. Pokud nechcete obnovte GTID, předejte --set-gtid-purged=OFF. Chcete-li vytvořit úplný výpis, předejte --all-databases --triggers --routines --events.“
Výše uvedené varování se objevuje, protože jsme přeskočili definování příznaku --events, který vyžaduje oprávnění SUPER. Uživatel root vytvořený pro každou instanci Google Cloud SQL nemá oprávnění FILE a SUPER. To je jedna z nevýhod použití této metody, že události MySQL nelze importovat z Google Cloud SQL.
Konfigurace podřízeného serveru
Na podřízeném serveru nainstalujte MySQL 5.7 pro Debian 10:
$ echo 'deb http://repo.mysql.com/apt/debian/ buster mysql-5.7' > /etc/apt/sources.list.d/mysql.list
$ apt-key adv --keyserver pgp.mit.edu --recv-keys 5072E1F5
$ apt update
$ apt -y install mysql-community-server
Potom přidejte následující řádky do sekce [mysqld] uvnitř /etc/mysql/my.cnf (nebo jakéhokoli jiného relevantního konfiguračního souboru MySQL):
server-id = 1111 # different value than the master
log_bin = binlog
log_slave_updates = 1
expire_logs_days = 7
binlog_format = ROW
gtid_mode = ON
enforce_gtid_consistency = 1
sync_binlog = 1
report_host = 202.187.194.255 # IP address of this slave
Chcete-li použít výše uvedené změny, restartujte server MySQL:
$ systemctl restart mysql
Obnovte zálohu mysqldump na tomto serveru:
$ mysql -uroot -p < fullbackup.sql
V tuto chvíli by mělo být kořenové heslo MySQL podřízeného serveru totožné s heslem v Google Cloud SQL. Od této chvíle byste se měli přihlašovat jiným heslem root.
Upozorňujeme, že uživatel root ve službě Google Cloud nemá úplná oprávnění. Musíme provést nějaké úpravy na straně slave tím, že umožníme uživateli root mít všechna oprávnění v MySQL, protože máme nad tímto serverem větší kontrolu. K tomu potřebujeme aktualizovat uživatelskou tabulku MySQL. Přihlaste se k podřízenému serveru MySQL jako uživatel root MySQL a spusťte následující příkaz:
mysql> UPDATE mysql.user SET Super_priv = 'Y', File_priv = 'Y' WHERE User = 'root';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
Vyprázdnit tabulku oprávnění:
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
Opusťte aktuální terminál a znovu se přihlaste. Spuštěním následujícího příkazu ověřte, že uživatel root má nyní nejvyšší úroveň oprávnění:
mysql> SHOW GRANTS FOR [email protected];
+---------------------------------------------------------------------+
| Grants for [email protected] |
+---------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION |
+---------------------------------------------------------------------+
Nastavení replikačního odkazu
Z bezpečnostních důvodů se musí podřízený uživatel replikace připojit k hlavnímu hostiteli (instanci Google Cloud) prostřednictvím kanálu šifrovaného SSL. Proto musíme připravit klíč a certifikát SSL se správným oprávněním a přístupné uživateli mysql. Zkopírujte adresář gcloud do /etc/mysql a přiřaďte správná oprávnění a vlastnictví:
$ mkdir -p /etc/mysql
$ cp /root/gcloud-certs /etc/mysql
$ chown -Rf mysql:mysql /etc/mysql/gcloud-certs
Na podřízeném serveru nakonfigurujte odkaz na replikaci, jak je uvedeno níže:
mysql> CHANGE MASTER TO MASTER_HOST = '35.198.197.171',
MASTER_USER = 'slave',
MASTER_PASSWORD = 'slavepassword',
MASTER_AUTO_POSITION = 1,
MASTER_SSL = 1,
MASTER_SSL_CERT = '/etc/mysql/gcloud-certs/client-cert.pem',
MASTER_SSL_CA = '/etc/mysql/gcloud-certs/server-ca.pem',
MASTER_SSL_KEY = '/etc/mysql/gcloud-certs/client-key.pem';
Potom spusťte podřízenou replikaci:
mysql> START SLAVE;
Ověřte výstup takto:
mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 35.198.197.171
Master_User: slave
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000003
Read_Master_Log_Pos: 1120160
Relay_Log_File: puppet-master-relay-bin.000002
Relay_Log_Pos: 15900
Relay_Master_Log_File: mysql-bin.000003
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 1120160
Relay_Log_Space: 16115
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: Yes
Master_SSL_CA_File: /etc/mysql/gcloud-certs/server-ca.pem
Master_SSL_CA_Path:
Master_SSL_Cert: /etc/mysql/gcloud-certs/client-cert.pem
Master_SSL_Cipher:
Master_SSL_Key: /etc/mysql/gcloud-certs/client-key.pem
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: 2272712871
Master_UUID: 8539637e-14d1-11eb-ae3c-42010a94001a
Master_Info_File: /var/lib/mysql/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set: 8539637e-14d1-11eb-ae3c-42010a94001a:5611-5664
Executed_Gtid_Set: 8539637e-14d1-11eb-ae3c-42010a94001a:1-5664,
b1dabe58-14e6-11eb-840f-0800278dc04d:1-2
Auto_Position: 1
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
Ujistěte se, že hodnoty Slave_IO_Running a Slave_SQL_Running jsou 'Yes' a Seconds_Behind_Master by měly být 0, což znamená, že slave dohonil master. Všimněte si, že Executed_Gtid_Set má dvě GTID:
- 8539637e-14d1-11eb-ae3c-42010a94001a:1-5664
- b1dabe58-14e6-11eb-840f-0800278dc04d:1-2
První GTID představuje změny pocházející z aktuálního hlavního serveru (instance Google Cloud SQL), zatímco druhé GTID představuje změny, které jsme provedli, když jsme upravili oprávnění pro kořenového uživatele MySQL na podřízeném hostiteli. Věnujte pozornost prvnímu GTID, abyste viděli, zda se databáze replikuje správně (celočíselná část by se měla při replikaci zvyšovat).
Ověřte, zda je náš podřízený hostitel součástí replikace z pohledu hlavního. Přihlaste se k instanci SQL Cloud jako root:
$ mysql -uroot -p \
-h 35.198.197.171 \
--ssl-ca=/root/gcloud-certs/server-ca.pem \
--ssl-cert=/root/gcloud-certs/client-cert.pem \
--ssl-key=/root/gcloud-certs/client-key.pem
A spusťte následující příkaz:
mysql> SHOW SLAVE HOSTS;
*************************** 1. row ***************************
Server_id: 1111
Host: 202.187.194.255
Port: 3306
Master_id: 2272712871
Slave_UUID: b1dabe58-14e6-11eb-840f-0800278dc04d
V tomto okamžiku můžete naplánovat svůj další přesun, abyste přesměrovali zátěž databáze z aplikací na tento podřízený server jako nový hlavní server a vyřadili z provozu starý hlavní server ve službě Google Cloud.
Poslední myšlenky
Online migraci z Google Cloud SQL pro MySQL na místní server můžete provést bez větších potíží. To vám dává možnost přesunout svou databázi mimo cloudové dodavatele pro ochranu soukromí a kontrolu, když nadejde správný čas.