Google Cloud SQL voor MySQL is een volledig beheerde databaseservice waarmee u uw relationele MySQL-databases op Google Cloud Platform kunt instellen, onderhouden, beheren en beheren. Er zijn echter verschillen tussen Cloud SQL en standaard MySQL-functionaliteit, zoals beperkte controle, beperkte bronnen, gegevenslocatie, budget en beveiliging, die van invloed kunnen zijn op uw uiteindelijke beslissing om de Google Cloud SQL-instanties te verlaten en de databaseservice te hosten in de on- gebouweninfrastructuur in plaats daarvan.
In deze blogpost wordt uitgelegd hoe u een online migratie uitvoert van Google Cloud SQL naar een on-premises server. Onze doeldatabase op de on-premises server is een Debian-server, maar de stappen en procedures zijn van toepassing op andere versies van Linux en zolang de pakketten correct zijn geïnstalleerd.
Onze Google Cloud MySQL-instantie draait op MySQL 5.7 en wat we nodig hebben is:
- Een replicatie-slave-gebruiker gemaakt op de master.
- De slave moet worden geïnstalleerd met dezelfde hoofdversie als de master.
- SSL moet om veiligheidsredenen zijn ingeschakeld voor geografische replicatie.
Aangezien Google Cloud standaard GTID-replicatie voor MySQL heeft ingeschakeld, gaan we een migratie uitvoeren op basis van dit replicatieschema. Daarom zouden de instructies die in dit bericht worden beschreven ook moeten werken in MySQL 8.0-instanties.
Een replicatieslave-gebruiker maken
Allereerst moeten we een replicatieslave-gebruiker maken op onze Google Cloud SQL-instantie. Log in op het Google Cloud Platform -> Databases -> SQL -> kies de MySQL-instantie -> Gebruikers -> Gebruikersaccount toevoegen en voer de vereiste gegevens in:
De 202.187.194.255 is het openbare IP-adres van de slaaf in onze on- gebouwen die van deze instantie gaan repliceren. Zoals u kunt zien, is er geen configuratie van privileges, aangezien gebruikers die vanuit deze interface zijn gemaakt, de hoogste privileges hebben die Google Cloud SQL kan bieden (bijna alles behalve SUPER en FILE). Om de privileges te verifiëren, kunnen we de volgende opdracht gebruiken:
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
Het lijkt erop dat onze slave-gebruiker de vereiste toestemming heeft om als slave te werken (REPLICATION SLAVE).
Een mysqldump-back-up maken
Voordat we een externe mysqldump-back-up maken, moeten we de SSL-certificaten van de client configureren vanwege het risico om de instantie via een openbaar netwerk te verbinden. Ga hiervoor naar Verbindingen -> SSL-clientcertificaten configureren -> Een clientcertificaat maken:
Download de bovenstaande bestanden (server-ca.pem, client-cert. pem en client-key.pem) en sla ze op in de slave-server. We gaan deze certificaten gebruiken om vanaf de slave-server veilig verbinding te maken met de master. Om het proces te vereenvoudigen, worden alle bovenstaande certificaten en het sleutelbestand in een map met de naam "gcloud-certs" geplaatst:
$ mkdir -p /root/gcloud-certs # put the certs/key here
Zorg ervoor dat de rechten correct zijn, vooral het privésleutelbestand, client-key.pem:
$ chmod 600 /root/gcloud-certs/client-key.pem
Nu zijn we klaar om veilig een mysqldump-back-up te maken van onze Google Cloud SQL MySQL 5.7-instantie:
$ 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
U zou de volgende waarschuwing moeten krijgen:
"Waarschuwing:een gedeeltelijke dump van een server die GTID's heeft, bevat standaard de GTID's van alle transacties, zelfs de transacties die onderdrukte delen van de database hebben gewijzigd. Als u dat niet wilt herstel GTID's, geef --set-gtid-purged=OFF door. Om een volledige dump te maken, geef --all-databases --triggers --routines --events door."
De bovenstaande waarschuwing treedt op omdat we het definiëren van de vlag --events hebben overgeslagen, waarvoor het SUPER-privilege vereist is. De rootgebruiker die voor elke Google Cloud SQL-instantie is gemaakt, heeft geen FILE- en SUPER-rechten. Dit is een van de nadelen van het gebruik van deze methode, dat MySQL-gebeurtenissen niet kunnen worden geïmporteerd uit Google Cloud SQL.
De slaveserver configureren
Installeer MySQL 5.7 voor Debian 10 op de slave-server:
$ 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
Voeg vervolgens de volgende regels toe onder de sectie [mysqld] in /etc/mysql/my.cnf (of een ander relevant MySQL-configuratiebestand):
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
Start de MySQL-server opnieuw om de bovenstaande wijzigingen toe te passen:
$ systemctl restart mysql
Herstel de mysqldump-back-up op deze server:
$ mysql -uroot -p < fullbackup.sql
Op dit moment moet het MySQL-rootwachtwoord van de slaveserver identiek zijn aan dat in Google Cloud SQL. Je moet vanaf nu inloggen met een ander root-wachtwoord.
Houd er rekening mee dat de rootgebruiker in Google Cloud geen volledige rechten heeft. We moeten enkele wijzigingen aanbrengen aan de slave-kant, door de rootgebruiker alle rechten binnen MySQL te geven, aangezien we meer controle hebben over deze server. Om dit te doen, moeten we de gebruikerstabel van MySQL bijwerken. Log in op de MySQL-server van de slave als MySQL-rootgebruiker en voer de volgende instructie uit:
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
Flush de privilegetabel:
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
Verlaat de huidige terminal en log opnieuw in. Voer de volgende opdracht uit om te controleren of de rootgebruiker nu het hoogste niveau van rechten heeft:
mysql> SHOW GRANTS FOR [email protected];
+---------------------------------------------------------------------+
| Grants for [email protected] |
+---------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION |
+---------------------------------------------------------------------+
De replicatielink instellen
Om veiligheidsredenen moet de replicatieslave-gebruiker verbinding maken met de masterhost (Google Cloud-instantie) via een SSL-gecodeerd kanaal. Daarom moeten we de SSL-sleutel en het certificaat voorbereiden met de juiste toestemming en toegankelijk voor de mysql-gebruiker. Kopieer de gcloud-map naar /etc/mysql en wijs de juiste toestemming en eigendom toe:
$ mkdir -p /etc/mysql
$ cp /root/gcloud-certs /etc/mysql
$ chown -Rf mysql:mysql /etc/mysql/gcloud-certs
Configureer op de slave-server de replicatielink zoals hieronder:
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';
Start vervolgens de replicatieslave:
mysql> START SLAVE;
Controleer de uitvoer als volgt:
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:
Zorg ervoor dat de Slave_IO_Running en Slave_SQL_Running waarden 'Ja' zijn, en dat Seconds_Behind_Master 0 moet zijn, wat betekent dat de slave de master heeft ingehaald. Merk op dat de Executed_Gtid_Set twee GTID's heeft:
- 8539637e-14d1-11eb-ae3c-42010a94001a:1-5664
- b1dabe58-14e6-11eb-840f-0800278dc04d:1-2
De eerste GTID vertegenwoordigt de wijzigingen die afkomstig zijn van de huidige master (Google Cloud SQL-instantie), terwijl de tweede GTID de wijzigingen vertegenwoordigt die we hebben aangebracht toen we de privileges voor de MySQL-rootgebruiker op de slave-host wijzigden. Let op de eerste GTID om te zien of de database correct wordt gerepliceerd (het integer-gedeelte zou moeten toenemen tijdens het repliceren).
Controleer of onze slave-host deel uitmaakt van de replicatie vanuit het oogpunt van de master. Log in op de SQL Cloud-instantie als 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
En voer het volgende statement uit:
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
Op dit punt kunt u uw volgende stap plannen om de database-workload van de applicaties om te leiden naar deze slave-server als de nieuwe master en de oude master buiten gebruik te stellen in Google Cloud.
Laatste gedachten
U kunt zonder veel gedoe een online migratie uitvoeren van Google Cloud SQL voor MySQL naar een on-premises server. Dit geeft u de mogelijkheid om uw database buiten de cloudleveranciers te plaatsen voor privacy en controle wanneer het juiste moment is gekomen.