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

Sebelum memulai
Men-deploy VM
Ikuti Membuat dan memulai instance VM untuk membuat tiga VM di tiga zona yang tersedia.
Konfigurasi lingkungan lokal Anda untuk membuat koneksi SSH ke VM dengan pasangan kunci: 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, ingatlah untuk menyiapkan PNP (Project Network Policy) dengan tepat.
Ikuti bagian Ringkasan PNP bergantung pada kasus penggunaannya.
Persiapan software 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')
"
Mentransfer dan menginstal
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 ada, periksa log untuk melihat paket deb yang mungkin tidak ada dan sertakan dalam download.
Saat diminta untuk menetapkan sandi root, biarkan kosong. 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
Di VM 1 SAJA, 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()
Mem-bootstrap Router MySQL
Di ketiga VM, bootstrap router untuk mendeteksi cluster baru:
sudo mysqlrouter --bootstrap root@VM1_IP --user=mysqlrouter
sudo systemctl restart mysqlrouter
sudo systemctl enable mysqlrouter
Memverifikasi load balancing dan koneksi
Jalankan perintah ini dari node mana pun untuk memastikan router mendistribusikan traffic dengan benar.
Memverifikasi Perutean Tulis (Primer Aktif): Kueri port 6446 (RW Klasik). Perintah ini harus menampilkan nama host Primer saat ini secara ketat.
mysql -u root -pyour_new_secure_password -h 127.0.0.1 -P 6446 -e "SELECT @@hostname;"Memverifikasi Load Balancing Baca (Round-Robin): Kueri port 6447 (RO Klasik) beberapa kali. Perintah ini harus melakukan siklus melalui 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;"; doneMemeriksa Topologi Koneksi: Gunakan MySQL Shell untuk mengonfirmasi bahwa semua anggota
ONLINEdan seimbang dengan benar.mysqlsh --uri root@localhost --cluster # inside the shell > cluster.status()
Penyiapan Load Balancer Global
Sediakan IP Virtual (VIP) tunggal dan 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 sebagai 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 primer
Identifikasi Primer saat ini (misalnya, Node 1) dan hentikan layanan MySQL:
sudo systemctl stop mysql
Memverifikasi pergeseran pemilihan dan perutean
Tunggu 10-20 detik agar protokol konsensus memilih pemimpin baru.
Memeriksa Status Cluster: Dari VM 2 atau 3, verifikasi bahwa Primer 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 ditandaiUNREACHABLEatauMISSING.Memverifikasi Perutean Tulis: Uji kembali port RW (6446). Perintah ini sekarang akan menampilkan nama host Primer baru.
mysql -u root -p -h 127.0.0.1 -P 6446 -e "SELECT @@hostname;"Menguji Konektivitas VIP Global: Dari server aplikasi, kueri VIP Global.
mysql -u root -p -h ${LB_IP} -P 3306 -e "SELECT @@hostname;"
Memulihkan dan memverifikasi penggabungan kembali
Mulai layanan MySQL di node yang gagal dan verifikasi bahwa 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.