הגדרת ניטור 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?
- צרו משתמש עם הרשאות מינימליות:
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"
- ודאו איסוף מדדים על ידי שאילתת
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.eventsstatementssumMAX_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 שעות. סט התראות מלא עם שכפול, ניתוח שאילתות ומדדים מותאמים לסכמת מסד נתונים ספציפית—עד יומיים.
צרו קשר לייעוץ. אנו מבטיחים פעולת התראות יציבה ושקיפות מדדים מלאה. הזמינו את ההגדרה ושכחו מתקלות ליליות.







