Juju #05 – วิธีกระจายงานไปยัง MySQL แบบ Master-Master

ต่อจาก Juju #04 – วิธีทำให้ WordPress กระจายงานไปยัง MySQL Slave ด้วย HyperDB ซึ่งเป็นวิธีการกระจายงานให้ MySQL แบบ Master-Slave จะต้องอาศัยความสามารถของ HyperDB Plugin ของ WordPress ในการทำงาน ซึ่งถ้าเป็นการพัฒนา Application ทั่วไปที่ไม่ใช่ WordPress ก็จะทำด้วยวิธีดังกล่าวไม่ได้

ในบทความนี้จะกล่าวถึง การสร้าง Load-Balanced MySQL แบบ Master-Master ซึ่งทำให้สามารถกระจายการ Write ไปยัง MySQL หลายตัวได้ (ในเบื้องต้น 2 ตัว)
*** ในบทความต่อไป จะต่อด้วยการเชื่อมเข้ากับ haproxy ***

ขั้นตอนการติดตั้งมีดังนี้

  1. Deploy haproxy (ตั้งชื่อ haproxy-mysql) และ MySQL (ตั้งชื่อ mysql-master1 และ mysql-master2)
  2. ต่อไปนี้เป็นวิธีการติดตั้ง MySQL Master-Master Replication [1]
  3. บนเครื่อง mysql-master1
    แก้ไขไฟล์ /etc/mysql/mysql.cnf
    ค้นหาคำว่า server-id
    จากนั้น Uncomment บรรทัดต่อไปนี้
    server-id
    log_bin
    binlog_do_db

    จากนั้น ในบรรทัด
    server_id = 1
    – binlog_do_db ใส่เป็น Database Name ที่จะทำการ Replication

    เมื่อเสร็จแล้ว ก็ Save แล้ว Restart Mysql
    sudo service mysql restart
    แล้วเข้าใช้งานด้วยคำสั่ง
    mysql -u root -p$(cat /var/lib/mysql/mysql.passwd)
    สร้าง User ที่จะทำหน้า Replicate ข้อมูล ด้วยคำสั่ง
    mysql> create user ‘replicator’@’%’ identified by ‘password’;
    และกำหนดสิทธิให้สามารถ Replicate ได้ ด้วยคำสั่ง
    mysql> grant replication slave on *.* to ‘replicator’@’%’;
    สุดท้ายใช้คำสั่งต่อไปนี้ เพื่อเรียกข้อมูลที่สำหรับการตั้งค่า mysql-master2
    mysql> show master status;
    ได้ผลดังนี้

    จากนั้นใช้คำสั่งต่อไปนี้ แล้วเก็บค่า FILE และ POSITION ไว้ เพื่อใช้ในขั้นตอนต่อไป
  4. บนเครื่อง mysql-master2
    แก้ไขไฟล์ /etc/mysql/mysql.cnf เหมือนกับที่ทำบน mysql-master1 แต่เปลี่ยนค่า server_id เป็น 2

    เมื่อเสร็จแล้ว ก็ Save แล้ว Restart Mysql
    sudo service mysql restart
    แล้วเข้าใช้งานด้วยคำสั่ง
    mysql -u root -p$(cat /var/lib/mysql/mysql.passwd)
    สร้าง User ที่จะทำหน้า Replicate ข้อมูล ด้วยคำสั่ง
    mysql> create user ‘replicator’@’%’ identified by ‘password’;
    และกำหนดสิทธิให้สามารถ Replicate ได้ ด้วยคำสั่ง
    mysql> grant replication slave on *.* to ‘replicator’@’%’;
    ** ขั้นตอนต่อไปนี้ ทำที่ mysql-master2 (mysql-master1 ใช้ IP 10.107.107.35)
    mysql>  slave stop;
    mysql>  CHANGE MASTER TO MASTER_HOST = ‘10.107.107.35’, MASTER_USER = ‘replicator’, MASTER_PASSWORD = ‘password’, MASTER_LOG_FILE = ‘mysql-bin.000003’, MASTER_LOG_POS = 344;
    mysql> slave start;จากนั้นใช้คำสั่งต่อไปนี้ แล้วเก็บค่า FILE และ POSITION ไว้ เพื่อใช้ในขั้นตอนต่อไป
    mysql> show master status;
  5. กลับมาที่ mysql-master1 อีกครั้ง แล้วใช้คำสั่งต่อไปนี้ (mysql-master2 ใช้ IP 10.107.107.83)
    mysql> slave stop;
    mysql> CHANGE MASTER TO MASTER_HOST = ‘10.107.107.83’, MASTER_USER = ‘replicator’, MASTER_PASSWORD = ‘password’, MASTER_LOG_FILE = ‘mysql-bin.000003’, MASTER_LOG_POS = 344;
    mysql> slave start;
  6. ที่ mysql-master1 ทำการสร้าง Database ชื่อ wordpress
  7. ไปดูที่ mysql-master2 ก็จะพบว่า wordpress database ปรากฏขึ้นแล้วด้วย

Reference:

[1] https://www.digitalocean.com/community/tutorials/how-to-set-up-mysql-master-master-replication

[2] https://www.digitalocean.com/community/tutorials/how-to-use-haproxy-to-set-up-mysql-load-balancing–3