show slave status.
Pada replikasi MySQL ada yang namanya statement SHOW SLAVE STATUS
. Disini kita akan belajar mengenai statement tersebut.
Apa itu SHOW SLAVE STATUS
SHOW SLAVE STATUS adalah sebuah statement pada MySQL, dimana kita bisa mengecek status replikasi MySQL yang berisi beberapa informasi, mulai dari koneksi yang sedang digunakan oleh slave ke master (host, port, username), informasi file binlog (binary log), informasi apakah ada delay replikasi, error replikasi? dll.
Output dari SHOW SLAVE STATUS ada banyak kolom (seperti gambar diatas). Disini saya akan jabarkan fungsi pada kolom-kolom tersebut based on my exprience.
Mari kita mulai.
Slave_IO_State
Kolom slave_io_state berfungsi sebagai state / tanda, apakah slave sudah terhubung ke master?
Ada beberapa state pada slave_io_state, lengkapnya ada didokumentasi mysql, namun disini saya jelaskan 2 saja (sesuai yang saya tahu) :
- Connecting to master
Tandanya slave sedang mencoba connect ke master. Jika kita baru pertama kali membuat replikasi dan menjalankan statementCHANGE MASTER TO
, salah satu state yang tampil adalah connecting to master. Slave akan mencoba connect ke master selama 60 detik (default). Jika lebih dari 60 detik, maka akan kena timeout dan slave akan mencoba reconnect lagi. - Waiting for master to send event
Artinya slave sudah connected ke master dan slave sedang menunggu event file binlog (binary log) yang baru dari master. Jika ada binlog baru, master akan mengirimkan event (notifikasi) ke slave, kemudian slave akan segera mendownloadnya. Jika tidak ada binlog baru, koneksi slave ke master akan terbuka terus sampai kena timout (slave_net_timeout) dan koneksi direconnect lagi secara otomatis.
Master Host
Master Host, Master User, Master Port saling berkaitan. Digunakan oleh slave untuk connect ke master.
Master Host merupakan host dari DB master. Master Host bisa berupa IP address atau DNS name. Misal:
- IP address: 180.111.222.445
- DNS name: testdb.1ab2.ap-southeast-1.rds.amazonaws.com
Master User
(Lihat gambar pada master host).
Master user adalah username yang ada di DB master yang digunakan oleh slave untuk connect ke master untuk melakukan replikasi. Biasanya user ini memiliki privilege REPLICATION SLAVE
agar slave mempunyai hak akses untuk melakukan replikasi.
Master Port
(Lihat gambar pada master host).
Master Port adalah port pada DB master, dimana slave akan connect ke master menggunakan port ini. Jika port dimaster adalah 3306, maka biasanya slave akan connect menggunakan port 3306 juga.
Connect Retry
Adalah nilai waktu (dalam detik) untuk me-retry koneksi jika slave gagal connect ke master. Variable ini diset ketika menjalankan statement CHANGE MASTER TO
pada field MASTER_CONNECT_RETRY. Jika tidak diset maka nilai defaultnya adalah 60 detik.
Master_Log_File
Master Log File merupakan file binlog pada master yang sedang dibaca/download oleh slave melalui I/O thread si slave.
Secara periodik master akan membuat binlog (binary log) yang nantinya akan didownload oleh slave. File binary log pada master ini biasanya akan dipecah-pecah menjadi beberapa file. Misal mysql-bin.000012, mysql-bin.000013, … mysql-bin.002111, dst (Note: nama mysql-bin bisa diset, bisa saja mysql-bin-changelog.xxx). File mysql-bin.xxx tersebut masing-masing berukuran 100 MB (kita bisa set sendiri mau berapa MB per file).
Jika koneksi internet di slave sedang lemot, maka bisa terjadi lag saat mendownload file binlog. Sebagai contoh, jika di master sudah mencreate file binlog mysql-bin.000010, bisa jadi di slave baru mendownload file mysql-bin.000005 karena koneksi lagi lemot. Impactnya, data dislave tidak akan sama dengan yang dimaster.
Read_Master_Log_Pos
Pada posisi byte keberapa file binlog master (pada Master_Log_File) sedang dibaca (didownload) oleh slave melalui I/O thread.
Contoh, Misal value dari Master_Log_File saat ini adalah mysql-bin.00010 (dimana file tersebut berukuran 100 MB) Kemudian slave akan mendownloadnya dan setiap byte yang sudah didownload tersebut akan disimpan pada Read_Master_Log_Pos ini.
Ini sama seperti kita sedang mendownload file dari internet (misal film, dengan ukuran 1GB) di browser. Jika kita lihat pada halaman download browser, maka progress downloadnya ketahuan sudah berapa MB yang terdownload?. Nah progress download ini sama seperti Read_Master_Log_Pos.
Relay_Log_File
Relay_Log_File merupakan kolom yang berisi file relay log yang sedang dibaca dan dieksekusi oleh SQL thread. Relay log ini merupakan file hasil downloadan dari file binlog master (misal mysql-bin.000002). Relay log disimpan di server slave. Format relay log biasanya seperti ini: host-relay-bin.000001, host-relay-bin.000002, dst.
Alur terbuatnya file relay log kira-kira seperti ini:
- Slave mendownload file binlog yang ada dimaster, misal mysql-bin.000002
- File yang didownload ini disimpan di server slave dan diberi nama relay-bin.000002
- Bisa dibilang relay-bin.000002 = mysql-bin.000002
- Defaultnya, file relay log disimpan di folder /var/lib/mysql/
- Setelah relay-bin.0000002 terdownload semua ke server slave, SQL thread slave akan membaca isi filenya (which is berisi SQL Statement seperti INSERT, UPDATE, DELETE, ALTER dalam bentuk binary)
- Semua SQL statement tersebut akan dijalankan / dieksekusi di sisi slave, sehingga data di database slave akan terupdate
- File relay-bin.0000002 akan segera dihapus jika SQL thread sudah membaca dan mengeksekusi semua isi dari file tersebut
Contoh isi dari file relay host-relay-bin.063419
dari server slave yang saya punya:
Jika diperhatikan file host-relay-bin.063419 mengacu ke file binlog mysql-bin-changelog.298598. Jadi bisa dibilang file host-relay-bin.063419 merupakan alias dari mysql-bin-changelog.298598
Kenapa angkanya tidak sama, 063419 dan 29858 ? Saya juga tidak tahu, dari MySQL sudah seperti itu. :’)
Relay_Log_Pos
Pada posisi byte keberapa dari file host-relay-bin.xxx pada kolom Relay_Log_File sudah dibaca dan dieksekusi oleh SQL Thread.
Fungsi Relay_Log_Pos sama seperti Read_Master_Log_Pos, yaitu menyimpan posisi byte yang sudah dibaca & dieksekusi. Cuma bedanya Relay_Log_Pos ada dilevel SQL thread, sedangkan Read_Master_Log_Pos ada dilevel I/O thread.
Relay_Master_Log_File
Merupakan nama file binary log master yang sudah dibaca dan dieksekusi oleh SQL thread.
Sebenarnya Relay_Master_Log_File berhubungan dengan Relay_Log_File. Ketika SQL thread sedang membaca host.relay-bin.xxx, pada saat itu juga slave mencari mysql-bin.xxx yang terelasi ke host.relay-bin.xxx tersebut. Sehingga Relay_Master_Log_File dan Relay_Log_File akan sama-sama terupdate valuenya.
Menurut saya (CMIIW), kolom Relay_Master_Log_File ini dibuat supaya memudahkan monitoring, untuk melihat sudah sampai mana file binlog master yang sudah dibaca oleh slave melalui SQL thread? Alih-alih melihat file relay-bin.xxx kita tidak tahu posisi binlog master sebenarnya?
Relay_Master_Log_File juga digunakan sebagai acuan untuk memfix error replikasi (misal relay-bin corrupted). Solusinya, slave akan direset, kemudian dilakukan CHANGE MASTER TO
kembali, dimana binlog master akan diambil dari value Relay_Master_Log_File, tempelkan value tersebut ke field MASTER_LOG_FILE.
Exec_Master_Log_Pos
Pada posisi byte keberapa file binlog master yang sudah dibaca dan dieksekusi oleh SQL thread si slave.
Exec_Master_Log_Pos ini pasangannya Relay_Master_Log_File. Jadi ketika host-relay.bin.xxx diread, maka posisi file binlog masternya akan dicari, begitu juga posisi bytenya dicatat.
Exec_Master_Log_Pos juga digunakan untuk menfix error replikasi. Biasanya slave akan direset (RESET SLAVE) jika replikasinya corrupted, kemudian dilakukan CHANGE MASTER TO
lagi. Dimana value MASTER_LOG_POS diambil dari Exec_Master_Log_Pos.
Slave_IO_Running
Apakah I/O thread slave sudah running? jika isinya yes maka I/O thread sudah running.
Slave_SQL_Running
Apakah SQL thread slave sudah running? jika isinya yes maka SQL thread sudah running.
Replicate_Do_DB
List database yang bisa direplikasikan. Jika diisi, maka hanya database tersebut yang bisa direplikasi.
Seconds_Behind_Master
Ini menandakan seberapa lag replikasi. Jika isinya 0 maka tidak ada lag. Jika > 0 maka ada lag.
FYI, selama memonitor replikasi, kolom ini yang paling sering saya pantau. Karena jika terjadi lag, data akan delay dan mengakibatkan user pada teriak (saya tarik data report kok tidak terupdate datanya!??) :D.
Penyebab lag ada beberapa faktor:
- Long queries
- Slave server overload
- Locks
Slave_SQL_Running_State
State / Tanda untuk mengetahui status SQL thread sekarang. Ada beberapa state, tapi saya jelaskan 2 saja:
- Slave has read all relay log; waiting for more updates
Artinya slave (melalui SQL thread) sudah membaca semua relay log. Ini artinya tidak ada delay disisi slave. Dan posisi I/O thread sekarang sedang standby menunggu events binary log yang baru dari master. - Reading event from the relay log
Artinya sedang membaca file relay log. Biasanya disini ada delay. Detailnya bisa dilihat pada value Seconds_Mehind_Master, semakin besar valuenya semakin lama delay.
Last_Error
Merupakan error terakhir dari SQL thread.
Misal, SQL thread gagal membaca relay log, maka errornya bisa berupa:
Relay log readfailure: Cloud not parse relay log.
Kolom ini merupakan alias dari Last_SQL_Errorno dan Last_SQL_error.
—
Oke sekian tutorial memahami statement show slave status pada replikasi mysql, semoga bermanfaat!