MaxScale - Memisahkan Akses Baca-Tulis

Submitted by w41lf0x on Fri, 12/18/2015 - 04:24

Setelah tulisan mengenai instalasi, berikutnya saya ingin bercerita mengenai konfigurasi #MaxScale untuk memisahkan akses baca-tulis #database. Dalam skenario ini saya akan menggunakan tiga database, satu database master dan dua database slave. Database slave merupakan replikasi dari database master, artinya apapun yang berubah di dalam database master akan direplikasi ke dalam database slave menggunakan fasilitas replikasi dari database. Silakan baca-baca sendiri mengenai prosedur replikasi database karena ada beberapa model replikasi. Nanti pembahasannya bisa panjang dan guru-guru TIK bisa sumringah kalau saya tulis lengkap, materi pembelajaran lengkap gratis.

Mari kita anggap sistem database master-slave ini sudah berjalan normal, tidak ada slave yang mengalami kegagalan replikasi, dan semua data di master dapat dilihat pula di slave. Konfigurasi IP untuk server-server tersebut misalnya seperti ini:

  • Master: 1.2.3.1
  • Slave1: 1.2.3.2
  • Slave2: 1.2.3.3
  • MaxScale: 1.2.3.4

Berikut ini adalah konfigurasi MaxScale untuk sistem database tersebut:

# Global
[maxscale]
# threads=1
# log_debug=0

# Server definitions
[master]
type=server
address=1.2.3.1
port=3306
protocol=MySQLBackend

[slave1]
type=server
address=1.2.3.2
port=3306
protocol=MySQLBackend

[slave2]
type=server
address=1.2.3.3
port=3306
protocol=MySQLBackend

# Monitor for the servers
[MySQL Monitor]
type=monitor
module=mysqlmon
servers=master,slave1,slave2
user=username
passwd=rahasia
monitor_interval=10000

# Servis:
[Read-Write]
type=service
router=readwritesplit
servers=master,slave1,slave2
user=username
passwd=rahasia
max_slave_connections=100%
# Opsi tambahan untuk mengatur pilihan slave database:
# options=slave_selection_criteria=Salah satu dari:
# LEAST_GLOBAL_CONNECTIONS, slave dengan jumlah koneksi paling sedikit dari total koneksi
# LEAST_ROUTER_CONNECTIONS, slave dengan jumlah koneksi paling sedikit dari router
# LEAST_BEHIND_MASTER, slave dengan waktu keterlambatan replikasi paling kecil
# LEAST_CURRENT_OPERATIONS (default), slave dengan jumlah operasi paling sedikit

# Akses maxadmin:
[MaxAdmin Service]
type=service
router=cli

[Debug Interface]
type=service
router=debugcli

# Port akses servis
[Read-Write Listener]
type=listener
service=Read-Write
protocol=MySQLClient
port=4006

[MaxAdmin Listener]
type=listener
service=MaxAdmin Service
protocol=maxscaled
address=127.0.0.1
port=6603

[Debug Listener]
type=listener
service=Debug Interface
protocol=telnetd
address=127.0.0.1
port=4442

Jika kita tidak ingin menggunakan user root database untuk akses maxscale ke database-database tersebut kita bisa menambahkan user khusus untuk maxscale di database master seperti ini:

database> CREATE USER 'maxscale'@'1.2.3.4' IDENTIFIED BY 'passwordnyaMaxScale';
database> GRANT SELECT ON mysql.user TO 'maxscale'@'1.2.3.4';
database> GRANT SELECT ON mysql.db TO 'maxscale'@'1.2.3.4';
database> GRANT SHOW DATABASES ON *.* TO 'maxscale'@'1.2.3.4';
database> GRANT REPLICATION SLAVE ON *.* TO 'maxscale'@'1.2.3.4';
database> GRANT REPLICATION CLIENT ON *.* TO 'maxscale'@'1.2.3.4';

Kenapa kok harus grant (memberikan) opsi-opsi tersebut kepada user MaxScale? Ingat bahwa sistem database yang kita bangun ini berdasarkan pada replikasi database. Kemudian harus kita ingat bahwa MaxScale bukanlah database itu sendiri. MaxScale hanyalah router yang juga membutuhkan akses ke database untuk mengetahui daftar user database, dan mengecek status database serta status proses dalam database master dan slave. MaxScale bekerja dengan menganalisis statement query untuk menentukan apakah operasi yang diminta adalah baca atau tulis. Setelah analisis selesai, query akan dikirimkan ke database backend sesuai dengan konfigurasi maxscale.cnf.

Untuk mengakses konsol administrasi MaxScale kita menggunakan maxadmin dengan password standar #mariadb. Jika MaxScale dijalankan dengan konfigurasi tersebut, kira-kira seperti ini statusnya:

$ maxadmin -pmariadb list servers

Servers.

-------------+-----------------+-------+-------------+--------------------

Server       | Address         | Port  | Connections | Status              

-------------+-----------------+-------+-------------+--------------------

slave1       | 1.2.3.2         |  3306 |           0 | Running, Slave

master       | 1.2.3.1         |  3306 |           0 | Running, Master

slave2       | 1.2.3.3         |  3306 |           0 | Running, Slave

-------------+-----------------+-------+-------------+--------------------

$ maxadmin -pmariadb list listeners

Listeners.

-----------------+--------------------+-------------+-------+--------

Service Name     | Protocol Module    | Address     | Port  | State

-----------------+--------------------+-------------+-------+--------

Write Service    | MySQLClient        | *           |  4006 | Running

MaxAdmin Service | maxscaled          | localhost   |  6603 | Running

Debug Interface  | telnetd            | localhost   |  4442 | Running

-----------------+--------------------+-------------+-------+--------

Setelah dapat dipastikan bahwa servis MaxScale berjalan normal, kita tinggal mengubah sedikit database host di aplikasi menjadi HOSTMAXSCALE:PORT_READ-WRITE atau 1.2.3.4:4006. Selesai. Silakan cek di masing-masing database backend apakah query yang bersifat mengubah data (WRITE) masuk ke database master, dan yang bersifat hanya baca (READ) diarahkan ke database slave.