Google Cloud SQL untuk MySQL adalah layanan database terkelola sepenuhnya yang membantu Anda menyiapkan, memelihara, mengelola, dan mengelola database relasional MySQL Anda di Google Cloud Platform. Namun, ada perbedaan antara Cloud SQL dan fungsionalitas MySQL standar seperti kontrol terbatas, sumber daya terbatas, lokalitas data, anggaran, dan keamanan, yang dapat memengaruhi keputusan akhir Anda untuk keluar dari instance Google Cloud SQL dan menghosting layanan database di on- sebagai gantinya.
Postingan blog ini akan memandu Anda tentang cara melakukan migrasi online dari Google Cloud SQL ke server lokal. Basis data target kami di server lokal adalah server Debian, tetapi langkah-langkah dan prosedur akan berlaku pada versi lain dari Linux serta selama paket diinstal dengan benar.
Instance Google Cloud MySQL kami berjalan di MySQL 5.7 dan yang kami butuhkan adalah:
- Pengguna slave replikasi dibuat di master.
- Budak harus diinstal dengan versi utama yang sama dengan master.
- SSL harus diaktifkan untuk replikasi geografis demi alasan keamanan.
Karena Google Cloud secara default mengaktifkan replikasi GTID untuk MySQL, kami akan melakukan migrasi berdasarkan skema replikasi ini. Oleh karena itu, instruksi yang dijelaskan dalam posting ini juga harus berfungsi di instance MySQL 8.0.
Membuat Pengguna Budak Replikasi
Pertama-tama, kita harus membuat pengguna slave replikasi di instance Google Cloud SQL kita. Masuk ke Google Cloud Platform -> Basis Data -> SQL -> pilih instance MySQL -> Pengguna -> Tambahkan Akun Pengguna dan masukkan detail yang diperlukan:
202.187.194.255 adalah alamat IP publik budak yang terletak di- tempat yang akan mereplikasi dari contoh ini. Seperti yang Anda lihat, tidak ada konfigurasi hak istimewa karena pengguna yang dibuat dari antarmuka ini akan memiliki hak istimewa tertinggi yang dapat ditawarkan Google Cloud SQL (hampir semuanya kecuali SUPER dan FILE). Untuk memverifikasi hak istimewa, kita dapat menggunakan perintah berikut:
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
Sepertinya pengguna budak kami memiliki izin yang diperlukan untuk berjalan sebagai budak (REPLICATION SLAVE).
Mengambil Cadangan mysqldump
Sebelum kita membuat cadangan mysqldump eksternal, kita perlu mengonfigurasi sertifikat SSL klien karena risiko menghubungkan instans melalui jaringan publik. Untuk melakukannya, buka Koneksi -> Konfigurasikan sertifikat klien SSL -> Buat sertifikat klien:
Unduh file di atas (server-ca.pem, client-cert. pem dan client-key.pem) dan simpan di dalam server budak. Kami akan menggunakan sertifikat ini untuk terhubung ke master dengan aman dari layanan budak. Untuk menyederhanakan proses, semua sertifikat dan file kunci di atas akan diletakkan di bawah direktori bernama "gcloud-certs":
$ mkdir -p /root/gcloud-certs # put the certs/key here
Pastikan izin sudah benar, terutama file kunci pribadi, client-key.pem:
$ chmod 600 /root/gcloud-certs/client-key.pem
Sekarang kami siap untuk mengambil cadangan mysqldump dari instance Google Cloud SQL MySQL 5.7 kami dengan aman:
$ 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
Anda akan mendapatkan peringatan berikut:
"Peringatan:Dump sebagian dari server yang memiliki GTID akan secara default menyertakan GTID dari semua transaksi, bahkan yang mengubah bagian database yang disembunyikan. Jika Anda tidak ingin melakukannya pulihkan GTID, teruskan --set-gtid-purged=OFF. Untuk membuat dump lengkap, teruskan --all-databases --triggers --routines --events."
Peringatan di atas terjadi karena kita melewatkan pendefinisian flag --events yang membutuhkan hak istimewa SUPER. Pengguna root yang dibuat untuk setiap instance Google Cloud SQL tidak dilengkapi dengan hak istimewa FILE dan SUPER. Ini adalah salah satu kelemahan menggunakan metode ini, MySQL Events tidak dapat diimpor dari Google Cloud SQL.
Mengonfigurasi Server Budak
Di server budak, instal MySQL 5.7 untuk 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
Kemudian, tambahkan baris berikut di bawah bagian [mysqld] di dalam /etc/mysql/my.cnf (atau file konfigurasi MySQL lain yang relevan):
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
Mulai ulang server MySQL untuk menerapkan perubahan di atas:
$ systemctl restart mysql
Pulihkan cadangan mysqldump di server ini:
$ mysql -uroot -p < fullbackup.sql
Pada titik ini, kata sandi root MySQL dari server slave harus sama dengan yang ada di Google Cloud SQL. Anda harus masuk dengan kata sandi root yang berbeda mulai sekarang.
Perhatikan bahwa pengguna root di Google Cloud tidak memiliki hak penuh. Kita perlu membuat beberapa modifikasi pada sisi slave, dengan mengizinkan pengguna root memiliki semua hak istimewa di dalam MySQL, karena kita memiliki kendali lebih besar atas server ini. Untuk melakukan ini, kita perlu memperbarui tabel pengguna MySQL. Login ke server MySQL slave sebagai pengguna root MySQL dan jalankan pernyataan berikut:
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
Hapus tabel hak istimewa:
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
Keluar dari terminal saat ini dan login kembali. Jalankan perintah berikut untuk memverifikasi bahwa pengguna root sekarang memiliki tingkat hak istimewa tertinggi:
mysql> SHOW GRANTS FOR [email protected];
+---------------------------------------------------------------------+
| Grants for [email protected] |
+---------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION |
+---------------------------------------------------------------------+
Menyiapkan Tautan Replikasi
Untuk alasan keamanan, pengguna slave replikasi harus terhubung ke host master (instance Google Cloud) melalui saluran terenkripsi SSL. Oleh karena itu, kita harus menyiapkan kunci dan sertifikat SSL dengan izin yang benar dan dapat diakses oleh pengguna mysql. Salin direktori gcloud ke /etc/mysql dan tetapkan izin dan kepemilikan yang benar:
$ mkdir -p /etc/mysql
$ cp /root/gcloud-certs /etc/mysql
$ chown -Rf mysql:mysql /etc/mysql/gcloud-certs
Pada server slave, konfigurasikan link replikasi seperti di bawah ini:
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';
Kemudian, mulai budak replikasi:
mysql> START SLAVE;
Verifikasi output sebagai berikut:
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:
Pastikan nilai Slave_IO_Running dan Slave_SQL_Running adalah 'Ya', serta Seconds_Behind_Master harus 0, yang berarti budak telah menyusul master. Perhatikan bahwa Executed_Gtid_Set memiliki dua GTID:
- 8539637e-14d1-11eb-ae3c-42010a94001a:1-5664
- b1dabe58-14e6-11eb-840f-8000278dc04d:1-2
GTID pertama mewakili perubahan yang berasal dari master saat ini (instance Google Cloud SQL), sedangkan GTID kedua mewakili perubahan yang telah kami buat saat kami memodifikasi hak istimewa untuk pengguna root MySQL pada host slave. Perhatikan GTID pertama untuk melihat apakah database direplikasi dengan benar (bagian bilangan bulat harus bertambah saat mereplikasi).
Verifikasi apakah host budak kami adalah bagian dari replikasi dari sudut pandang master. Masuk ke instance SQL Cloud sebagai 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
Dan jalankan pernyataan berikut:
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
Pada titik ini, Anda dapat merencanakan langkah selanjutnya untuk mengalihkan beban kerja database dari aplikasi ke server slave ini sebagai master baru dan menonaktifkan master lama di Google Cloud.
Pemikiran Terakhir
Anda dapat melakukan migrasi online dari Google Cloud SQL untuk MySQL ke server lokal tanpa banyak kesulitan. Ini memberi Anda kemungkinan untuk memindahkan database Anda ke luar vendor cloud untuk privasi dan kontrol ketika waktu yang tepat telah tiba.