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.
Mempersiapkan
Di bagian ini, Anda akan menyiapkan akun layanan, membuat variabel lingkungan, dan mencadangkan alamat IP.
Menyiapkan akun layanan untuk instance cluster
Buka Cloud Shell.
Buat akun layanan:
gcloud iam service-accounts create mysql-instance \ --display-name "mysql-instance"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
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" EOFMuat 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.
Di Cloud Shell, buat instance MySQL bernama
database1di zonaasia-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}"Buat instance MySQL bernama
database2di zonaasia-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}"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}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
Di konsol Google Cloud , buka halaman VM instances:
Di baris instance
database1, klik SSH untuk terhubung ke instance.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") EOFMuat variabel metadata dari file:
source ~/.varsrcFormat 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.Instal DRBD:
sudo apt -y install drbd8-utilsBuat file konfigurasi DRBD:
sudo bash -c 'cat <<EOF > /etc/drbd.d/global_common.conf global { usage-count no; } common { protocol C; } EOF'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"Muat modul kernel DRBD:
sudo modprobe drbdHapus konten disk
/dev/sdb:sudo dd if=/dev/zero of=/dev/sdb bs=1k count=1024Buat resource DRBD
r0:sudo drbdadm create-md r0Munculkan DRBD:
sudo drbdadm up r0Nonaktifkan 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.
- Hubungkan ke instance
database2melalui SSH. Buat file
.varsrcuntuk 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") EOFMuat variabel metadata dari file:
source ~/.varsrcFormat disk data:
sudo bash -c "mkfs.ext4 -m 0 -F -E lazy_itable_init=0,lazy_journal_init=0,discard /dev/sdb"Instal paket DRBD:
sudo apt -y install drbd8-utilsBuat file konfigurasi DRBD:
sudo bash -c 'cat <<EOF > /etc/drbd.d/global_common.conf global { usage-count no; } common { protocol C; } EOF'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"Muat modul kernel DRBD:
sudo modprobe drbdKosongkan disk
/dev/sdb:sudo dd if=/dev/zero of=/dev/sdb bs=1k count=1024Buat resource DRBD
r0:sudo drbdadm create-md r0Munculkan DRBD:
sudo drbdadm up r0Nonaktifkan 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
- Hubungkan ke instance
database1melalui SSH. Timpa semua resource
r0di 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/drbd0Verifikasi status DRBD:
sudo cat /proc/drbd | grep ============Outputnya akan terlihat seperti ini:
[===================>] sync'ed:100.0% (208/307188)M
Pasang
/dev/drbdke/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
- Hubungkan ke instance
database1melalui SSH. 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'Tambahkan kunci GPG ke file
repository.srvAPT:wget -O /tmp/RPM-GPG-KEY-mysql https://repo.mysql.com/RPM-GPG-KEY-mysql sudo apt-key add /tmp/RPM-GPG-KEY-mysqlPerbarui daftar paket:
sudo apt updateInstal server MySQL:
sudo apt -y install mysql-serverSaat diminta memasukkan sandi, masukkan
DRBDha2.Hentikan server MySQL:
sudo /etc/init.d/mysql stopBuat 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'Buat direktori sementara untuk server MySQL (dikonfigurasi di
mysql.conf):sudo mkdir /srv/tmp sudo chmod 1777 /srv/tmpPindahkan semua data MySQL ke direktori DRBD
/srv/mysql:sudo mv /var/lib/mysql /srv/mysqlTautkan
/var/lib/mysqlke/srv/mysqlpada bagian volume penyimpanan yang direplikasi DRBD:sudo ln -s /srv/mysql /var/lib/mysqlUbah pemilik
/srv/mysqlmenjadi prosesmysql:sudo chown -R mysql:mysql /srv/mysqlHapus data awal
InnoDBuntuk 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.
Mulai MySQL:
sudo /etc/init.d/mysql startBerikan 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;"Nonaktifkan startup MySQL otomatis, yang ditangani oleh pengelolaan resource cluster:
sudo update-rc.d -f mysql disable
Menginstal Pacemaker pada database1
Muat variabel metadata dari file
.varsrcyang Anda buat sebelumnya:source ~/.varsrcHentikan server MySQL:
sudo /etc/init.d/mysql stopInstal Pacemaker:
sudo apt -y install pcsAktifkan
pcsd,corosync, danpacemakersaat 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 enableKonfigurasikan
corosyncuntuk dimulai sebelumpacemaker:sudo update-rc.d corosync defaults 20 20 sudo update-rc.d pacemaker defaults 30 10Setel sandi pengguna cluster ke
haCLUSTER3untuk autentikasi:sudo bash -c "echo hacluster:haCLUSTER3 | chpasswd"Jalankan skrip
corosync-keygenuntuk membuat kunci otorisasi cluster 128-bit dan tuliskan ke/etc/corosync/authkey:sudo corosync-keygen -lSalin
authkeyke instancedatabase2. Saat dimintai frasa sandi, tekanEnter: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/authkeyBuat 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
totemmengonfigurasi 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, nodedatabase1dandatabase2.quorum/two_node: Secara default, pada cluster dua node, tidak ada node yang akan mencapai kuorum. Anda dapat menggantinya dengan menentukan nilai "1" untuktwo_nodedi bagianquorum.
Dengan penyiapan ini, Anda dapat mengonfigurasi cluster dan menyiapkannya nanti saat Anda menambahkan node ketiga yang akan menjadi perangkat kuorum.
Buat direktori layanan untuk
corosync:sudo mkdir -p /etc/corosync/service.dKonfigurasi
corosyncuntuk mengetahui Pacemaker:sudo bash -c 'cat <<EOF > /etc/corosync/service.d/pcmk service { name: pacemaker ver: 1 } EOF'Aktifkan layanan
corosyncsecara 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'Mulai ulang layanan
corosyncdanpacemaker:sudo service corosync restart sudo service pacemaker restartInstal paket perangkat quorum Corosync:
sudo apt -y install corosync-qdeviceInstal 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
- Hubungkan ke instance
database2melalui SSH. 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'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-mysqlPerbarui daftar paket:
sudo apt updateInstal server MySQL:
sudo apt -y install mysql-serverSaat diminta memasukkan sandi, masukkan
DRBDha2.Hentikan server MySQL:
sudo /etc/init.d/mysql stopBuat 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'Hapus data di bagian
/var/lib/mysqldan tambahkan link simbolis ke target direktori pemasangan untuk volume DRBD yang direplikasi. Volume DRBD (/dev/drbd0) akan dipasang di/srvhanya jika terjadi failover.sudo rm -rf /var/lib/mysql sudo ln -s /srv/mysql /var/lib/mysqlNonaktifkan startup MySQL otomatis, yang ditangani oleh pengelolaan resource cluster:
sudo update-rc.d -f mysql disable
Menginstal Pacemaker di database2
Muat variabel metadata dari file
.varsrc:source ~/.varsrcInstal Pacemaker:
sudo apt -y install pcsPindahkan file
authkeyCorosync yang Anda salin sebelumnya ke/etc/corosync/:sudo mv ~/authkey /etc/corosync/ sudo chown root: /etc/corosync/authkey sudo chmod 400 /etc/corosync/authkeyAktifkan
pcsd,corosync, danpacemakersaat 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 enableKonfigurasikan
corosyncuntuk dimulai sebelumpacemaker:sudo update-rc.d corosync defaults 20 20 sudo update-rc.d pacemaker defaults 30 10Menetapkan sandi pengguna cluster untuk autentikasi. Sandinya sama dengan sandi (
haCLUSTER3) yang Anda gunakan untuk instancedatabase1.sudo bash -c "echo hacluster:haCLUSTER3 | chpasswd"Membuat
corosyncfile 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"Membuat direktori layanan Corosync:
sudo mkdir /etc/corosync/service.dKonfigurasi
corosyncuntuk mengetahui Pacemaker:sudo bash -c 'cat <<EOF > /etc/corosync/service.d/pcmk service { name: pacemaker ver: 1 } EOF'Aktifkan layanan
corosyncsecara 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'Mulai ulang layanan
corosyncdanpacemaker:sudo service corosync restart sudo service pacemaker restartInstal paket perangkat quorum Corosync:
sudo apt -y install corosync-qdeviceInstal 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.logPeriksa 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
- Hubungkan ke instance
database2melalui SSH. Muat variabel metadata dari file
.varsrc:source ~/.varsrcLakukan autentikasi terhadap node cluster:
sudo pcs cluster auth --name mysql_cluster ${DATABASE1_INSTANCE_NAME} ${DATABASE2_INSTANCE_NAME} -u hacluster -p haCLUSTER3Mulai cluster:
sudo pcs cluster start --allVerifikasi status cluster:
sudo pcs statusOutputnya 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.
- Hubungkan ke instance
database1melalui SSH. Gunakan utilitas
pcsPacemaker untuk mengantrekan beberapa perubahan ke dalam file, lalu kirimkan perubahan tersebut ke Cluster Information Base (CIB) secara atomik:sudo pcs cluster cib clust_cfgNonaktifkan STONITH, karena Anda akan men-deploy perangkat kuorum nanti:
sudo pcs -f clust_cfg property set stonith-enabled=falseMenonaktifkan setelan terkait kuorum. Anda akan menyiapkan node perangkat kuorum nanti.
sudo pcs -f clust_cfg property set no-quorum-policy=stopMencegah Pacemaker bergerak kembali ke aset setelah pemulihan:
sudo pcs -f clust_cfg resource defaults resource-stickiness=200Buat 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=60Pastikan 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=trueBuat resource sistem file untuk memasang disk DRBD:
sudo pcs -f clust_cfg resource create mystore_FS Filesystem \ device="/dev/drbd0" \ directory="/srv" \ fstype="ext4"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=MasterKonfigurasikan cluster untuk menampilkan resource disk hanya setelah primer DRBD dipromosikan:
sudo pcs -f clust_cfg constraint order promote primary_mysql then start mystore_FSMembuat 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=30sKonfigurasikan 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 INFINITYPastikan sistem file DRBD mendahului layanan MySQL dalam urutan startup:
sudo pcs -f clust_cfg constraint order mystore_FS then mysql_serviceBuat 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.logCommit perubahan ke cluster:
sudo pcs cluster cib-push clust_cfgVerifikasi bahwa semua resource online:
sudo pcs statusOutputnya 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
- Hubungkan ke instance
qdevicemelalui SSH. Instal
pcsdancorosync-qnetd:sudo apt update && sudo apt -y install pcs corosync-qnetdMulai layanan daemon sistem konfigurasi Pacemaker atau Corosync (
pcsd) dan aktifkan saat sistem dimulai:sudo service pcsd start sudo update-rc.d pcsd enableSetel sandi pengguna cluster (
haCLUSTER3) untuk autentikasi:sudo bash -c "echo hacluster:haCLUSTER3 | chpasswd"Periksa status perangkat kuorum:
sudo pcs qdevice status net --fullOutputnya 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
- Hubungkan ke node
database1melalui SSH. Muat variabel metadata dari file
.varsrc:source ~/.varsrcAutentikasi node perangkat kuorum untuk cluster:
sudo pcs cluster auth --name mysql_cluster ${QUORUM_INSTANCE_NAME} -u hacluster -p haCLUSTER3Tambahkan perangkat kuorum ke cluster. Gunakan algoritma
ffsplit, yang memastikan bahwa node aktif akan ditentukan berdasarkan 50% suara atau lebih:sudo pcs quorum device add model net host=${QUORUM_INSTANCE_NAME} algorithm=ffsplitTambahkan 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"Mulai ulang layanan
corosyncuntuk memuat ulang setelan perangkat kuorum yang baru:sudo service corosync restartMulai daemon perangkat kuorum
corosyncdan jalankan saat sistem dimulai:sudo service corosync-qdevice start sudo update-rc.d corosync-qdevice defaults
Mengonfigurasi setelan perangkat kuorum pada database2
- Hubungkan ke node
database2melalui SSH. Muat variabel metadata dari file
.varsrc:source ~/.varsrcTambahkan 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"Mulai ulang layanan
corosyncuntuk memuat ulang setelan perangkat kuorum yang baru:sudo service corosync restartMulai 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.
- Hubungkan ke instance
database1melalui SSH. Verifikasi status cluster:
sudo pcs statusOutputnya 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/enabledTunjukkan status kuorum:
sudo pcs quorum statusOutputnya 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 QdeviceTampilkan status perangkat kuorum:
sudo pcs quorum device statusOutputnya 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
Buka Cloud Shell:
Buat grup instance tidak terkelola dan tambahkan instance
database1ke 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}Buat grup instance tidak terkelola dan tambahkan instance
database2ke 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}Buat health check untuk
port 3306:gcloud compute health-checks create tcp mysql-backend-healthcheck \ --port 3306Buat layanan backend internal regional:
gcloud compute backend-services create mysql-ilb \ --load-balancing-scheme internal \ --region ${CLUSTER_REGION} \ --health-checks mysql-backend-healthcheck \ --protocol tcpTambahkan 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}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-ilbBuat 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=mysqlUntuk memeriksa status load balancer, buka halaman Load balancing di konsol Google Cloud .
Klik
mysql-ilb:
Karena cluster hanya mengizinkan satu instance untuk menjalankan MySQL pada waktu tertentu, hanya satu instance yang responsif dari perspektif load balancer internal.
Menghubungkan ke cluster dari klien MySQL
- Hubungkan ke instance
mysql-clientmelalui SSH. Perbarui definisi paket:
sudo apt-get updateInstal klien MySQL:
sudo apt-get install -y mysql-clientBuat 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() EOFBuat 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
database1untuk menguji apakah database utama dapat beralih ke instancedatabase2atau tidak. - Mulai instance
database1untuk melihat apakahdatabase1berhasil bergabung kembali ke cluster. - Matikan instance
database2untuk menguji apakah database utama dapat beralih ke instancedatabase1atau tidak. - Mulai instance
database2untuk melihat apakahdatabase2berhasil bergabung kembali dengan cluster dan apakah instancedatabase1masih mempertahankan peran utama. - Buat partisi jaringan antara
database1dandatabase2untuk menyimulasikan masalah split-brain.
Buka Cloud Shell:
Hentikan instance
database1:gcloud compute instances stop ${DATABASE1_INSTANCE_NAME} \ --zone=${DATABASE1_INSTANCE_ZONE}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/enabledMulai instance
database1:gcloud compute instances start ${DATABASE1_INSTANCE_NAME} \ --zone=${DATABASE1_INSTANCE_ZONE}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/enabledHentikan instance
database2:gcloud compute instances stop ${DATABASE2_INSTANCE_NAME} \ --zone=${DATABASE2_INSTANCE_ZONE}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/enabledMulai instance
database2:gcloud compute instances start ${DATABASE2_INSTANCE_NAME} \ --zone=${DATABASE2_INSTANCE_ZONE}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/enabledBuat partisi jaringan antara
database1dandatabase2:gcloud compute firewall-rules create block-comms \ --description="no MySQL communications" \ --action=DENY \ --rules=all \ --source-tags=mysql \ --target-tags=mysql \ --priority=800Setelah beberapa menit, periksa status cluster. Perhatikan cara
database1mempertahankan peran utamanya, karena kebijakan kuorum adalah node ID terendah terlebih dahulu dalam situasi partisi jaringan. Sementara itu, layanan MySQLdatabase2dihentikan. 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 database1Hapus aturan firewall jaringan untuk menghapus partisi jaringan. (Tekan
Ysaat diminta.)gcloud compute firewall-rules delete block-commsVerifikasi 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 database1Hubungkan ke instance
mysql-clientmelalui SSH.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:
- Perangkat kuorum dan node standby kehilangan konektivitas dengan node utama.
- Perangkat kuorum memberi suara untuk node standby, dan node standby memilih node itu sendiri.
- Kuorum diperoleh oleh node standby.
- Node standby dipromosikan menjadi node utama.
- Node utama baru akan melakukan hal berikut:
- Mempromosikan DRBD ke utama
- Memasang disk data MySQL dari DRBD
- Memulai MySQL
- Menjadi responsif untuk load balancer
- Load balancer mulai mengirimkan traffic ke node utama baru.