คำตอบสั้น ๆ: สร้างคลัสเตอร์ฐานข้อมูลที่ทุกโหนดรับการเขียนได้และข้อมูลตรงกันทันที พร้อมข้อจำกัดที่ต้องรู้ก่อนตัดสินใจใช้
คู่มือนี้อธิบาย MariaDB Galera Cluster ทีละขั้นตอน พร้อมคำสั่งที่ใช้ได้จริงและปัญหาที่พบบ่อย
Galera Cluster ต่างจาก Replication แบบ Master-Replica ตรงที่ทุกโหนดรับการเขียนได้และข้อมูลตรงกันทุกโหนดก่อนที่จะตอบว่าสำเร็จ เมื่อโหนดใดล่ม ระบบยังทำงานต่อได้โดยไม่ต้องสลับตัวหลักด้วยมือ
ก่อนตัดสินใจใช้ ต้องรู้ข้อจำกัดสำคัญก่อน Galera รองรับเฉพาะ InnoDB ทุกตารางต้องมี Primary Key และการเขียนจะช้ากว่าเครื่องเดียวเพราะต้องยืนยันกับทุกโหนด จึงเหมาะกับระบบที่อ่านมากเขียนปานกลางและต้องการความพร้อมใช้งานสูง
สิ่งที่ต้องเตรียม (MariaDB Galera Cluster)
- เซิร์ฟเวอร์สามเครื่อง ใช้จำนวนคี่เสมอเพื่อให้ตัดสินเสียงข้างมากได้
- เครือข่ายภายในที่หน่วงต่ำระหว่างโหนด ยิ่งหน่วงสูงการเขียนยิ่งช้า
- MariaDB 10.6 ขึ้นไป และสเปกที่เท่ากันทั้งสามเครื่อง
ในคู่มือนี้ใช้ IP 10.0.0.31, 10.0.0.32 และ 10.0.0.33
ขั้นตอนที่ 1: ติดตั้งบนทุกโหนด (MariaDB Galera Cluster)
sudo apt update
sudo apt install -y mariadb-server mariadb-client galera-4 rsync
sudo systemctl stop mariadb
sudo mysql_secure_installation
ขั้นตอนที่ 2: ตั้งค่าคลัสเตอร์ (MariaDB Galera Cluster)
สร้างไฟล์เดียวกันบนทุกโหนด ต่างกันเฉพาะสองบรรทัดสุดท้าย
sudo nano /etc/mysql/mariadb.conf.d/60-galera.cnf
[mysqld]
binlog_format = ROW
default_storage_engine = InnoDB
innodb_autoinc_lock_mode = 2
bind-address = 0.0.0.0
# Galera
wsrep_on = ON
wsrep_provider = /usr/lib/galera/libgalera_smm.so
wsrep_cluster_name = "tdc_cluster"
wsrep_cluster_address = "gcomm://10.0.0.31,10.0.0.32,10.0.0.33"
wsrep_sst_method = rsync
wsrep_slave_threads = 4
# เฉพาะโหนดนี้ แก้ให้ตรงกับแต่ละเครื่อง
wsrep_node_address = "10.0.0.31"
wsrep_node_name = "node1"
ค่า innodb_autoinc_lock_mode = 2 จำเป็นและห้ามเปลี่ยน Galera ต้องการค่านี้เพื่อให้เลขอัตโนมัติไม่ชนกันระหว่างโหนด
ขั้นตอนที่ 3: เปิด Firewall ระหว่างโหนด (MariaDB Galera Cluster)
sudo ufw allow from 10.0.0.0/24 to any port 3306 proto tcp
sudo ufw allow from 10.0.0.0/24 to any port 4567
sudo ufw allow from 10.0.0.0/24 to any port 4568 proto tcp
sudo ufw allow from 10.0.0.0/24 to any port 4444 proto tcp
พอร์ตแต่ละตัวมีหน้าที่ต่างกัน 3306 คือการใช้งานปกติ 4567 คือการสื่อสารของคลัสเตอร์ 4568 คือการส่งข้อมูลส่วนต่าง และ 4444 คือการถ่ายโอนข้อมูลตั้งต้นให้โหนดใหม่
ขั้นตอนที่ 4: เริ่มโหนดแรก
โหนดแรกต้องเริ่มด้วยคำสั่งพิเศษเพื่อสร้างคลัสเตอร์ขึ้นมา
sudo galera_new_cluster
sudo systemctl status mariadb --no-pager
mysql -e "SHOW STATUS LIKE 'wsrep_cluster_size';"
mysql -e "SHOW STATUS LIKE 'wsrep_local_state_comment';"
ควรเห็น wsrep_cluster_size เท่ากับ 1 และสถานะเป็น Synced
ใช้ galera_new_cluster เฉพาะครั้งแรกหรือเมื่อคลัสเตอร์หยุดทั้งหมดเท่านั้น การใช้ผิดจังหวะจะสร้างคลัสเตอร์ใหม่แยกออกไปและข้อมูลแตกเป็นสองชุด
ขั้นตอนที่ 5: เพิ่มโหนดที่สองและสาม
# บนโหนด 2 และ 3 ใช้คำสั่งเริ่มปกติ
sudo systemctl start mariadb
sudo journalctl -u mariadb -f
โหนดใหม่จะดึงข้อมูลทั้งหมดจากโหนดที่มีอยู่ ซึ่งใช้เวลาตามขนาดข้อมูล ระหว่างนี้จะเห็นสถานะ Joining และ Donor
ตรวจสอบเมื่อเสร็จ
mysql -e "SHOW STATUS LIKE 'wsrep_cluster_size';" # ควรเป็น 3
mysql -e "SHOW STATUS LIKE 'wsrep_cluster_status';" # ควรเป็น Primary
mysql -e "SHOW STATUS LIKE 'wsrep_local_state_comment';" # ควรเป็น Synced
mysql -e "SHOW STATUS LIKE 'wsrep_incoming_addresses';"