Sangat penting untuk menginstal dan mengkonfigurasi server MySQL produksi dengan paket dan alat yang diperlukan untuk memperlancar operasi dalam jangka panjang. Kami telah melihat banyak kasus di mana pemecahan masalah atau penyetelan server produksi (terutama yang tanpa akses internet publik) umumnya sulit karena kurangnya alat yang diperlukan yang diinstal pada server untuk membantu mengidentifikasi dan memecahkan masalah.
Dalam seri blog dua bagian ini, kami akan menunjukkan kepada Anda 9 tips dan trik tentang cara menyiapkan server MySQL untuk penggunaan produksi dari perspektif administrator sistem. Semua contoh dalam posting blog ini didasarkan pada dua-node, penyiapan Replikasi MySQL master-slave kami yang berjalan di CentOS 7.
Instal Paket Esensial
Setelah instalasi paket klien dan server MySQL atau MariaDB, kita perlu menyiapkan server MySQL/MariaDB dengan semua alat yang diperlukan untuk menangani semua operasi administrasi, manajemen, dan pemantauan yang akan terjadi pada server. Jika Anda berencana untuk mengunci server MySQL dalam produksi, akan sedikit lebih sulit untuk menginstal semuanya secara manual tanpa koneksi internet.
Beberapa paket penting yang harus diinstal pada server MySQL/MariaDB untuk Linux:
- Percona Xtrabackup/MariaDB Backup - Pencadangan fisik server database yang tidak memblokir.
- ntp/ntpdate - Menyinkronkan waktu server.
- pv - Memantau data melalui pipeline, juga dapat digunakan untuk throttling.
- socat atau netcat- Alat streaming data, bagus untuk cadangan streaming.
- net-tools - Kumpulan alat debugging jaringan untuk Linux.
- bind-utils - Kumpulan alat debugging DNS untuk Linux.
- sysstat - Kumpulan alat pemantauan kinerja untuk Linux.
- telnet - Klien Telnet untuk memeriksa jangkauan layanan.
- mailx/mailutils - klien MTA.
- openssl - Toolkit untuk protokol Transport Layer Security (TLS) dan Secure Sockets Layer (SSL).
- unzip - Alat buka kompresi.
- htop - Alat pemantauan host.
- innotop - alat pemantauan MySQL.
- vim - Editor teks dengan penyorotan sintaks (atau editor teks pilihan lainnya).
- python-setuptools - Manajer paket Python.
- lm_sensors/ipmitool - Untuk memeriksa suhu komponen server. Hanya server bare-metal.
Perhatikan bahwa beberapa paket yang disarankan hanya tersedia di repositori paket non-default seperti EPEL untuk CentOS. Oleh karena itu, untuk instalasi berbasis YUM:
$ yum install epel-release
$ yum install -y wget ntp pv socat htop innotop vim mailx bind-utils net-tools telnet sysstat openssl python-setuptools lm_sensors ipmitool
Sedangkan untuk instalasi berbasis APT:
$ apt-get install ntp pv socat htop innotop vim easy_install mailutils bind-utils sysstat net-tools telnet openssl lm_sensors ipmitool
Untuk antarmuka baris perintah MySQL, kita dapat menggunakan alat lain selain klien baris perintah "mysql" standar seperti mycli, dengan pelengkapan otomatis dan penyorotan sintaks. Untuk menginstal paket, kita dapat menggunakan pip (Python package manager):
$ pip install mycli
Dengan mycli, seseorang dapat mengurangi vektor kesalahan manusia dengan visualisasi yang lebih baik ketika berhadapan dengan server produksi, seperti yang ditunjukkan pada tangkapan layar berikut:
Permintaan Shell yang Bermakna
Bagian ini awalnya terlihat tidak perlu, tetapi mungkin akan menyelamatkan Anda dari membuat kesalahan konyol dalam produksi. Sebagai manusia, kita cenderung membuat kesalahan terutama saat menjalankan perintah destruktif selama momen yang intens, misalnya saat server produksi sedang down.
Perhatikan screenshot berikut. Secara default, bash PS1 prompt (prompt utama) terlihat cukup membosankan:
Permintaan PS1 yang baik harus memberikan informasi yang jelas untuk membuat SysAdmins lebih sadar akan lingkungan, server, dan jalur saat ini yang sedang mereka hadapi. Akibatnya, seseorang akan lebih berhati-hati dan selalu tahu apakah berada di jalur/server/pengguna yang benar untuk menjalankan perintah.
Untuk mencapai ini, cari baris yang menjelaskan konfigurasi PS1 (prompt utama), biasanya di /etc/bashrc baris 41:
[ "$PS1" = "\\s-\\v\\\$ " ] && PS1="[\[email protected]\h \W]\\$ "
Dan ganti dengan baris ini:
[ "$PS1" = "\\s-\\v\\\$ " ] && PS1="[\[\e[36m\]\u\[\e[m\]@\[\e[32m\]\h\[\e[m\]\[\e[31;47m\]Production\[\e[m\]: \[\e[33m\]\w\[\e[m\]]$ "
Log out dari terminal dan login kembali. Anda akan melihat sesuatu seperti ini di terminal sekarang:
Seperti yang ditunjukkan pada tangkapan layar di atas, pengguna saat ini (biru), server hostname (hijau), Tingkat produksi (tebal dalam warna merah dengan latar belakang putih), bersama dengan path lengkap dari direktori saat ini (kuning) memberikan ringkasan yang lebih baik dari sesi saat ini di mana informasi penting dapat dengan mudah dibedakan dengan warna yang berbeda.
Anda dapat menggunakan alat online gratis ini untuk menyesuaikan prompt bash Anda, sesuai dengan selera Anda.
MOTD
Jika Anda mengelola klaster database dengan banyak peran seperti replikasi MySQL atau MariaDB, biasanya perasaan cemas ini selalu muncul saat mengelola salah satu host secara langsung karena kami perlu melakukan pemeriksaan ekstra untuk memverifikasi bahwa node tempat kita berada adalah node yang benar-benar ingin kita kelola. Topologi replikasi cenderung menjadi lebih kompleks karena klaster basis data Anda diskalakan dan mungkin ada banyak peran dalam klaster seperti master perantara, server binlog, master cadangan dengan replikasi semi-sinkron, budak hanya-baca, dan juga server verifikasi cadangan.
Akan jauh lebih baik jika kita bisa mendapatkan ringkasan status database setiap kali kita berada di server tertentu, hanya untuk memberi tahu kita apa yang akan kita tangani. Kita dapat memanfaatkan Message of the Day (MOTD) Linux untuk mengotomatiskan perilaku ini setiap kali kita masuk ke server. Menggunakan default /etc/motd hanya baik untuk konten statis, yang sebenarnya tidak kita inginkan jika kita ingin melaporkan status server MySQL saat ini.
Untuk mencapai hasil yang serupa, kita dapat menggunakan skrip Bash sederhana untuk menghasilkan keluaran MOTD yang berarti untuk meringkas server MySQL/MariaDB kita, misalnya:
$ vim ~/.motd.sh
#!/bin/bash
# Auto-generate MOTD for MySQL/MariaDB Replication
# .motd.sh, to be executed under ~/.bash_profile
#####
# Preferred role of the node, pick one
#PREFER_ROLE='Slave'
PREFER_ROLE='Master'
#####
HOSTNAME=$(hostname)
UPTIME=$(uptime -p)
MYSQL_COMMAND='mysql --connect-timeout=2 -A -Bse'
MYSQL_READONLY=$(${MYSQL_COMMAND} 'SHOW GLOBAL VARIABLES LIKE "read_only"' | awk {'print $2'})
TIER='Production'
MAIN_IP=$(hostname -I | awk {'print $1'})
CHECK_MYSQL_REPLICATION=$(${MYSQL_COMMAND} 'SHOW SLAVE STATUS\G' | egrep 'Slave_.*_Running: Yes$')
MYSQL_MASTER=$(${MYSQL_COMMAND} 'SHOW SLAVE STATUS\G' | grep Master_Host | awk {'print $2'})
# The following requires show_compatibility_56=1 for MySQL 5.7 and later
MYSQL_UPTIME=$(${MYSQL_COMMAND} 'SELECT TIME_FORMAT(SEC_TO_TIME(VARIABLE_VALUE ),"%Hh %im") AS Uptime FROM information_schema.GLOBAL_STATUS WHERE VARIABLE_NAME="Uptime"')
# coloring
bold=$(tput bold)
red=$(tput setaf 1)
green=$(tput setaf 2)
normal=$(tput sgr0)
MYSQL_SHOW=1
if [ $MYSQL_READONLY == 'ON' ]; then
CURRENT_MYSQL_ROLE='Slave'
if ${MYSQL_COMMAND} 'SHOW SLAVE STATUS\G' | egrep 'Slave_.*_Running: Yes$' &>/dev/null ; then
lag=$(${MYSQL_COMMAND} 'SHOW SLAVE STATUS\G' | egrep 'Seconds_Behind_Master:' | awk {'print $2'})
if [ $lag -eq 0 ]; then
REPLICATION_STATUS="${green}Healthy "
else
if [ $lag == 'NULL' ]; then
REPLICATION_STATUS=${red}Unhealthy
else
REPLICATION_STATUS="${red}Lagging ${lag}s"
fi
fi
else
REPLICATION_STATUS=${red}Unhealthy
fi
elif [ $MYSQL_READONLY == 'OFF' ]; then
CURRENT_MYSQL_ROLE='Master'
SLAVE_HOSTS=$(${MYSQL_COMMAND} 'SHOW SLAVE HOSTS' | awk {'print $1'})
else
MYSQL_SHOW=0
fi
if [ $TIER == 'Production' ]; then
TIER=${green}Production
fi
if [ $PREFER_ROLE == $CURRENT_MYSQL_ROLE ]; then
MYSQL_ROLE=${green}$CURRENT_MYSQL_ROLE
else
MYSQL_ROLE=${red}$CURRENT_MYSQL_ROLE
fi
echo
echo "HOST INFO"
echo "========="
echo -e " Hostname : ${bold}$HOSTNAME${normal} \t Server Uptime : ${bold}$UPTIME${normal}"
echo -e " IP Address : ${bold}$MAIN_IP${normal} \t Tier : ${bold}$TIER${normal}"
echo
if [ $MYSQL_SHOW -eq 1 ]; then
echo "MYSQL STATE"
echo "==========="
echo -e " Current role : ${bold}$MYSQL_ROLE${normal} \t\t Read-only : ${bold}$MYSQL_READONLY${normal}"
echo -e " Preferred role : ${bold}$PREFER_ROLE${normal} \t\t DB Uptime : ${bold}$MYSQL_UPTIME${normal}"
if [ $CURRENT_MYSQL_ROLE == 'Slave' ]; then
echo -e " Replication state : ${bold}$REPLICATION_STATUS${normal} \t Current Master : ${bold}$MYSQL_MASTER${normal}"
else
echo -e " Slave Hosts(s) ID : "
for i in $SLAVE_HOSTS; do
echo -e " - ${bold}$i${normal} \t"; done
fi
echo
fi
Pilih salah satu peran MySQL, baik master atau slave pada baris 8 atau 9 dan simpan skrip. Script ini membutuhkan file opsi MySQL untuk menyimpan kredensial pengguna database, jadi kita harus membuatnya terlebih dahulu:
$ vim ~/.my.cnf
Dan tambahkan baris berikut:
[client]
user=root
password='YourRootP4ssw0rd'
Ganti bagian kata sandi dengan kata sandi root MySQL yang sebenarnya. Kemudian, terapkan izin yang dapat dieksekusi ke skrip:
$ chmod 755 ~/.motd.sh
Uji skrip yang dapat dieksekusi apakah menghasilkan output yang benar atau tidak:
$ ~/.motd.sh
Jika output terlihat bagus (tidak ada kesalahan atau peringatan), tambahkan skrip ke ~/.bash_profile sehingga akan dimuat secara otomatis saat pengguna login:
$ whoami
root
$ echo '~/.motd.sh' >> ~/.bash_profile
Masuk ulang terminal dan Anda akan melihat sesuatu seperti ini di master:
Saat berada di slave, Anda akan melihat sesuatu seperti ini:
Perhatikan bahwa skrip ini khusus ditulis untuk MySQL/MariaDB sederhana- replikasi master-slave tingkat. Anda mungkin harus memodifikasi skrip jika Anda memiliki pengaturan yang lebih kompleks, atau Anda ingin menggunakan teknologi clustering MySQL lainnya seperti Galera Cluster, Group Replication atau NDB Cluster. Idenya adalah untuk mengambil status dan informasi node database tepat saat kita login sehingga kita mengetahui status server database saat ini yang sedang kita kerjakan.
Sensor dan Suhu
Bagian ini biasanya diabaikan oleh banyak SysAdmins. Pemantauan suhu sangat penting karena kami tidak ingin mendapat kejutan besar jika server berperilaku tidak terduga saat kepanasan. Server fisik biasanya terdiri dari ratusan komponen elektronik yang direkatkan dalam sebuah kotak dan peka terhadap perubahan suhu. Satu kipas pendingin yang gagal dapat meningkatkan suhu CPU hingga mencapai batas maksimalnya, yang pada akhirnya menyebabkan jam CPU melambat dan memengaruhi kinerja pemrosesan data secara keseluruhan.
Kita dapat menggunakan paket lm-sensors untuk tujuan ini. Untuk menginstalnya, cukup lakukan:
$ yum install lm-sensors # apt-get install lm-sensors for APT
Kemudian jalankan program sensor-detect untuk secara otomatis menentukan modul kernel mana yang perlu Anda muat untuk menggunakan lm_sensors secara paling efektif:
$ sensors-detect
Jawab semua pertanyaan (biasanya terima saja semua jawaban yang disarankan). Beberapa host seperti mesin virtual atau container tidak mendukung modul ini. Sensor benar-benar harus berada di level host (bare-metal). Lihat daftar ini untuk informasi lebih lanjut.
Kemudian, jalankan perintah sensor:
$ sensors
i350bb-pci-0203
Adapter: PCI adapter
loc1: +53.0°C (high = +120.0°C, crit = +110.0°C)
power_meter-acpi-0
Adapter: ACPI interface
power1: 4.29 MW (interval = 1.00 s)
coretemp-isa-0000
Adapter: ISA adapter
Package id 0: +55.0°C (high = +85.0°C, crit = +95.0°C)
Core 0: +45.0°C (high = +85.0°C, crit = +95.0°C)
Core 1: +51.0°C (high = +85.0°C, crit = +95.0°C)
Core 2: +47.0°C (high = +85.0°C, crit = +95.0°C)
Core 3: +51.0°C (high = +85.0°C, crit = +95.0°C)
Core 4: +49.0°C (high = +85.0°C, crit = +95.0°C)
Core 5: +48.0°C (high = +85.0°C, crit = +95.0°C)
Core 8: +47.0°C (high = +85.0°C, crit = +95.0°C)
Core 9: +49.0°C (high = +85.0°C, crit = +95.0°C)
Core 10: +48.0°C (high = +85.0°C, crit = +95.0°C)
Core 11: +48.0°C (high = +85.0°C, crit = +95.0°C)
Core 12: +46.0°C (high = +85.0°C, crit = +95.0°C)
Core 13: +49.0°C (high = +85.0°C, crit = +95.0°C)
coretemp-isa-0001
Adapter: ISA adapter
Package id 1: +53.0°C (high = +85.0°C, crit = +95.0°C)
Core 0: +46.0°C (high = +85.0°C, crit = +95.0°C)
Core 1: +48.0°C (high = +85.0°C, crit = +95.0°C)
Core 2: +47.0°C (high = +85.0°C, crit = +95.0°C)
Core 3: +45.0°C (high = +85.0°C, crit = +95.0°C)
Core 4: +46.0°C (high = +85.0°C, crit = +95.0°C)
Core 5: +47.0°C (high = +85.0°C, crit = +95.0°C)
Core 8: +47.0°C (high = +85.0°C, crit = +95.0°C)
Core 9: +45.0°C (high = +85.0°C, crit = +95.0°C)
Core 10: +45.0°C (high = +85.0°C, crit = +95.0°C)
Core 11: +46.0°C (high = +85.0°C, crit = +95.0°C)
Core 12: +46.0°C (high = +85.0°C, crit = +95.0°C)
Core 13: +46.0°C (high = +85.0°C, crit = +95.0°C)
Hasil di atas menunjukkan suhu CPU secara keseluruhan, bersama dengan setiap inti CPU-nya. Alat lain yang dapat kita gunakan untuk melihat keadaan keseluruhan komponen server adalah ipmitool. Untuk menginstal, cukup lakukan:
$ yum -y install ipmitool
Dengan menjalankan perintah berikut, kita dapat mengetahui keadaan keseluruhan komponen fisik di server:
$ ipmitool sdr list full
Inlet_Temp | 20 degrees C | ok
PCIe_Inlet_Temp | 37 degrees C | ok
Outlet_Temp | 20 degrees C | ok
CPU0_VR_Temp | 39 degrees C | ok
CPU1_VR_Temp | 41 degrees C | ok
CPU0_Temp | 55 degrees C | ok
CPU1_Temp | 52 degrees C | ok
PCH_Temp | 58 degrees C | ok
DIMMG0_Temp | 35 degrees C | ok
DIMMG1_Temp | 32 degrees C | ok
PSU0_Temp | 0 degrees C | ok
PSU1_Temp | 0 degrees C | ok
SYS_3.3V | 3.30 Volts | ok
SYS_5V | 5 Volts | ok
SYS_12V | 12.10 Volts | ok
CPU0_VCORE | 1.79 Volts | ok
CPU1_VCORE | 1.79 Volts | ok
CPU0_DDR_VDD | 1.23 Volts | ok
CPU1_DDR_VDD | 1.23 Volts | ok
SYS_FAN1_Speed | 4018 RPM | ok
SYS_FAN2_Speed | 4116 RPM | ok
SYS_FAN3_Speed | 4116 RPM | ok
SYS_FAN4_Speed | 4116 RPM | ok
SYS_FAN5_Speed | 4018 RPM | ok
SYS_FAN6_Speed | 4116 RPM | ok
SYS_FAN7_Speed | 4018 RPM | ok
SYS_FAN8_Speed | 4116 RPM | ok
SYS_FAN9_Speed | 4018 RPM | ok
SYS_FAN10_Speed | 4116 RPM | ok
SYS_FAN11_Speed | 4116 RPM | ok
SYS_FAN12_Speed | 4116 RPM | ok
SYS_FAN13_Speed | 4116 RPM | ok
SYS_FAN14_Speed | 4214 RPM | ok
Airflow_rate | 16 CFM | ok
PSU1_PIN | 0 Watts | ok
PSU2_PIN | 0 Watts | ok
PSU1_POUT | 0 Watts | ok
PSU2_POUT | 0 Watts | ok
PSU1_IIN | 0 Amps | ok
PSU2_IIN | 0 Amps | ok
PSU1_VIN | 0 Volts | ok
PSU2_VIN | 0 Volts | ok
CPU_Power | 63 Watts | ok
MEM_Power | 8 Watts | ok
Total_Power | 0 Watts | ok
BP_Power | 8 Watts | ok
FAN_Power | 6 Watts | ok
MB_Power | 0 Watts | ok
Daftarnya panjang tetapi cukup jelas dan Anda harus dapat mengawasi keadaan komponen server secara keseluruhan. Mungkin ada kasus di mana beberapa kipas tidak berjalan dengan kecepatan penuh yang kemudian meningkatkan suhu CPU. Penggantian perangkat keras mungkin diperlukan untuk memperbaiki masalah.
Perhatikan bahwa modul kernel Intelligent Platform Management Interface (IPMI) memerlukan Baseboard Management Controller (BMC) untuk diaktifkan pada motherboard. Gunakan dmesg untuk memverifikasi apakah tersedia:
$ dmesg | grep -i bmc
[ 8.063470] ipmi_si IPI0001:00: Found new BMC (man_id: 0x000000, prod_id: 0x02f3, dev_id: 0x20)
Jika tidak, periksa pengaturan BIOS server jika pengontrol ini dinonaktifkan.
Itu saja untuk saat ini. Bagian kedua dari seri blog ini akan membahas 5 topik lainnya seperti konfigurasi alat pencadangan, uji stres, dan penguncian server.