ข้ามไปยังเนื้อหา
อีบุ๊ก Cloudflare Workers Playbook เปิดตัวแล้ว — อ่านตัวอย่างฟรีก่อนตัดสินใจ

มอนิเตอร์ MariaDB Galera ด้วย Prometheus และ Grafana

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

เผยแพร่
7 ตุลาคม 2568
อ่าน
2 นาที
เขียนโดย
SSUSEMAN
มอนิเตอร์ MariaDB Galera ด้วย Prometheus และ Grafana
observability — SUSEMANPrometheus · Grafana

คลัสเตอร์ฐานข้อมูลที่ไม่มีใครมองเห็นคือคลัสเตอร์ที่ล่มโดยไม่มีใครรู้ก่อนลูกค้า บทความนี้คือชุดที่ผมใช้จริงบน 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 ที่ใช้ได้เลย

yaml
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 ได้เท่านั้น:

sql
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 ในเวลาทำการแทน

yaml
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 ที่ดีไม่ใช่ที่มีกราฟเต็มจอ แต่คือที่ตอบได้ว่า "ตอนนี้ระบบโอเคไหม" ภายในห้าวินาทีแรกที่เปิดดู

S

เขียนโดย

SUSEMAN · วิศวกรโครงสร้างพื้นฐาน · นักเขียน

บันทึกวิศวกรรมคลาวด์และเว็บ · กรุงเทพฯ ประเทศไทย

เกี่ยวกับ →

จดหมายรายสัปดาห์

สรุปบทความใหม่ เครื่องมือที่ลองแล้ว และบทเรียนจากการ deploy — ส่งทุกวันพฤหัส ไม่มีสแปม

ไม่ส่งสแปม ยกเลิกได้ทุกเมื่อ

บทความที่เกี่ยวข้อง

ดูทั้งหมด →

บทความถัดไป

Auto scaling กับ Predictive scaling: ตั้งให้รับโหลดล่วงหน้า ไม่ใช่ตามหลัง

→