Day: December 29, 2016

  • Juju #06 – เชื่อม MySQL Master-Master เข้ากับ HAProxy

    ต่อจาก Juju #05 – วิธีกระจายงานไปยัง MySQL แบบ Master-Master เมื่อสร้าง MySQL แบบ Master-Master Replication ได้แล้ว ก็มาเชื่อมกับ HAProxy เพื่อให้ Application ที่เขียน มองเห็นทั้งระบบเป็นชิ้นเดียว

    IP Address ของระบบต่างๆเป็นดังนี้
    haproxy : 10.107.107.71

    mysql-master1: 10.107.107.35

    mysql-master1: 10.107.107.83

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

    1. ที่ mysql-master1 ต้องสร้าง 2 Users ขึ้นมา ชื่อ haproxy_check และ haproxy_root ด้วยคำสั่งต่อไปนี้
      mysql -u root -p$(cat /var/lib/mysql/mysql.passwd) -e "INSERT INTO mysql.user (Host,User) values ('10.107.107.71','haproxy_check'); FLUSH PRIVILEGES;"
      
      mysql -u root -p$(cat /var/lib/mysql/mysql.passwd) -e "GRANT ALL PRIVILEGES ON *.* TO 'haproxy_root'@'10.107.107.71' IDENTIFIED BY 'password' WITH GRANT OPTION; FLUSH PRIVILEGES;"
    2. ที่ haproxy
      ติดตั้ง mysql-client ด้วยคำสั่ง

      sudo apt-get install mysql-client

      ทดสอบด้วยคำสั่ง

      mysql -h 10.107.107.35 -u haproxy_root -ppassword -e "SHOW DATABASES;"
      mysql -h 10.107.107.83 -u haproxy_root -ppassword -e "SHOW DATABASES;"

      แก้ไขไฟล์ /etc/haproxy/haproxy.cfg โดยเพิ่มบรรทัดต่อไปนี้ท้ายไฟล์ [3]

      frontend mysql-cluster
       bind *:3306
       mode tcp
       default_backend mysql-backend
      
      backend mysql-backend
       mode tcp
       balance roundrobin
       server mysql-master1 10.107.107.35:3306 check
       server mysql-master2 10.107.107.83:3306 check

      และสุดท้าย ทดสอบด้วยคำสั่งต่อไปนี้

      for i in `seq 1 6`; do 
         mysql -h 127.0.0.1 -u haproxy_root -ppassword -e "show variables like 'server_id'"; 
      done
      

      ควรจะได้ผลประมาณนี้

    3. จากนั้นก็สามารถพัฒนา Application โดยใช้ IP Address ของ haproxy ซึ่งในที่นี้คือ 10.107.107.71 และ Port 3306 ได้แล้ว ซึ่งเบื้องหลัระบบจะทำการ Replication กันเองทั้งหมด

    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

    [3] https://serversforhackers.com/load-balancing-with-haproxy

     

  • 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