Implementasi referensi database MySQL di GDC dengan air gap

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:

Arsitektur tiga VM yang menjalankan stack layanan yang ditempatkan bersama.

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.

  1. 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;"
    
  2. 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;"; done
    
  3. Periksa Topologi Koneksi: Gunakan MySQL Shell untuk mengonfirmasi bahwa semua anggota ONLINE dan 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.

  1. 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 PRIMARY dan node yang gagal ditandai sebagai UNREACHABLE atau MISSING.

  2. 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;"
    
  3. 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.