TeknoCerdas.com – Salam cerdas untuk kita semua. Dalam sebuah instalasi MySQL replication ketertinggalan atau lag pada Slave sering terjadi. Pada tulisan ini TeknoCerdas akan membahas bagaimana membuat replication lag monitor untuk MySQL dengan PHP dan AWS Lambda.
Secara singkat replication lag adalah keterlambatan MySQL slave untuk mereplikasi data dari MySQL master.
Apa yang terjadi ketika terjadi lag pada MySQL replication? Kemungkinan terburuk adalah aplikasi tidak berfungsi sebagai mana mestinya. Untuk itu peran monitoring untuk MySQL replication penting untuk mengetahui akar masalah.
Replication lag monitoring yang akan dibuat dengan model Serverless dengan perhitungan bahwa aplikasi ini akan tidak dibuka setiap waktu. Monitoring terdiri dari sebuah PHP script dan berjalan diatas AWS Lambda dan menggunakan custom runtime Bref PHP.
Kriteria dari aplikasi monitoring ini adalah:
- Serverless – Tidak perlu ada pengelolaan server
- Sebuah aplikasi web normal bukan API
- Tidak ada trigger alarm yang dikirim ketika replikasi lag terjadi
- Aplikasi dapat melakukan skip error pada Slave agar proses replikasi dapat kembali berjalan.
- Proses otentikasi diabaikan untuk simplifikasi
Daftar Isi
- Persiapan Pembuatan MySQL Replication Lag Monitor
- Membuat MySQL Akun untuk Monitoring
- Membuat Script Replication Lag Monitoring
- Deployment dengan Serverless Framework
- Melakukan Tes Replication Lag Pada Slave
Persiapan Pembuatan MySQL Replication Lag Monitor
Sebelum mulai membuat PHP script untuk monitoring replication lag pada MySQL Slave beberapa syarat yang harus diperhatikan.
- Memiliki akun AWS yang aktif
- Memiliki pemahaman dasar tentang AWS Lambda dan Custom Runtime
- Memiliki pemahaman dasar tentang Serverless Framework
- Memiliki pemahaman dasar tentang PHP
- Memiliki pemahaman dasar tentang MySQL server
- Memiliki instalasi MySQL Master-Slave yang sudah berjalan
Jika anda tidak memiliki prasyarat diatas silahkan lanjutkan membaca. Karena mungkin banyak informasi baru yang diperoleh meskipun tanpa mencoba langsung tutorial ini.
Membuat MySQL Akun untuk Monitoring
Script perlu melakukan beberapa hal yang membutuhkan privilege tertentu. Untuk itu perlu dibuatkan akun baik disisi Master dan Slave. Berikut ini adalah akun yang dibutuhkan.
User | Server | Privilege | Catatan |
master_monitor | Master | REPLICATION CLIENT | Untuk menjalankan SHOW MASTER STATUS |
slave_monitor | Slave | SUPER | Untuk menjalankan manajemen Slave dan SET global variabel |
Pada server MySQL master jalankan query berikut.
mysql> CREATE USER 'master_monitor'@'%' IDENTIFIED BY 'teknocerdas123';
mysql> GRANT REPLICATION CLIENT ON *.* TO 'master_monitor'@'%';
Pada server MySQL slave jalankan query berikut.
mysql> CREATE USER 'slave_monitor'@'%' IDENTIFIED BY 'teknocerdas123';
mysql> GRANT SUPER ON *.* TO 'slave_monitor'@'%';
Membuat Script Replication Lag Monitoring
Script ini hanya terdiri dari sebuah file PHP. Karena aplikasi yang dibuat cukup sederhana maka view HTML akan digabungkan menjadi satu untuk simplifikasi.
Berikut adalah file index.php
yang akan menampilkan monitoring replication lag pada Slave.
getMessage());
exit(2);
}
try {
$slavePdo = new PDO(getenv('DSN_SLAVE'), getenv('USER_SLAVE'), getenv('PASSWD_SLAVE'));
} catch (PDOException $e) {
printf('Failed to connect Slave. Message: %s', $e->getMessage());
exit(2);
}
?>
exec('STOP SLAVE');
$slavePdo->exec('SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1');
$slavePdo->exec('START SLAVE'); ?>
Queries below has been run to skip the error.
- STOP SLAVE
- SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1
- START SLAVE
query("SHOW MASTER STATUS", PDO::FETCH_ASSOC)->fetchAll();
$slaveResult = $slavePdo->query("SHOW SLAVE STATUS", PDO::FETCH_ASSOC)->fetchAll();
?>Master vs Slave Summary
Status
Master
Slave
Log File
= $masterResult[0]['File'] ?>
= $slaveResult[0]['Master_Log_File'] ?>
Log Position
= $masterResult[0]['Position'] ?>
= $slaveResult[0]['Exec_Master_Log_Pos'] ?>
Slave SQL Thread is not running. Do you want to skip error?
Master Status
$value) : ?>
= $key ?>
= $value ?>
Slave Status
$value) : ?>
= $key ?>
= $value ?>
getMessage() . "
";
}
?>