Monday, May 1, 2017

Solusi untuk MySQL yang tiba-tiba mati di VPS

Sumber https://www.hardinal.com/blog/solusi-untuk-mysql-yang-tiba-tiba-mati-pada-webuzo/

untuk membuat swap  http://tempatmencatat.blogspot.co.id/2015/12/how-to-add-swap-on-centos-6.html

Mungkin pengalaman saya ini cukup bisa memberi pelajaran.
Jadi saya beberapa waktu lalu menjual web wallpaper saya. Spesifikasi hosting untuk web wallpaper itu yang paling penting adalah space yang besar. Web wallpaper yang saya jual kemaren memiliki ukuran 30GB.
Si klien nanya spek hosting yang cocok, dia pengennya Shared hosting dari Hotgator, cuma saya tidak direkomendasikan, saya tolak karena meskipun judul nya Unlimited, tetep saja Hosgator membatasi jumlah inode maksimal 250.000 buah inode.
Sebagai informasi yang saya tahu, inode adalah jumlah seluruh file dan folder dalam suatu folder. Misal saya punya folder bernama Foto di dalam folder itu ada 10 foto, maka total inode adalah 11 yang terdiri dari 10 file foto dan 1 folder Foto.
Kembali lagi ke masalah hosting, saya kemudian menyarankan klien untuk menyewa VPS saja karena inode web wallpaper saya lebih dari 250rb buah.
Setelah diskusi saya menyarankan dia untuk nyewa di Vultr karena dengan $5 per bulan bisa mendapat ruang HD 125GB, memang belum SSD, tapi spek itu sdh lebih dari cukup (kalo yang SSD hanya 30GB).
Spek detail VPS nya adalah: 512 MB RAM, 1 core CPU, 125GB SATA, CentOS 6 64 bit.
Si klien ini ngga ngerti cara mengoperasikan VPS, dia minta saya untk install cPanel.
Berhubung saya ngga ngerti cara nginstall cPanel (karena ngga kebeli) saya carikan alternatif panel yaitu Webuzo.
Skip skip skip…
Setelah saya install Webuzo, lalu kok aneh ya, penggunaan RAM oleh MySQL cukup besar, padahal NS belum diarahkan ke VPS, masih ke Dedicated Server saya.
Setelah semua file saya pindahkan dari server saya ke VPS Vultr, saya minta klien untuk arahkan NS nya ke IP VPS.
Namun beberapa jam setelah itu VPS selalu mati, saya reboot server, 20 menit kemudian mati lagi. Begitu terus… Saya ganti MySQL jadi MariaDB tapi tetep aja ngga nyelesain masalah.
Aneh memang, padahal saya punya beberapa VPS yang memiliki spek lebih rendah (256MB RAM, Debian 7) yang saya install LEMP lancar-lancar aja tanpa downtime.
Tadinya saya mau nyaranin si klien buat diinstall LEMP aja (tanpa Webuzo) agar lebih ringan, atau minta dia buat upgrade RAM jadi 1GB. Dia udah setuju tapi saya masih penasaran atas penyakit MySQL tiba-tiba mati tersebut.
Saya kemudian melihat error log mysql dengan perintah
1 lines
1
tail -f /var/log/mysqld.log
Dan hasilnya seperti ini:
webuzo mysql error log
Setelah Googling dengan kata kunci “Fatal error: cannot allocate memory for the buffer pool” akhirnya saya nemu jawaban dan narik kesimpulan seperti berikut.
Sesuai informasi dari situs resmi Webuzo, bahwa minimal RAM untuk Webuzo adalah 1GB, sementara itu, VPS yang saya seting hanya punya 512MB RAM, artinya ada kekurangan.
Konyol nya saya, saya ngga ngeuh kalo saya blm membuat file SWAP memory sebagai backup jika sewaktu-waktu memori utama habis. Vultr sendiri secara default ngga membuatkan memori swap saat instalasi.
Kemudian saya membuat file swap dan sampe sekarang MySQL pada VPS pun lancar dan tidak mati lagi seperti sebelumnya.
Bagi yang belum tau, swap memory itu semacam memory virtual / RAM tambahan yang diambil dari harddisk, jadi sangat membantu memori utama.
Lalu bagaimana cara membuat file swap?
Memory VPS yang saya setting memiliki RAM 512 MB. Untuk cari aman, saya buat Swap memory menjadi 2 x memori utama, artinya 1GB. 1GB = 1024k. Maka, tinggal lakukan perintah ini lewat SSH Client.
1 lines
1
dd if=/dev/zero of=/swap.file bs=1024 count=1024k
1 lines
1
mkswap /swap.file
1 lines
1
swapon /swap.file
Lalu edit file konfigurasi, saya edit pake vi editor
1 lines
1
vi /etc/fstab
Lalu tambahkan kode ini di baris paling akhir
1 lines
1
/swap.file none swap sw 0 0
Beres deh.
Setelah itu, silahkan cek dengan perintah free -m, harus nya nanti bakal keliatan di kolom total pada baris Swap ada berapa (punya saya di bawah ini: 1023).
free m linux command
Selain itu, saya tuning konfigurasi mysql yang ada di Webuzo. Di bawah bagian[mysqld] saya tambahkan kode berikut:
1 lines
1
innodb_buffer_pool_size=64M
Lalu saya restart MySQL server nya.
Lihat penampakan htop saya setelah dibuat memori swap
htop
Kalo ditotal memori yang dipakai adalah 359+190 = 549. Sebelumnya pantas saja MySQL sering mati (down) tiap 20 menit karena RAM nya abis karena hanya punya 512MB.
Nah kalo ada yang memiliki error seperti di atas (Fatal error: cannot allocate memory for the buffer pool) kemungkinan VPS nya kekurangan memori, silahkan buat memori swap, mudah-mudahan lancar.
Solusi Tambahan: Menghidupkan MySQL / MariaDB Yang Mati Di Webuzo
Agar lebih afdol, maka kita harus melakukan langkah selanjutnya. Ini diperlukan jika solusi di atas gagal (mysql / mariadb tetap suka mati sendiri), jadi ikuti saja ya langkah selanjutnya. Tidak susah kok.
Kita akan membuat suatu perintah yang akan mengecek program mysql setiap menit.
Setiap menitnya, program akan mememerika service mysql, jika mysql hidup, maka program tidak melakukan apa-apa, jika mysql mati, maka program akan berusaha menghidupkannya.
Pertama kita buat dulu programnya, ketik perintah berikut:
1 lines
1
cd ~
1 lines
1
vi jalankan-mysql.sh
Copy paste kode di bawah!
7 lines
1
2
3
4
5
6
7
#!/bin/bash
PATH=/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/bin
if [[ ! "$(service mysqld status)" =~ "start/running" ]]
then
service mysqld start
fi
Kalau Anda menggunakan mariadb maka ganti kode “service mysqld status” di atas, menjadi “service mariadb status“. Juga ganti kode “service mysqld start” menjadi “service mariadb start
Save kalo sudah, dan jalankan
1 lines
1
chmod +x jalankan-mysql.sh
Setelah selesai membuat program nya, kita harus integrasikan dengan cronjob. Cronjob itu kaya “to do list” yang akan dijalankan sesuai jadwal yang kita tentukan (Ibarat kita nyeting alarm maka di jam tersebut alarm akan hidup).
Cara setting cronjob-nya adalah sbb.
Tapi sebelum setting, pastikan cron sudah terinstall, kalau belum terinstall silahkan install dulu.
Untuk CentOS, perintahnya yum install cronie
Untuk Ubuntu, perintahnya apt-get install cron
Setelah terinstall tinggal jalankan perintah ini
1 lines
1
crontab -e
Lalu tambahkan kode ini di baris paling awal (sisa baris yang ada diturunkan ke bawah aja)
1 lines
1
*/1 * * * * /root/jalankan-mysql.sh
Jika editor untuk crontab bernama nano maka save dengan menekan kombinasi tombol CTRL+O diakhiri dengan Enter. Jika editor nya vi maka tinggal eksekusi perintah :wq.
Selesai.
Untuk mengujinya, kita akan dengan sengaja mematikan service mysql. Caranya:
1 lines
1
service mysqld stop
Kalau Anda menggunakan mariadb maka ganti perintah “service mysqld stop” menjadi “service mariadb stop
Cek website, seharusnya web sekarang error. Lalu, tunggu selama 1 menit dan cek kembali website, seharusnya web akan kembali live.
https://www.hardinal.com/blog/solusi-untuk-mysql-yang-tiba-tiba-mati-pada-webuzo/