Di blog sebelumnya, kami telah membahas beberapa tips dan trik untuk menyiapkan server MySQL untuk penggunaan produksi dari perspektif administrator sistem. Postingan blog ini adalah lanjutannya...
Gunakan Alat Pencadangan Basis Data
Setiap alat pencadangan memiliki kelebihan dan kekurangannya sendiri. Misalnya, Percona Xtrabackup (atau MariaDB Backup for MariaDB) dapat melakukan hot-backup fisik tanpa mengunci database tetapi hanya dapat dipulihkan ke versi yang sama pada instance lain. Sementara untuk mysqldump, ini kompatibel silang dengan versi utama MySQL lainnya dan jauh lebih sederhana untuk pencadangan parsial, meskipun relatif lebih lambat selama pemulihan jika dibandingkan dengan Percona Xtrabackup pada basis data besar. MySQL 5.7 juga memperkenalkan mysqlpump, mirip dengan mysqldump dengan kemampuan pemrosesan paralel untuk mempercepat proses dump.
Jangan lewatkan untuk mengonfigurasi semua alat pencadangan ini di server MySQL Anda karena tersedia secara gratis dan sangat penting untuk pemulihan data. Karena mysqldump dan mysqlpump sudah termasuk dalam MySQL 5.7 dan yang lebih baru, kita hanya perlu menginstal Percona Xtrabackup (atau MariaDB Backup untuk MariaDB) tetapi memerlukan beberapa persiapan, seperti yang ditunjukkan pada langkah-langkah berikut:
Langkah Pertama
Pastikan alat pencadangan dan dependensinya telah diinstal:
$ yum install -y epel-release
$ yum install -y socat pv percona-xtrabackup
Untuk server MariaDB, gunakan Cadangan MariaDB sebagai gantinya:
$ yum install -y socat pv MariaDB-Backup
Langkah Kedua
Buat 'xtrabackup' pengguna di master jika tidak ada:
mysql> CREATE USER 'xtrabackup'@'localhost' IDENTIFIED BY 'Km4z9^sT2X';
mysql> GRANT RELOAD, LOCK TABLES, PROCESS, REPLICATION CLIENT ON *.* TO 'xtrabackup'@'localhost';
Langkah Ketiga
Buat pengguna lain bernama 'mysqldump' di master jika tidak ada. Pengguna ini akan digunakan untuk 'mysqldump' dan 'mysqlpump':
mysql> CREATE USER 'mysqldump'@'localhost' IDENTIFIED BY 'Km4z9^sT2X';
mysql> GRANT SELECT, SHOW VIEW, EVENT, TRIGGER, LOCK TABLES, RELOAD, REPLICATION CLIENT ON *.* TO 'mysqldump'@'localhost';
Langkah Empat
Tambahkan kredensial pengguna cadangan di dalam file konfigurasi MySQL di bawah direktif [xtrabackup], [mysqldump] dan [mysqlpump]:
$ cat /etc/my.cnf
...
[xtrabackup]
user=xtrabackup
password='Km4z9^sT2X'
[mysqldump]
user=mysqldump
password='Km4z9^sT2X'
[mysqlpump]
user=mysqldump
password='Km4z9^sT2X'
Dengan menetapkan baris di atas, kita tidak perlu menentukan nama pengguna dan sandi dalam perintah pencadangan karena alat pencadangan akan secara otomatis memuat opsi konfigurasi tersebut dari file konfigurasi utama.
Pastikan alat pencadangan diuji dengan benar sebelumnya. Untuk Xtrabackup yang mendukung streaming backup melalui jaringan, hal ini harus diuji terlebih dahulu untuk memastikan link komunikasi dapat terjalin dengan benar antara server sumber dan server tujuan. Di server tujuan, jalankan perintah berikut agar socat mendengarkan port 9999 dan siap menerima streaming masuk:
$ socat -u tcp-listen:9999,reuseaddr stdout 2>/tmp/netcat.log | xbstream -x -C /var/lib/mysql
Kemudian, buat cadangan di server sumber dan streaming ke port 9999 di server tujuan:
$ innobackupex --socket=/var/lib/mysql/mysql.sock --stream=xbstream /var/lib/mysql/ | socat - TCP4:192.168.0.202:9999
Anda akan mendapatkan aliran keluaran yang berkelanjutan setelah menjalankan perintah pencadangan. Tunggu hingga Anda melihat baris 'Selesai OK' yang menunjukkan pencadangan berhasil.
Dengan pv, kita dapat membatasi penggunaan bandwidth atau melihat kemajuan sebagai proses yang disalurkan melaluinya. Biasanya, proses streaming akan menjenuhkan jaringan jika tidak ada pembatasan yang diaktifkan dan ini dapat menyebabkan masalah dengan server lain untuk berinteraksi dengan server lain di segmen yang sama. Menggunakan pv, kita dapat membatasi proses streaming sebelum kita meneruskannya ke alat streaming seperti socat atau netcat. Contoh berikut menunjukkan streaming cadangan akan dibatasi sekitar 80 MB/dtk untuk koneksi masuk dan keluar:
$ innobackupex --slave-info --socket=/var/lib/mysql/mysql.sock --stream=xbstream /var/lib/mysql/ | pv -q -L 80m | socat - TCP4:192.168.0.202:9999
Streaming cadangan biasanya digunakan untuk mengatur slave atau menyimpan cadangan dari jarak jauh di server lain.
Untuk mysqldump dan mysqlpump, kita dapat mengujinya dengan perintah berikut:
$ mysqldump --set-gtid-purged=OFF --all-databases
$ mysqlpump --set-gtid-purged=OFF --all-databases
Pastikan Anda melihat baris non-kesalahan muncul di output.
Tes Stres Server
Stress testing server database penting untuk memahami kapasitas maksimum yang dapat kita antisipasi untuk server tertentu. Ini akan berguna ketika Anda mendekati ambang batas atau kemacetan di tahap selanjutnya. Anda dapat menggunakan banyak alat benchmark yang tersedia di pasar seperti mysqlslap, DBT2 dan sysbench.
Dalam contoh ini, kami menggunakan sysbench untuk mengukur kinerja puncak server, tingkat saturasi, dan juga suhu komponen saat berjalan di lingkungan beban kerja database yang tinggi. Ini akan memberi Anda pemahaman dasar tentang seberapa bagus server, dan mengantisipasi beban kerja yang dapat diproses server untuk aplikasi kita dalam produksi.
Untuk menginstal dan mengkonfigurasi sysbench, Anda dapat mengompilasinya dari sumber atau menginstal paket dari repositori Percona:
$ yum install -y https://repo.percona.com/yum/percona-release-latest.noarch.rpm
$ yum install -y sysbench
Buat skema database dan pengguna di server MySQL:
mysql> CREATE DATABASE sbtest;
mysql> CREATE USER 'sbtest'@'localhost' IDENTIFIED BY 'sysbenchP4ss';
mysql> GRANT ALL PRIVILEGES ON sbtest.* TO [email protected]'localhost';
Hasilkan data uji:
$ sysbench \
/usr/share/sysbench/oltp_common.lua \
--db-driver=mysql \
--mysql-host=localhost \
--mysql-user=sbtest \
--mysql-password=sysbenchP4ss \
--tables=50 \
--table-size=100000 \
prepare
Kemudian jalankan benchmark selama 1 jam (3600 detik):
$ sysbench \
/usr/share/sysbench/oltp_read_write.lua \
--report-interval=2 \
--threads=64 \
--max-requests=0 \
--db-driver=mysql \
--time=3600 \
--db-ps-mode=disable \
--mysql-host=localhost \
--mysql-user=sbtest \
--mysql-password=sysbenchP4ss \
--tables=50 \
--table-size=100000 \
run
Saat pengujian berjalan, gunakan iostat (tersedia dalam paket sysstat) di terminal lain untuk memantau penggunaan disk, bandwidth, IOPS, dan I/O tunggu:
$ yum install -y sysstat
$ iostat -x 60
avg-cpu: %user %nice %system %iowait %steal %idle
40.55 0.00 55.27 4.18 0.00 0.00
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0.19 6.18 1236.23 816.92 61283.83 14112.44 73.44 4.00 1.96 2.83 0.65 0.34 69.29
Hasil di atas akan dicetak setiap 60 detik. Tunggu hingga tes selesai dan ambil rata-rata r/s (baca/detik), w/s (tulis/detik), %iowait, %util, rkB/s dan wkB/s (bandwidth). Jika Anda melihat penggunaan disk, CPU, RAM, atau jaringan yang relatif rendah, Anda mungkin perlu meningkatkan nilai "--threads" ke angka yang lebih tinggi lagi sehingga akan menggunakan semua sumber daya hingga batasnya.
Pertimbangkan aspek berikut yang akan diukur:
- Kueri per Detik =Ringkasan Sysbench setelah pengujian selesai di bawah statistik SQL -> Kueri -> Per detik.
- Latensi kueri =Ringkasan Sysbench setelah pengujian selesai pada Latensi (md) -> persentil ke-95.
- IOPS Disk =Rata-rata dari r/s + w/s
- Utilisasi disk =Rata-rata %util
- Bandwidth disk R/W =Rata-rata rkB/dtk / Rata-rata wkB/dtk
- Disk IO wait =Rata-rata %iowait
- Rata-rata beban server =Rata-rata beban rata-rata seperti yang dilaporkan oleh perintah teratas.
- Penggunaan CPU MySQL =Penggunaan CPU rata-rata seperti yang dilaporkan oleh perintah teratas.
Dengan ClusterControl, Anda dapat dengan mudah mengamati dan mendapatkan informasi di atas melalui panel Ikhtisar Nodes, seperti yang ditunjukkan pada tangkapan layar berikut:
Selanjutnya, informasi yang dikumpulkan selama stress test dapat digunakan untuk menyetel MySQL dan variabel InnoDB sesuai seperti innodb_buffer_pool_size, innodb_io_capacity, innodb_io_capacity_max, innodb_write_io_threads, innodb_read_io_threads dan juga max_connections.
Untuk mempelajari lebih lanjut tentang tolok ukur kinerja MySQL menggunakan sysbench, lihat posting blog ini, Cara Membandingkan Kinerja MySQL &MariaDB Menggunakan SysBench.
Gunakan Alat Perubahan Skema Online
Perubahan skema adalah sesuatu yang tidak dapat dihindari dalam database relasional. Saat aplikasi tumbuh dan menjadi lebih menuntut dari waktu ke waktu, tentu saja memerlukan beberapa perubahan struktur pada database. Ada beberapa operasi DDL yang akan membangun kembali tabel sehingga memblokir pernyataan DML lain untuk dijalankan dan ini dapat memengaruhi ketersediaan database Anda jika Anda melakukan perubahan struktural pada tabel besar. Untuk melihat daftar pemblokiran operasi DDL, lihat halaman dokumentasi MySQL ini dan cari operasi yang memiliki "Permits Concurrent DML" =Tidak.
Jika Anda tidak mampu menghentikan waktu henti di server produksi saat melakukan perubahan skema, mungkin ide yang baik untuk mengonfigurasi alat perubahan skema online pada tahap awal. Dalam contoh ini, kami menginstal dan mengonfigurasi gh-ost, perubahan skema online yang dibuat oleh Github. Gh-ost menggunakan aliran log biner untuk menangkap perubahan tabel dan menerapkannya secara asinkron ke tabel hantu.
Untuk menginstal gh-ost pada kotak CentOS, cukup ikuti langkah-langkah berikut:
Langkah Pertama
Unduh gh-ost terbaru dari sini:
$ wget https://github.com/github/gh-ost/releases/download/v1.0.48/gh-ost-1.0.48-1.x86_64.rpm
Langkah Kedua
Instal paket:
$ yum localinstall gh-ost-1.0.48-1.x86_64.rpm
Langkah Ketiga
Buat pengguna database untuk gh-ost jika tidak ada, dan berikan hak istimewa yang sesuai:
mysql> CREATE USER 'gh-ost'@'{host}' IDENTIFIED BY 'ghostP455';
mysql> GRANT ALTER, CREATE, DELETE, DROP, INDEX, INSERT, LOCK TABLES, SELECT, TRIGGER, UPDATE ON {db_name}.* TO 'gh-ost'@'{host}';
mysql> GRANT SUPER, REPLICATION SLAVE ON *.* TO 'gh-ost'@'{host}';
** Ganti {host} dan {db_name} dengan nilai yang sesuai. Idealnya, {host} adalah salah satu host slave yang akan melakukan perubahan skema online. Lihat dokumentasi hantu untuk detailnya.
Langkah Empat
Buat file konfigurasi gh-ost untuk menyimpan nama pengguna dan sandi di bawah /root/.gh-ost.cnf:
[client]
user=gh-ost
password=ghostP455
Demikian pula, Anda dapat mengonfigurasi Percona Toolkit Online Schema Change (pt-osc) di server database. Idenya adalah untuk memastikan Anda siap dengan alat ini terlebih dahulu di server database yang kemungkinan akan menjalankan operasi ini di masa mendatang.
Gunakan Percona Toolkit
Percona Toolkit adalah kumpulan alat baris perintah open source canggih, yang dikembangkan oleh Percona, yang dirancang untuk melakukan berbagai server MySQL, MongoDB, dan PostgreSQL serta tugas sistem yang terlalu sulit atau rumit untuk melakukan secara manual. Alat ini telah menjadi penyelamat utama, yang digunakan oleh DBA di seluruh dunia untuk mengatasi atau memecahkan masalah teknis yang ditemukan di server MySQL dan MariaDB.
Untuk menginstal Percona Toolkit, cukup jalankan perintah berikut:
$ yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
$ yum install percona-toolkit
Ada lebih dari 30 alat yang tersedia dalam paket ini. Beberapa di antaranya dirancang khusus untuk MongoDB dan PostgreSQL. Beberapa alat yang paling populer untuk pemecahan masalah MySQL dan penyetelan kinerja adalah pt-stalk, pt-mysql-summary, pt-query-digest, pt-table-checksum, pt-table-sync dan pt-archiver. Toolkit ini dapat membantu DBA untuk memverifikasi integritas replikasi MySQL dengan memeriksa konsistensi data master dan replika, mengarsipkan baris secara efisien, menemukan indeks duplikat, menganalisis kueri MySQL dari log dan tcpdump, dan banyak lagi.
Contoh berikut menunjukkan salah satu keluaran alat (pt-table-checksum) yang dapat melakukan pemeriksaan konsistensi replikasi online dengan menjalankan kueri checksum pada master, yang menghasilkan hasil berbeda pada replika yang tidak konsisten dengan master:
$ pt-table-checksum --no-check-binlog-format --replicate-check-only
Checking if all tables can be checksummed ...
Starting checksum ...
Differences on mysql2.local
TABLE CHUNK CNT_DIFF CRC_DIFF CHUNK_INDEX LOWER_BOUNDARY UPPER_BOUNDARY
mysql.proc 1 0 1
mysql.tables_priv 1 0 1
mysql.user 1 1 1
Output di atas menunjukkan bahwa ada 3 tabel pada slave (mysql2.local) yang tidak sesuai dengan master. Kemudian kita dapat menggunakan alat pt-table-sync untuk menambal data yang hilang dari master, atau cukup menyinkronkan ulang slave sekali lagi.
Kunci Server
Akhirnya, setelah tahap konfigurasi dan persiapan selesai, kita dapat mengisolasi node database dari jaringan publik dan membatasi akses server ke host dan jaringan yang dikenal. Anda dapat menggunakan firewall (iptables, firewalld, ufw), grup keamanan, hosts.allow dan/atau hosts.deny atau cukup nonaktifkan antarmuka jaringan yang menghadap internet jika Anda memiliki beberapa antarmuka jaringan.
Untuk iptables, penting untuk menentukan komentar untuk setiap aturan menggunakan tanda '-m comment --comment':
$ iptables -A INPUT -p tcp -s 192.168.0.0/24 --dport 22 -m comment --comment 'Allow local net to SSH port' -j ACCEPT
$ iptables -A INPUT -p tcp -s 192.168.0.0/24 --dport 3306 -m comment --comment 'Allow local net to MySQL port' -j ACCEPT
$ iptables -A INPUT -p tcp -s 192.168.0.0/24 --dport 9999 -m comment --comment 'Allow local net to backup streaming port' -j ACCEPT
$ iptables -A INPUT -p tcp -s 0.0.0.0/0 -m comment --comment 'Drop everything apart from the above' -j DROP
Sama halnya untuk Firewall Ubuntu (ufw), kita perlu mendefinisikan aturan default terlebih dahulu dan kemudian dapat membuat aturan serupa untuk MySQL/MariaDB mirip dengan ini:
$ sudo ufw default deny incoming comment 'Drop everything apart from the above'
$ sudo ufw default allow outgoing comment 'Allow outgoing everything'
$ sudo ufw allow from 192.168.0.0/24 to any port 22 comment 'Allow local net to SSH port'
$ sudo ufw allow from 192.168.0.0/24 to any port 3306 comment 'Allow local net to MySQL port'
$ sudo ufw allow from 192.168.0.0/24 to any port 9999 comment 'Allow local net to backup streaming port'
Aktifkan firewall:
$ ufw enable
Kemudian, pastikan aturan dimuat dengan benar:
$ ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip
To Action From
-- ------ ----
22 ALLOW IN 192.168.0.0/24 # Allow local net to SSH port
3306 ALLOW IN 192.168.0.0/24 # Allow local net to MySQL port
9999 ALLOW IN 192.168.0.0/24 # Allow local net to backup streaming port
Sekali lagi, sangat penting untuk menentukan komentar pada setiap aturan untuk membantu kami memahami aturan dengan lebih baik.
Untuk pembatasan akses basis data jarak jauh, kami juga dapat menggunakan server VPN seperti yang ditunjukkan dalam posting blog ini, Menggunakan OpenVPN untuk Mengamankan Akses ke Cluster Basis Data Anda di Cloud.
Kesimpulan
Menyiapkan server produksi jelas bukan tugas yang mudah, yang telah kami tunjukkan dalam seri blog ini. Jika Anda khawatir akan gagal, mengapa Anda tidak menggunakan ClusterControl untuk menyebarkan cluster database Anda? ClusterControl memiliki rekam jejak yang sangat baik dalam penerapan basis data dan telah memungkinkan lebih dari 70.000 penerapan MySQL dan MariaDB untuk semua lingkungan hingga saat ini.