Setup Slave Replikasi MySQL Database dengan Percona XtraBackup


logo mysqlMenyiapkan slave untuk replikasi MySQL database dengan Percona XtraBackup sangat mudah dan simple. Dengan menggunkan tool dari Percona ini database master tidak perlu dilock ataupun dimatikan. Yang perlu disiapkan adalah :

  1. Server MySQL Database yang akan dijadikan master dengan IP Address misalnya : 192.168.1.1 dan konfigurasi
    • MySQL bisa berkomunikasi dengan server lain dengan port standar TCP/IP
    • Percona xtrabackup telah diinstall -> langkahnya
    • User dengan privileges replication slave sudah tersedia
      mysql> CREATE USER 'repl'@'192.168.1.2' IDENTIFIED BY 'slavepass';
      mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.2';
    • Binlog dan server-id telah disetup di file my.cnf atau my.ini
      [[email protected] ~]$ vi /etc/my.cnf
      log-bin = /var/lib/mysql/mysql-bin
      server-id = 1
  2. Server MySQL Database yang akan dijadikan slave dengan IP Address misalnya : 192.168.1.2 dan konfigurasi
    • MySQL bisa berkomunikasi dengan server lain dengan port standar TCP/IP
    • server-id telah disetup di file my.cnf atau my.ini
      [[email protected] ~]$ vi /etc/my.cnf
      server-id = 2

 

Kemudian langkah-langkahnya adalah

Langkah I : Menyiapkan Backup di server master

[[email protected] ~]$  innobackupex --user=yourDBuser --password=MaGiCdB1 /var/lib/mysql.backup/
Setelah selesai akan muncul pesan
innobackupex: completed OK!

Maka akan terbuat sebuah file backup di /var/lib/mysql.backup/$TIMESTAMP. Agar file backup konsisten maka perlu mempersiapkan data:

[[email protected] ~]$  innobackupex --user=yourDBuser --password=MaGiCdB1 --apply-log /var/lib/mysql.backup/$TIMESTAMP

Langkah II : Mencopykan file backup ke server slave

[[email protected] ~]$  innobackupex --user=yourDBuser --password=MaGiCdB1 --apply-log /var/lib/mysql.backup/$TIMESTAMP

Kopikan file backup dari server master ke datadir mysql slave

[[email protected] ~]$ scp -r /var/lib/mysql.backup/$TIMESTAMP [email protected]:/var/lib/mysql/

Langkah III : Start Slave
lihat posisi binlog, untuk dijadikan acuan MASTER_LOG_FILE dan MASTER_LOG_POS slave ketika start

[[email protected] ~]$ cat /var/lib/mysql/xtrabackup_binlog_info

konfigurasi slave

mysql> CHANGE MASTER TO MASTER_HOST='192.168.1.1', MASTER_USER='repl', MASTER_PASSWORD='slavepass', MASTER_PORT=3306, MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=245;

Start slave

mysql> START SLAVE;

Cek slave

mysql> SHOW SLAVE STATUS;

FEDERATE Storage Engine MySQL


FEDERATED storage engine sudah ada sejak MySQL 5.0.3. Merupakan storage engine yang bisa mengakses data pada remote database (kaya DB link kalo di Oracle), jadi tanpa harus melakukan replikasi maupun clustering. Ketika table menggunakan FEDERATED storage engine maka query pada table tersebut otomatis akan mengeksekusi pada remote table (federated).

Untuk menyertakan FEDERATED storage engine pada saat buid MySQL dari Source,
pastikan menyertakan opsi –with-federated-storage-engine

Contoh Penggunaan
Host MySQL Server A : 172.17.1.23 (tanpa harus support FEDERATED)
Db MySQL Server A : test
Table MySQL Server A : test (sebarang storage engine)

Host MySQL Server B : 172.17.1.61 (harus support FEDERATED)
Db MySQL Server B : test
Table MySQL Server B : test_federated (FEDERATE storage engine)


-- ON Db MySQL Server A
CREATE TABLE test (
id INT(20) NOT NULL AUTO_INCREMENT,
NAME VARCHAR(32) NOT NULL DEFAULT '',
other INT(20) NOT NULL DEFAULT '0',
PRIMARY KEY (id),
INDEX NAME (NAME),
INDEX other_key (other)
)
ENGINE=MYISAM
DEFAULT CHARSET=latin1;

insert into `test_table` (`id`, `name`, `other`) values('1','Sugeng','2');
insert into `test_table` (`id`, `name`, `other`) values('2','Sugeng lagi','4');
insert into `test_table` (`id`, `name`, `other`) values('3','Sugeng lagi lagi','5');
-- 3 record dientrikan
-- berikan hak akses user sugeng untuk select ke table tersebut dari Db MySQL Server B

Sekarang kita buat table test_federated pada server B

-- On Db MySQL Server B
CREATE TABLE federated_table (
id INT(20) NOT NULL AUTO_INCREMENT,
NAME VARCHAR(32) NOT NULL DEFAULT '',
other INT(20) NOT NULL DEFAULT '0',
PRIMARY KEY (id),
INDEX NAME (NAME),
INDEX other_key (other)
)
ENGINE=FEDERATED
DEFAULT CHARSET=latin1
CONNECTION='mysql://sugeng:[email protected]:3306/test/test_table';

mysql> select * from federated_table;
+----+------------------+-------+
| id | name | other |
+----+------------------+-------+
| 1 | Sugeng | 2 |
| 2 | Sugeng lagi | 4 |
| 3 | Sugeng lagi lagi | 5 |
+----+------------------+-------+
3 rows in set (0.00 sec)

3 record tersebut sebenarnya data pada remote Server (DB MySQL Server B)

Tuning Perfoma MySQL


Setelah beberapa project menggunakan DB Engine MySQL akhirnya mendapatkan masalah pertama  yaitu Eksekusi Select Query yang sangat lamban pada saat data sudah mencapai ribuan baris record, terlebih untuk query  yang kompleks. Akhirnya diputuskan lah untuk menlakukan tunning pada MySQL, setelah browsing sana-sini akhirnya didapatkan kesimpulan tunning atau increasing perfomance MySQL sendiri secara umum terdiri dari 3 bagian, yaitu :

  1. Optimasi MySQL variable di file my.ini (my.cnf).
  2. Optimasi Struktur Table.
  3. Optimasi SQL Query.

Artikel bagian pertama ini yang akan dibahas cuma Optimasi MySQL variable. Yaitu kita akan men-edit variable-variable bawaan dari instalasi awal MySQL. Karena secara default settingan variable MySQL adalah memungkinkan untuk berjalan dikomputer minim resource (spesifikasi hardware rendah), untuk kebutuhan production/live terlebih lagi apabila spesifikasi hardware Database Server kita tinggi, maka hal ini tentunya kurang relevan lagi.

Proses edit variable MySQL bisa dengan berbagai cara, tapi yang akan kita pakai adalah langsung mengedit file my.ini (my.cfg). Matikan dulu service MySQL apabila sendang berjalan, masuk ke commandline (cmd) Windows, ketik :

    mysqladmin -u[username] -p[password] shutdown

Untuk mengeksekusi perintah diatas, pastikan mysql console telah terdaftar di Environment Variable Windows, dan user yang digunakan memiliki hak Akses penuh (sysdba). Kemudian silakan ke folder instalasi MySQL, kemudian cari file my.ini (my.cfg)
Contoh lokasinya

  • Pada windows di : “C:\Program Files\MySQL\MySQL Server 5.5\my.ini”
  • Pada linux di : “/etc/my.cnf”
  • Buka dengan Notepad atau Text Editor lainnya, cari & edit variable-variable berikut menjadi :
  • key_buffer_size

    Untuk kebutuhan table yang menggunakan engine MyISAM. Max 25% dari total memory (RAM) Hardware dalam satuan MB, misal memory saya 3GB (3002 MB * 25%= 750,5 MB) maka saya edit menjadi 750M. apabila tidak ada table MyISAM sebaiknya disetting menjadi 16-32M.

  • innodb_buffer_pool_size

    Untuk kebutuhan table yang menggunakan engine InnoDB. Max 70% dari total memory (RAM) Hardware dalam satuan MB, misal memory saya 3GB (3002 MB * 25%= 2101,4 MB) maka saya edit menjadi 2101M.

  • innodb_additional_mem_pool_size

    Edit menjadi 20M.

  • innodb_log_buffer_size

    Edit menjadi 8M.

  • table_cache

    Edit menjadi 1024.

  • thread_cache_size

    Edit menjadi 16.

  • sort_buffer_size

    Edit menjadi 512K

  • read_buffer_size

    Nilai variable sort_buffer_size diatas dibagi 2, maka dengan contoh diatas adalah 256K

  • innodb_flush_log_at_trx_commit

    Yang ini hanya opsional, apabila edit menjadi 0 (nol) bisa menjadi sedikit lebih cepat, namun kekurangannya adalah memungkinkan untuk kehilangan data yang sedang ditransaksikan apabila server crash.

    Setelah itu silakan jalankan kembali service MySQL, kembali ke commandline (cmd) ketik :

        net start mysql (pada windows)
        /etc/init.d/mysql start (pada linux)

    Apabila service gagal dijalankan dan terdapat error, maka periksa kembali hasil edit variable diatas, mungkin saja ada nilai yang kelebihan dan hal ini tentu saja tergantung spesifikasi hardware masing-masing 

    Dari Tunning bagian pertama ini saja, yang saya dapatkan adalah perfomance dalam menginsert 1000 record (20 kolom) sekaligus ke table InnoDB menjadi 2-3x lebih cepat, dibanding settingan variable awal bawaan instalasi MySQL 

    Akhir kata, janganlah sekaligus menaikan nilai variable sampai maksimal, naikanlah secara bertahap, lihat hasil perkembangan & kebutuhan. Sekian artikel kali ini, natikan lanjutan artikel berikutnya. semoga bisa bermanfaat