Bucardo : Menambah Server ke dalam Replikasi Master To Master

  Beberapa waktu yang lalu, saya memutuskan untuk menambahkan 1 server lagi kedalam replikasi master to master yang saya pergunakan. Saya memakai Bucardo untuk menangani replikasi master to master. Performancenya cukup memuaskan saya. Nah saat ini saya merasa perlu untuk menambah 1 server lagi untuk membagi beban kerja di server.

Pada awalnya tujuan memakai 2 server hanya untuk keperluan berbagi beban server dan backup di dalam 1 lokasi gedung, ternyata diperjalanannya untuk lokasi kota yang lain perlu juga di bagi beban servernya dan backup jika sewaktu waktu jaringan antar kota terputus, sehingga tidak akan mengganggu transaksi lokal. Untuk instalasi awal replikasi master to master dengan bucardo dapat anda baca disini.

Informasi :

  • db1 memiliki ip address 192.16.0.1
  • db2 memiliki ip address 192.16.0.2
  • db1 dan db2 berada dalam 1 gedung
  • db3 memiliki ip address 192.16.1.3
  • db3 berada di kota yang berbeda

Nah berikut adalah langkah langkah untuk menambahkan Server Database db3  ke dalam replikasi :

  • Login ke Server Bucardo dan stop replikasinya.
    • bucardo stop
  • Login ke Server Applikasi dan stop semua applikasi yang terkoneksi ke Server Database
  • Login ke Server Database ke 1 , backup dan kirim Server Database ke 3
    • pg_dump -h 127.0.0.1 -U postgres my_database > my_database.dmp
    • scp my_database.dmp root@192.16.1.3:/root
  • Login ke Server Database ke 3, buat database baru, dan restore database backupnya
    • psql -h 127.0.0.1 -U postgres -c “create database my_database; ” template1
    • psql -h 127.0.0.1 -U postgres -d my_database < my_database.dmp
  • Login ke Server Bucardo, daftarkan Server Database ke 3, dan syncronize ulang
    • bucardo add db db3 dbname=eis dbhost=192.16.1.3 dbuser=postgres dbpass=password
    • bucardo remove sync db_sync
    • bucardo remove dbgroup db_group
    • bucardo add dbgroup db1:source db2:source db3:source
    • bucardo add sync db_sync herd=db_herd dbs=db_group
    • bucardo start
  • Kemudian check log.bucardo, kita akan menemukan pesan kesalahan seperti ini :
    • “(23143) [Mon Dec 3 13:18:24 2012] VAC Warning! VAC was killed at line 6486: DBD::Pg::st pg_result failed: ERROR: relation “bucardo.delta_265672? does not exist”
    • Tenang, pesan kesalahan ini terjadi karena kita melakukan restore database beserta object object bucardo dari server asal.
    • Setelah kita restore database dan kemudian bucardo kita start, maka bucardo akan melakukan proses sinkronisasi objectnya. Karena kita melakukan restore, tentu saja object id atau OID dari object table di server yang baru akan berbeda dengan object id dari server yang lama. Oleh karena itu, bucardo akan mendaftarkan ulang object table di server yang baru, sehingga kita harus menghapus object id yang lama secara manual.
    • Mari kita periksa table bucardo_delta_targets, disinilah object table di daftarkan.
      • select * from bucardo.bucardo_delta_targets;
    • Kita akan mendapati, daftar table dengan perbedaan di tanggal registrasi, di kolom cdate. Yang perlu kita lakukan adalah menghapus semua table yang memiliki tanggal cdate tidak sama dengan saat ini atau saat prosess restore.
      • delete from bucardo.bucardo_delta_targets where to_char(cdate,’dd/mm/yyyy’) <> to_char(now(),’dd/mm/yyyy’);
    • Setelah itu periksa kembali file log.bucardo, seharusnya pesan kesalahan sudah tidak muncul lagi.
  • Done

Nah, sekarang kita memiliki 3 server di dalam replikasi master to master kita, db1 dan db2 dalam 1 gedung, db3 berada di kota yang lain. Dengan cara ini, apabila terjadi putusnya jaringan antar kota, maka user di kota yang lain tetap dapat menjalankan applikasi. Dan pada saat jaringan tersambung kembali maka bucardo akan melakukan sinkronisasi data kembali. Bagaimana pendapat anda ?

Instalasi Rubyrep, master to master replikasi untuk database PostgreSQL

  Rubyrep yang saya pergunakan adalah versi rubyrep dengan JRuby. Sampai saat ini kecepatan replikasi yang dapat saya peroleh adalah 20 record per detik. Hasil ini dapat berbeda untuk jenis applikasi yang anda gunakan.

Konfigurasi yang saya miliki :

  • memakai 3 server yang terinstall Ubuntu 10.10.
  • 2 Server memiliki Database PostgreSQL 9.1.
  • 1 Server memiliki Java 1.6 untuk RubyRep berjalan.

Berikut langkah langkah yang dilakukan untuk instalasi rubyrep :

  • Download Rubyrep versi JRuby disini.
  • ekstrak file hasil download tersebut.
  • Kemudian buat file konfigurasinya.
$> cd rubyrep
$> ./rubyrep generate myruby.conf
  • Edit file konfigurasi sesuai dengan database anda, berikut adalah konfigurasi milik saya.
 RR::Initializer::run do |config|
  config.left = {
    :adapter  => 'postgresql', # or 'mysql'
    :database => 'db1',
    :username => 'postgres',
    :password => 'postgres',
    :host     => '192.168.0.1',
    :port     => '5432',
#    :logger   => '/opt/rubyrep/db1_sql.log'
  }

  config.right = {
    :adapter  => 'postgresql',
    :database => 'db2',
    :username => 'postgres',
    :password => 'postgres',
    :host     => '192.168.0.2',
    :port     => '5432',
#    :logger   => '/opt/rubyrep/db2_sql.log'
  }

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

  ## General Options :
  config.options[:database_connection_timeout] = 360
  config.options[:rep_prefix] = 'rr_xx'

  ## Syncronization Options :
  config.options[:table_ordering] = :true
  config.options[:sync_conflict_handling] = :later_wins

  ## Replication Options :
  config.options[:replication_conflict_handling] = :later_wins

  ## Table Options :
  ## Exclude tables options :
  config.exclude_tables 'my_big_table'
  config.exclude_tables 'my_big_reporting_table'
  config.exclude_tables 'my_datawarehouse_result_table'
  ## Include tables options :
  config.include_tables /./ # regexp matching all tables in the database
  config.include_tables 'my_image_table',
    :row_buffer_size => 200
  config.include_tables 'my_material_tracking',
    :row_buffer_size => 200
end
    • Setelah itu kita lakukan scan untuk cek database structure
$> cd rubyrep
$> ./rubyrep scan myruby.conf
    • Setelah itu kita lakukan sync untuk melakukan sinkronisasi data
$> cd rubyrep
$> ./rubyrep sync myruby.conf
    • Setelah itu baru kita lakukan replikasi
$> cd rubyrep
$> ./rubyrep replicate myruby.conf
  • Done.
Replikasi akan berjalan dengan cara melakukan log atas semua perintah DML, insert, update, delete.
Untuk perintah DDL , create, truncate, drop, tidak akan direplikasi.
Silahkan mencoba.

Install Ulang Postgresql 9

  Hari ini, saya ada keperluan untuk melakukan reinstall ulang database postgresql yang ada di mesin ubuntu maverick. Setelah berulang ulang mencoba akhirnya ketemu caranya.

Berikut langkah langkah yang dilakukan :

  1. Stop database postgresql

    $ sudo /etc/init.d/postgresql stop
    atau

    $ sudo service postgresql stop

  2. Uninstall postgresql dan sekaligus purge

    $ sudo apt-get remove postgresql-9.1 libpq-dev postgresql-contrib-9.1 postgresql-client-9.1 postgresql-common
    $ sudo apt-get purge postgresql-9.1 libpq-dev postgresql-contrib-9.1 postgresql-client-9.1 postgresql-common
  3. Remove semua file postgresql

    $ sudo rm -r /etc/postgresql/
    $ sudo rm -r /etc/postgresql-common/
    $ sudo rm -r /var/lib/postgresql/
    $ sudo rm -r /var/log/postgresql/
  4. Install ulang database postgresql

    $ sudo apt-get install postgresql-9.1 libpq-dev postgresql-contrib-9.1 postgresql-client-9.1 postgresql-common

Dengan cara ini, maka otomatis cluster database akan di buat pada saat install dilakukan.
Silakahkan mencoba.