הגדרת ניטור MySQL עם Prometheus (mysqld_exporter)

כאשר MySQL קורסת באמצע הלילה, אתה לומד על כך מהלקוחות, לא מהמערכת. אנחנו מקימים ניטור מבוסס Prometheus ו-mysqld_exporter, שאוסף מדדי מסד נתונים מרכזיים ומתריע על בעיות לפני שהן הופכות קריטיות. הצוות שלנו מספק את הפרויקט במפתח מלא—מהתקנה והגדרה ועד יצירת לוחות מחוונים והתראות ב-Grafana, עם תמיכה מתמשכת.

היכולות שלנו:

שאלות נפוצות

העבודות האחרונות

  • פיתוח אפליקציית ווב עבור FEEDME
    פיתוח אפליקציית ווב עבור FEEDME
    1365
  • פיתוח חנות מקוונת לחברת FURNORO
    פיתוח חנות מקוונת לחברת FURNORO
    1330
  • עיצוב לוגו לחברת B2B Advance
    עיצוב לוגו לחברת B2B Advance
    776
  • פיתוח אפליקציית ווב עבור Enviok
    פיתוח אפליקציית ווב עבור Enviok
    1077
  • פיתוח לוגו חברת AIDER
    פיתוח לוגו חברת AIDER
    1022
  • פיתוח CRM עבור Chasseurs
    פיתוח CRM עבור Chasseurs
    1113

הגדרת ניטור MySQL עם Prometheus (mysqld_exporter)

תארו לעצמכם: ב-3 לפנות בוקר, MySQL קורס עקב דלדול מאגר החיבורים. אתם מגלים על כך בבוקר מהלקוחות. אנו פורסים ניטור אוטומטי שמתריע 5 דקות לפני התקלה. MySQL מייצר כמויות עצומות של מידע אבחוני: SHOW STATUS, SHOW ENGINE INNODB STATUS, information_schema, performance_schema. לעבור על אלפי שורות ידנית זה חסר טעם. אנו הופכים את איסוף המדדים לאוטומטי עם mysqld_exporter, והופכים אותם לגרפים ברורים והתראות ב-Grafana. במשך למעלה מ-10 שנים, הקמנו ניטור ליותר מ-50 פרויקטים. החיסכון בעלויות ממניעת תקלה אחת בלילה יכול להיות משמעותי.

למה mysqld_exporter?

הוא מחלץ הכל מ-MySQL: מיחס פגיעות מטמון InnoDB ועד פיגור שכפול. בלעדיו, אתם לומדים על בעיות כשהמסד נתונים כבר למטה. איתו, אתם מקבלים אזהרה 5 דקות לפני כשל. כפי שצוין בתיעוד Prometheus, mysqld_exporter אוסף למעלה מ-200 מדדי MySQL.

אילו מדדים קריטיים?

מאגר החוצץ של InnoDB. mysql_global_status_innodb_buffer_pool_reads ו-mysql_global_status_innodb_buffer_pool_read_requests. חשבו יחס פגיעות: 1 - (rate(innodb_buffer_pool_reads[5m]) / rate(innodb_buffer_pool_read_requests[5m])). אם מתחת ל-99%, מאגר החוצץ קטן מדי. ב-95%, הגדילו בדחיפות את innodb_buffer_pool_size. בפרויקט עם 10k בקשות/שנייה, יחס הפגיעות ירד ל-97%. הגדלנו את מאגר החוצץ והיחס חזר ל-99.9%.

תהליכים וחיבורים. mysql_global_status_threads_connected / mysql_global_variables_max_connections. כשמשתמשים ביותר מ-80%, שגיאת "Too many connections" קרובה. סיבה אופיינית: דליפות חיבורים ביישום.

שאילתות איטיות. rate(mysql_global_status_slow_queries[5m]) > 1 מצביע על זרם קבוע של שאילתות איטיות. בדקו את יומן השאילתות האיטיות או performance_schema.events_statements_summary_by_digest.

פיגור שכפול. mysql_slave_status_seconds_behind_master > 30 — פיגור מעל 30 שניות שובר יישומים תלויים בקריאה.

מדד תקין אזהרה קריטי
יחס פגיעות InnoDB > 99% 95–99% < 95%
ניצול תהליכים < 70% 70–85% > 85%
פיגור שכפול < 5 שניות 5–30 שניות > 30 שניות
קצב שאילתות איטיות < 0.1/שנייה 0.1–1/שנייה > 1/שנייה

איך להגדיר התראות?

אנו משתמשים בכללי Prometheus סטנדרטיים (mysql_up == 0, threads_connected / max_connections > 0.8 וכו'). הסט המוכן שלנו מכסה את כל התרחישים המרכזיים. הזמינו הגדרה מקיפה—אנו מספקים סט שלם של כללים ביום אחד. חיסכון נוסף: הגדרה מקיפה מונעת השבתה יקרה.

דוגמה לסט התראות מלא הכללים כוללים MySQLDown, MySQLTooManyConnections, MySQLHighReplicationLag, MySQLInnoDBBufferPoolLowHitRatio. כולם עם רמות חומרה והערות.

איך לפרוס mysqld_exporter?

  1. צרו משתמש עם הרשאות מינימליות:
CREATE USER 'exporter'@'%' IDENTIFIED BY 'exporter_secret' WITH MAX_USER_CONNECTIONS 3;
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'%';
GRANT SELECT ON performance_schema.* TO 'exporter'@'%';
FLUSH PRIVILEGES;
  1. הריצו את הקונטיינר:
---
services:
  mysqld-exporter:
    image: prom/mysqld-exporter:v0.15.1
    command:
      - "--mysqld.username=exporter"
      - "--mysqld.address=mysql:3306"
    ports:
      - "9104:9104"
    environment:
      MYSQLD_EXPORTER_PASSWORD: "exporter_secret"
  1. ודאו איסוף מדדים על ידי שאילתת CREATE USER 'exporter'@'%' IDENTIFIED BY 'exporter_secret' WITH MAX_USER_CONNECTIONS 3; GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'%'; GRANT SELECT ON performance_schema.* TO 'exporter'@'%'; FLUSH PRIVILEGES; .

services: mysqld-exporter: image: prom/mysqld-exporter:v0.15.1 command: - "--mysqld.username=exporter" - "--mysqld.address=mysql:3306" ports: - "9104:9104" environment: MYSQLD_EXPORTER_PASSWORD: "exporter_secret" חשוב: ה-exporter יוצר חיבור נפרד לכל גרידה; ללא הגבלה, scrape_interval אגרסיבי יכול לדלדל את http://localhost:9104/metrics.

אילו קולטים להפעיל?

קולטים ברירת מחדל מופעלים. לייצור, הוסיפו בנוסף:

--collect.global_status
--collect.global_variables
--collect.slave_status
--collect.info_schema.innodb_metrics
--collect.info_schema.tables
--collect.perf_schema.eventsstatements
--collect.perf_schema.eventsstatementssum

MAX_USER_CONNECTIONS 3 יקר—הוא קורא את max_connections. על שרתים עמוסים, הגדירו job נפרד עם --collect.global_status --collect.global_variables --collect.slave_status --collect.info_schema.innodb_metrics --collect.info_schema.tables --collect.perf_schema.eventsstatements --collect.perf_schema.eventsstatementssum .

אילו מדדי MySQL הם מפתח?

מאגר החוצץ של InnoDB. perf_schema.eventsstatements לעומת performance_schema.events_statements_summary_by_digest — זה יחס פגיעות המטמון של InnoDB. חשבו כך:

1 - (rate(innodb_buffer_pool_reads[5m]) / rate(innodb_buffer_pool_read_requests[5m])) 

אם היחס יורד מתחת ל-99%, או שמאגר החוצץ קטן מדי עבור סט העבודה, או שהעומס השתנה. ערך של 95% הוא אות רציני.

תהליכים וחיבורים. scrape_interval: 60s ו-mysql_global_status_innodb_buffer_pool_reads. כשש-mysql_global_status_innodb_buffer_pool_read_requests מתקרב ל-1 - (rate(innodb_buffer_pool_reads[5m]) / rate(innodb_buffer_pool_read_requests[5m])) , MySQL מתחיל לסרב לחיבורים עם "Too many connections". סיפור קלאסי: מפתחים לא סוגרים חיבורים, דליפה מצטברת, וב-3 לפנות בוקר המסד נתונים מת.

שאילתות איטיות. mysql_global_status_threads_connected — מונה שעולה באופן מונוטוני. mysql_global_status_max_used_connections פירושו זרם קבוע של שאילתות איטיות. זה מסמן לבדוק את יומן השאילתות האיטיות או threads_connected.

פיגור שכפול. על רפליקות, max_connections מציג פיגור בשניות. ערכים מעל 30 שניות גורמים לבעיות ליישומים תלויים בקריאה המשתמשים ברפליקה.

התראות ב-Prometheus

---
groups:
  - name: mysql
    rules:
      - alert: MySQLDown
        expr: mysql_up == 0
        for: 1m
        labels:
          severity: critical
      - alert: MySQLTooManyConnections
        expr: |
          mysql_global_status_threads_connected / mysql_global_variables_max_connections > 0.8
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "MySQL использует {{ $value | humanizePercentage }} соединений"
      - alert: MySQLHighReplicationLag
        expr: mysql_slave_status_seconds_behind_master > 30
        for: 5m
        labels:
          severity: warning
      - alert: MySQLInnoDBBufferPoolLowHitRatio
        expr: |
          1 - (rate(mysql_global_status_innodb_buffer_pool_reads[5m]) / rate(mysql_global_status_innodb_buffer_pool_read_requests[5m])) < 0.99
        for: 10m
        labels:
          severity: warning

לוח מחוונים ב-Grafana

מזהה לוח Too many connections (MySQL Overview מאת Percona) הוא אחת האפשרויות המוכנות הטובות ביותר. מכסה מדדי InnoDB, ניתוח שאילתות, חיבורים, שכפול. דורש קולטי mysql_global_status_slow_queries.

מה כלול בהגדרה?

  • התקנה והגדרה של mysqld_exporter
  • הגדרת משימות גרידה ב-Prometheus
  • התראות בסיסיות (5 כללים) ולוח מחוונים ב-Grafana
  • תיעוד תפעול ופרטי גישה
  • חודשיים של תמיכה באחריות

איך אנחנו עובדים

אנחנו מתחילים בבדיקה: האם rate(mysql_global_status_slow_queries[5m]) > 1 מופעל בקונפיגורציית MySQL (performance_schema.events_statements_summary_by_digest ב-mysql_slave_status_seconds_behind_master), מהו groups: - name: mysql rules: - alert: MySQLDown expr: mysql_up == 0 for: 1m labels: severity: critical - alert: MySQLTooManyConnections expr: | mysql_global_status_threads_connected / mysql_global_variables_max_connections > 0.8 for: 5m labels: severity: warning annotations: summary: "MySQL использует {{ $value | humanizePercentage }} соединений" - alert: MySQLHighReplicationLag expr: mysql_slave_status_seconds_behind_master > 30 for: 5m labels: severity: warning - alert: MySQLInnoDBBufferPoolLowHitRatio expr: | 1 - (rate(mysql_global_status_innodb_buffer_pool_reads[5m]) / rate(mysql_global_status_innodb_buffer_pool_read_requests[5m])) < 0.99 for: 10m labels: severity: warning הנוכחי, האם יש רפליקות. בגרסאות MySQL ישנות יותר (5.6 ומטה), חלק מהקולטים לא זמינים—אנו מגבילים במפורש את הדגלים של ה-exporter.

פריסת ה-exporter, הגדרת גרידות, התראות בסיסיות—2–3 שעות. סט התראות מלא עם שכפול, ניתוח שאילתות ומדדים מותאמים לסכמת מסד נתונים ספציפית—עד יומיים.

צרו קשר לייעוץ. אנו מבטיחים פעולת התראות יציבה ושקיפות מדדים מלאה. הזמינו את ההגדרה ושכחו מתקלות ליליות.