How To Use HAProxy to Set Up Mariadb Load Balancing
สิ่งที่ต้องเตรียม
เครื่องทำ HAProxy 1 เครื่อง
เครื่อง Database Server 2 เครื่องเป็นอย่างน้อยในที่นี้ใช้ 3 เครื่องที่ทำ cluster มาเรียบร้อยแล้ว
ip DB1 =192.168.30.154
ip DB2 =192.168.30.155
ip DB3 =192.168.30.156
ip HAProxy =192.168.30.153
ต้องจัดเตรียม user สำหรับตรวจสอบสถานะเซิร์ฟเวอร์ MySQL โดยการสร้างผู้ใช้นี้จำเป็นต้องไปสร้างในทุกๆโหนดของ cluster (สร้างในแต่ละโหนดเอง)
sudo -s
เพื่อใช้งานใน mode root
mysql -u root -p -e "INSERT INTO mysql.user (Host,User) values ('192.168.30.153','haproxy_check'); FLUSH PRIVILEGES;"
//ip 192.168.30.153 คือ ip ของเครื่อง hpproxy
ผู้ใช้ MySQL จำเป็นต้องมีสิทธิ์ root เมื่อเข้าถึงกลุ่ม MySQL จาก HAProxy ผู้ใช้ root ที่เป็นค่าเริ่มต้นบนเซิร์ฟเวอร์ทั้งหมดจะได้รับอนุญาตให้เข้าสู่ระบบภายในเครื่องเท่านั้น
แม้ว่าจะสามารถแก้ไขได้โดยการให้สิทธิ์เพิ่มเติมแก่ผู้ใช้ root คุณควรมีผู้ใช้ที่แยกกันซึ่งมีสิทธิ์ของ root
mysql -u root -p -e "GRANT ALL PRIVILEGES ON *.* TO 'haproxy_root'@'192.168.30.172' IDENTIFIED BY '123456' WITH GRANT OPTION; FLUSH PRIVILEGES"
แทนที่ haproxy_root และรหัสผ่านโดยใช้ค่าความปลอดภัยของคุณเอง ก็เพียงพอที่จะรันคำสั่งเหล่านี้บน MySQL
ทำซ้ำกับเครื่องที่เหลือ
Install MySQL Client
ติดตั้ง MySQL Client บน HAProxy เพื่อทดสอบการเชื่อมต่อ
apt-get install mysql-client
เมื่อติดตั้งเสร็จให้ทดลองเรียกใช้งานผ่าน user ที่ชื่อ haproxy_root
mysql -h 192.168.30.154 -u haproxy_root -p -e "SHOW DATABASES"
ถ้า connet ได้ก็จะแสดงชื่อตารางออกมาประมาณนี้ ถ้าไม่ได้ให้ไปตรวจสอบขั้นตอนว่ามีอะไรผิดพลาดไหม
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| playground |
+--------------------+
Installing HAProxy
บนเครื่อง HAProxy ให้ติดตั้ง package สำหรับ HAProxy
apt-get install haproxy
เปิดใช้ HAProxy เพื่อเริ่มต้นโดยสคริปต์ init
sed -i "s/ENABLED=0/ENABLED=1/" /etc/default/haproxy
หากต้องการตรวจสอบว่าการเปลี่ยนแปลงนี้ทำถูกต้องหรือไม่ให้รันสคริปต์ init ของ HAProxy โดยไม่มีพารามิเตอร์ใด ๆ
service haproxy
output
Usage: /etc/init.d/haproxy {start|stop|reload|restart|status}
Configuring HAProxy
เปลี่ยนชื่อไฟล์การกำหนดค่าเดิม
mv /etc/haproxy/haproxy.cfg{,.original}
สร้างและแก้ไขใหม่
nano /etc/haproxy/haproxy.cfg
บล็อกแรกคือบล็อกการกำหนดค่าเริ่มต้นและค่าเริ่มต้น
global
log 127.0.0.1 local0 notice
user haproxy
group haproxy
defaults
log global
retries 2
timeout connect 3000
timeout server 5000
timeout client 5000
ข้อมูลเพิ่มเติมเกี่ยวกับแต่ละตัวเลือกเหล่านี้จะอยู่ท้ายเรื่องนี้ต่อไป
เรากำหนด HAProxy เพื่อส่งข้อความบันทึกไปยัง 127.0.0.1
เราจึงต้องกำหนดค่า rsyslog เพื่อรับฟัง
ต่อไปการกำหนดค่าหลัก
#สำหรับ mysql
listen mysql-cluster
bind 127.0.0.1:3306 # ถ้าต้องการเป็น ip อื่นให้เปลี่ยนเป็นอย่างอื่น เช่น bind 192.168.30.153:3306
mode tcp
option mysql-check user haproxy_check
balance roundrobin
server mysql-1 192.168.30.154:3306 check
server mysql-2 192.168.30.155:3306 check
server mysql-3 192.168.30.156:3306 check
หมายเหตุ: จากการใช้ อัลกอลิทึม balance roundrobin กับ cluster 3 ตัวที่ แสปคเครื่องไม่เหมือนกันพบว่าเกิดข้อผิดพลาดในการทำ transection พร้อมกันจำนวนมาก จึงต้องแก้เป็น
balance source แทน เพื่อให้ haproxy จ่ายงานให้ client ต่อ 1 node cluster
ไม่เหมือนกับ HTTP load balancing HAProxy ไม่มีโหมด "เฉพาะ" สำหรับ MySQL
ดังนั้นเราจึงใช้ tcp เราได้ตั้งค่า HAProxy ให้ฟังเฉพาะที่อยู่ย้อนกลับ (สมมติว่าแอ็พพลิเคชันอยู่บนเซิร์ฟเวอร์เดียวกัน)
เมื่อคุณเสร็จสิ้นการกำหนดค่าเริ่มต้นบริการ HAProxy แล้ว
service haproxy start
ทดสอบการทำงาน typing:
mysql -h192.168.30.153 -u haproxy_root -p -e "SHOW STATUS LIKE 'wsrep_gcomm_uuid'"
+------------------+--------------------------------------+
| Variable_name | Value |
+------------------+--------------------------------------+
| wsrep_gcomm_uuid | 7ac6c9cf-9147-11e7-8551-fadd7d0556e7 |
+------------------+--------------------------------------+
ซ้ำคำสั่งเดิม
mysql -h192.168.30.153 -u haproxy_root -p -e "SHOW STATUS LIKE 'wsrep_gcomm_uuid'"
+------------------+--------------------------------------+
| Variable_name | Value |
+------------------+--------------------------------------+
| wsrep_gcomm_uuid | dabbb080-9146-11e7-b657-bbd07239e766 |
+------------------+--------------------------------------+
ซ้ำคำสั่งเดิม
mysql -h192.168.30.153 -u haproxy_root -p -e "SHOW STATUS LIKE 'wsrep_gcomm_uuid'"
+------------------+--------------------------------------+
| Variable_name | Value |
+------------------+--------------------------------------+
| wsrep_gcomm_uuid | 0d275234-9148-11e7-b0bf-836e0f43d6a2 |
+------------------+--------------------------------------+
ถ้าต้องการให้ haproxy จ่ายงานให้กับเครื่องใดเครื่องหนึ่งมากกว่า เครื่องอื่นๆให้แก้ไขที่ file
sudo nano /etc/haproxy/haproxy.cfg
server mysql-2 192.168.30.154.:3306 check weight 2
sudo systemctl restart haproxy
test