Panduan ini memberikan tutorial langkah demi langkah yang komprehensif untuk men-deploy Cluster InnoDB MySQL 8.4 dengan tingkat ketersediaan tinggi di tiga zona ketersediaan dalam lingkungan Google Distributed Cloud (GDC) dengan air gap. Arsitektur ini memanfaatkan Group Replication untuk konsensus berbasis Paxos, MySQL Router untuk perutean koneksi cerdas, dan MySQL Shell untuk orkestrasi cluster.
Dengan hanya menggunakan Virtual Machine (VM), implementasi ini mengabaikan batasan GDC dengan air gap terkait cluster stretch Kubernetes lintas zona, sehingga memastikan ketahanan multi-zona penuh tanpa risiko kehilangan data.
Berikut adalah diagram arsitekturnya:

Sebelum memulai
Men-deploy VM
Ikuti Membuat dan memulai instance VM untuk membuat tiga VM di tiga zona yang tersedia.
Konfigurasikan lingkungan lokal Anda untuk membuat koneksi SSH ke VM dengan key pair: Menghubungkan ke VM
Hal ini diperlukan untuk menggunakan salinan aman (SCP) guna mentransfer paket: Mentransfer file
Untuk verifikasi, kami menggunakan OS Ubuntu 22.04, dan jenis mesin n3-standard-2-gdc.
Untuk lingkungan produksi, gunakan jenis mesin dengan lebih banyak resource.
Dapatkan IP VM menggunakan:
VM_NAME=$1
if [[ -z "$VM_NAME" ]]; then
echo "Error: VM_NAME must be provided."
echo "Usage: $0 <VM_NAME>"
exit 1
fi
# 1. Get External IP from 'instances list'
EXT_IP=$(gdcloud compute instances list | awk -v vm="${VM_NAME}" '$1 == vm {print $5}')
if [[ -z "$EXT_IP" ]]; then
echo "Error: Could not find VM '${VM_NAME}' in the instance list."
exit 1
fi
INTERNAL_IP=$(gdcloud compute instances describe "${VM_NAME}" | awk '/^status:/ {in_status=1} in_status && /- [0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/ {print $2; exit}' | cut -d'/' -f1)
if [[ -z "$INTERNAL_IP" ]]; then
INTERNAL_IP="<Not assigned or not found>"
fi
echo "${VM_NAME}"
echo "External IP: ${EXT_IP}"
echo "Internal IP: ${INTERNAL_IP}"
Mengonfigurasi variabel lingkungan
Tetapkan variabel ini di sesi shell workstation lokal Anda:
export PROJECT_ID="your-project-id"
export VM1_NAME="mysql-node-1"
export VM2_NAME="mysql-node-2"
export VM3_NAME="mysql-node-3"
export VM1_IP="10.0.1.245" # Zone 1
export VM2_IP="10.0.1.241" # Zone 2
export VM3_IP="10.0.1.242" # Zone 3
export CLUSTER_NAME="mysql-ha-cluster"
Konfigurasi jaringan
Jika Anda perlu menjangkau DB di luar project atau di luar organisasi, jangan lupa untuk menyiapkan PNP (Project Network Policy) yang sesuai.
Ikuti bagian Ringkasan PNP bergantung pada kasus penggunaan.
Persiapan software dengan air gap
Mendownload paket menggunakan Docker
Jalankan perintah berikut dari workstation yang terhubung untuk mengambil komponen MySQL 8.4 dan Shell:
mkdir -p ./mysql-packages
docker run --rm -v "$(pwd)/mysql-packages:/packages" ubuntu:22.04 bash -c "
apt-get update && apt-get install -y curl gnupg apt-rdepends wget lsb-release
curl -LsS https://dev.mysql.com/get/mysql-apt-config_0.8.39-1_all.deb -o config.deb
# Configure for MySQL 8.4 LTS
DEBIAN_FRONTEND=noninteractive dpkg -i config.deb
apt-get update
cd /packages
PACKAGES='mysql-server mysql-shell mysql-router'
apt-get download \$(apt-cache depends --recurse --no-recommends --no-suggests --no-conflicts --no-breaks --no-replaces --no-enhances --no-pre-depends \${PACKAGES} | grep '^\w')
"
Transfer dan instal
Upload file .deb ke /tmp/packages/ di ketiga VM dan instal:
# From workstation: scp ./mysql-packages/*.deb ${VM_IP}:/tmp/packages/
# On each VM:
sudo dpkg -i /tmp/packages/*.deb
Pastikan dpkg tidak menampilkan error. Jika ya, periksa log untuk melihat paket deb yang mungkin tidak ada dan sertakan dalam download.
Saat diminta untuk menetapkan sandi root, kosongkan. Kita akan menetapkan sandi nanti.
Konfigurasi node MySQL
Mengonfigurasi MySQL untuk penggunaan cluster
Edit /etc/mysql/mysql.conf.d/mysqld.cnf di semua node untuk mengaktifkan GTID dan logging biner:
[mysqld]
bind-address = 0.0.0.0
server-id = 1 # Use 2 and 3 for other VMs
gtid-mode = ON
enforce-gtid-consistency = ON
binlog-format = ROW
log-bin = mysql-bin
report_host = 10.0.1.245 # Use the VM's specific IP
Mulai ulang layanan:
sudo systemctl restart mysql
Kemudian, hubungkan ke DB:
sudo mysql
dan tetapkan sandi root:
CREATE USER 'root'@'%' IDENTIFIED WITH 'caching_sha2_password' BY 'your_new_secure_password';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
Inisialisasi dan verifikasi cluster InnoDB
Membuat cluster menggunakan MySQL Shell
HANYA di VM 1, gunakan MySQL Shell untuk melakukan inisialisasi cluster:
mysqlsh --uri root@localhost
# Inside MySQL Shell:
\js
dba.configureInstance('root@VM1_IP')
var cluster = dba.createCluster('mysql-ha-cluster')
cluster.addInstance('root@VM2_IP')
cluster.addInstance('root@VM3_IP')
cluster.status()
Melakukan bootstrap Router MySQL
Di ketiga VM, lakukan bootstrap router untuk mendeteksi cluster baru:
sudo mysqlrouter --bootstrap root@VM1_IP --user=mysqlrouter
sudo systemctl restart mysqlrouter
sudo systemctl enable mysqlrouter
Memverifikasi penyeimbangan dan koneksi
Jalankan perintah ini dari node mana pun untuk memastikan bahwa router mendistribusikan traffic dengan benar.
Memverifikasi Perutean Tulis (Primer Aktif): Buat kueri port 6446 (RW Klasik). Skrip ini harus benar-benar menampilkan nama host dari Primary saat ini.
mysql -u root -pyour_new_secure_password -h 127.0.0.1 -P 6446 -e "SELECT @@hostname;"Verifikasi Penyeimbangan Baca (Round-Robin): Buat kueri port 6447 (RO Klasik) beberapa kali. Perintah ini akan menampilkan nama host semua node yang tersedia di cluster.
for i in {1..4}; do mysql -u root -pyour_new_secure_password -h 127.0.0.1 -P 6447 -e "SELECT @@hostname;"; donePeriksa Topologi Koneksi: Gunakan MySQL Shell untuk mengonfirmasi bahwa semua anggota
ONLINEdan diseimbangkan dengan benar.mysqlsh --uri root@localhost --cluster # inside the shell > cluster.status()
Penyiapan Load Balancer Global
Menyediakan IP Virtual (VIP) tunggal yang stabil untuk aplikasi Anda menggunakan Load Balancer L4 Global GDC. Ikuti Mengonfigurasi load balancer global internal untuk menyiapkan load balancer L4 global internal dan menyiapkan VM Anda untuk menjadi targetnya: Menyiapkan VM sebagai target load balancer.
Verifikasi failover otomatis
Pengujian ini mengonfirmasi bahwa cluster memilih pemimpin baru dan router mengalihkan traffic tanpa intervensi manual.
Menyimulasikan kegagalan utama
Identifikasi Primary saat ini (misalnya, Node 1) dan hentikan layanan MySQL:
sudo systemctl stop mysql
Memverifikasi pemilihan dan pergeseran pemilihan rute
Tunggu 10-20 detik hingga protokol konsensus memilih pemimpin baru.
Periksa Status Cluster: Dari VM 2 atau 3, verifikasi bahwa Primary baru telah dipilih.
mysqlsh --uri root@localhost --cluster # inside the shell > cluster.status()Pastikan salah satu node yang tersisa ditandai sebagai
PRIMARYdan node yang gagal ditandai sebagaiUNREACHABLEatauMISSING.Memverifikasi pemilihan rute tulis: Uji port RW (6446) lagi. Sekarang, nama host Primer baru akan ditampilkan.
mysql -u root -p -h 127.0.0.1 -P 6446 -e "SELECT @@hostname;"Menguji Konektivitas VIP Global: Dari server aplikasi, buat kueri VIP Global.
mysql -u root -p -h ${LB_IP} -P 3306 -e "SELECT @@hostname;"
Memulihkan dan memverifikasi penggabungan kembali
Mulai layanan MySQL pada node yang gagal dan pastikan node tersebut bergabung kembali sebagai replika sekunder.
sudo systemctl start mysql
mysqlsh --uri root@localhost --cluster -e "cluster.status()"
Pastikan ketiga node menampilkan status ONLINE.