มอนิเตอร์ MariaDB Galera ด้วย Prometheus และ Grafana
สร้างชุด observability ที่มองเห็นทั้งระดับเซิร์ฟเวอร์และระดับคลัสเตอร์ฐานข้อมูล พร้อม alert ที่ไม่ปลุกคุณตอนตีสามโดยไม่จำเป็น
- เผยแพร่
- 7 ตุลาคม 2568
- อ่าน
- 2 นาที
- เขียนโดย
- SSUSEMAN

คลัสเตอร์ฐานข้อมูลที่ไม่มีใครมองเห็นคือคลัสเตอร์ที่ล่มโดยไม่มีใครรู้ก่อนลูกค้า บทความนี้คือชุดที่ผมใช้จริงบน MariaDB Galera ตั้งแต่ node-exporter ไปจนถึง dashboard ที่ตอบคำถามได้ในห้าวินาที
องค์ประกอบทั้งชุด
- Prometheus เก็บ time series และประเมิน alert rules
- node-exporter เก็บค่าฮาร์ดแวร์ (CPU, disk, network)
- mysqld_exporter ดึงค่าจากฐานข้อมูลและสถานะ Galera
- Grafana สำหรับ dashboard และการแชร์ให้ทีม ops
- Alertmanager ส่งเข้า Slack หรือ LINE Notify
docker-compose ที่ใช้ได้เลย
services:
prometheus:
image: prom/prometheus:v2.54.1
command:
- --config.file=/etc/prometheus/prometheus.yml
- --storage.tsdb.retention.time=30d
volumes: ['./prometheus.yml:/etc/prometheus/prometheus.yml:ro', 'prom-data:/prometheus']
ports: ['9090:9090']
grafana:
image: grafana/grafana:11.1.0
environment:
GF_SECURITY_ADMIN_PASSWORD: ${GRAFANA_PASSWORD}
volumes: ['grafana-data:/var/lib/grafana']
ports: ['3000:3000']
เปิดพอร์ต exporter ของ MySQL ผ่านผู้ใช้เฉพาะที่อ่าน metrics ได้เท่านั้น:
CREATE USER 'exporter'@'10.%' IDENTIFIED BY 'strong-secret' WITH MAX_USER_CONNECTIONS 3;
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'10.%';
metric ที่ต้องมีจริง ๆ
มี metric เป็นพันตัว แต่ที่ทำให้เราตื่นมาแก้ได้ทันมีไม่กี่ตัว:
| Metric | ความหมาย | เกณฑ์เตือน |
|---|---|---|
wsrep_cluster_size |
จำนวน node ที่ยังอยู่ในคลัสเตอร์ | ต่ำกว่า 3 |
wsrep_ready |
node พร้อมรับ write หรือไม่ | เท่ากับ 0 |
wsrep_flow_control_paused |
สัดส่วนเวลาที่ถูก throttle | สูงกว่า 0.05 |
mysql_global_status_threads_connected |
จำนวน connection | เกิน 80% ของ max_connections |
node_filesystem_avail_bytes |
พื้นที่ดิสก์เหลือ | ต่ำกว่า 15% |
alert ที่ไม่ควรปลุกคน
กฎง่าย ๆ: alert ที่ดังตอนตีสามต้องเป็นสิ่งที่คนแก้ได้ตอนตีสาม ถ้าเป็นเรื่อง capacity ให้ส่งเข้า Slack ในเวลาทำการแทน
groups:
- name: galera
rules:
- alert: GaleraClusterDegraded
expr: wsrep_cluster_size < 3
for: 2m
labels: { severity: critical }
- alert: DiskAlmostFull
expr: node_filesystem_avail_bytes / node_filesystem_size_bytes < 0.15
for: 30m
labels: { severity: warning }
สิ่งที่ผมเรียนรู้หลังใช้จริงสองปี
ดิสก์ของ Prometheus คือจุดที่คนมักลืม — 30 วันของ series ระดับล้านตัวกินพื้นที่มาก ตั้ง retention ที่ชัดเจนและแยก volume ออกมา
อีกอย่างคือ label ต้องมีระเบียบ ถ้าตั้ง instance เป็น IP ปนกับ hostname วันหน้าจะ query ยากมาก ใช้ชื่อเครื่องเป็น source of truth แล้วเก็บ IP เป็น label เสริม
สุดท้าย dashboard ที่ดีไม่ใช่ที่มีกราฟเต็มจอ แต่คือที่ตอบได้ว่า "ตอนนี้ระบบโอเคไหม" ภายในห้าวินาทีแรกที่เปิดดู
เขียนโดย
SUSEMAN · วิศวกรโครงสร้างพื้นฐาน · นักเขียน
บันทึกวิศวกรรมคลาวด์และเว็บ · กรุงเทพฯ ประเทศไทย
จดหมายรายสัปดาห์
สรุปบทความใหม่ เครื่องมือที่ลองแล้ว และบทเรียนจากการ deploy — ส่งทุกวันพฤหัส ไม่มีสแปม


