Rubyrep saya Crash !

  Pagi ini seperti biasanya saya login ke database Postgresql untuk melihat kondisi database, sekaligus check apakah masih ada record record yang belum ter-replikasi melalui rubyrep. Ternyata ada 350 ribu record yang belum terreplikasi. Saya check rubyrepnya juga masih berjalan normal melalui perintah top dan ps. Saya tunggu beberapa saat dan menghitung kembali berapa jumlah record yang ada di tabel rr_pending_changes. Ternyata jumlahnya terus meningkat, berarti tidak ada data yang terkirim ke server master yang lainnya.

Applikasi rubyrepnya jalan, indikasi di top dan ps menunjukkan kalau java nya masih aktif bekerja. Saya menggunakan rubyrep versi JRuby. Postgresql di mesin source juga masih aktif bekerja. Akhirnya saya simpulkan rubyrepnya yang tidak bekerja, walaupun top dan ps menunjukkan kalau applikasinya masih aktif. Akhirnya saya kill semua proses rubyrep dan saya aktifkan rubyrep kembali dengan parameter log saya aktifkan.

Kemudian setelah rubyrep aktif kembali, saya cek lagi berapa jumlah record yang pending sekarang, sekitar 370 ribu record. Saya lihat log di left dan di right. Di log untuk database source (left log), ruby rep memproses perintah seperti di bawah ini berulang ulang hingga berbaris baris ke bawah.

select "change_table", "change_key", "change_new_key", "change_type", "change_time", "id"
from "rr_sby_pending_changes"
where ("id") > (5100081) order by "id" limit 1

Sedangkan di dalam log database target (right log), saya menemukan ada 1 perintah insert yang error, yang menunjukkan kegagalan insert data karena data sudah ada, duplicate value violate constraint _pk. Error ini menunjukkan bahwa ada 1 record yang gagal di duplikasi ke mesin target karena di mesin target data tersebut telah ada.

Untuk mengatasi hal ini, saya menghapus record data di tabel rr_pending_changes yang gagal tersebut. Kemudian saya restart kembali rubyrep dan memperhatikan error log yang kemungkinan muncul. Setelah beberapa saat muncul juga problem sejenis seperti diatas, tetapi dengan perintah sql serperti berikut di dalam log database source (left log) :

select "change_table", "change_key", "change_new_key", "change_type", "change_time", "id"
from "rr_sby_pending_changes"
where ("id") > (5945381) order by "id" limit 1000

Perintah ini muncul berulang ulang juga di dalam log, dan di console yang menjalankan rubyrep muncul error JAVA, GC overhead limit dan Java Heap Space. Kedua error ini menunjukkan bahwa applikasi rubyrep memakan semua resource JAVA hingga habis tidak bersisa. Saya baca di group milist rubyrep menunjukkan bahwasannya saya masih memakai default setup Jruby untuk 500mb, dan disarankan untuk menaikkan heap sizenya menjadi 1GB dengan perintah -J-Xmx1024m.

Dikarenakan saya masih ragu ragu, saya ulangi proses rubyrep saya. Setelah sekian lama tetap saja error tersebut muncul kembali dan akhirnya rubyrep saya crash, stop bekerja, hilang dari top dan ps.

Akhirnya saya ikuti saran dari milist rubyrep, saya ubah beberapa bagian dari file konfigurasi dan script rubyrep, sehingga script eksekusi rubyrep saya sekarang akan seperti ini :

 #!/bin/bash

 script_dir="`dirname \"$0\"`"

 jruby_path="$script_dir"/jruby/bin/jruby
 rubyrep_path="$script_dir"/bin/rubyrep

 $jruby_path --server -J-Xmx1024m $rubyrep_path $*

selain itu saya juga merubah file konfigurasi rubyrep dengan menambahkan 2 parameter berikut ini :

config.options[:row_buffer_size] = 100
config.options[:commit_frequency] = 500

Parameter yang pertama akan memaksa rubyrep untuk mengambil 100 record untuk setiap table untuk di prosess, defaultnya adalah 1000 record. Dengan hanya mengalokasikan 100 record diharapkan proses rubyrep tetap berjalan dan memory Jruby tidak cepat habis.

Parameter yang kedua akan memaksa rubyrep untuk malakukan commit untuk setiap 500 transaksi yang di proses, default 1000. Dengan parameter ini process commit transaksi akan lebih cepat, sehingga bufer memory dapat dipergunakan untuk memproses record yang lainnya.

Kemudian saya ulangi prosess replikasi rubyrep. Posisi record yang terpending saat ini adalah 500ribu record. Setelah bererapa lama prosess rubyrep berjalan akhirnya saya melihat log di database sumber (left log) menunjukkan adanya perintah insert, delete dan update (DML), yang artinya replikasinya sudah berjalan kembali.

Jika saya tetap mengacu pada tulisan yang terdahulu, maka untuk 500 000 record dengan kecepatan replikasi 20 record/detik, maka dibutuhkan waktu sekitar 6.5 jam. Lama juga ya. Bagaimana dengan anda ?

Author: Nareswara

Ordinary People with eye glasses

Leave a Reply

Your email address will not be published. Required fields are marked *