Jumat, 03 April 2009

Replikasi Database dengan MySQL

Dengan menggunakan Fitur Replikasi di MySQL dapat membuat duplikasi database master ke slave secara realtime. Database slave ini juga nantinya dapat digunakan sebagai standby server untuk master jika DB master shutdown (in case: terjadi error di master) dengan melakukan perubahan pada aplikasi supaya merujuk ke DB slave.

Dalam membuat replikasi DB Server ini dapat menggunakan operating system Linux maupun Windows.

Langkah-langkahnya adalah sebagai berikut:

1. Master MySQL Database

Lakukan perubahan pada file konfigurasi mysql yang ada di Server Master. Biasanya nama file : mysql.cnf atau my.cnf yang terletak di /etc/mysql (Sesuai dengan Distro yang digunakan).

Lakukan perubahan atau penambahan seperti baris dibawah ini:

server-id = 1

log_bin = /var/log/mysql/mysql-bin.log

binlog-do-db=database_name_1
binlog-do-db=database_name_2
binlog-do-db=database_name_3

Lalu restart mysql service: /etc/init.d/mysql restart

Kemudian login ke console mysql:

#mysql –u root –p

#enter password:

Pada shell mysql

Mysql> GRANT REPLICATION SLAVE ON *.* TO ’slave_user’@'%' IDENTIFIED BY 'slave2';

Mysql> FLUSH PRIVILEGES;

Mysql> USE nama_db;
Mysql> FLUSH TABLES WITH READ LOCK;

Mysql> SHOW MASTER STATUS;

Hasilnya:

—————+———-+————–+——————+

| File | Position | Binlog_do_db | Binlog_ignore_db |

+—————+———-+————–+——————+

| mysql-bin.000001 | 98 | nama_db | |

+—————+———-+————–+——————+

1 row in set (0.00 sec)

Hasil diatas yang nantinya digunakan untuk konfigurasi DB slave

2. Lakukan snapshot Database master dan di copy ke Slave server. Hal ini dilakukan supaya DB Master dan Slave memiliki struktur dan data yang sama

Snapshot dapat dilakukan dengan menggunakan utility Mysqldump atau dengan menggunakan snapshot data raw files.

mysqldump -u root -p –opt nama_db > nama_db.sql

atau

shell> tar cf /tmp/db.tar ./data
shell> zip -r /tmp/db.zip ./data
shell> rsync --recursive ./data /tmp/dbdata

3. Slave MySQl database

Pada slave buat database dengan nama yang sama nama_db yang datanya bisa diambil dari hasil snapshot yang dilakukan di step 2.

Dengan asumsi DB slave sudah sama dengan Master, lakukan perubahan pada konfigurasi mysql slave /etc/mysql/my.cnf sperti pada baris dibawah ini:

server-id=2

master-host=ip-master

master-user=slave-user

master-password=password-slave

master-connect-retry=60

replicate-do-db=database_name_1
replicate-do-db=database_name_2
replicate-do-db=database_name_3

kemudian restart MySQL:

/etc/init.d/mysql restart

4. penyesuaian data pada slave jika terjadi update pada master pada saat konfigurasi

mysql -u root -p
Enter password:
mysql> SLAVE STOP;

mysql>CHANGE MASTER TO MASTER_HOST=’ip-master′, mysql> MASTER_USER=’slave_user’, MASTER_PASSWORD=’‘, mysql> MASTER_LOG_FILE=’mysql-bin.0000001′, MASTER_LOG_POS=183;

KETERANGAN :

  • MASTER_HOST is the IP address or hostname of the master (in this example it is 192.168.0.100).
  • MASTER_USER is the user we granted replication privileges on the master.
  • MASTER_PASSWORD is the password of MASTER_USER on the master.
  • MASTER_LOG_FILE is the file MySQL gave back when you ran SHOW MASTER STATUS; on the master.
  • MASTER_LOG_POS is the position MySQL gave back when you ran SHOW MASTER STATUS; on the master.

Mysql> START SLAVE;

Mysql> SHOW SLAVE STATUS\G;

*************************** 1. row ***************************

Slave_IO_State: Waiting for master to send event

Master_Host: 10.X.X.X

Master_User: slave_user

Master_Port: 3306

Connect_Retry: 60

Master_Log_File: MASTERMYSQL01-bin.000009

Read_Master_Log_Pos: 4

Relay_Log_File: MASTERMYSQL02-relay-bin.000015

Relay_Log_Pos: 3630
Relay_Master_Log_File: MASTERMYSQL01-bin.000002
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: nama_db
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 4
Relay_Log_Space: 3630
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 1519187

Untuk melihat jalan tidaknya proses replikasi Parameter Slave_IO_Running and Slave_SQL_Running: harus YES.

Creating a MySQL Data Snapshot Using Raw Data Files

To get the most consistent results with a raw data snapshot you should shut down the server during the process, as below:

  1. Acquire a read lock and get the master's status.

  2. In a separate session, shut down the MySQL server:

    shell> mysqladmin shutdown
  3. Make a copy of the MySQL data files. Examples are shown below for common ways to do this - you need to choose only one of them:

    shell> tar cf /tmp/db.tar ./data
    shell> zip -r /tmp/db.zip ./data
    shell> rsync --recursive ./data /tmp/dbdata
  4. Start up the MySQL instance on the master.

If you are not using InnoDB tables, you can get a snapshot of the system from a master without shutting down the server as described in the following steps:

  1. Acquire a read lock and get the master's status.

  2. Take a copy of the MySQL data files. Examples are shown below for common solutions - you need to choose only one of these solutions:

    shell> tar cf /tmp/db.tar ./data
    shell> zip -r /tmp/db.zip ./data
    shell> rsync --recursive ./data /tmp/dbdata
  3. In the client where you acquired the read lock, free the lock:

    mysql> UNLOCK TABLES;

Once you have created the archive or copy of the database, you will need to copy the files to each slave before starting the slave replication process.