ta-aum field notes
← Back to all articles
Broadcast Television

High-availability cluster

การทำ High-availability System นั้นเป็นการการันตีว่าระบบพร้อมใช้งาน 24/7 ซึ่งโดยทั่วไปลูกค้าจะคาดหวังเช่นนั้น ทำให้เราต้องสร้างระบบที่สามารถให้คอมพิวเตอร์นั้นสามารถทำงานทดแทนกันได้ พร้อมทั้งขยายความสามารถในการรองรับการเข้าใช้งานพร้อมกัน

High-availability cluster

High-availability cluster

นั่งในห้องประชุมได้ยิน CTO พูดเรื่อง MySQL Load Balancing  ขึ้นมาก็เลยไปรับอาสางานฝั่ง IT มาช่วยทำ Solution ให้ดู ที่จริงเคยทำ MySQL Replication มาแล้วในตอนเข้าไปทำโปรเจคของ Vizrt ใน AOT แต่ตอนนั้นแค่ Active – Standby มาวันนี้เลยลองเต็มๆเลย

การทำ High-availability System นั้นเป็นการการันตีว่าระบบพร้อมใช้งาน  24/7 ซึ่งโดยทั่วไปลูกค้าจะคาดหวังเช่นนั้น ทำให้เราต้องสร้างระบบที่สามารถให้คอมพิวเตอร์นั้นสามารถทำงานทดแทนกันได้ เมื่อมีเครื่องหนึ่งเครื่องในผิดปกติพร้อมทั้งขยายความสามารถในการรองรับการเข้าใช้งานพร้อมกัน ทีนี่มาดู Solution สำหรับ Web กันครับ

MySQL นั้น ผมเลือกใช้ Percona XtraDB Cluster  ถ้าสนใจลองอ่านดูครับครับ
https://www.percona.com/software/mysql-database/percona-server/benchmarks
พร้อมกับ Percona เคลมว่าทุกฟังก์ชั่นใน MySQL ใช้ได้ทั้งหมด (พูดง่ายๆก็คือกรูเอา MySQL มาจูนให้แล้ว)
https://www.percona.com/doc/percona-server/5.6/feature_comparison.html

โดย Solution ที่ทดสอบคือ ใช้ MySQL จำนวน 3 nodes แบบ Master-Master คือเขียนและอ่านได้ทุก Node

HA LabTest

คอนฟิก Cluster ที่ MySQL ครับเพื่อใครสนใจอยากลองครับ

wsrep_provider=/usr/lib/libgalera_smm.so

wsrep_cluster_address=gcomm://172.20.3.141,172.20.3.142,172.20.3.143 binlog_format=ROW

default_storage_engine=InnoDB

innodb_autoinc_lock_mode=2

wsrep_node_address=172.20.3.141 wsrep_node_name=node1

wsrep_sst_method=xtrabackup-v2

wsrep_cluster_name=thairath_cluster

wsrep_sst_auth=“Taaum:Taaumpassword”

วิธีทดสอบก็ลองเข้าไปแต่ล่ะ Node แล้วสร้างข้อมูลดูครับ เมื่อเช็คแต่ล่ะ Node ก็จะได้ข้อมูลเดียวกัน

ข้อดีของการทำ Master-Master ก็คือเราทำ Load balance ได้ง่ายขึ้นและก็ไม่ต้องกังวล เรื่อง Fail-over เพราะเมื่อมี Node ไหนหายไปเราสามารถเพิ่ม Node เข้ามาทดแทนได้เลย ยิ่งถ้าใช้ Cloud ด้วยแล้ว ยิ่งง่ายเลยครับ Load Balancer ผมใช้ HAProxy เข้ามาช้วยจัดการนะครับ

ตัว Configurtion ของ HAProxy ครับ

global
        log 127.0.0.1   local0
        log 127.0.0.1   local1 notice
        maxconn 4096
        uid 99
        gid 99

defaults log global mode http option tcplog option dontlognull retries 3 option redispatch maxconn 2000 contimeout 5000 clitimeout 50000 srvtimeout 50000

listen mysql-cluster 0.0.0.0:3306 mode tcp balance roundrobin option httpchk

server db-cluster1 172.20.3.141:3306 check port 9200 inter 12000 rise 3 fall 3
server db-cluster2 172.20.3.142:3306 check port 9200 inter 12000 rise 3 fall 3
server db-cluster3 172.20.3.143:3306 check port 9200 inter 12000 rise 3 fall 3

listen mysql-cluster-failover :43306 mode tcp balance leastconn option httpchk server db-cluster1 172.20.3.141:3306 check port 9200 server db-cluster2 172.20.3.142:3306 check port 9200 backup server db-cluster3 172.20.3.143:3306 check port 9200 backup

listen webinterface bind 0.0.0.0:8080 mode http stats enable stats uri / stats realm Strictly\ Private stats auth aum:aum

วิธีทดสอบ ก็ลอง select variable wsrep_node_name ดูครับ (อย่าลืมลง mysql-client ที่ Load balancer นะครับ)

หลังจากลอง solution ข้างบนเสร็จลองมาทำรูปข้องล่างนี้ต่อกันครับ

HA Solution

ผมลองออกแบบให้ง่ายกับการ scalable ครับ  จากภาพข้างบนลองเพิ่มขยายแต่ล่ะ Tier ดูครับ