Mengonfigurasi instance cluster failover SQL Server di Linux dengan disk multi-writer

Untuk mencapai ketersediaan tinggi SQL Server di dua zona berbeda di Compute Engine, Anda dapat men-deploy Instance Cluster Failover (FCI) SQL Server di Linux yang menggunakan disk multi-writer. Tidak seperti arsitektur shared-nothing tradisional, konfigurasi ini memungkinkan Anda melampirkan node secara bersamaan di zona yang berbeda ke disk yang sama. Panduan ini menjelaskan cara men-deploy FCI SQL Server dengan ketersediaan tinggi di Linux di Compute Engine menggunakan replikasi sinkron latensi rendah Google Cloud Hyperdisk.

Desain ini memastikan bahwa SQL Server tetap tersedia meskipun terjadi pemadaman layanan di zona tertentu. Menggabungkan Pacemaker untuk orkestrasi cluster dengan ketahanan lintas zona Compute Engine memberikan solusi yang andal dan berperforma tinggi untuk workload database penting yang memerlukan kesederhanaan penyimpanan bersama.

Manfaat penerapan ketersediaan tinggi dengan disk multi-writer

Menggunakan FCI SQL Server dengan disk multi-writer, bukan Grup Ketersediaan (AG) Always On di Linux, akan menghilangkan kompleksitas pengelolaan beberapa salinan data dan overhead sinkronisasi yang ditimbulkan oleh konfigurasi AG.

Arsitektur volume bersama juga lebih efisien dalam penyimpanan jika dibandingkan dengan arsitektur AG yang menggunakan replika data lengkap di setiap node. Volume bersama juga dapat mengurangi biaya disk dalam skenario pencerminan.

Sorotan Utama Arsitektur ini

  • Redundansi Zonal: Perlindungan data jika terjadi kegagalan node atau pemadaman layanan zona yang jarang terjadi.
  • Pengelolaan yang disederhanakan: Mengurangi kompleksitas pengelolaan beberapa salinan data dibandingkan dengan Grup Ketersediaan Always On.
  • Efisiensi penyimpanan: menggunakan satu volume bersama untuk data dan log, yang dioptimalkan menggunakan kemampuan multi-penulis.
  • Orkestrasi Native Linux: Menggunakan ekstensi ketersediaan tinggi (HAE) standar industri untuk failover yang lancar.

Di lingkungan lokal, Anda dapat mengizinkan WSFC melakukan pengumuman ARP jika terjadi failover untuk memberi tahu peralatan jaringan tentang perubahan alamat IP. Cloud de Confiance, namun, mengabaikan pengumuman ARP. Oleh karena itu, Anda harus mengimplementasikan load balancer internal (lihat Menjalankan Cluster Failover Windows Server)

Arsitektur

Artikel ini mengasumsikan bahwa Anda memiliki pengetahuan dasar tentang SQL Server, Active Directory, dan Compute Engine.

Tujuan

Tutorial ini menunjukkan cara menyelesaikan tugas berikut untuk mencapai tujuan Anda:

  • Buat deployment SQL Server di Linux.
  • Buat, pasang, dan konfigurasi disk multi-penulis.
  • Konfigurasi cluster Pacemaker.
  • Siapkan load balancer.
  • Lakukan pengujian failover.

Biaya

Tutorial ini menggunakan komponen Cloud de Confiance by S3NSyang dapat ditagih, termasuk:

Gunakan kalkulator harga untuk membuat perkiraan biaya berdasarkan penggunaan yang Anda proyeksikan.

Sebelum memulai

  1. Untuk tutorial ini, Anda memerlukan project Cloud de Confiance . Anda dapat membuat project baru atau memilih project yang sudah dibuat:

    1. Di konsol Cloud de Confiance , pada halaman pemilih project, pilih atau buat project Cloud de Confiance .

      Peran yang diperlukan untuk memilih atau membuat project

      • Pilih project: Memilih project tidak memerlukan peran IAM tertentu—Anda dapat memilih project mana pun yang telah diberi peran.
      • Membuat project: Untuk membuat project, Anda memerlukan peran Project Creator (roles/resourcemanager.projectCreator), yang berisi izin resourcemanager.projects.create. Pelajari cara memberikan peran.

      Buka pemilih project

    2. Verifikasi bahwa penagihan diaktifkan untuk project Cloud de Confiance Anda.

    3. Di konsol Cloud de Confiance , aktifkan Cloud Shell.

      Aktifkan Cloud Shell

Menyiapkan project dan jaringan

Untuk menyiapkan project Cloud de Confiance dan VPC Anda untuk deployment FCI SQL Server, lakukan hal berikut:

  1. Di konsol Cloud de Confiance , buka Cloud Shell dengan mengklik tombol Activate Cloud Shell Mengaktifkan Cloud Shell..

    Buka Cloud de Confiance konsol

  2. Tetapkan project ID default Anda:

    gcloud config set project PROJECT_ID
    

    Ganti PROJECT_ID dengan ID project Cloud de Confiance Anda.

  3. Tetapkan region default Anda:

    gcloud config set compute/region REGION
    

    Ganti REGION dengan ID region tempat Anda ingin men-deploy.

Buat node cluster

Deploy dua VM sebagai node cluster dan VM ketiga sebagai klien khusus untuk memvalidasi konektivitas dan performa failover.

  1. Lakukan inisialisasi variabel berikut yang akan digunakan untuk perintah lainnya.

    BOOT_DISK_SIZE=50
    BOOT_IOPS=10000
    BOOT_THROUGHPUT=400
    DATA_IOPS=10000
    DATA_THROUGHPUT=400
    DATA_DISK_SIZE=200
    REGION=$(gcloud config get-value compute/region)
    ZONE1=$REGION-a
    ZONE2=$REGION-b
    SUBNET=SUBNET_NAME
    MACHINE_TYPE=c3-standard-8
    VPC_NAME=VPC_NAME
    
  2. Buat dua disk regional, satu disk data dan satu lagi untuk log. Untuk mengizinkan kedua instance mengakses disk, aktifkan mode multi-penulis untuk kedua disk dengan tanda --access-mode=READ_WRITE_MANY.

    gcloud compute disks create sqlfci-mw-data-disk \
    --size=$DATA_DISK_SIZE \
    --type=hyperdisk-balanced-high-availability \
    --region=$REGION \
    --replica-zones=$ZONE1,$ZONE2 \
    --provisioned-iops=$DATA_IOPS \
    --provisioned-throughput=$DATA_THROUGHPUT \
    --access-mode=READ_WRITE_MANY
    
    gcloud compute disks create sqlfci-mw-log-disk \
    --size=$DATA_DISK_SIZE \
    --type=hyperdisk-balanced-high-availability \
    --region=$REGION \
    --replica-zones=$ZONE1,$ZONE2 \
    --provisioned-iops=$DATA_IOPS \
    --provisioned-throughput=$DATA_THROUGHPUT \
    --access-mode=READ_WRITE_MANY
    
  3. Buat VM Linux dan pasang disk multi-writer yang Anda buat.

    gcloud compute instances create node-1 \
    --boot-disk-size=$BOOT_DISK_SIZE \
    --boot-disk-type=hyperdisk-balanced \
    --boot-disk-provisioned-iops=$BOOT_IOPS \
    --boot-disk-provisioned-throughput=$BOOT_THROUGHPUT \
    --zone $ZONE1 \
    --machine-type $MACHINE_TYPE \
    --subnet $SUBNET \
    --image-family ubuntu-2204-lts \
    --image-project ubuntu-os-cloud \
    --disk="name=sqlfci-mw-data-disk,scope=regional,mode=rw" \
    --disk="name=sqlfci-mw-log-disk,scope=regional,mode=rw" \
    --scopes=compute-rw,trace,service-control,service-management,pubsub,monitoring-write,logging-write,storage-rw \
    --tags=sqlfci
    
    gcloud compute instances create node-2 \
    --boot-disk-size=$BOOT_DISK_SIZE \
    --boot-disk-type=hyperdisk-balanced \
    --boot-disk-provisioned-iops=$BOOT_IOPS \
    --boot-disk-provisioned-throughput=$BOOT_THROUGHPUT \
    --zone $ZONE2 \
    --machine-type $MACHINE_TYPE \
    --subnet $SUBNET \
    --image-family ubuntu-2204-lts \
    --image-project ubuntu-os-cloud \
    --disk="name=sqlfci-mw-data-disk,scope=regional,mode=rw" \
    --disk="name=sqlfci-mw-log-disk,scope=regional,mode=rw" \
    --scopes=compute-rw,trace,service-control,service-management,pubsub,monitoring-write,logging-write,storage-rw \
    --tags=sqlfci
    
  4. Buat VM klien Windows, cl-node, yang akan Anda gunakan untuk menguji koneksi.

    gcloud compute instances create cl-node \
    --boot-disk-size=100 \
    --boot-disk-type=hyperdisk-balanced \
    --machine-type $MACHINE_TYPE \
    --image-family windows-2025 \
    --image-project windows-cloud \
    --zone $ZONE1 \
    --subnet $SUBNET \
    --scopes=compute-rw,trace,service-control,service-management,pubsub,monitoring-write,logging-write,storage-rw
    

Buat load balancer internal

  1. Cadangkan alamat IP untuk cluster dan load balancer.

    gcloud compute addresses create sqlfci-lb-ipaddress \
    --region=$REGION \
    --subnet=$SUBNET \
    --purpose="SHARED_LOADBALANCER_VIP"
    CLUSTER_ADDRESS=$(gcloud compute addresses describe sqlfci-lb-ipaddress \
    --region $REGION \
    --format=value\(address\)) && \
    echo "Cluster IP address: $CLUSTER_ADDRESS"
    
  2. Buat health check untuk cluster.

    gcloud compute health-checks create tcp sqlfci-healthcheck \
    --port="60008" \
    --region=$REGION \
    --check-interval=3 \
    --timeout=2 \
    --unhealthy-threshold=2 \
    --healthy-threshold=5
    
  3. Untuk mengizinkan koneksi ke port health check, buat aturan firewall.

    gcloud compute firewall-rules create "allow-sqlfci-healthcheck-60008" \
    --allow "tcp:60008" \
    --target-tags sqlfci \
    --network $VPC_NAME \
    --source-ranges="35.191.0.0/16,130.211.0.0/22" \
    --priority="1000"
    

    Untuk mengetahui informasi selengkapnya, lihat Aturan firewall untuk health check.

  4. Buat grup instance untuk node cluster.

    gcloud compute instance-groups unmanaged create sqlfci-1-uig \
    --zone=$ZONE1
    gcloud compute instance-groups unmanaged add-instances sqlfci-1-uig \
    --zone=$ZONE1 \
    --instances=node-1
    
    gcloud compute instance-groups unmanaged create sqlfci-2-uig \
    --zone=$ZONE2
    gcloud compute instance-groups unmanaged add-instances sqlfci-2-uig \
    --zone=$ZONE2 \
    --instances=node-2
    
  5. Buat layanan backend load balancer.

    gcloud compute backend-services create sqlfci-backend-services \
    --region=$REGION \
    --load-balancing-scheme="INTERNAL" \
    --protocol="TCP" \
    --health-checks=sqlfci-healthcheck \
    --health-checks-region=$REGION
    
    gcloud compute backend-services add-backend sqlfci-backend-services \
    --region=$REGION \
    --instance-group=sqlfci-1-uig \
    --instance-group-zone=$ZONE1
    
    gcloud compute backend-services add-backend sqlfci-backend-services \
    --region=$REGION \
    --instance-group=sqlfci-2-uig \
    --instance-group-zone=$ZONE2
    
  6. Buat aturan penerusan load balancer.

    gcloud compute forwarding-rules create "sqlfci-forwarding-rule" \
    --load-balancing-scheme=INTERNAL \
    --network=$VPC_NAME \
    --subnet=$SUBNET \
    --region=$REGION \
    --address=$CLUSTER_ADDRESS \
    --ip-protocol="TCP" \
    --ports="ALL" \
    --backend-service=sqlfci-backend-services \
    --backend-service-region=$REGION
    
  7. Buat bucket Cloud Storage untuk mentransfer file dari node cluster utama ke sekunder.

    gcloud storage buckets create gs://BUCKET_NAME \
    --location=$REGION \
    --public-access-prevention
    

    Ganti BUCKET_NAME dengan nama bucket yang akan dibuat.

    Untuk mengetahui informasi selengkapnya, lihat Membuat Bucket

Instal software yang diperlukan

Download, instal, dan konfigurasi mesin SQL Server dan pengelolaan cluster di dua VM Linux, node-1 dan node-2, yang akan berpartisipasi dalam Cluster Failover.

  1. Hubungkan ke setiap VM Anda menggunakan SSH. Untuk mengetahui informasi selengkapnya, lihat Menghubungkan ke VM Linux dan Praktik terbaik untuk mengontrol akses jaringan SSH.

  2. Perbarui hosts file di node-1 dan node-2.

    1. Buka hosts file untuk diedit.

      sudo vi /etc/hosts
      
    2. Temukan alamat IP internal untuk setiap VM Linux dan tambahkan entri host ke bagian bawah file.

      Buka Compute Engine

      NODE1_INTERNAL_IP node-1
      NODE2_INTERNAL_IP node-2
      

      Ganti NODE1_INTERNAL_IP dan NODE2_INTERNAL_IP dengan alamat IP internal setiap VM Linux.

  3. Periksa komunikasi antar-VM. Semua VM yang berpartisipasi dalam grup ketersediaan Always On harus dapat berkomunikasi dengan VM lain: Kembali ke setiap VM Linux, jalankan perintah dari setiap VM, dan pastikan semua VM dapat berkomunikasi satu sama lain.

    ping -c 4 node-1
    ping -c 4 node-2
    

    Output-nya akan tampak mirip dengan berikut ini:

    PING node-1 (10.128.0.37) 56(84) bytes of data.
    64 bytes from node-1 (10.128.0.37): icmp_seq=1 ttl=128 time=1.91 ms
    64 bytes from node-1 (10.128.0.37): icmp_seq=2 ttl=128 time=0.234 ms
    64 bytes from node-1 (10.128.0.37): icmp_seq=3 ttl=128 time=0.249 ms
    64 bytes from node-1 (10.128.0.37): icmp_seq=4 ttl=128 time=0.263 ms
    
  4. Instal SQL Server 2025.

    1. Tambahkan repositori SQL Server ke sistem.

      curl https://packages.microsoft.com/keys/microsoft.asc | sudo tee /etc/apt/trusted.gpg.d/microsoft.asc
      curl -fsSL https://packages.microsoft.com/config/ubuntu/22.04/mssql-server-2025.list | sudo tee /etc/apt/sources.list.d/mssql-server-2025.list
      sudo apt-get update
      
    2. Instal SQL Server.

      sudo apt-get install -y mssql-server
      
    3. Instal alat developer SQL Server. Download dan instal alat SQL Server di dua VM Linux yang akan berpartisipasi dalam Failover Cluster.

      curl https://packages.microsoft.com/config/ubuntu/22.04/prod.list | sudo tee /etc/apt/sources.list.d/mssql-release.list
      sudo apt-get update
      
      sudo ACCEPT_EULA=Y apt-get install -y mssql-tools18 unixodbc-dev
      
  5. Instal Pacemaker. Pacemaker adalah software pengelola resource ketersediaan tinggi open source, yang digunakan dengan mesin Cluster Corosync. Di bagian ini, Anda akan menginstal Pacemaker di kedua VM cluster.

    1. Instal Pacemaker di node-1 dan node-2.

      sudo apt-get install -y pacemaker pcs fence-agents resource-agents pacemaker-cli-utils crmsh
      
    2. Instal agen resource SQL Server untuk Pacemaker.

      sudo apt-get install -y mssql-server-ha
      
  6. Jika Anda mengaktifkan firewall di VM, buka firewall untuk SQL Server.

    1. Periksa apakah Uncomplicated Firewall diinstal dan diaktifkan dengan menjalankan perintah berikut.

      sudo ufw status
      
    2. Jika statusnya aktif, jalankan perintah berikut untuk membuka port. Jika layanan firewall tidak berjalan, Anda dapat mengabaikan langkah ini.

      sudo ufw allow 1433
      sudo ufw allow 5022
      sudo ufw reload
      

Mengonfigurasi node database utama

Di bagian ini, Anda akan melakukan inisialisasi dua disk multi-writer dan menyiapkan setiap disk dengan grup volume dan grup logis.

Konfigurasi LVM.

Konfigurasi setelan LVM.

  1. Buat cadangan konfigurasi yang ada.

    sudo cp /etc/lvm/lvm.conf /etc/lvm/lvm.conf.bak
    
  2. Memperbarui sumber ID sistem:

    sudo sed -i 's/^\(\s*system_id_source\s*=\s*\)"none"/\1"uname"/' /etc/lvm/lvm.conf
    
  3. Pastikan perubahan berhasil dilakukan.

    grep 'system_id_source *= *"uname"' /etc/lvm/lvm.conf
    
  4. Konfigurasi grup volume LVM dan volume logis.

    sudo pvcreate /dev/nvme0n2 /dev/nvme0n3
    sudo pvs
    sudo vgcreate vgdata /dev/nvme0n2
    sudo lvcreate -l 100%FREE -n lvdata vgdata
    sudo vgcreate vglogtmp /dev/nvme0n3
    sudo lvcreate -l 70%FREE  -n lvlog vglogtmp
    sudo lvcreate -l 100%FREE -n lvtmp vglogtmp
    sudo vgs -o+systemid
    
  5. Format volume dengan sistem file xfs dengan ukuran blok 64 KB.

    sudo mkfs.xfs -d su=64k,sw=1 -L data /dev/vgdata/lvdata -f
    sudo mkfs.xfs -d su=64k,sw=1 -L dblog /dev/vglogtmp/lvlog -f
    sudo mkfs.xfs -d su=64k,sw=1 -L tmp /dev/vglogtmp/lvtmp -f
    
  6. Pastikan volume telah dibuat.

    sudo lvs
    

Pasang dan format disk

Siapkan titik pemasangan untuk disk bersama dan berikan akses pengguna mssql.

  1. Buat titik pemasangan untuk volume baru.

    sudo mkdir /mssql
    sudo mkdir -p /mssql/db_data
    sudo mkdir -p /mssql/db_log
    sudo mkdir -p /mssql/db_temp
    
  2. Pasang volume LVM ke direktori pemasangan.

    sudo mount /dev/vgdata/lvdata /mssql/db_data
    sudo mount /dev/vglogtmp/lvlog /mssql/db_log
    sudo mount /dev/vglogtmp/lvtmp /mssql/db_temp
    
  3. Tetapkan pengguna mssql sebagai pemilik titik pemasangan.

    sudo chown mssql:mssql /mssql/db_data
    sudo chown mssql:mssql /mssql/db_log
    sudo chown mssql:mssql /mssql/db_temp
    
  4. Konfigurasi SQL Server:

    1. Tetapkan variabel yang memindahkan database utama ke penyimpanan bersama dan jalankan alat mssql-conf.

      sudo MSSQL_MASTER_DATA_FILE="/mssql/db_data/master.mdf" MSSQL_MASTER_LOG_FILE="/mssql/db_data/mastlog.ldf" /opt/mssql/bin/mssql-conf setup
      
    2. Pilih edisi Developer untuk edisi SQL Server dan setujui perjanjian lisensi.

      Edisi developer mencakup semua fitur enterprise, tetapi Anda hanya dapat menggunakannya untuk lingkungan non-produksi. Informasi selengkapnya tersedia terkait edisi SQL Server dan lisensi Microsoft.

    3. Tentukan sandi untuk akun SA.

    4. Pastikan layanan mssql-server sedang berjalan.

      systemctl status mssql-server --no-pager
      

Mengonfigurasi SQL Server dan Pacemaker

  1. Buat pengguna SQL Server untuk Pacemaker. Ganti SA_PASSWORD dengan sandi akun SA di SQL Server dan PA_PASSWORD dengan sandi yang akan digunakan untuk akun pacemaker.

    QUERY="
    CREATE LOGIN [pacemaker] with PASSWORD= N'PA_PASSWORD';
    ALTER SERVER ROLE [sysadmin] ADD MEMBER [pacemaker];
    GO"
    
    /opt/mssql-tools18/bin/sqlcmd -No -S localhost -U sa -P 'SA_PASSWORD' -Q "$QUERY"
    
  2. Tambahkan login dan sandi Pacemaker ke folder rahasia SQL Server.

    {
      echo 'pacemaker'
      echo PA_PASSWORD'
    } | sudo tee /var/opt/mssql/secrets/passwd > /dev/null
    sudo chown root:root /var/opt/mssql/secrets/passwd
    sudo chmod 400 /var/opt/mssql/secrets/passwd
    
  3. Perbarui konfigurasi SQL Server untuk menggunakan lokasi data, log, dan temp baru. Anda juga akan menyetel setelan yang direkomendasikan untuk SQL Server.

    sudo /opt/mssql/bin/mssql-conf set filelocation.defaultdatadir /mssql/db_data
    sudo /opt/mssql/bin/mssql-conf set filelocation.defaultlogdir /mssql/db_log
    sudo /opt/mssql/bin/mssql-conf set filelocation.defaultdumpdir /mssql/db_log
    sudo /opt/mssql/bin/mssql-conf traceflag 9944 3979 on
    sudo /opt/mssql/bin/mssql-conf set control.alternatewritethrough 0
    sudo /opt/mssql/bin/mssql-conf set control.writethrough 1
    

Memindahkan TempDB ke disk bersama

  1. Dapatkan daftar file TempDB dan gunakan untuk membuat kueri Ubah. Kueri ini akan digunakan pada langkah berikutnya untuk menyetel lokasi baru bagi file TempDB.

    QUERY="
    SET NOCOUNT ON;
    SELECT 'ALTER DATABASE tempdb MODIFY FILE (NAME = [' + f.name + '],' + ' FILENAME = ''/mssql/db_temp/' + f.name + CASE WHEN f.type = 1 THEN '.ldf' ELSE '.mdf' END + ''');' FROM sys.master_files f WHERE f.database_id = DB_ID(N'tempdb');"
    
    /opt/mssql-tools18/bin/sqlcmd -No -S localhost -U sa -P 'SA_PASSWORD' -Q "$QUERY"
    
  2. Ambil output dari perintah sebelumnya. Anda akan menggunakan output untuk membentuk perintah berikutnya yang akan dieksekusi.

    QUERY="QUERY_OUTPUT"
    

    Contoh kueri menggunakan output:

    QUERY="
    ALTER DATABASE tempdb MODIFY FILE (NAME = [tempdev], FILENAME = '/mssql/db_temp/tempdev.mdf');
    ALTER DATABASE tempdb MODIFY FILE (NAME = [templog], FILENAME = '/mssql/db_temp/templog.ldf');
    ALTER DATABASE tempdb MODIFY FILE (NAME = [tempdev2], FILENAME = '/mssql/db_temp/tempdev2.mdf');
    ALTER DATABASE tempdb MODIFY FILE (NAME = [tempdev3], FILENAME = '/mssql/db_temp/tempdev3.mdf');"
    

  3. Jalankan perintah SQL yang dihasilkan untuk memindahkan file TempDB.

    /opt/mssql-tools18/bin/sqlcmd -No -S localhost -U sa -P 'SA_PASSWORD' -Q "$QUERY"
    
  4. Mulai ulang layanan SQL Server agar perubahan dapat diterapkan.

    sudo systemctl restart mssql-server.service
    
  5. Verifikasi bahwa file TempDB telah dibuat.

    ls -l /mssql/db_temp/
    
  6. Pastikan layanan SQL Server sedang berjalan.

    systemctl status mssql-server --no-pager
    

Konfigurasi HAProxy

  1. Tetapkan sandi baru untuk hacluster.

    sudo passwd hacluster
    
  2. Untuk menyelesaikan penyiapan dan menguji apakah load balancer jaringan Anda disiapkan dengan benar, instal dan konfigurasi HAProxy tcp listener di kedua node cluster:

    1. Instal HAProxy.

      sudo apt-get install haproxy
      
    2. Ketik Y untuk menyelesaikan penginstalan.

    3. Edit file haproxy.cfg.

      sudo vi /etc/haproxy/haproxy.cfg
      
    4. Di bagian defaults pada haproxy.cfg file, ubah mode menjadi tcp.

    5. Tambahkan bagian berikut di akhir file haproxy.cfg.

      #---------------------------------------------------------------
      # Set up health check listener for SQL Server Availability Group
      #---------------------------------------------------------------
      listen healthcheck
      bind *:60008
      
  3. Mulai layanan HAProxy.

    sudo systemctl start haproxy.service
    sudo systemctl status haproxy.service
    
  4. Hentikan dan nonaktifkan layanan HAProxy.

    sudo systemctl stop haproxy.service
    sudo systemctl disable haproxy.service
    
  5. Upload file kunci mesin ke Cloud Storage menggunakan perintah berikut.

    sudo gcloud storage cp /var/opt/mssql/secrets/machine-key gs://BUCKET_NAME/
    

    Ganti BUCKET_NAME dengan nama bucket yang dibuat.

  6. Hentikan dan nonaktifkan layanan SQL Server. Layanan dari titik ini akan dikontrol oleh cluster.

    sudo systemctl stop mssql-server.service
    sudo systemctl disable mssql-server.service
    
  7. Lepaskan penyimpanan bersama.

    sudo umount /mssql/db_data
    sudo umount /mssql/db_log
    sudo umount /mssql/db_temp
    
  8. Hapus konfigurasi cluster default yang ada.

    sudo pcs cluster destroy
    

Mengonfigurasi node sekunder

  1. Buat direktori pemasangan untuk volume LVM. Anda tidak perlu memformat disk karena disk ini dibagikan kepada node-1. Anda telah memformat disk dan mengonfigurasi volume LVM saat mengonfigurasi node-1.

    sudo mkdir /mssql
    sudo mkdir -p /mssql/db_data
    sudo mkdir -p /mssql/db_log
    sudo mkdir -p /mssql/db_temp
    
    sudo chown mssql:mssql /mssql/db_data
    sudo chown mssql:mssql /mssql/db_log
    sudo chown mssql:mssql /mssql/db_temp
    
  2. Konfigurasi SQL Server.

    1. Untuk memindahkan database utama ke disk data yang dibagikan, tetapkan variabel berikut, lalu jalankan alat mssql-conf untuk menerapkan perubahan.

      sudo MSSQL_MASTER_DATA_FILE="/mssql/db_data/master.mdf" MSSQL_MASTER_LOG_FILE="/mssql/db_data/mastlog.ldf" /opt/mssql/bin/mssql-conf setup
      
    2. Pilih edisi Developer untuk edisi SQL Server dan setujui perjanjian lisensi.

      Edisi developer mencakup semua fitur enterprise, tetapi Anda hanya dapat menggunakannya untuk lingkungan non-produksi. Informasi selengkapnya tersedia terkait edisi SQL Server dan lisensi Microsoft.

    3. Tentukan sandi untuk akun SA.

    4. Pastikan layanan mssql-server sedang berjalan.

      systemctl status mssql-server --no-pager
      
  3. Buat pengguna SQL Server untuk cluster Pacemaker. Ganti SA_PASSWORD dengan sandi akun SA di SQL Server dan PA_PASSWORD dengan sandi yang akan digunakan untuk akun pacemaker.

    QUERY="
    CREATE LOGIN [pacemaker] with PASSWORD= N'PA_PASSWORD';
    ALTER SERVER ROLE [sysadmin] ADD MEMBER [pacemaker];
    GO"
    
    /opt/mssql-tools18/bin/sqlcmd -No -S localhost -U sa -P 'SA_PASSWORD' -Q "$QUERY"
    
  4. Tambahkan login dan sandi Pacemaker ke folder rahasia SQL Server.

    {
      echo 'pacemaker'
      echo 'PA_PASSWORD'
    } | sudo tee /var/opt/mssql/secrets/passwd > /dev/null
    sudo chown root:root /var/opt/mssql/secrets/passwd
    sudo chmod 400 /var/opt/mssql/secrets/passwd
    
  5. Perbarui konfigurasi SQL Server untuk menggunakan lokasi data, log, dan temp baru. Anda juga akan menetapkan setelan yang direkomendasikan untuk SQL Server.

    sudo /opt/mssql/bin/mssql-conf set filelocation.defaultdatadir /mssql/db_data
    sudo /opt/mssql/bin/mssql-conf set filelocation.defaultlogdir /mssql/db_log
    sudo /opt/mssql/bin/mssql-conf set filelocation.defaultdumpdir /mssql/db_log
    sudo /opt/mssql/bin/mssql-conf traceflag 9944 3979 on
    sudo /opt/mssql/bin/mssql-conf set control.alternatewritethrough 0
    sudo /opt/mssql/bin/mssql-conf set control.writethrough 1
    
  6. Pindahkan TempDB ke disk data bersama.

    1. Dapatkan daftar file TempDB dan gunakan untuk membuat kueri Ubah.

      QUERY="
      SET NOCOUNT ON;
      SELECT 'ALTER DATABASE tempdb MODIFY FILE (NAME = [' + f.name + '],' + ' FILENAME = ''/mssql/db_temp/' + f.name + CASE WHEN f.type = 1 THEN '.ldf' ELSE '.mdf' END + ''');' FROM sys.master_files f WHERE f.database_id = DB_ID(N'tempdb');"
      
      /opt/mssql-tools18/bin/sqlcmd -No -S localhost -U sa -P 'SA_PASSWORD' -Q "$QUERY"
      
    2. Ambil output dari perintah sebelumnya. Anda akan menggunakan output untuk membentuk perintah berikutnya yang akan dieksekusi.

      QUERY="QUERY_OUTPUT"
      

      Contoh kueri menggunakan output:

      QUERY="
      ALTER DATABASE tempdb MODIFY FILE (NAME = [tempdev], FILENAME = '/mssql/db_temp/tempdev.mdf');
      ALTER DATABASE tempdb MODIFY FILE (NAME = [templog], FILENAME = '/mssql/db_temp/templog.ldf');
      ALTER DATABASE tempdb MODIFY FILE (NAME = [tempdev2], FILENAME = '/mssql/db_temp/tempdev2.mdf');
      ALTER DATABASE tempdb MODIFY FILE (NAME = [tempdev3], FILENAME = '/mssql/db_temp/tempdev3.mdf');"
      
    3. Untuk memindahkan file TempDB, jalankan perintah SQL yang dihasilkan.

      /opt/mssql-tools18/bin/sqlcmd -No -S localhost -U sa -P 'SA_PASSWORD' -Q "$QUERY"
      
    4. Agar perubahan diterapkan, mulai ulang layanan SQL Server.

      sudo systemctl restart mssql-server.service
      
    5. Pastikan layanan SQL Server sedang berjalan.

      sudo systemctl status mssql-server --no-pager
      
    6. Pastikan file TempDB telah dibuat.

      ls -l /mssql/db_temp/
      
  7. Hentikan dan nonaktifkan sementara layanan SQL Server.

    sudo systemctl stop mssql-server.service
    sudo systemctl disable mssql-server.service
    
  8. Untuk memastikan kedua node menggunakan kunci yang sama untuk SQL Server, download file kunci mesin dari node-1.

    sudo rm /var/opt/mssql/secrets/machine-key
    sudo gcloud storage cp gs://BUCKET_NAME/machine-key /var/opt/mssql/secrets/machine-key
    sudo chown mssql:mssql /var/opt/mssql/secrets/machine-key
    sudo chmod 0600  /var/opt/mssql/secrets/machine-key
    
  9. Konfigurasi setelan LVM.

    1. Mencadangkan konfigurasi yang ada.

      sudo cp /etc/lvm/lvm.conf /etc/lvm/lvm.conf.bak
      
    2. Perbarui sumber ID sistem.

      sudo sed -i 's/^\(\s*system_id_source\s*=\s*\)"none"/\1"uname"/' /etc/lvm/lvm.conf
      

      Verifikasi perubahan dengan menjalankan:

      cat /etc/lvm/lvm.conf | grep uname
      

      Output-nya akan tampak mirip dengan berikut ini:

      #     Set the system ID from the hostname (uname) of the system.
      system_id_source = "uname"
      
    3. Pastikan perubahan berhasil dilakukan.

      grep 'system_id_source *= *"uname"' /etc/lvm/lvm.conf
      
  10. Tetapkan sandi baru untuk hacluster.

    sudo passwd hacluster
    
  11. Untuk menyelesaikan penyiapan dan menguji apakah load balancer jaringan Anda telah disiapkan dengan benar, instal dan konfigurasi HAProxy tcp listener di kedua node cluster.

    1. Instal HAProxy.

      sudo apt-get install haproxy
      

    2. Pilih Y untuk menyelesaikan penginstalan.

    3. Edit file haproxy.cfg.

      sudo vi /etc/haproxy/haproxy.cfg
      
    4. Di bagian default haproxy.cfg file, ubah mode menjadi tcp.

    5. Tambahkan bagian berikut di akhir file haproxy.cfg.

      #---------------------------------------------------------------
      # Set up health check listener for SQL Server Availability Group
      #---------------------------------------------------------------
      listen healthcheck
      bind *:60008
      
    6. Mulai layanan HAProxy.

      sudo systemctl start haproxy.service
      sudo systemctl status haproxy.service
      
  12. Hentikan dan nonaktifkan layanan HAProxy.

    sudo systemctl stop haproxy.service
    sudo systemctl disable haproxy.service
    
  13. Hapus konfigurasi cluster default yang ada.

    sudo pcs cluster destroy
    

Menyelesaikan konfigurasi cluster

Kembali ke node-1 untuk melanjutkan konfigurasi cluster.

  1. Lakukan autentikasi sebagai pengguna hacluster.

    sudo pcs host auth node-1 node-2 -u hacluster -p "HA_PASSWORD"
    
  2. Buat cluster bernama ubuntu_fci.

    sudo pcs cluster setup ubuntu_fci node-1 addr="NODE1_INTERNAL_IP" node-2 addr="NODE2_INTERNAL_IP" --start --enable
    
  3. Menetapkan no-quorum-policy untuk cluster dua node.

    sudo pcs property set no-quorum-policy="ignore"
    
  4. Buat resource cluster alamat IP Virtual.

    sudo pcs resource create pcs-cluster-vip ocf:heartbeat:IPaddr2 ip="CLUSTER_ADDRESS" cidr_netmask=32 nic=ens3 op monitor interval=30s
    

    Ganti CLUSTER_ADDRESS dengan alamat IP yang dicadangkan sebelumnya.

  5. Buat objek resource cluster untuk semua volume bersama.

    sudo pcs resource create vgdata ocf:heartbeat:LVM-activate vgname=vgdata vg_access_mode=system_id activation_mode=exclusive
    sudo pcs resource create vglogtmp ocf:heartbeat:LVM-activate vgname=vglogtmp vg_access_mode=system_id activation_mode=exclusive
    sudo pcs resource create data_dir ocf:heartbeat:Filesystem device="/dev/mapper/vgdata-lvdata" directory="/mssql/db_data" fstype="xfs"
    sudo pcs resource create log_dir ocf:heartbeat:Filesystem device="/dev/mapper/vglogtmp-lvlog" directory="/mssql/db_log" fstype="xfs"
    sudo pcs resource create tmp_dir ocf:heartbeat:Filesystem device="/dev/mapper/vglogtmp-lvtmp" directory="/mssql/db_temp" fstype="xfs"
    
  6. Buat grup resource dan tambahkan semua objek yang dibuat ke grup baru.

    sudo pcs resource group add sql_group pcs-cluster-vip vgdata vglogtmp data_dir log_dir tmp_dir
    
  7. Buat resource cluster untuk layanan Microsoft SQL Server dan tambahkan ke grup resource yang ada.

    sudo pcs resource create sql_fci ocf:mssql:fci  op stop timeout=60s --group sql_group
    
  8. Buat resource cluster untuk HAProxy dan tambahkan ke grup yang sama.

    sudo pcs resource create pcs-healthcheck systemd:haproxy.service op monitor interval=20s timeout=30s --group sql_group
    
  9. Buat batasan cluster yang mengontrol urutan mulai untuk resource.

    sudo pcs constraint order set  pcs-cluster-vip vgdata vglogtmp data_dir log_dir tmp_dir sql_fci pcs-healthcheck
    

Menyiapkan pagar STONITH

STONITH adalah strategi pagar untuk menjaga integritas node dalam cluster HA. Layanan STONITH berfungsi di tingkat node dan melindungi cluster dari node yang tidak responsif atau dalam status tidak diketahui. Sebaiknya gunakan fence_gce perangkat pembatasan yang dikhususkan untuk Compute Engine di Cloud de Confiance by S3NS.

Menyiapkan perangkat pagar

  1. Periksa apakah agen fence_gce - Fence untuk Compute Engine diinstal di node-1.

    sudo pcs stonith list | grep fence_gce
    

    Untuk informasi selengkapnya, lihat:

  2. Mengonfigurasi resource pagar cluster.

    sudo pcs stonith create node-1-fence fence_gce \
    plug=node-1 \
    zone=ZONE1 \
    project=PROJECT_ID \
    pcmk_reboot_timeout=300 pcmk_monitor_retries=4 pcmk_delay_max=30 \
    op monitor interval="300s" timeout="120s" \
    op start interval="0" timeout="60s"
    
    sudo pcs stonith create node-2-fence fence_gce \
    plug=node-2 \
    zone=ZONE2 \
    project=PROJECT_ID \
    pcmk_reboot_timeout=300 pcmk_monitor_retries=4 pcmk_delay_max=30 \
    op monitor interval="300s" timeout="120s" \
    op start interval="0" timeout="60s"
    

    Ganti ZONE1 dan ZONE2 dengan zona tempat VM Linux di-deploy dan ganti PROJECT_ID dengan project ID Anda.

  3. Anda dapat menguji status agen pembatasan dengan menjalankan perintah status.

    sudo fence_gce -o status -n node-1 --zone=ZONE1
    sudo fence_gce -o status -n node-2 --zone=ZONE2
    

    Output-nya akan tampak mirip dengan berikut ini:

    Status: ON
    

Ganti ZONE1 dan ZONE2 dengan zona tempat VM Linux di-deploy.

  1. Buat batasan lokasi untuk perangkat pagar Anda guna memastikan perangkat tersebut hanya berjalan di instance yang dimaksud.

    sudo pcs constraint location node-1-fence avoids node-1
    sudo pcs constraint location node-2-fence avoids node-2
    
  2. Aktifkan pembatasan di cluster pacemaker Anda dan tetapkan waktu tunggu pembatasan cluster.

    sudo pcs -f stonith_cfg property set stonith-enabled=true
    sudo pcs property set stonith-timeout="300s"
    
  3. Membersihkan proses startup cluster.

    sudo pcs resource cleanup
    
  4. Periksa status cluster.

    sudo crm status
    

    Output-nya akan tampak mirip dengan berikut ini:

      Cluster Summary:
        * Stack: corosync
        * Current DC: node-1 (version 2.1.2-ada5c3b36e2) - partition with quorum
        * Last updated: Tue Jun  2 21:36:47 2026
        * Last change:  Mon Apr 27 12:31:58 2026 by root via crm_resource on node-1
        * 2 nodes configured
        * 10 resource instances configured
    
      Node List:
        * Online: [ node-1 node-2 ]
    
      Full List of Resources:
        * Resource Group: sql_group:
          * pcs-cluster-vip   (ocf:heartbeat:IPaddr2):         Started node-2
          * vgdata    (ocf:heartbeat:LVM-activate):    Started node-2
          * vglogtmp  (ocf:heartbeat:LVM-activate):    Started node-2
          * data_dir  (ocf:heartbeat:Filesystem):      Started node-2
          * log_dir   (ocf:heartbeat:Filesystem):      Started node-2
          * tmp_dir   (ocf:heartbeat:Filesystem):      Started node-2
          * sql_fci   (ocf:mssql:fci):                 Started node-2
          * pcs-healthcheck   (systemd:haproxy.service):       Started node-2
        * node-1-fence       (stonith:fence_gce):     Started node-2
        * node2-fence        (stonith:fence_gce):     Started node-1
    

Menguji perangkat pagar

Setelah penyiapan perangkat pembatasan, sebaiknya Anda mengujinya menggunakan langkah-langkah berikut.

  1. Hentikan pagar di node-2.

    1. Hubungkan ke node-1 dan jalankan perintah berikut untuk menguji perangkat pagar yang terkait dengan node-2 dari cluster Anda.

      fence_gce -o off -n node-2 --zone=ZONE2
      

      Output-nya akan tampak mirip dengan berikut ini:

      Success: Powered OFF
      
    2. Periksa status cluster.

      sudo crm status
      

      Output-nya akan tampak mirip dengan berikut ini:

        Cluster Summary:
          * Stack: corosync
          * Current DC: node-1 (version 2.1.2-ada5c3b36e2) - partition with quorum
          * Last updated: Tue Jun  2 21:52:00 2026
          * Last change:  Mon Apr 27 12:31:58 2026 by root via crm_resource on node-1
          * 2 nodes configured
          * 10 resource instances configured
    
        Node List:
          * Online: [ node-1 ]
          * OFFLINE: [ node-2 ]
    
        Full List of Resources:
          * Resource Group: sql_group:
            * pcs-cluster-vip   (ocf:heartbeat:IPaddr2): Started node-1
            * vgdata    (ocf:heartbeat:LVM-activate):    Started node-1
            * vglogtmp  (ocf:heartbeat:LVM-activate):    Started node-1
            * data_dir  (ocf:heartbeat:Filesystem):      Started node-1
            * log_dir   (ocf:heartbeat:Filesystem):      Started node-1
            * tmp_dir   (ocf:heartbeat:Filesystem):      Started node-1
            * sql_fci   (ocf:mssql:fci):                 Started node-1
            * pcs-healthcheck   (systemd:haproxy.service):       Started node-1
          * node-1-fence       (stonith:fence_gce):     Stopped
          * node-2-fence        (stonith:fence_gce):     Started node-1
    
    1. Anda juga akan melihat bahwa node-2 dinonaktifkan di Compute Engine.

      Buka Compute Engine

  2. Mulai ulang pagar pada node-2.

    1. Kembali ke node-1 dan mulai ulang instance lagi dengan menjalankan perintah berikut.

      fence_gce -o on -n node-2 --zone=ZONE2
      

      Output-nya akan tampak mirip dengan berikut ini:

      Success: Powered ON
      
    2. Periksa status cluster di Pacemaker dan Compute Engine. Setelah beberapa saat, Anda akan melihat bahwa node-2 kembali online.

       $ sudo crm status
      

Menguji failover

Sekarang Anda siap untuk menguji apakah failover berfungsi seperti yang diharapkan.

  1. Buat nama pengguna dan sandi untuk instance VM
  2. Hubungkan ke VM menggunakan Desktop Jarak Jauh dan login menggunakan nama pengguna dan sandi yang dibuat di langkah sebelumnya.
  3. Hubungkan ke VM Windows di cl-node melalui Desktop Jarak Jauh.
  4. Buka sesi PowerShell.
  5. Hubungkan ke server dengan menjalankan skrip berikut. Setiap lima detik, skrip akan terhubung ke SQL Server menggunakan pemroses grup ketersediaan dan mengkueri nama server.

    while ($True){
      try {
        $Conn = New-Object System.Data.SqlClient.SqlConnection
        $Conn.ConnectionString = "Server=CLUSTER_ADDRESS;User ID=sa;Password=SA_PASSWORD;Initial Catalog=master"
        $Conn.Open()
    
        $Cmd =  $Conn.CreateCommand()
        $Cmd.CommandText = "SELECT SERVERPROPERTY('ComputerNamePhysicalNetBIOS')"
    
        $Result = $Cmd.ExecuteReader()
        if ($Result.Read()) {
          $currentNode = $Result.GetString(0)
          Write-Host "Current Node: $currentNode at $(Get-Date)"
        }
    
        $Conn.Close()
        Start-Sleep -Seconds 5
      }
      catch {
          Write-Host "SQL Connection Failed at $(Get-Date). Retrying..."
          Start-Sleep -Seconds 15 # Wait before retrying
      }
    }
    

    Ganti CLUSTER_ADDRESS dengan alamat IP pendengar dan SA_PASSWORD dengan sandi akun SA di SQL Server.

    Output-nya akan tampak mirip dengan berikut ini:

      Current Node: node-1 at 06/09/2026 20:24:35
      Current Node: node-1 at 06/09/2026 20:24:40
      Current Node: node-1 at 06/09/2026 20:24:45
      Current Node: node-1 at 06/09/2026 20:24:50
      Current Node: node-1 at 06/09/2026 20:24:55
    

    Biarkan skrip berjalan.

  6. Picu failover ke node-2: dari node-1, kembali ke terminal SSH dan jalankan perintah berikut.

    sudo pcs resource move sql_group node-2
    
  7. Kembali ke sesi PowerShell di cl-node.

    1. Amati output skrip yang berjalan dan perhatikan bahwa nama server berubah dari node-1 menjadi node-2 sebagai akibat dari failover.

    Output-nya akan tampak mirip dengan berikut ini:

      Current Node: node-1 at 06/09/2026 20:28:51
      Current Node: node-1 at 06/09/2026 20:28:56
      SQL Connection Failed at 06/09/2026 20:29:16. Retrying...
      Current Node: node-2 at 06/09/2026 20:29:31
      Current Node: node-2 at 06/09/2026 20:29:36
    
  8. Mulai failback ke node-1. Dari command line di node-1, jalankan perintah berikut

    sudo pcs resource move sql_group node-1
    
  9. Kembali ke Powershell di cl-node. Hentikan skrip dengan menekan Ctrl+C.

Pembersihan

Setelah menyelesaikan tutorial, Anda dapat membersihkan resource yang dibuat agar tidak lagi menggunakan kuota dan menimbulkan tagihan. Bagian berikut menjelaskan cara menghapus atau menonaktifkan resource ini.

Menghapus project

Cara termudah untuk menghilangkan penagihan adalah dengan menghapus project yang Anda buat untuk tutorial.

Untuk menghapus project:

  1. Di konsol Cloud de Confiance , buka halaman Manage resources.

    Buka Kelola resource

  2. Pada daftar project, pilih project yang ingin Anda hapus, lalu klik Delete.
  3. Pada dialog, ketik project ID, lalu klik Shut down untuk menghapus project.

Langkah berikutnya