Men-deploy cluster MySQL 5.6 yang sangat tersedia dengan DRBD di Compute Engine

Last reviewed 2019-05-10 UTC

Tutorial ini memandu Anda melalui proses men-deploy database MySQL 5.6 ke Google Cloud dengan menggunakan Distributed Replicated Block Device (DRBD) dan Compute Engine. DRBD adalah sistem penyimpanan replika terdistribusi untuk platform Linux.

Tutorial ini berguna jika Anda adalah admin sistem, developer, engineer, admin database, atau engineer DevOps. Anda mungkin ingin mengelola instance MySQL sendiri daripada menggunakan layanan terkelola karena beberapa alasan, termasuk:

  • Anda menggunakan instance MySQL lintas region.
  • Anda perlu menetapkan parameter yang tidak tersedia di versi MySQL terkelola.
  • Anda ingin mengoptimalkan performa dengan cara yang tidak dapat disetel dalam versi terkelola.

DRBD menyediakan replikasi pada level perangkat blok. Artinya, Anda tidak perlu mengonfigurasi replikasi di MySQL itu sendiri, dan Anda akan langsung mendapatkan manfaat DRBD, misalnya dukungan untuk load balancing baca dan koneksi yang aman.

Tutorial ini menggunakan:

Tidak ada pengetahuan lanjutan yang diperlukan untuk menggunakan resource ini, meskipun dokumen ini merujuk pada kemampuan lanjutan seperti pengelompokan MySQL, konfigurasi DRBD, dan pengelolaan resource Linux.

Arsitektur

Pacemaker adalah pengelola resource cluster. Corosync adalah paket komunikasi dan partisipasi klaster, yang digunakan oleh Pacemaker. Dalam tutorial ini, Anda menggunakan DRBD untuk mereplikasi disk MySQL dari instance utama ke instance standby. Agar klien dapat terhubung ke cluster MySQL, Anda juga men-deploy load balancer internal.

Anda men-deploy cluster yang dikelola Pacemaker dari tiga instance komputasi. Anda menginstal MySQL pada dua instance, yang berfungsi sebagai instance utama dan standby. Instance ketiga berfungsi sebagai perangkat kuorum.

Dalam cluster, setiap node memberikan suara untuk node yang seharusnya menjadi node aktif, yaitu node yang menjalankan MySQL. Pada cluster dua node, hanya dibutuhkan satu suara untuk menentukan node aktif. Dalam kasus semacam itu, perilaku cluster dapat menyebabkan masalah split-brain atau periode nonaktif. Masalah split brain terjadi saat kedua node mengambil alih karena hanya satu suara yang diperlukan dalam skenario dua node. Periode nonaktif terjadi saat node yang dimatikan adalah node yang dikonfigurasi untuk selalu menjadi yang utama jika konektivitas hilang. Jika kedua node kehilangan konektivitas satu sama lain, ada risiko bahwa lebih dari satu node cluster mengasumsikan bahwa node tersebut adalah node yang aktif.

Menambahkan perangkat kuorum akan mencegah situasi ini. Perangkat kuorum berfungsi sebagai arbiter, di mana satu-satunya tugasnya adalah memberikan suara. Dengan cara ini, jika instance database1 dan database2 tidak dapat berkomunikasi, node perangkat kuorum ini dapat berkomunikasi dengan salah satu dari dua instance tersebut sehingga suara terbanyak dapat diperoleh.

Diagram berikut menunjukkan arsitektur sistem yang dijelaskan di sini.

Arsitektur yang menampilkan database MySQL 5.6 yang di-deploy ke Google Cloud menggunakan DRBD dan Compute Engine

Tujuan

  • Membuat instance cluster.
  • Menginstal MySQL dan DRBD pada dua instance.
  • Mengonfigurasi replikasi DRBD.
  • Menginstal Pacemaker pada instance.
  • Mengonfigurasi pengelompokan Pacemaker pada instance.
  • Membuat instance dan mengonfigurasinya sebagai perangkat kuorum.
  • Menguji failover.

Biaya

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

Sebelum memulai

  1. Login ke akun Google Cloud Anda. Jika Anda baru menggunakan Google Cloud, buat akun untuk mengevaluasi performa produk kami dalam skenario dunia nyata. Pelanggan baru juga mendapatkan kredit gratis senilai $300 untuk menjalankan, menguji, dan men-deploy workload.
  2. Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.

    Buka pemilih project

  3. Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.

  4. Enable the Compute Engine API.

    Enable the API

  5. Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.

    Buka pemilih project

  6. Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.

  7. Enable the Compute Engine API.

    Enable the API

Dalam tutorial ini, Anda akan memasukkan perintah menggunakan Cloud Shell kecuali jika dinyatakan lain.

Setelah menyelesaikan tugas yang dijelaskan dalam dokumen ini, Anda dapat menghindari penagihan berkelanjutan dengan menghapus resource yang Anda buat. Untuk mengetahui informasi selengkapnya, lihat Pembersihan.

Mempersiapkan

Di bagian ini, Anda akan menyiapkan akun layanan, membuat variabel lingkungan, dan mencadangkan alamat IP.

Menyiapkan akun layanan untuk instance cluster

  1. Buka Cloud Shell.

    BUKA Cloud Shell

  2. Buat akun layanan:

    gcloud iam service-accounts create mysql-instance \
        --display-name "mysql-instance"
    
  3. Lampirkan peran yang diperlukan untuk tutorial ini ke akun layanan:

    gcloud projects add-iam-policy-binding ${DEVSHELL_PROJECT_ID} \
        --member=serviceAccount:mysql-instance@${DEVSHELL_PROJECT_ID}.iam.gserviceaccount.com \
        --role=roles/compute.instanceAdmin.v1
    
    gcloud projects add-iam-policy-binding ${DEVSHELL_PROJECT_ID} \
        --member=serviceAccount:mysql-instance@${DEVSHELL_PROJECT_ID}.iam.gserviceaccount.com \
        --role=roles/compute.viewer
    
    gcloud projects add-iam-policy-binding ${DEVSHELL_PROJECT_ID} \
        --member=serviceAccount:mysql-instance@${DEVSHELL_PROJECT_ID}.iam.gserviceaccount.com \
        --role=roles/iam.serviceAccountUser
    

Membuat variabel lingkungan Cloud Shell

  1. Buat file dengan variabel lingkungan yang diperlukan untuk tutorial ini:

    cat <<EOF > ~/.mysqldrbdrc
    # Cluster instance names
    DATABASE1_INSTANCE_NAME=database1
    DATABASE2_INSTANCE_NAME=database2
    QUORUM_INSTANCE_NAME=qdevice
    CLIENT_INSTANCE_NAME=mysql-client
    # Cluster IP addresses
    DATABASE1_INSTANCE_IP="10.140.0.2"
    DATABASE2_INSTANCE_IP="10.140.0.3"
    QUORUM_INSTANCE_IP="10.140.0.4"
    ILB_IP="10.140.0.6"
    # Cluster zones and region
    DATABASE1_INSTANCE_ZONE="asia-east1-a"
    DATABASE2_INSTANCE_ZONE="asia-east1-b"
    QUORUM_INSTANCE_ZONE="asia-east1-c"
    CLIENT_INSTANCE_ZONE="asia-east1-c"
    CLUSTER_REGION="asia-east1"
    EOF
    
  2. Muat variabel lingkungan di sesi saat ini dan tetapkan Cloud Shell agar otomatis memuat variabel saat login berikutnya:

    source ~/.mysqldrbdrc
    grep -q -F "source ~/.mysqldrbdrc" ~/.bashrc || echo "source ~/.mysqldrbdrc" >> ~/.bashrc
    

Mencadangkan alamat IP

  • Di Cloud Shell, cadangkan alamat IP internal untuk masing-masing dari tiga node cluster:

    gcloud compute addresses create ${DATABASE1_INSTANCE_NAME} ${DATABASE2_INSTANCE_NAME} ${QUORUM_INSTANCE_NAME} \
        --region=${CLUSTER_REGION} \
        --addresses "${DATABASE1_INSTANCE_IP},${DATABASE2_INSTANCE_IP},${QUORUM_INSTANCE_IP}" \
        --subnet=default
    

Membuat instance Compute Engine

Dalam langkah-langkah berikut, instance cluster menggunakan Debian 9 dan instance klien menggunakan Ubuntu 16.

  1. Di Cloud Shell, buat instance MySQL bernama database1 di zona asia-east1-a:

    gcloud compute instances create ${DATABASE1_INSTANCE_NAME} \
        --zone=${DATABASE1_INSTANCE_ZONE} \
        --machine-type=n1-standard-2  \
        --network-tier=PREMIUM \
        --maintenance-policy=MIGRATE \
        --image-family=debian-9 \
        --image-project=debian-cloud \
        --boot-disk-size=50GB \
        --boot-disk-type=pd-standard \
        --boot-disk-device-name=${DATABASE1_INSTANCE_NAME} \
        --create-disk=mode=rw,size=300,type=pd-standard,name=disk-1 \
        --private-network-ip=${DATABASE1_INSTANCE_NAME} \
        --tags=mysql --service-account=mysql-instance@${DEVSHELL_PROJECT_ID}.iam.gserviceaccount.com \
        --scopes="https://www.googleapis.com/auth/compute,https://www.googleapis.com/auth/servicecontrol,https://www.googleapis.com/auth/service.management.readonly" \
        --metadata="DATABASE1_INSTANCE_IP=${DATABASE1_INSTANCE_IP},DATABASE2_INSTANCE_IP=${DATABASE2_INSTANCE_IP},DATABASE1_INSTANCE_NAME=${DATABASE1_INSTANCE_NAME},DATABASE2_INSTANCE_NAME=${DATABASE2_INSTANCE_NAME},QUORUM_INSTANCE_NAME=${QUORUM_INSTANCE_NAME},DATABASE1_INSTANCE_ZONE=${DATABASE1_INSTANCE_ZONE},DATABASE2_INSTANCE_ZONE=${DATABASE2_INSTANCE_ZONE}"
    
  2. Buat instance MySQL bernama database2 di zona asia-east1-b:

    gcloud compute instances create ${DATABASE2_INSTANCE_NAME} \
        --zone=${DATABASE2_INSTANCE_ZONE} \
        --machine-type=n1-standard-2  \
        --network-tier=PREMIUM \
        --maintenance-policy=MIGRATE \
        --image-family=debian-9 \
        --image-project=debian-cloud \
        --boot-disk-size=50GB \
        --boot-disk-type=pd-standard \
        --boot-disk-device-name=${DATABASE2_INSTANCE_NAME} \
        --create-disk=mode=rw,size=300,type=pd-standard,name=disk-2 \
        --private-network-ip=${DATABASE2_INSTANCE_NAME} \
        --tags=mysql \
        --service-account=mysql-instance@${DEVSHELL_PROJECT_ID}.iam.gserviceaccount.com \
        --scopes="https://www.googleapis.com/auth/compute,https://www.googleapis.com/auth/servicecontrol,https://www.googleapis.com/auth/service.management.readonly" \
        --metadata="DATABASE1_INSTANCE_IP=${DATABASE1_INSTANCE_IP},DATABASE2_INSTANCE_IP=${DATABASE2_INSTANCE_IP},DATABASE1_INSTANCE_NAME=${DATABASE1_INSTANCE_NAME},DATABASE2_INSTANCE_NAME=${DATABASE2_INSTANCE_NAME},QUORUM_INSTANCE_NAME=${QUORUM_INSTANCE_NAME},DATABASE1_INSTANCE_ZONE=${DATABASE1_INSTANCE_ZONE},DATABASE2_INSTANCE_ZONE=${DATABASE2_INSTANCE_ZONE}"
    
  3. Buat node kuorum untuk digunakan oleh Pacemaker di zona asia-east1-c:

    gcloud compute instances create ${QUORUM_INSTANCE_NAME} \
        --zone=${QUORUM_INSTANCE_ZONE} \
        --machine-type=n1-standard-1 \
        --network-tier=PREMIUM \
        --maintenance-policy=MIGRATE \
        --image-family=debian-9  \
        --image-project=debian-cloud \
        --boot-disk-size=10GB \
        --boot-disk-type=pd-standard \
        --boot-disk-device-name=${QUORUM_INSTANCE_NAME} \
        --private-network-ip=${QUORUM_INSTANCE_NAME}
    
  4. Buat instance klien MySQL:

    gcloud compute instances create ${CLIENT_INSTANCE_NAME} \
        --image-family=ubuntu-1604-lts \
        --image-project=ubuntu-os-cloud \
        --tags=mysql-client \
        --zone=${CLIENT_INSTANCE_ZONE} \
        --boot-disk-size=10GB \
        --metadata="ILB_IP=${ILB_IP}"
    

Menginstal dan mengonfigurasi DRBD

Di bagian ini, Anda akan menginstal dan mengonfigurasi paket DRBD pada instance database1 dan database2, lalu memulai replikasi DRBD dari database1 ke database2.

Mengonfigurasi DRBD pada database1

  1. Di Konsol Google Cloud, buka halaman Instance VM:

    HALAMAN INSTANCE VM

  2. Di baris instance database1, klik SSH untuk terhubung ke instance.

  3. Buat file untuk mengambil dan menyimpan metadata instance di variabel lingkungan:

    sudo bash -c cat <<EOF  > ~/.varsrc
    DATABASE1_INSTANCE_IP=$(curl -s "http://metadata.google.internal/computeMetadata/v1/instance/attributes/DATABASE1_INSTANCE_IP" -H "Metadata-Flavor: Google")
    DATABASE2_INSTANCE_IP=$(curl -s "http://metadata.google.internal/computeMetadata/v1/instance/attributes/DATABASE2_INSTANCE_IP" -H "Metadata-Flavor: Google")
    DATABASE1_INSTANCE_NAME=$(curl -s "http://metadata.google.internal/computeMetadata/v1/instance/attributes/DATABASE1_INSTANCE_NAME" -H "Metadata-Flavor: Google")
    DATABASE2_INSTANCE_NAME=$(curl -s "http://metadata.google.internal/computeMetadata/v1/instance/attributes/DATABASE2_INSTANCE_NAME" -H "Metadata-Flavor: Google")
    DATABASE2_INSTANCE_ZONE=$(curl -s "http://metadata.google.internal/computeMetadata/v1/instance/attributes/DATABASE2_INSTANCE_ZONE" -H "Metadata-Flavor: Google")
    DATABASE1_INSTANCE_ZONE=$(curl -s "http://metadata.google.internal/computeMetadata/v1/instance/attributes/DATABASE1_INSTANCE_ZONE" -H "Metadata-Flavor: Google")
    QUORUM_INSTANCE_NAME=$(curl -s "http://metadata.google.internal/computeMetadata/v1/instance/attributes/QUORUM_INSTANCE_NAME" -H "Metadata-Flavor: Google")
    
    EOF
    
  4. Muat variabel metadata dari file:

    source ~/.varsrc
    
  5. Format disk data:

    sudo bash -c  "mkfs.ext4 -m 0 -F -E \
    lazy_itable_init=0,lazy_journal_init=0,discard /dev/sdb"
    

    Untuk deskripsi mendetail tentang opsi mkfs.ext4, lihat halaman manual mkfs.ext4.

  6. Instal DRBD:

    sudo apt -y install drbd8-utils
    
  7. Buat file konfigurasi DRBD:

    sudo bash -c 'cat <<EOF  > /etc/drbd.d/global_common.conf
    global {
        usage-count no;
    }
    common {
        protocol C;
    }
    EOF'
    
  8. Buat file resource DRBD:

    sudo bash -c "cat <<EOF  > /etc/drbd.d/r0.res
    resource r0 {
        meta-disk internal;
        device /dev/drbd0;
        net {
            allow-two-primaries no;
            after-sb-0pri discard-zero-changes;
            after-sb-1pri discard-secondary;
            after-sb-2pri disconnect;
            rr-conflict disconnect;
        }
        on database1 {
            disk /dev/sdb;
            address 10.140.0.2:7789;
        }
        on database2 {
            disk /dev/sdb;
            address 10.140.0.3:7789;
        }
    }
    EOF"
    
  9. Muat modul kernel DRBD:

    sudo modprobe drbd
    
  10. Hapus konten disk /dev/sdb:

    sudo dd if=/dev/zero of=/dev/sdb bs=1k count=1024
    
  11. Buat resource DRBD r0:

    sudo drbdadm create-md r0
    
  12. Munculkan DRBD:

    sudo drbdadm up r0
    
  13. Nonaktifkan DRBD saat sistem dimulai agar software pengelolaan resource cluster memunculkan semua layanan yang diperlukan secara berurutan:

    sudo update-rc.d drbd disable
    

Mengonfigurasi DRBD pada database2

Sekarang Anda menginstal dan mengonfigurasi paket DRBD pada instance database2.

  1. Hubungkan ke instance database2 melalui SSH.
  2. Buat file .varsrc untuk mengambil dan menyimpan metadata instance dalam variabel lingkungan:

    sudo bash -c cat <<EOF  > ~/.varsrc
    DATABASE1_INSTANCE_IP=$(curl -s "http://metadata.google.internal/computeMetadata/v1/instance/attributes/DATABASE1_INSTANCE_IP" -H "Metadata-Flavor: Google")
    DATABASE2_INSTANCE_IP=$(curl -s "http://metadata.google.internal/computeMetadata/v1/instance/attributes/DATABASE2_INSTANCE_IP" -H "Metadata-Flavor: Google")
    DATABASE1_INSTANCE_NAME=$(curl -s "http://metadata.google.internal/computeMetadata/v1/instance/attributes/DATABASE1_INSTANCE_NAME" -H "Metadata-Flavor: Google")
    DATABASE2_INSTANCE_NAME=$(curl -s "http://metadata.google.internal/computeMetadata/v1/instance/attributes/DATABASE2_INSTANCE_NAME" -H "Metadata-Flavor: Google")
    DATABASE2_INSTANCE_ZONE=$(curl -s "http://metadata.google.internal/computeMetadata/v1/instance/attributes/DATABASE2_INSTANCE_ZONE" -H "Metadata-Flavor: Google")
    DATABASE1_INSTANCE_ZONE=$(curl -s "http://metadata.google.internal/computeMetadata/v1/instance/attributes/DATABASE1_INSTANCE_ZONE" -H "Metadata-Flavor: Google")
    QUORUM_INSTANCE_NAME=$(curl -s "http://metadata.google.internal/computeMetadata/v1/instance/attributes/QUORUM_INSTANCE_NAME" -H "Metadata-Flavor: Google")
    EOF
    
  3. Muat variabel metadata dari file:

    source ~/.varsrc
    
  4. Format disk data:

    sudo bash -c  "mkfs.ext4 -m 0 -F -E  lazy_itable_init=0,lazy_journal_init=0,discard /dev/sdb"
    
  5. Instal paket DRBD:

    sudo apt -y install drbd8-utils
    
  6. Buat file konfigurasi DRBD:

    sudo bash -c 'cat <<EOF  > /etc/drbd.d/global_common.conf
    global {
        usage-count no;
    }
    common {
        protocol C;
    }
    EOF'
    
  7. Buat file resource DRBD:

    sudo bash -c "cat <<EOF  > /etc/drbd.d/r0.res
    resource r0 {
        meta-disk internal;
        device /dev/drbd0;
        net {
            allow-two-primaries no;
            after-sb-0pri discard-zero-changes;
            after-sb-1pri discard-secondary;
            after-sb-2pri disconnect;
            rr-conflict disconnect;
        }
        on ${DATABASE1_INSTANCE_NAME} {
            disk /dev/sdb;
            address ${DATABASE1_INSTANCE_IP}:7789;
        }
        on ${DATABASE2_INSTANCE_NAME} {
            disk /dev/sdb;
            address ${DATABASE2_INSTANCE_IP}:7789;
        }
    }
    EOF"
    
  8. Muat modul kernel DRBD:

    sudo modprobe drbd
    
  9. Kosongkan disk /dev/sdb:

    sudo dd if=/dev/zero of=/dev/sdb bs=1k count=1024
    
  10. Buat resource DRBD r0:

    sudo drbdadm create-md r0
    
  11. Munculkan DRBD:

    sudo drbdadm up r0
    
  12. Nonaktifkan DRBD saat sistem dimulai agar software pengelolaan resource cluster memunculkan semua layanan yang diperlukan secara berurutan:

    sudo update-rc.d drbd disable
    

Memulai replikasi DRBD dari database1 ke database2

  1. Hubungkan ke instance database1 melalui SSH.
  2. Timpa semua resource r0 di node utama:

    sudo drbdadm -- --overwrite-data-of-peer primary r0
    sudo mkfs.ext4 -m 0 -F -E lazy_itable_init=0,lazy_journal_init=0,discard /dev/drbd0
    
  3. Verifikasi status DRBD:

    sudo cat /proc/drbd | grep ============
    

    Outputnya akan terlihat seperti ini:

    [===================>] sync'ed:100.0% (208/307188)M
    
  4. Pasang /dev/drbd ke /srv:

    sudo mount -o discard,defaults /dev/drbd0 /srv
    

Menginstal MySQL dan Pacemaker

Di bagian ini, Anda akan menginstal MySQL dan Pacemaker pada setiap instance.

Menginstal MySQL di database1

  1. Hubungkan ke instance database1 melalui SSH.
  2. Update repositori APT dengan definisi paket MySQL 5.6:

    sudo bash -c 'cat <<EOF  > /etc/apt/sources.list.d/mysql.list
    deb http://repo.mysql.com/apt/debian/ stretch mysql-5.6\ndeb-src http://repo.mysql.com/apt/debian/ stretch mysql-5.6
    EOF'
    
  3. Tambahkan kunci GPG ke file repository.srv APT:

    wget -O /tmp/RPM-GPG-KEY-mysql https://repo.mysql.com/RPM-GPG-KEY-mysql
    sudo apt-key add /tmp/RPM-GPG-KEY-mysql
    
  4. Perbarui daftar paket:

    sudo apt update
    
  5. Instal server MySQL:

    sudo apt -y install mysql-server
    

    Saat diminta memasukkan sandi, masukkan DRBDha2.

  6. Hentikan server MySQL:

    sudo /etc/init.d/mysql stop
    
  7. Buat file konfigurasi MySQL:

    sudo bash -c 'cat <<EOF  > /etc/mysql/mysql.conf.d/my.cnf
    [mysqld]
    bind-address = 0.0.0.0  # You may want to listen at localhost at the beginning
    datadir = /var/lib/mysql
    tmpdir = /srv/tmp
    user = mysql
    EOF'
    
  8. Buat direktori sementara untuk server MySQL (dikonfigurasi di mysql.conf):

    sudo mkdir /srv/tmp
    sudo chmod 1777 /srv/tmp
    
  9. Pindahkan semua data MySQL ke direktori DRBD /srv/mysql:

    sudo mv /var/lib/mysql /srv/mysql
    
  10. Tautkan /var/lib/mysql ke /srv/mysql pada bagian volume penyimpanan yang direplikasi DRBD:

    sudo ln -s /srv/mysql /var/lib/mysql
    
  11. Ubah pemilik /srv/mysql menjadi proses mysql:

    sudo chown -R mysql:mysql /srv/mysql
    
  12. Hapus data awal InnoDB untuk memastikan disk sudah benar-benar bersih:

    sudo bash -c "cd /srv/mysql && rm ibdata1 && rm ib_logfile*"
    

    InnoDB adalah mesin penyimpanan untuk sistem pengelolaan database MySQL.

  13. Mulai MySQL:

    sudo /etc/init.d/mysql start
    
  14. Berikan akses kepada pengguna root untuk koneksi jarak jauh agar dapat menguji deployment nanti:

    mysql -uroot -pDRBDha2 -e "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'DRBDha2' WITH GRANT OPTION;"
    
  15. Nonaktifkan startup MySQL otomatis, yang ditangani oleh pengelolaan resource cluster:

    sudo update-rc.d -f mysql disable
    

Menginstal Pacemaker pada database1

  1. Muat variabel metadata dari file .varsrc yang Anda buat sebelumnya:

    source ~/.varsrc
    
  2. Hentikan server MySQL:

    sudo /etc/init.d/mysql stop
    
  3. Instal Pacemaker:

    sudo apt -y install pcs
    
  4. Aktifkan pcsd, corosync, dan pacemaker saat sistem dimulai di instance utama:

    sudo update-rc.d -f pcsd enable
    sudo update-rc.d -f corosync enable
    sudo update-rc.d -f pacemaker enable
    
  5. Konfigurasikan corosync untuk dimulai sebelum pacemaker:

    sudo update-rc.d corosync defaults 20 20
    sudo update-rc.d pacemaker defaults 30 10
    
  6. Setel sandi pengguna cluster ke haCLUSTER3 untuk autentikasi:

    sudo bash -c "echo  hacluster:haCLUSTER3 | chpasswd"
    
  7. Jalankan skrip corosync-keygen untuk membuat kunci otorisasi cluster 128-bit dan tuliskan ke /etc/corosync/authkey:

    sudo corosync-keygen -l
    
  8. Salin authkey ke instance database2. Saat dimintai frasa sandi, tekan Enter:

    sudo chmod 444 /etc/corosync/authkey
    gcloud beta compute scp /etc/corosync/authkey ${DATABASE2_INSTANCE_NAME}:~/authkey --zone=${DATABASE2_INSTANCE_ZONE} --internal-ip
    sudo chmod 400 /etc/corosync/authkey
    
  9. Buat file konfigurasi cluster Corosync:

    sudo bash -c "cat <<EOF  > /etc/corosync/corosync.conf
    
    totem {
        version: 2
        cluster_name: mysql_cluster
        transport: udpu
        interface {
            ringnumber: 0
            Bindnetaddr: ${DATABASE1_INSTANCE_IP}
            broadcast: yes
            mcastport: 5405
        }
    }
    quorum {
        provider: corosync_votequorum
    two_node: 1
    }
    
    nodelist {
        node {
            ring0_addr: ${DATABASE1_INSTANCE_NAME}
        name:  ${DATABASE1_INSTANCE_NAME}
    
        nodeid: 1
        }
        node {
            ring0_addr:  ${DATABASE2_INSTANCE_NAME}
            name:  ${DATABASE2_INSTANCE_NAME}
            nodeid: 2
        }
    }
    logging {
        to_logfile: yes
        logfile: /var/log/corosync/corosync.log
        timestamp: on
    }
    
    EOF"
    

    Bagian totem mengonfigurasi protokol Totem untuk komunikasi yang andal. Corosync menggunakan komunikasi ini untuk mengontrol keanggotaan cluster, dan menentukan cara anggota cluster harus berkomunikasi satu sama lain.

    Setelan yang penting dalam penyiapan adalah sebagai berikut:

    • transport: Menentukan mode unicast (udpu).
    • Bindnetaddr: Menentukan alamat jaringan yang diikat dengan Corosync.
    • nodelist: Menentukan node dalam cluster, dan cara menjangkaunya—dalam hal ini, node database1 dan database2.
    • quorum/two_node: Secara default, pada cluster dua node, tidak ada node yang akan mencapai kuorum. Anda dapat menggantinya dengan menentukan nilai "1" untuk two_node di bagian quorum.

    Dengan penyiapan ini, Anda dapat mengonfigurasi cluster dan menyiapkannya nanti saat Anda menambahkan node ketiga yang akan menjadi perangkat kuorum.

  10. Buat direktori layanan untuk corosync:

    sudo mkdir -p /etc/corosync/service.d
    
  11. Konfigurasi corosync untuk mengetahui Pacemaker:

    sudo bash -c 'cat <<EOF  > /etc/corosync/service.d/pcmk
    service {
        name: pacemaker
        ver: 1
    }
    EOF'
    
  12. Aktifkan layanan corosync secara default:

    sudo bash -c 'cat <<EOF  > /etc/default/corosync
    # Path to corosync.conf
    COROSYNC_MAIN_CONFIG_FILE=/etc/corosync/corosync.conf
    # Path to authfile
    COROSYNC_TOTEM_AUTHKEY_FILE=/etc/corosync/authkey
    # Enable service by default
    START=yes
    EOF'
    
  13. Mulai ulang layanan corosync dan pacemaker:

    sudo service corosync restart
    sudo service pacemaker restart
    
  14. Instal paket perangkat quorum Corosync:

    sudo apt -y install corosync-qdevice
    
  15. Instal skrip shell untuk menangani peristiwa kegagalan DRBD:

    sudo bash -c 'cat << 'EOF'  > /var/lib/pacemaker/drbd_cleanup.sh
    #!/bin/sh
    if [ -z \$CRM_alert_version ]; then
        echo "\$0 must be run by Pacemaker version 1.1.15 or later"
        exit 0
    fi
    
    tstamp="\$CRM_alert_timestamp: "
    
    case \$CRM_alert_kind in
        resource)
            if [ \${CRM_alert_interval} = "0" ]; then
                CRM_alert_interval=""
            else
                CRM_alert_interval=" (\${CRM_alert_interval})"
            fi
    
            if [ \${CRM_alert_target_rc} = "0" ]; then
                CRM_alert_target_rc=""
            else
                CRM_alert_target_rc=" (target: \${CRM_alert_target_rc})"
            fi
    
            case \${CRM_alert_desc} in
                Cancelled) ;;
                *)
                    echo "\${tstamp}Resource operation "\${CRM_alert_task}\${CRM_alert_interval}" for "\${CRM_alert_rsc}" on "\${CRM_alert_node}": \${CRM_alert_desc}\${CRM_alert_target_rc}" >> "\${CRM_alert_recipient}"
                    if [ "\${CRM_alert_task}" = "stop" ] && [ "\${CRM_alert_desc}" = "Timed Out" ]; then
                        echo "Executing recovering..." >> "\${CRM_alert_recipient}"
                        pcs resource cleanup \${CRM_alert_rsc}
                    fi
                    ;;
            esac
            ;;
        *)
            echo "\${tstamp}Unhandled \$CRM_alert_kind alert" >> "\${CRM_alert_recipient}"
            env | grep CRM_alert >> "\${CRM_alert_recipient}"
            ;;
    esac
    EOF'
    sudo chmod 0755 /var/lib/pacemaker/drbd_cleanup.sh
    sudo touch /var/log/pacemaker_drbd_file.log
    sudo chown hacluster:haclient /var/log/pacemaker_drbd_file.log
    

Menginstal MySQL di database2

  1. Hubungkan ke instance database2 melalui SSH.
  2. Update repositori APT dengan paket MySQL 5.6:

    sudo bash -c 'cat <<EOF  > /etc/apt/sources.list.d/mysql.list
    deb http://repo.mysql.com/apt/debian/ stretch mysql-5.6\ndeb-src http://repo.mysql.com/apt/debian/ stretch mysql-5.6
    EOF'
    
  3. Tambahkan kunci GPG ke repositori APT:

    wget -O /tmp/RPM-GPG-KEY-mysql https://repo.mysql.com/RPM-GPG-KEY-mysql
    sudo apt-key add /tmp/RPM-GPG-KEY-mysql
    
  4. Perbarui daftar paket:

    sudo apt update
    
  5. Instal server MySQL:

    sudo apt -y install mysql-server
    

    Saat diminta memasukkan sandi, masukkan DRBDha2.

  6. Hentikan server MySQL:

    sudo /etc/init.d/mysql stop
    
  7. Buat file konfigurasi MySQL:

    sudo bash -c 'cat <<EOF  > /etc/mysql/mysql.conf.d/my.cnf
    [mysqld]
    bind-address = 0.0.0.0  # You may want to listen at localhost at the beginning
    datadir = /var/lib/mysql
    tmpdir = /srv/tmp
    user = mysql
    EOF'
    
  8. Hapus data di bagian /var/lib/mysql dan tambahkan link simbolis ke target direktori pemasangan untuk volume DRBD yang direplikasi. Volume DRBD (/dev/drbd0) akan dipasang di /srv hanya jika terjadi failover.

    sudo rm -rf /var/lib/mysql
    sudo ln -s /srv/mysql /var/lib/mysql
    
  9. Nonaktifkan startup MySQL otomatis, yang ditangani oleh pengelolaan resource cluster:

    sudo update-rc.d -f mysql disable
    

Menginstal Pacemaker di database2

  1. Muat variabel metadata dari file .varsrc:

    source ~/.varsrc
    
  2. Instal Pacemaker:

    sudo apt -y install pcs
    
  3. Pindahkan file authkey Corosync yang Anda salin sebelumnya ke /etc/corosync/:

    sudo mv ~/authkey /etc/corosync/
    sudo chown root: /etc/corosync/authkey
    sudo chmod 400 /etc/corosync/authkey
    
  4. Aktifkan pcsd, corosync, dan pacemaker saat sistem dimulai di instance standby:

    sudo update-rc.d -f pcsd enable
    sudo update-rc.d -f corosync enable
    sudo update-rc.d -f pacemaker enable
    
  5. Konfigurasikan corosync untuk dimulai sebelum pacemaker:

    sudo update-rc.d corosync defaults 20 20
    sudo update-rc.d pacemaker defaults 30 10
    
  6. Menetapkan sandi pengguna cluster untuk autentikasi. Sandinya sama dengan sandi (haCLUSTER3) yang Anda gunakan untuk instance database1.

    sudo bash -c "echo  hacluster:haCLUSTER3 | chpasswd"
    
  7. Membuat corosync file konfigurasi:

    sudo bash -c "cat <<EOF  > /etc/corosync/corosync.conf
    
    totem {
        version: 2
        cluster_name: mysql_cluster
        transport: udpu
        interface {
            ringnumber: 0
            Bindnetaddr: ${DATABASE2_INSTANCE_IP}
            broadcast: yes
            mcastport: 5405
        }
    }
    quorum {
        provider: corosync_votequorum
        two_node: 1
    }
    nodelist {
        node {
            ring0_addr: ${DATABASE1_INSTANCE_NAME}
            name: ${DATABASE1_INSTANCE_NAME}
            nodeid: 1
        }
        node {
            ring0_addr: ${DATABASE2_INSTANCE_NAME}
            name: ${DATABASE2_INSTANCE_NAME}
            nodeid: 2
        }
    }
    logging {
        to_logfile: yes
        logfile: /var/log/corosync/corosync.log
    timestamp: on
    }
    EOF"
    
  8. Membuat direktori layanan Corosync:

    sudo mkdir /etc/corosync/service.d
    
  9. Konfigurasi corosync untuk mengetahui Pacemaker:

    sudo bash -c 'cat <<EOF  > /etc/corosync/service.d/pcmk
    service {
    name: pacemaker
    ver: 1
    }
    EOF'
    
  10. Aktifkan layanan corosync secara default:

    sudo bash -c 'cat <<EOF  > /etc/default/corosync
    # Path to corosync.conf
    COROSYNC_MAIN_CONFIG_FILE=/etc/corosync/corosync.conf
    # Path to authfile
    COROSYNC_TOTEM_AUTHKEY_FILE=/etc/corosync/authkey
    # Enable service by default
    START=yes
    EOF'
    
  11. Mulai ulang layanan corosync dan pacemaker:

    sudo service corosync restart
    sudo service pacemaker restart
    
  12. Instal paket perangkat quorum Corosync:

    sudo apt -y install corosync-qdevice
    
  13. Instal skrip shell untuk menangani peristiwa kegagalan DRBD:

    sudo bash -c 'cat << 'EOF'  > /var/lib/pacemaker/drbd_cleanup.sh
    #!/bin/sh
    if [ -z \$CRM_alert_version ]; then
        echo "\$0 must be run by Pacemaker version 1.1.15 or later"
        exit 0
    fi
    
    tstamp="\$CRM_alert_timestamp: "
    
    case \$CRM_alert_kind in
        resource)
            if [ \${CRM_alert_interval} = "0" ]; then
                CRM_alert_interval=""
            else
                CRM_alert_interval=" (\${CRM_alert_interval})"
            fi
    
            if [ \${CRM_alert_target_rc} = "0" ]; then
                CRM_alert_target_rc=""
            else
                CRM_alert_target_rc=" (target: \${CRM_alert_target_rc})"
            fi
    
            case \${CRM_alert_desc} in
                Cancelled) ;;
                *)
                    echo "\${tstamp}Resource operation "\${CRM_alert_task}\${CRM_alert_interval}" for "\${CRM_alert_rsc}" on "\${CRM_alert_node}": \${CRM_alert_desc}\${CRM_alert_target_rc}" >> "\${CRM_alert_recipient}"
                    if [ "\${CRM_alert_task}" = "stop" ] && [ "\${CRM_alert_desc}" = "Timed Out" ]; then
                        echo "Executing recovering..." >> "\${CRM_alert_recipient}"
                        pcs resource cleanup \${CRM_alert_rsc}
                    fi
                    ;;
            esac
            ;;
        *)
            echo "\${tstamp}Unhandled \$CRM_alert_kind alert" >> "\${CRM_alert_recipient}"
            env | grep CRM_alert >> "\${CRM_alert_recipient}"
            ;;
    esac
    EOF'
    sudo chmod 0755 /var/lib/pacemaker/drbd_cleanup.sh
    sudo touch /var/log/pacemaker_drbd_file.log
    sudo chown hacluster:haclient /var/log/pacemaker_drbd_file.log
    
  14. Periksa status cluster Corosync:

    sudo corosync-cmapctl | grep "members...ip"
    

    Outputnya akan terlihat seperti ini:

    runtime.totem.pg.mrp.srp.members.1.ip (str) = r(0) ip(10.140.0.2)
    runtime.totem.pg.mrp.srp.members.2.ip (str) = r(0) ip(10.140.0.3)
    

Memulai cluster

  1. Hubungkan ke instance database2 melalui SSH.
  2. Muat variabel metadata dari file .varsrc:

    source ~/.varsrc
    
  3. Lakukan autentikasi terhadap node cluster:

    sudo pcs cluster auth --name mysql_cluster ${DATABASE1_INSTANCE_NAME} ${DATABASE2_INSTANCE_NAME} -u hacluster -p haCLUSTER3
    
  4. Mulai cluster:

    sudo pcs cluster start --all
    
  5. Verifikasi status cluster:

    sudo pcs status
    

    Outputnya akan terlihat seperti ini:

    Cluster name: mysql_cluster
    WARNING: no stonith devices and stonith-enabled is not false
    Stack: corosync
    Current DC: database2 (version 1.1.16-94ff4df) - partition with quorum
    Last updated: Sat Nov  3 07:24:53 2018
    Last change: Sat Nov  3 07:17:17 2018 by hacluster via crmd on database2
    
    2 nodes configured
    0 resources configured
    
    Online: [ database1 database2 ]
    
    No resources
    
    Daemon Status:
      corosync: active/enabled
      pacemaker: active/enabled
      pcsd: active/enabled
    

Mengonfigurasi Pacemaker untuk mengelola resource cluster

Selanjutnya, Anda akan mengonfigurasi Pacemaker dengan resource DRBD, disk, MySQL, dan kuorum.

  1. Hubungkan ke instance database1 melalui SSH.
  2. Gunakan utilitas pcs Pacemaker untuk mengantrekan beberapa perubahan ke dalam file, lalu kirimkan perubahan tersebut ke Cluster Information Base (CIB) secara atomik:

    sudo pcs cluster cib clust_cfg
    
  3. Nonaktifkan STONITH, karena Anda akan men-deploy perangkat kuorum nanti:

    sudo pcs -f clust_cfg property set stonith-enabled=false
    
  4. Menonaktifkan setelan terkait kuorum. Anda akan menyiapkan node perangkat kuorum nanti.

    sudo pcs -f clust_cfg property set no-quorum-policy=stop
    
  5. Mencegah Pacemaker bergerak kembali ke aset setelah pemulihan:

    sudo pcs -f clust_cfg resource defaults resource-stickiness=200
    
  6. Buat resource DRBD di cluster:

    sudo pcs -f clust_cfg resource create mysql_drbd ocf:linbit:drbd \
        drbd_resource=r0 \
        op monitor role=Master interval=110 timeout=30 \
        op monitor role=Slave interval=120 timeout=30 \
        op start timeout=120 \
        op stop timeout=60
    
  7. Pastikan hanya satu peran utama yang ditetapkan ke resource DRBD:

    sudo pcs -f clust_cfg resource master primary_mysql mysql_drbd \
        master-max=1 master-node-max=1 \
        clone-max=2 clone-node-max=1 \
        notify=true
    
  8. Buat resource sistem file untuk memasang disk DRBD:

    sudo pcs -f clust_cfg resource create mystore_FS Filesystem \
        device="/dev/drbd0" \
        directory="/srv" \
        fstype="ext4"
    
  9. Konfigurasikan cluster untuk menempatkan resource DRBD bersama dengan resource disk pada VM yang sama:

    sudo pcs -f clust_cfg constraint colocation add mystore_FS with primary_mysql INFINITY with-rsc-role=Master
    
  10. Konfigurasikan cluster untuk menampilkan resource disk hanya setelah primer DRBD dipromosikan:

    sudo pcs -f clust_cfg constraint order promote primary_mysql then start mystore_FS
    
  11. Membuat layanan MySQL:

    sudo pcs -f clust_cfg resource create mysql_service ocf:heartbeat:mysql \
        binary="/usr/bin/mysqld_safe" \
        config="/etc/mysql/my.cnf" \
        datadir="/var/lib/mysql" \
        pid="/var/run/mysqld/mysql.pid" \
        socket="/var/run/mysqld/mysql.sock" \
        additional_parameters="--bind-address=0.0.0.0" \
        op start timeout=60s \
        op stop timeout=60s \
        op monitor interval=20s timeout=30s
    
  12. Konfigurasikan cluster untuk menempatkan resource MySQL bersama dengan resource disk di VM yang sama:

    sudo pcs -f clust_cfg constraint colocation add mysql_service with mystore_FS INFINITY
    
  13. Pastikan sistem file DRBD mendahului layanan MySQL dalam urutan startup:

    sudo pcs -f clust_cfg constraint order mystore_FS then mysql_service
    
  14. Buat agen pemberitahuan, lalu tambahkan patch ke file log sebagai penerimanya:

    sudo pcs -f clust_cfg alert create id=drbd_cleanup_file description="Monitor DRBD events and perform post cleanup" path=/var/lib/pacemaker/drbd_cleanup.sh
    sudo pcs -f clust_cfg alert recipient add drbd_cleanup_file id=logfile value=/var/log/pacemaker_drbd_file.log
    
  15. Commit perubahan ke cluster:

    sudo pcs cluster cib-push clust_cfg
    
  16. Verifikasi bahwa semua resource online:

    sudo pcs status
    

    Outputnya akan terlihat seperti ini:

    Online: [ database1 database2 ]
    
    Full list of resources:
     Master/Slave Set: primary_mysql [mysql_drbd]
         Masters: [ database1 ]
         Slaves: [ database2 ]
     mystore_FS     (ocf::heartbeat:Filesystem):    Started database1
     mysql_service  (ocf::heartbeat:mysql): Started database1
    

Mengonfigurasi perangkat kuorum

  1. Hubungkan ke instance qdevice melalui SSH.
  2. Instal pcs dan corosync-qnetd:

    sudo apt update && sudo apt -y install pcs corosync-qnetd
    
  3. Mulai layanan daemon sistem konfigurasi Pacemaker/Corosync (pcsd) dan aktifkan saat sistem dimulai:

    sudo service pcsd start
    sudo update-rc.d pcsd enable
    
  4. Setel sandi pengguna cluster (haCLUSTER3) untuk autentikasi:

    sudo bash -c "echo  hacluster:haCLUSTER3 | chpasswd"
    
  5. Periksa status perangkat kuorum:

    sudo pcs qdevice status net --full
    

    Outputnya akan terlihat seperti ini:

    QNetd address:                  *:5403
    TLS:                            Supported (client certificate required)
    Connected clients:              0
    Connected clusters:             0
    Maximum send/receive size:      32768/32768 bytes
    

Mengonfigurasi setelan perangkat kuorum pada database1

  1. Hubungkan ke node database1 melalui SSH.
  2. Muat variabel metadata dari file .varsrc:

    source ~/.varsrc
    
  3. Autentikasi node perangkat kuorum untuk cluster:

    sudo pcs cluster auth --name mysql_cluster ${QUORUM_INSTANCE_NAME} -u hacluster -p haCLUSTER3
    
  4. Tambahkan perangkat kuorum ke cluster. Gunakan algoritma ffsplit, yang menjamin bahwa node aktif akan ditentukan berdasarkan 50% suara atau lebih:

    sudo pcs quorum device add model net host=${QUORUM_INSTANCE_NAME} algorithm=ffsplit
    
  5. Tambahkan setelan kuorum ke corosync.conf:

    sudo bash -c "cat <<EOF  > /etc/corosync/corosync.conf
    
    totem {
        version: 2
        cluster_name: mysql_cluster
        transport: udpu
        interface {
            ringnumber: 0
            Bindnetaddr: ${DATABASE1_INSTANCE_IP}
            broadcast: yes
            mcastport: 5405
        }
    }
    
    quorum {
        provider: corosync_votequorum
        device {
            votes: 1
            model: net
            net {
                tls: on
                host: ${QUORUM_INSTANCE_NAME}
                algorithm: ffsplit
            }
        }
    }
    
    nodelist {
        node {
            ring0_addr: ${DATABASE1_INSTANCE_NAME}
            name: ${DATABASE1_INSTANCE_NAME}
            nodeid: 1
        }
        node {
            ring0_addr: ${DATABASE2_INSTANCE_NAME}
            name: ${DATABASE2_INSTANCE_NAME}
            nodeid: 2
        }
    }
    
    logging {
        to_logfile: yes
        logfile: /var/log/corosync/corosync.log
        timestamp: on
    }
    
    EOF"
    
  6. Mulai ulang layanan corosync untuk memuat ulang setelan perangkat kuorum yang baru:

    sudo service corosync restart
    
  7. Mulai daemon perangkat kuorum corosync dan jalankan saat sistem dimulai:

    sudo service corosync-qdevice start
    sudo update-rc.d corosync-qdevice defaults
    

Mengonfigurasi setelan perangkat kuorum pada database2

  1. Hubungkan ke node database2 melalui SSH.
  2. Muat variabel metadata dari file .varsrc:

    source ~/.varsrc
    
  3. Tambahkan setelan kuorum ke corosync.conf:

    sudo bash -c "cat <<EOF  > /etc/corosync/corosync.conf
    
    totem {
        version: 2
        cluster_name: mysql_cluster
        transport: udpu
        interface {
            ringnumber: 0
            Bindnetaddr: ${DATABASE2_INSTANCE_IP}
            broadcast: yes
            mcastport: 5405
        }
    }
    
    quorum {
        provider: corosync_votequorum
        device {
            votes: 1
            model: net
            net {
                tls: on
                host: ${QUORUM_INSTANCE_NAME}
                algorithm: ffsplit
            }
        }
    }
    
    nodelist {
        node {
            ring0_addr: ${DATABASE1_INSTANCE_NAME}
            name: ${DATABASE1_INSTANCE_NAME}
            nodeid: 1
        }
        node {
            ring0_addr: ${DATABASE2_INSTANCE_NAME}
            name: ${DATABASE2_INSTANCE_NAME}
            nodeid: 2
        }
    }
    
    logging {
        to_logfile: yes
        logfile: /var/log/corosync/corosync.log
        timestamp: on
    }
    
    EOF"
    
  4. Mulai ulang layanan corosync untuk memuat ulang setelan perangkat kuorum yang baru:

    sudo service corosync restart
    
  5. Mulai daemon perangkat quorum Corosync dan konfigurasi untuk menampilkannya saat sistem dimulai:

    sudo service corosync-qdevice start
    sudo update-rc.d corosync-qdevice defaults
    

Memverifikasi status cluster

Langkah selanjutnya adalah memverifikasi bahwa resource cluster sudah online.

  1. Hubungkan ke instance database1 melalui SSH.
  2. Verifikasi status cluster:

    sudo pcs status
    

    Outputnya akan terlihat seperti ini:

    Cluster name: mysql_cluster
    Stack: corosync
    Current DC: database1 (version 1.1.16-94ff4df) - partition with quorum
    Last updated: Sun Nov  4 01:49:18 2018
    Last change: Sat Nov  3 15:48:21 2018 by root via cibadmin on database1
    
    2 nodes configured
    4 resources configured
    
    Online: [ database1 database2 ]
    
    Full list of resources:
    
     Master/Slave Set: primary_mysql [mysql_drbd]
         Masters: [ database1 ]
         Slaves: [ database2 ]
     mystore_FS     (ocf::heartbeat:Filesystem):    Started database1
     mysql_service  (ocf::heartbeat:mysql): Started database1
    
    Daemon Status:
      corosync: active/enabled
      pacemaker: active/enabled
      pcsd: active/enabled
    
  3. Tunjukkan status kuorum:

    sudo pcs quorum status
    

    Outputnya akan terlihat seperti ini:

    Quorum information
    ------------------
    Date:             Sun Nov  4 01:48:25 2018
    Quorum provider:  corosync_votequorum
    Nodes:            2
    Node ID:          1
    Ring ID:          1/24
    Quorate:          Yes
    
    Votequorum information
    ----------------------
    Expected votes:   3
    Highest expected: 3
    Total votes:      3
    Quorum:           2
    Flags:            Quorate Qdevice
    
    Membership information
    ----------------------
        Nodeid      Votes    Qdevice Name
             1          1    A,V,NMW database1 (local)
             2          1    A,V,NMW database2
             0          1            Qdevice
    
  4. Tampilkan status perangkat kuorum:

    sudo pcs quorum device status
    

    Outputnya akan terlihat seperti ini:

    Qdevice information
    -------------------
    Model:                  Net
    Node ID:                1
    Configured node list:
        0   Node ID = 1
        1   Node ID = 2
    Membership node list:   1, 2
    
    Qdevice-net information
    ----------------------
    Cluster name:           mysql_cluster
    QNetd host:             qdevice:5403
    Algorithm:              Fifty-Fifty split
    Tie-breaker:            Node with lowest node ID
    State:                  Connected
    

Mengonfigurasi load balancer internal sebagai IP cluster

  1. Buka Cloud Shell:

    BUKA Cloud Shell

  2. Buat grup instance tidak terkelola dan tambahkan instance database1 ke dalamnya:

    gcloud compute instance-groups unmanaged create ${DATABASE1_INSTANCE_NAME}-instance-group \
        --zone=${DATABASE1_INSTANCE_ZONE} \
        --description="${DATABASE1_INSTANCE_NAME} unmanaged instance group"
    
    gcloud compute instance-groups unmanaged add-instances ${DATABASE1_INSTANCE_NAME}-instance-group \
        --zone=${DATABASE1_INSTANCE_ZONE} \
        --instances=${DATABASE1_INSTANCE_NAME}
    
  3. Buat grup instance tidak terkelola dan tambahkan instance database2 ke dalamnya:

    gcloud compute instance-groups unmanaged create ${DATABASE2_INSTANCE_NAME}-instance-group \
        --zone=${DATABASE2_INSTANCE_ZONE} \
        --description="${DATABASE2_INSTANCE_NAME} unmanaged instance group"
    
    gcloud compute instance-groups unmanaged add-instances ${DATABASE2_INSTANCE_NAME}-instance-group \
        --zone=${DATABASE2_INSTANCE_ZONE} \
        --instances=${DATABASE2_INSTANCE_NAME}
    
  4. Buat health check untuk port 3306:

    gcloud compute health-checks create tcp mysql-backend-healthcheck \
        --port 3306
    
  5. Buat layanan backend internal regional:

    gcloud compute backend-services create mysql-ilb \
        --load-balancing-scheme internal \
        --region ${CLUSTER_REGION} \
        --health-checks mysql-backend-healthcheck \
        --protocol tcp
    
  6. Tambahkan dua grup instance sebagai backend ke layanan backend:

    gcloud compute backend-services add-backend mysql-ilb \
        --instance-group ${DATABASE1_INSTANCE_NAME}-instance-group \
        --instance-group-zone ${DATABASE1_INSTANCE_ZONE} \
        --region ${CLUSTER_REGION}
    
    gcloud compute backend-services add-backend mysql-ilb \
        --instance-group ${DATABASE2_INSTANCE_NAME}-instance-group \
        --instance-group-zone ${DATABASE2_INSTANCE_ZONE} \
        --region ${CLUSTER_REGION}
    
  7. Buat aturan penerusan untuk load balancer:

    gcloud compute forwarding-rules create mysql-ilb-forwarding-rule \
        --load-balancing-scheme internal \
        --ports 3306 \
        --network default \
        --subnet default \
        --region ${CLUSTER_REGION} \
        --address ${ILB_IP} \
        --backend-service mysql-ilb
    
  8. Buat aturan firewall untuk mengizinkan health check load balancer internal:

    gcloud compute firewall-rules create allow-ilb-healthcheck \
        --direction=INGRESS --network=default \
        --action=ALLOW --rules=tcp:3306 \
        --source-ranges=130.211.0.0/22,35.191.0.0/16 --target-tags=mysql
    
  9. Untuk memeriksa status load balancer, buka halaman Load balancing di Konsol Google Cloud.

    BUKA HALAMAN LOAD BALANCING

  10. Klik mysql-ilb:

    gambar

    Karena cluster hanya mengizinkan satu instance untuk menjalankan MySQL pada waktu tertentu, hanya satu instance yang responsif dari perspektif load balancer internal.

    gambar

Menghubungkan ke cluster dari klien MySQL

  1. Hubungkan ke instance mysql-client melalui SSH.
  2. Perbarui definisi paket:

    sudo apt-get update
    
  3. Instal klien MySQL:

    sudo apt-get install -y mysql-client
    
  4. Buat file skrip yang membuat dan mengisi tabel dengan data sampel:

    cat <<EOF > db_creation.sql
    CREATE DATABASE source_db;
    use source_db;
    CREATE TABLE source_table
    (
        id BIGINT NOT NULL AUTO_INCREMENT,
        timestamp timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
        event_data float DEFAULT NULL,
        PRIMARY KEY (id)
    );
    DELIMITER $$
    CREATE PROCEDURE simulate_data()
    BEGIN
    DECLARE i INT DEFAULT 0;
    WHILE i < 100 DO
        INSERT INTO source_table (event_data) VALUES (ROUND(RAND()*15000,2));
        SET i = i + 1;
    END WHILE;
    END$$
    DELIMITER ;
    CALL simulate_data()
    EOF
    
  5. Buat tabel:

    ILB_IP=$(curl -s "http://metadata.google.internal/computeMetadata/v1/instance/attributes/ILB_IP" -H "Metadata-Flavor: Google")
    mysql -u root -pDRBDha2 "-h${ILB_IP}" < db_creation.sql
    

Menguji cluster

Untuk menguji kemampuan HA dari cluster yang di-deploy, Anda dapat melakukan pengujian berikut:

  • Matikan instance database1 untuk menguji apakah database master dapat beralih ke instance database2 atau tidak.
  • Mulai instance database1 untuk melihat apakah database1 berhasil bergabung kembali ke cluster.
  • Matikan instance database2 untuk menguji apakah database master dapat beralih ke instance database1 atau tidak.
  • Mulai instance database2 untuk melihat apakah database2 berhasil bergabung kembali dengan cluster dan apakah instance database1 masih mempertahankan peran master.
  • Buat partisi jaringan antara database1 dan database2 untuk menyimulasikan masalah split-brain.

  1. Buka Cloud Shell:

    BUKA Cloud Shell

  2. Hentikan instance database1:

    gcloud compute instances stop ${DATABASE1_INSTANCE_NAME} \
        --zone=${DATABASE1_INSTANCE_ZONE}
    
  3. Periksa status cluster:

    gcloud compute ssh ${DATABASE2_INSTANCE_NAME} \
        --zone=${DATABASE2_INSTANCE_ZONE} \
        --command="sudo pcs status"
    

    Outputnya akan terlihat seperti berikut. Pastikan bahwa perubahan konfigurasi yang Anda lakukan telah terjadi:

    2 nodes configured
    4 resources configured
    
    Online: [ database2 ]
    OFFLINE: [ database1 ]
    
    Full list of resources:
    
     Master/Slave Set: primary_mysql [mysql_drbd]
         Masters: [ database2 ]
         Stopped: [ database1 ]
     mystore_FS     (ocf::heartbeat:Filesystem):    Started database2
     mysql_service  (ocf::heartbeat:mysql): Started database2
    
    Daemon Status:
      corosync: active/enabled
      pacemaker: active/enabled
      pcsd: active/enabled
    
  4. Mulai instance database1:

    gcloud compute instances start ${DATABASE1_INSTANCE_NAME} \
        --zone=${DATABASE1_INSTANCE_ZONE}
    
  5. Periksa status cluster:

    gcloud compute ssh ${DATABASE1_INSTANCE_NAME} \
        --zone=${DATABASE1_INSTANCE_ZONE} \
        --command="sudo pcs status"
    

    Outputnya akan terlihat seperti ini:

    2 nodes configured
    4 resources configured
    
    Online: [ database1 database2 ]
    
    Full list of resources:
    
     Master/Slave Set: primary_mysql [mysql_drbd]
         Masters: [ database2 ]
         Slaves: [ database1 ]
     mystore_FS     (ocf::heartbeat:Filesystem):    Started database2
     mysql_service  (ocf::heartbeat:mysql): Started database2
    
    Daemon Status:
      corosync: active/enabled
      pacemaker: active/enabled
      pcsd: active/enabled
    
  6. Hentikan instance database2:

    gcloud compute instances stop ${DATABASE2_INSTANCE_NAME} \
        --zone=${DATABASE2_INSTANCE_ZONE}
    
  7. Periksa status cluster:

    gcloud compute ssh ${DATABASE1_INSTANCE_NAME} \
        --zone=${DATABASE1_INSTANCE_ZONE} \
        --command="sudo pcs status"
    

    Outputnya akan terlihat seperti ini:

    2 nodes configured
    4 resources configured
    
    Online: [ database1 ]
    OFFLINE: [ database2 ]
    
    Full list of resources:
    
     Master/Slave Set: primary_mysql [mysql_drbd]
         Masters: [ database1 ]
         Stopped: [ database2 ]
     mystore_FS     (ocf::heartbeat:Filesystem):    Started database1
     mysql_service  (ocf::heartbeat:mysql): Started database1
    
    Daemon Status:
      corosync: active/enabled
      pacemaker: active/enabled
      pcsd: active/enabled
    
  8. Mulai instance database2:

    gcloud compute instances start ${DATABASE2_INSTANCE_NAME} \
        --zone=${DATABASE2_INSTANCE_ZONE}
    
  9. Periksa status cluster:

    gcloud compute ssh ${DATABASE1_INSTANCE_NAME} \
        --zone=${DATABASE1_INSTANCE_ZONE} \
        --command="sudo pcs status"
    

    Outputnya akan terlihat seperti ini:

    2 nodes configured
    4 resources configured
    
    Online: [ database1 database2 ]
    
    Full list of resources:
    
     Master/Slave Set: primary_mysql [mysql_drbd]
         Masters: [ database1 ]
         Slaves: [ database2 ]
     mystore_FS     (ocf::heartbeat:Filesystem):    Started database1
     mysql_service  (ocf::heartbeat:mysql): Started database1
    
    Daemon Status:
      corosync: active/enabled
      pacemaker: active/enabled
      pcsd: active/enabled
    
  10. Buat partisi jaringan antara database1 dan database2:

    gcloud compute firewall-rules create block-comms \
        --description="no MySQL communications" \
        --action=DENY \
        --rules=all \
        --source-tags=mysql \
        --target-tags=mysql \
        --priority=800
    
  11. Setelah beberapa menit, periksa status cluster. Perhatikan cara database1 mempertahankan peran utamanya, karena kebijakan kuorum adalah node ID terendah terlebih dahulu dalam situasi partisi jaringan. Sementara itu, layanan MySQL database2 dihentikan. Mekanisme kuorum ini menghindari masalah split-brain saat partisi jaringan terjadi.

    gcloud compute ssh ${DATABASE1_INSTANCE_NAME} \
        --zone=${DATABASE1_INSTANCE_ZONE} \
        --command="sudo pcs status"
    

    Outputnya akan terlihat seperti ini:

    2 nodes configured
    4 resources configured
    
    Online: [ database1 ]
    OFFLINE: [ database2 ]
    
    Full list of resources:
     Master/Slave Set: primary_mysql [mysql_drbd]
         Masters: [ database1 ]
         Stopped: [ database2 ]
     mystore_FS     (ocf::heartbeat:Filesystem):    Started database1
     mysql_service  (ocf::heartbeat:mysql): Started database1
    
  12. Hapus aturan firewall jaringan untuk menghapus partisi jaringan. (Tekan Y saat diminta.)

    gcloud compute firewall-rules delete block-comms
    
  13. Verifikasi bahwa status cluster kembali normal:

    gcloud compute ssh ${DATABASE1_INSTANCE_NAME} \
        --zone=${DATABASE1_INSTANCE_ZONE} \
        --command="sudo pcs status"
    

    Outputnya akan terlihat seperti ini:

    2 nodes configured
    4 resources configured
    
    Online: [ database1 database2 ]
    
    Full list of resources:
    
     Master/Slave Set: primary_mysql [mysql_drbd]
         Masters: [ database1 ]
         Slaves: [ database2 ]
     mystore_FS     (ocf::heartbeat:Filesystem):    Started database1
     mysql_service  (ocf::heartbeat:mysql): Started database1
    
  14. Hubungkan ke instance mysql-client melalui SSH.

  15. Di shell Anda, jalankan kueri tabel yang telah Anda buat sebelumnya:

    ILB_IP=$(curl -s "http://metadata.google.internal/computeMetadata/v1/instance/attributes/ILB_IP" -H "Metadata-Flavor: Google")
    
    mysql -uroot "-h${ILB_IP}" -pDRBDha2 -e "select * from source_db.source_table LIMIT 10"
    

    Output harus mencantumkan 10 data dengan bentuk berikut, yang memverifikasi konsistensi data dalam cluster:

    +----+---------------------+------------+
    | id | timestamp           | event_data |
    +----+---------------------+------------+
    |  1 | 2018-11-27 21:00:09 |    1279.06 |
    |  2 | 2018-11-27 21:00:09 |    4292.64 |
    |  3 | 2018-11-27 21:00:09 |    2626.01 |
    |  4 | 2018-11-27 21:00:09 |     252.13 |
    |  5 | 2018-11-27 21:00:09 |    8382.64 |
    |  6 | 2018-11-27 21:00:09 |    11156.8 |
    |  7 | 2018-11-27 21:00:09 |      636.1 |
    |  8 | 2018-11-27 21:00:09 |    14710.1 |
    |  9 | 2018-11-27 21:00:09 |    11642.1 |
    | 10 | 2018-11-27 21:00:09 |    14080.3 |
    +----+---------------------+------------+
    

Urutan failover

Jika node utama dalam cluster turun, urutan failover akan terlihat seperti ini:

  1. Perangkat kuorum dan node standby kehilangan konektivitas dengan node utama.
  2. Perangkat kuorum memberi suara untuk node standby, dan node standby memilih node itu sendiri.
  3. Kuorum diperoleh oleh node standby.
  4. Node standby dipromosikan menjadi node utama.
  5. Node utama baru akan melakukan hal berikut:
    1. Mempromosikan DRBD ke utama
    2. Memasang disk data MySQL dari DRBD
    3. Memulai MySQL
    4. Menjadi responsif untuk load balancer
  6. Load balancer mulai mengirimkan traffic ke node utama baru.

Pembersihan

Menghapus project

  1. Di konsol Google Cloud, buka halaman Manage resource.

    Buka Manage 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 selanjutnya