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 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:

Arsitektur tiga VM yang menjalankan tumpukan layanan yang ditempatkan bersama.

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.

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

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

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