Menggunakan set yang seimbang untuk mengklusterkan MySQL di Linux
Penting
Komputer virtual klasik akan dihentikan pada 1 Maret 2023.
Jika Anda menggunakan sumber IaaS dari ASM, harap menyelesaikan migrasi sebelum 1 Maret 2023. Kami mendorong Anda untuk beralih lebih cepat untuk memanfaatkan banyak peningkatan fitur di Azure Resource Manager.
Untuk mengetahui informasi selengkapnya, lihat Migrasikan sumber IaaS Anda ke Azure Resource Manager sebelum 1 Maret 2023.
Catatan
Azure memiliki dua model penyebaran yang berbeda untuk membuat dan bekerja dengan sumber daya: Azure Resource Manager dan klasik. Artikel ini membahas tentang menggunakan model penyebaran klasik. Microsoft merekomendasikan agar sebagian besar penyebaran baru menggunakan model Resource Manager. Templat Resource Manager tersedia jika Anda perlu menyebarkan kluster MySQL.
Mulai 15 November 2017, komputer virtual hanya akan tersedia di portal Azure.
Artikel ini mengeksplorasi dan mengilustrasikan berbagai pendekatan yang tersedia untuk menyebarkan layanan berbasis Linux yang sangat tersedia di Microsoft Azure, menjelajahi ketersediaan tinggi MySQL Server sebagai primer. Video yang mengilustrasikan pendekatan ini tersedia di Channel 9.
Kami akan menguraikan solusi ketersediaan tinggi MySQL shared-nothing, two-node, single-master berdasarkan DRBD, Corosync, dan Pacemaker. Hanya satu simpul yang menjalankan MySQL pada satu waktu. Membaca dan menulis dari sumber daya DRBD juga terbatas hanya pada satu simpul pada satu waktu.
Tidak perlu solusi VIP seperti LVS, karena Anda akan menggunakan set seimbang beban dalam Microsoft Azure untuk menyediakan fungsionalitas round-robin dan deteksi titik akhir, penghapusan, dan pemulihan VIP yang lancar. VIP adalah alamat IPv4 yang dapat dirutekan secara global yang ditetapkan oleh Microsoft Azure ketika Anda pertama kali membuat layanan cloud.
Ada kemungkinan arsitektur lain untuk MySQL, termasuk Kluster NBD, Percona, Galera, dan beberapa solusi middleware, termasuk setidaknya satu tersedia sebagai VM pada VM Depot. Selama solusi ini dapat direplikasi pada unicast vs. multicast atau siaran dan tidak mengandalkan penyimpanan bersama atau beberapa antarmuka jaringan, skenario harus mudah disebarkan pada Microsoft Azure.
Arsitektur pengklusteran ini dapat diperluas ke produk lain seperti PostgreSQL dan OpenLDAP dengan cara yang sama. Misalnya, prosedur penyeimbangan beban ini dengan berbagi tidak ada yang berhasil diuji dengan OpenLDAP multi-master, dan Anda dapat menontonnya di blog Channel 9 kami.
Bersiaplah
Anda memerlukan sumber daya dan kemampuan berikut:
- Akun Microsoft Azure dengan langganan yang valid, dapat membuat setidaknya dua VM (XS digunakan dalam contoh ini)
- Jaringan dan subnet
- Grup afinitas
- Sekumpulan ketersediaan
- Kemampuan untuk membuat VHD di wilayah yang sama dengan layanan cloud dan melampirkannya ke VM Linux
Lingkungan yang diuji
- Ubuntu 13.10
- DRBD
- Microsoft SQL Server MySQL
- Corosync dan Pacemaker
Grup afinitas
Buat grup afinitas untuk solusi dengan masuk ke portal Azure, memilih Pengaturan, dan membuat grup afinitas. Sumber daya yang dialokasikan yang dibuat nanti akan ditetapkan ke grup afinitas ini.
Jaringan
Jaringan baru dibuat, dan subnet dibuat di dalam jaringan. Contoh ini menggunakan jaringan 10.10.10.0/24 dengan hanya satu subnet /24 di dalamnya.
Komputer virtual
VM Ubuntu 13.10 pertama dibuat dengan menggunakan gambar Galeri Ubuntu yang Didukung dan disebut hadb01
. Layanan awan baru dibuat dalam proses, yang disebut hadb. Nama ini menggambarkan sifat bersama yang seimbang dengan beban yang akan dimiliki layanan ketika lebih banyak sumber daya ditambahkan. Pembuatan hadb01
tidak menemukan dan diselesaikan dengan menggunakan portal. Titik akhir untuk SSH dibuat secara otomatis, dan jaringan baru dipilih. Sekarang Anda dapat membuat set ketersediaan untuk VM.
Setelah VM pertama dibuat (secara teknis, ketika layanan cloud dibuat), buat VM kedua, hadb02
. Untuk VM kedua, gunakan VM Ubuntu 13.10 dari Gallery dengan menggunakan portal, tetapi gunakan layanan cloud yang ada, hadb.cloudapp.net
, alih-alih membuat yang baru. Jaringan dan set ketersediaan harus dipilih secara otomatis. Titik akhir SSH juga akan dibuat.
Setelah kedua VM dibuat, perhatikan port SSH untuk hadb01
(TCP 22) dan hadb02
(secara otomatis ditetapkan oleh Azure).
Penyimpanan terlampir
Pasang disk baru ke VM dan buat disk 5 GB dalam prosesnya. Disk dihosting dalam kontainer VHD yang digunakan untuk disk sistem operasi utama Anda. Setelah disk dibuat dan dilampirkan, tidak perlu memulai ulang Linux karena kernel akan melihat perangkat baru. Perangkat ini biasanya /dev/sdc
. Periksa dmesg
outputnya.
Pada setiap VM, buat partisi dengan menggunakan cfdisk
(primer, partisi Linux) dan tulis tabel partisi baru. Jangan membuat sistem file pada partisi ini.
Menyiapkan kluster
Gunakan APT untuk menginstal Corosync, Pacemaker, dan DRBD pada kedua VM Ubuntu. Untuk melakukannya dengan apt-get
, jalankan kode berikut:
sudo apt-get install corosync pacemaker drbd8-utils.
Jangan instal MySQL saat ini. Skrip penginstalan Debian dan Ubuntu akan menginisialisasi direktori data MySQL pada /var/lib/mysql
, tetapi karena direktori akan digantikan oleh sistem file DRBD, Anda perlu menginstal MySQL nanti.
Verifikasi (dengan menggunakan /sbin/ifconfig
) bahwa kedua VM menggunakan alamat di subnet 10.10.10.0/24 dan bahwa mereka dapat melakukan ping satu sama lain berdasarkan nama. Anda juga dapat menggunakan ssh-keygen
dan ssh-copy-id
untuk memastikan kedua VM dapat berkomunikasi melalui SSH tanpa memerlukan kata sandi.
Menyiapkan DRBD
Buat sumber daya DRBD yang menggunakan partisi yang mendasarinya /dev/sdc1
untuk menghasilkan /dev/drbd1
sumber daya yang dapat diformat dengan menggunakan ext3 dan digunakan dalam simpul primer dan sekunder.
Buka
/etc/drbd.d/r0.res
dan salin definisi sumber daya berikut pada kedua VM:resource r0 { on `hadb01` { device /dev/drbd1; disk /dev/sdc1; address 10.10.10.4:7789; meta-disk internal; } on `hadb02` { device /dev/drbd1; disk /dev/sdc1; address 10.10.10.5:7789; meta-disk internal; } }
Inisialisasi sumber daya dengan menggunakan
drbdadm
pada kedua VM:sudo drbdadm -c /etc/drbd.conf role r0 sudo drbdadm up r0
Pada VM utama (
hadb01
), paksa kepemilikan (utama) sumber daya DRBD:sudo drbdadm primary --force r0
Jika Anda memeriksa konten /proc/drbd (sudo cat /proc/drbd
) pada kedua VM, Anda akan melihat Primary/Secondary
di hadb01
dan Secondary/Primary
di hadb02
, konsisten dengan solusi pada saat ini. Disk 5 GB disinkronkan melalui jaringan 10.10.10.0/24 tanpa biaya kepada pelanggan.
Setelah disk disinkronkan, Anda dapat membuat sistem file di hadb01
. Untuk tujuan pengujian, kami menggunakan ext2, tetapi kode berikut akan membuat sistem file ext3:
mkfs.ext3 /dev/drbd1
Memasang sumber daya DRBD
Anda sekarang siap untuk memasang sumber daya DRBD pada hadb01
. Debian dan turunan menggunakan /var/lib/mysql
sebagai direktori data MySQL. Karena Anda belum menginstal MySQL, buat direktori dan pasang sumber daya DRBD. Untuk melakukan opsi ini, jalankan kode berikut pada hadb01
:
sudo mkdir /var/lib/mysql
sudo mount /dev/drbd1 /var/lib/mysql
Menyiapkan MySQL
Sekarang Anda siap untuk menginstal MySQL di hadb01
:
sudo apt-get install mysql-server
Untuk hadb02
, Anda memiliki dua opsi. Anda dapat menginstal mysql-server, yang akan membuat /var/lib/mysql, mengisinya dengan direktori data baru, lalu menghapus konten. Untuk melakukan opsi ini, jalankan kode berikut pada hadb02
:
sudo apt-get install mysql-server
sudo service mysql stop
sudo rm –rf /var/lib/mysql/*
Opsi kedua adalah failover ke hadb02
dan kemudian menginstal mysql-server di sana. Skrip penginstalan akan melihat penginstalan yang ada dan tidak akan menyentuhnya.
Jalankan kode berikut pada hadb01
:
sudo drbdadm secondary –force r0
Jalankan kode berikut pada hadb02
:
sudo drbdadm primary –force r0
sudo apt-get install mysql-server
Jika Anda tidak berencana untuk failover DRBD sekarang, opsi pertama lebih mudah meskipun bisa dibilang kurang elegan. Setelah menyiapkan ini, Anda dapat mulai mengerjakan database MySQL Anda. Jalankan kode berikut pada hadb02
(atau server mana pun yang aktif, menurut DRBD):
mysql –u root –p
CREATE DATABASE azureha;
CREATE TABLE things ( id SERIAL, name VARCHAR(255) );
INSERT INTO things VALUES (1, "Yet another entity");
GRANT ALL ON things.\* TO root;
Peringatan
Pernyataan terakhir ini secara efektif menonaktifkan autentikasi untuk pengguna akar dalam tabel ini. Ini harus digantikan oleh pernyataan GRANT tingkat produksi Anda dan hanya disertakan untuk tujuan ilustrasi.
Jika Anda ingin membuat kueri dari luar VM (yang merupakan tujuan panduan ini), Anda juga perlu mengaktifkan jaringan untuk MySQL. Pada kedua VM, buka /etc/mysql/my.cnf
dan buka bind-address
. Ubah alamat dari 127.0.0.1 menjadi 0.0.0.0. Setelah menyimpan file, terbitkan sudo service mysql restart
di primer Anda saat ini.
Membuat set mySQL dengan beban seimbang
Kembali ke portal, buka hadb01
, dan pilih Titik Akhir. Untuk membuat titik akhir, pilih MySQL (TCP 3306) dari daftar drop-down dan pilih Buat set beban baru yang seimbang. Beri nama titik lb-mysql
akhir yang seimbang beban . Atur Waktu ke 5 detik, minimum.
Setelah Anda membuat titik akhir, buka hadb02
, pilih Titik Akhir, dan buat titik akhir. Pilih lb-mysql
, lalu pilih MySQL dari daftar drop-down. Anda juga dapat menggunakan Azure CLI untuk langkah ini.
Anda sekarang memiliki semua yang Anda butuhkan untuk pengoperasian manual kluster.
Menguji set dengan beban seimbang
Pengujian dapat dilakukan dari mesin luar dengan menggunakan klien MySQL apa pun, atau dengan menggunakan aplikasi tertentu, seperti phpMyAdmin yang berjalan sebagai situs web Azure. Dalam hal ini, Anda menggunakan alat baris perintah MySQL pada kotak Linux lain:
mysql azureha –u root –h hadb.cloudapp.net –e "select * from things;"
Failover secara manual
Anda dapat mensimulasikan failover dengan mematikan MySQL, mengalihkan primer DRBD, dan memulai MySQL lagi.
Untuk melakukan tugas ini, jalankan kode berikut pada hadb01:
service mysql stop && umount /var/lib/mysql ; drbdadm secondary r0
Kemudian, pada hadb02:
drbdadm primary r0 ; mount /dev/drbd1 /var/lib/mysql && service mysql start
Setelah gagal secara manual, Anda dapat mengulangi kueri jarak jauh dan kueri tersebut akan berfungsi dengan sempurna.
Menyiapkan Corosync
Corosync adalah infrastruktur kluster yang mendasari yang diperlukan agar Pacemaker berfungsi. Untuk Heartbeat (dan metodologi lain seperti Ultramonkey), Corosync adalah pemisahan fungsi CRM, sementara Pacemaker tetap lebih mirip dengan Heartbeat dalam fungsionalitas.
Batasan utama untuk Corosync di Azure adalah corosync lebih memilih multicast daripada siaran daripada komunikasi unicast, tetapi jaringan Microsoft Azure hanya mendukung unicast.
Untungnya, Corosync memiliki mode unicast yang berfungsi. Satu-satunya batasan nyata adalah bahwa karena semua simpul tidak berkomunikasi di antara mereka sendiri, Anda perlu menentukan simpul dalam file konfigurasi Anda, termasuk alamat IP mereka. Kita dapat menggunakan file contoh Corosync untuk Unicast dan mengubah alamat ikatan, daftar simpul, dan direktori pengelogan (Ubuntu menggunakan /var/log/corosync
saat file contoh menggunakan /var/log/cluster
), dan mengaktifkan alat kuorum.
Catatan
Gunakan direktif berikut transport: udpu
dan alamat IP yang ditentukan secara manual untuk kedua simpul.
Jalankan kode berikut pada /etc/corosync/corosync.conf
untuk kedua simpul:
totem {
version: 2
crypto_cipher: none
crypto_hash: none
interface {
ringnumber: 0
bindnetaddr: 10.10.10.0
mcastport: 5405
ttl: 1
}
transport: udpu
}
logging {
fileline: off
to_logfile: yes
to_syslog: yes
logfile: /var/log/corosync/corosync.log
debug: off
timestamp: on
logger_subsys {
subsys: QUORUM
debug: off
}
}
nodelist {
node {
ring0_addr: 10.10.10.4
nodeid: 1
}
node {
ring0_addr: 10.10.10.5
nodeid: 2
}
}
quorum {
provider: corosync_votequorum
}
Salin file konfigurasi ini pada VM dan mulai Corosync di kedua simpul:
sudo service start corosync
Tak lama setelah memulai layanan, kluster harus ditetapkan di cincin saat ini, dan kuorum harus dibentuk. Kita dapat memeriksa fungsionalitas ini dengan meninjau log atau dengan menjalankan kode berikut:
sudo corosync-quorumtool –l
Anda akan melihat output yang mirip dengan gambar berikut:
Menyiapkan Pacemaker
Pacemaker menggunakan kluster untuk memantau sumber daya, menentukan kapan utama turun, dan mengalihkan sumber daya tersebut ke sekunder. Sumber daya dapat ditentukan dari sekumpulan skrip yang tersedia atau dari skrip LSB (seperti init), di antara pilihan lainnya.
Kami ingin Pacemaker "memiliki" sumber daya DRBD, titik pemasangan, dan layanan MySQL. Jika Pacemaker dapat mengaktifkan dan menonaktifkan DRBD, pasang dan lepaskan, lalu mulai dan hentikan MySQL dalam urutan yang tepat ketika sesuatu yang buruk terjadi dengan primer, penyiapan selesai.
Ketika Anda pertama kali menginstal Pacemaker, konfigurasi Anda harus cukup sederhana, seperti:
node $id="1" hadb01
attributes standby="off"
node $id="2" hadb02
attributes standby="off"
Periksa konfigurasi dengan menjalankan
sudo crm configure show
.Kemudian buat file (seperti
/tmp/cluster.conf
) dengan sumber daya berikut:primitive drbd_mysql ocf:linbit:drbd \ params drbd_resource="r0" \ op monitor interval="29s" role="Master" \ op monitor interval="31s" role="Slave" ms ms_drbd_mysql drbd_mysql \ meta master-max="1" master-node-max="1" \ clone-max="2" clone-node-max="1" \ notify="true" primitive fs_mysql ocf:heartbeat:Filesystem \ params device="/dev/drbd/by-res/r0" \ directory="/var/lib/mysql" fstype="ext3" primitive mysqld lsb:mysql group mysql fs_mysql mysqld colocation mysql_on_drbd \ inf: mysql ms_drbd_mysql:Master order mysql_after_drbd \ inf: ms_drbd_mysql:promote mysql:start property stonith-enabled=false property no-quorum-policy=ignore
Muat file ke dalam konfigurasi. Anda hanya perlu melakukan ini dalam satu simpul.
sudo crm configure load update /tmp/cluster.conf commit exit
Pastikan Pacemaker dimulai pada boot di kedua simpul:
sudo update-rc.d pacemaker defaults
Dengan menggunakan
sudo crm_mon –L
, verifikasi bahwa salah satu node Anda telah menjadi master untuk kluster dan menjalankan semua sumber daya. Anda dapat menggunakan mount dan ps untuk memeriksa apakah sumber daya sedang berjalan.
Cuplikan layar berikut menunjukkan crm_mon
dengan satu simpul dihentikan (keluar dengan memilih Ctrl+C):
Cuplikan layar ini menunjukkan kedua simpul, satu master, dan satu budak:
Pengujian
Anda siap untuk simulasi failover otomatis. Ada dua cara untuk melakukan ini: lembut dan keras.
Cara lunak menggunakan fungsi matikan kluster: crm_standby -U `uname -n` -v on
. Jika Anda menggunakan ini pada master, budak mengambil alih. Ingatlah untuk mengatur ini kembali ke off. Jika tidak, crm_mon akan menampilkan satu simpul yang siaga.
Cara yang sulit adalah mematikan VM utama (hadb01) melalui portal atau dengan mengubah runlevel pada VM (yaitu, menghentikan, mematikan). Ini membantu Corosync dan Pacemaker dengan menandakan bahwa master akan turun. Anda dapat menguji ini (berguna untuk jendela pemeliharaan), tetapi Anda juga dapat memaksa skenario dengan membekukan VM.
STONITH
Dimungkinkan untuk mengeluarkan penonaktifan VM melalui Azure CLI sebagai pengganti skrip STONITH yang mengontrol perangkat fisik. Anda dapat menggunakan /usr/lib/stonith/plugins/external/ssh
sebagai dasar dan mengaktifkan STONITH dalam konfigurasi kluster. Azure CLI harus diinstal secara global, dan pengaturan dan profil penerbitan harus dimuat untuk pengguna kluster.
Kode sampel untuk sumber daya tersedia di GitHub. Ubah konfigurasi kluster dengan menambahkan yang berikut ini ke sudo crm configure
:
primitive st-azure stonith:external/azure \
params hostlist="hadb01 hadb02" \
clone fencing st-azure \
property stonith-enabled=true \
commit
Catatan
Skrip tidak melakukan pemeriksaan naik/turun. Sumber daya SSH asli memiliki 15 pemeriksaan ping, tetapi waktu pemulihan untuk Azure VM mungkin lebih bervariasi.
Batasan
Batasan berikut berlaku:
- Skrip sumber daya DRBD linbit yang mengelola DRBD sebagai sumber daya di Pacemaker menggunakan
drbdadm down
saat mematikan simpul, bahkan jika simpul hanya berlangsung siaga. Ini tidak ideal karena budak tidak akan menyinkronkan sumber daya DRBD saat master akan menulis. Jika master tidak gagal dengan baik, budak dapat mengambil alih status sistem file yang lebih lama. Ada dua cara potensial untuk memecahkan ini:- Memberlakukan
drbdadm up r0
di semua node kluster melalui pengawas lokal (tidak terkluster) - Mengedit skrip DRBD linbit, memastikan bahwa
down
tidak dipanggil/usr/lib/ocf/resource.d/linbit/drbd
- Memberlakukan
- Penyeimbang beban membutuhkan setidaknya lima detik untuk merespons, sehingga aplikasi harus sadar kluster dan lebih toleran terhadap batas waktu. Arsitektur lain, seperti antrean dalam aplikasi dan middleware kueri, juga dapat membantu.
- Penyetelan MySQL diperlukan untuk memastikan bahwa penulisan dilakukan dengan kecepatan yang dapat dikelola dan cache disiram ke disk sesering mungkin untuk meminimalkan kehilangan memori.
- Performa tulis tergantung pada interkoneksi VM di sakelar virtual karena ini adalah mekanisme yang digunakan oleh DRBD untuk mereplikasi perangkat.