BLOG TAAUM

Broadcast television ,PHP ,GIS ,POSTGIS ,POSTGRESQL ,MAPSERVER ,MAP ,MySQL

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 ดูครับ

Tagged:

Related Posts