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.
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
- 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.
-
Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.
-
Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.
-
Aktifkan API Compute Engine.
-
Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.
-
Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.
-
Aktifkan API Compute Engine.
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
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" EOF
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.
Di Cloud Shell, buat instance MySQL bernama
database1
di 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
database2
di 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 Instance VM:
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") EOF
Muat variabel metadata dari file:
source ~/.varsrc
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.Instal DRBD:
sudo apt -y install drbd8-utils
Buat 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 drbd
Hapus konten disk
/dev/sdb
:sudo dd if=/dev/zero of=/dev/sdb bs=1k count=1024
Buat resource DRBD
r0
:sudo drbdadm create-md r0
Munculkan DRBD:
sudo drbdadm up r0
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
.
- Hubungkan ke instance
database2
melalui SSH. 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
Muat variabel metadata dari file:
source ~/.varsrc
Format 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-utils
Buat 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 drbd
Kosongkan disk
/dev/sdb
:sudo dd if=/dev/zero of=/dev/sdb bs=1k count=1024
Buat resource DRBD
r0
:sudo drbdadm create-md r0
Munculkan DRBD:
sudo drbdadm up r0
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
- Hubungkan ke instance
database1
melalui SSH. 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
Verifikasi status DRBD:
sudo cat /proc/drbd | grep ============
Outputnya akan terlihat seperti ini:
[===================>] sync'ed:100.0% (208/307188)M
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
- Hubungkan ke instance
database1
melalui 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.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
Perbarui daftar paket:
sudo apt update
Instal server MySQL:
sudo apt -y install mysql-server
Saat diminta memasukkan sandi, masukkan
DRBDha2
.Hentikan server MySQL:
sudo /etc/init.d/mysql stop
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'
Buat direktori sementara untuk server MySQL (dikonfigurasi di
mysql.conf
):sudo mkdir /srv/tmp sudo chmod 1777 /srv/tmp
Pindahkan semua data MySQL ke direktori DRBD
/srv/mysql
:sudo mv /var/lib/mysql /srv/mysql
Tautkan
/var/lib/mysql
ke/srv/mysql
pada bagian volume penyimpanan yang direplikasi DRBD:sudo ln -s /srv/mysql /var/lib/mysql
Ubah pemilik
/srv/mysql
menjadi prosesmysql
:sudo chown -R mysql:mysql /srv/mysql
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.
Mulai MySQL:
sudo /etc/init.d/mysql start
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;"
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
.varsrc
yang Anda buat sebelumnya:source ~/.varsrc
Hentikan server MySQL:
sudo /etc/init.d/mysql stop
Instal Pacemaker:
sudo apt -y install pcs
Aktifkan
pcsd
,corosync
, danpacemaker
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
Konfigurasikan
corosync
untuk dimulai sebelumpacemaker
:sudo update-rc.d corosync defaults 20 20 sudo update-rc.d pacemaker defaults 30 10
Setel sandi pengguna cluster ke
haCLUSTER3
untuk autentikasi:sudo bash -c "echo hacluster:haCLUSTER3 | chpasswd"
Jalankan skrip
corosync-keygen
untuk membuat kunci otorisasi cluster 128-bit dan tuliskan ke/etc/corosync/authkey
:sudo corosync-keygen -l
Salin
authkey
ke 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/authkey
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, nodedatabase1
dandatabase2
.quorum
/two_node
: Secara default, pada cluster dua node, tidak ada node yang akan mencapai kuorum. Anda dapat menggantinya dengan menentukan nilai "1" untuktwo_node
di 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.d
Konfigurasi
corosync
untuk mengetahui Pacemaker:sudo bash -c 'cat <<EOF > /etc/corosync/service.d/pcmk service { name: pacemaker ver: 1 } EOF'
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'
Mulai ulang layanan
corosync
danpacemaker
:sudo service corosync restart sudo service pacemaker restart
Instal paket perangkat quorum Corosync:
sudo apt -y install corosync-qdevice
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
- Hubungkan ke instance
database2
melalui 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-mysql
Perbarui daftar paket:
sudo apt update
Instal server MySQL:
sudo apt -y install mysql-server
Saat diminta memasukkan sandi, masukkan
DRBDha2
.Hentikan server MySQL:
sudo /etc/init.d/mysql stop
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'
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
Nonaktifkan 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 ~/.varsrc
Instal Pacemaker:
sudo apt -y install pcs
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
Aktifkan
pcsd
,corosync
, danpacemaker
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
Konfigurasikan
corosync
untuk dimulai sebelumpacemaker
:sudo update-rc.d corosync defaults 20 20 sudo update-rc.d pacemaker defaults 30 10
Menetapkan sandi pengguna cluster untuk autentikasi. Sandinya sama dengan sandi (
haCLUSTER3
) yang Anda gunakan untuk instancedatabase1
.sudo bash -c "echo hacluster:haCLUSTER3 | chpasswd"
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"
Membuat direktori layanan Corosync:
sudo mkdir /etc/corosync/service.d
Konfigurasi
corosync
untuk mengetahui Pacemaker:sudo bash -c 'cat <<EOF > /etc/corosync/service.d/pcmk service { name: pacemaker ver: 1 } EOF'
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'
Mulai ulang layanan
corosync
danpacemaker
:sudo service corosync restart sudo service pacemaker restart
Instal paket perangkat quorum Corosync:
sudo apt -y install corosync-qdevice
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
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
- Hubungkan ke instance
database2
melalui SSH. Muat variabel metadata dari file
.varsrc
:source ~/.varsrc
Lakukan autentikasi terhadap node cluster:
sudo pcs cluster auth --name mysql_cluster ${DATABASE1_INSTANCE_NAME} ${DATABASE2_INSTANCE_NAME} -u hacluster -p haCLUSTER3
Mulai cluster:
sudo pcs cluster start --all
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.
- Hubungkan ke instance
database1
melalui SSH. 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
Nonaktifkan STONITH, karena Anda akan men-deploy perangkat kuorum nanti:
sudo pcs -f clust_cfg property set stonith-enabled=false
Menonaktifkan setelan terkait kuorum. Anda akan menyiapkan node perangkat kuorum nanti.
sudo pcs -f clust_cfg property set no-quorum-policy=stop
Mencegah Pacemaker bergerak kembali ke aset setelah pemulihan:
sudo pcs -f clust_cfg resource defaults resource-stickiness=200
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
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
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"
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
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
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
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
Pastikan sistem file DRBD mendahului layanan MySQL dalam urutan startup:
sudo pcs -f clust_cfg constraint order mystore_FS then mysql_service
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
Commit perubahan ke cluster:
sudo pcs cluster cib-push clust_cfg
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
- Hubungkan ke instance
qdevice
melalui SSH. Instal
pcs
dancorosync-qnetd
:sudo apt update && sudo apt -y install pcs corosync-qnetd
Mulai layanan daemon sistem konfigurasi Pacemaker/Corosync (
pcsd
) dan aktifkan saat sistem dimulai:sudo service pcsd start sudo update-rc.d pcsd enable
Setel sandi pengguna cluster (
haCLUSTER3
) untuk autentikasi:sudo bash -c "echo hacluster:haCLUSTER3 | chpasswd"
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
- Hubungkan ke node
database1
melalui SSH. Muat variabel metadata dari file
.varsrc
:source ~/.varsrc
Autentikasi node perangkat kuorum untuk cluster:
sudo pcs cluster auth --name mysql_cluster ${QUORUM_INSTANCE_NAME} -u hacluster -p haCLUSTER3
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
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"
Mulai ulang layanan
corosync
untuk memuat ulang setelan perangkat kuorum yang baru:sudo service corosync restart
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
- Hubungkan ke node
database2
melalui SSH. Muat variabel metadata dari file
.varsrc
:source ~/.varsrc
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"
Mulai ulang layanan
corosync
untuk memuat ulang setelan perangkat kuorum yang baru:sudo service corosync restart
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.
- Hubungkan ke instance
database1
melalui SSH. 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
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
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
Buka Cloud Shell:
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}
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}
Buat health check untuk
port 3306
:gcloud compute health-checks create tcp mysql-backend-healthcheck \ --port 3306
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
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}
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
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
Untuk 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-client
melalui SSH. Perbarui definisi paket:
sudo apt-get update
Instal klien MySQL:
sudo apt-get install -y mysql-client
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
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 instancedatabase2
atau tidak. - Mulai instance
database1
untuk melihat apakahdatabase1
berhasil bergabung kembali ke cluster. - Matikan instance
database2
untuk menguji apakah database master dapat beralih ke instancedatabase1
atau tidak. - Mulai instance
database2
untuk melihat apakahdatabase2
berhasil bergabung kembali dengan cluster dan apakah instancedatabase1
masih mempertahankan peran master. - Buat partisi jaringan antara
database1
dandatabase2
untuk 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/enabled
Mulai 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/enabled
Hentikan 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/enabled
Mulai 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/enabled
Buat partisi jaringan antara
database1
dandatabase2
:gcloud compute firewall-rules create block-comms \ --description="no MySQL communications" \ --action=DENY \ --rules=all \ --source-tags=mysql \ --target-tags=mysql \ --priority=800
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 MySQLdatabase2
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
Hapus aturan firewall jaringan untuk menghapus partisi jaringan. (Tekan
Y
saat diminta.)gcloud compute firewall-rules delete block-comms
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
Hubungkan ke instance
mysql-client
melalui 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.
Pembersihan
Menghapus project
- Di konsol Google Cloud, buka halaman Manage resource.
- Pada daftar project, pilih project yang ingin Anda hapus, lalu klik Delete.
- Pada dialog, ketik project ID, lalu klik Shut down untuk menghapus project.
Langkah selanjutnya
- Baca selengkapnya tentang DRBD.
- Baca selengkapnya tentang Pacemaker.
- Baca selengkapnya tentang Corosync Cluster Engine.
- Untuk setelan server MySQL 5.6 lanjutan lainnya, lihat Panduan administrasi server MySQL.
- Jika Anda ingin menyiapkan akses jarak jauh ke MySQL, lihat Cara menyiapkan akses jarak jauh ke MySQL di Compute Engine.
- Untuk informasi lebih lanjut tentang MySQL, lihat dokumentasi resmi MySQL.
- Pelajari arsitektur referensi, diagram, dan praktik terbaik tentang Google Cloud. Lihat Cloud Architecture Center kami.