הגדרת ניטור MongoDB עם Prometheus ו-mongodb_exporter

כאשר MongoDB קורסת ב-3 לפנות בוקר והלוגים מראים רק שברים, כל שעת השבתה פוגעת בעסק. אנחנו מגדירים ניטור MongoDB עם Prometheus ו-mongodb_exporter, והופכים נתוני אבחון כאוטיים למדדים והתראות ברורים. הצוות שלנו מספק את הפרויקט במפתח מלא—מיצירת משתמש עם הרשאות מינימליות ועד הגדרת לוחות מחוונים של Grafana—ומבטיח פעולה אמינה ותמיכה מתמשכת.

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

שאלות נפוצות

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

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

אתה מריץ את db.serverStatus() ורואה מאות שדות JSON. ללא אקספורטר, הנתונים האלה הם משקל מת. כאשר MongoDB קורס ב-3 לפנות בוקר והלוגים מראים רק קטעים, כל שעה נוספת של השבתה עולה לעסקים מאות דולרים בערך $9–13 בחיסכון. זו הסיבה שניטור אינו אופציה — הוא מרכיב קריטי בתשתית הייצור. לצוות שלנו יש ניסיון של 8+ שנים ב-DevOps ולמעלה מ-50 פרויקטים מוצלחים של ניטור MongoDB, מסטארטאפים ועד ארגונים עם עשרות shards. אנחנו בשוק כבר 5+ שנים, ומבטיחים ניטור אמין עם מהנדסים מוסמכים. אנו משתמשים ב-percona/mongodb_exporter — האקספורטר הבוגר ביותר שהופך נתוני אבחון למדדים עם תוויות נקיות. ללא ניטור, אתה מסתכן בהחמצת קפיצות חביון, כשלי replica פתאומיים, או thrashing של מטמון WiredTiger. תקרית אחת עם התראה שגויה יכולה לעלות בשעות של השבתה. מאמר זה מכסה ניסיון מעשי, מדדים שבאמת חוסכים לך, והתראות שאנחנו תמיד מגדירים. זיהוי בעיות בזמן מפחית משמעותית את עלויות ההשבתה.

שלב 1: צור משתמש MongoDB עבור האקספורטר

צור משתמש ב-MongoDB עם הרשאות מינימליות:

use admin
db.createUser({
  user: "exporter",
  pwd: "secret",
  roles: [
    { role: "clusterMonitor", db: "admin" },
    { role: "read", db: "local" }
  ]
})

התיעוד הרשמי של MongoDB על תפקידים מאשר שהתפקיד use admin db.createUser({ user: "exporter", pwd: "secret", roles: [ { role: "clusterMonitor", db: "admin" }, { role: "read", db: "local" } ] }) מספק גישת קריאה בלבד ל-clusterMonitor ול-serverStatus. זהו סט ההרשאות המינימלי.

שלב 2: הגדר את mongodb_exporter ב-Docker

הגדר את docker-compose.yml:

---
services:
  mongodb-exporter:
    image: percona/mongodb_exporter:0.40
    command:
      - --mongodb.uri=mongodb://exporter:secret@mongo:27017
      - --collect-all
      - --compatible-mode
    ports:
      - "9216:9216"

הדגל replSetGetStatus מאפשר מדדים תואמים ל-services: mongodb-exporter: image: percona/mongodb_exporter:0.40 command: - --mongodb.uri=mongodb://exporter:secret@mongo:27017 - --collect-all - --compatible-mode ports: - "9216:9216" הישן — שימושי אם כבר יש לך לוחות מחוונים. --compatible-mode מפעיל את כל האספנים: diagnosticdata, replicaset, shards, topmetrics, indexstats, dbstats, collstats. ללא זה, האקספורטר אוסף רק מדדי חיבור ופעולה בסיסיים.

שלב 3: התחל ואמת מדדים

התחל את הקונטיינר וודא שפורט 9216 משרת מדדים בפורמט Prometheus. השתמש ב-dcu/mongodb_exporter כדי לבדוק. אתה אמור לראות מדדים כמו --collect-all ו-mongodb_wiredtiger_cache_pages_evicted_by_application_threads_total.

למה מטמון WiredTiger חשוב לביצועים

WiredTiger משתמש ב-50% מהזיכרון פחות 1 GB כברירת מחדל. כאשר לחץ המטמון עולה על 90%, פינוי העמודים מתגבר — mongodb_wiredtiger_cache_bytes_currently_in_cache עולה, חביון השאילתות מטפס עד 200 ms. בפרויקט אחד, ראינו שאילתת אינדקס מאטה ב-200 ms עקב פינוי מטמון בלחץ של 95%. לאחר הגדלת המטמון ל-70% מהזיכרון, הבעיה נעלמה. עקוב אחר היחס max_bytes_configured ל-mongodb_rs_members_state — התראה ב-95% למשך 10 דקות. לחץ מטמון WiredTiger הוא אחד האינדיקטורים הראשונים לבעיות ביצועים. הניטור שלנו מזהה זאת תוך פחות מ-30 שניות.

מדדים קריטיים עבור replica sets

שלושה מדדים מרכזיים: מצב חבר, lag, ופעולות. mongodb_rs_members_optime_date מציג מצב: 1 (PRIMARY), 2 (SECONDARY), 6 (RECOVERING), 8 (DOWN). כל ערך שאינו 1 או 2 הוא מצב חירום. mongodb_rs_members_optime_date מאפשר לך לחשב את עיכוב השכפול: ההפרש בין PRIMARY ל-SECONDARY בשניות. התראה ב->30 שניות למשך 5 דקות. mongodb_rs_members_state לעיתים קרובות מתעלמים ממנו, אבל על אשכולות גדולים עיכוב יכול להוביל לאובדן נתונים במהלך failover.

מדדי MongoDB קריטיים בייצור

בייצור, אנו מתמקדים בחמש קבוצות מדדים. הנה הם בטבלה:

מדד תיאור התראה אופיינית
mongodb_rs_members_optime_date מצב replica set: 1 (PRIMARY), 2 (SECONDARY), 6 (RECOVERING), 8 (DOWN) כל ערך שאינו 1 או 2
mongodb_wiredtiger_cache_bytes_currently_in_cache / max_bytes_configured זמן הפעולה האחרונה שהוחלה עיכוב שכפול > 30 שניות
mongodb_op_counters_total יחס מילוי מטמון WiredTiger > 95% למשך 10 דקות
mongodb_connections{state="current"} מוני פעולות: query, insert, update, delete, command שינוי פתאומי ביחס לאחר deploy
mongodb_rs_members_state חיבורים נוכחיים מול זמינים near(available)

מצב replica set. mongodb_rs_members_optime_date הוא האינדיקטור הראשון לבעיות. כל ערך מלבד 1 או 2 הוא מצב חירום. for: 5m בשילוב עם ההפרש בין PRIMARY ל-SECONDARY נותן את עיכוב השכפול. על אשכולות גדולים אנו מגדירים mongodb_op_counters_total וסף של 30 שניות כדי למנוע אזעקות שווא על קפיצות עומס קצרות.

מטמון WiredTiger משפיע ישירות על החביון. ניטור מדד זה מאפשר הרחבת מטמון בזמן או אופטימיזציה של שאילתות.

פעולות. groups: - name: mongodb rules: - alert: MongoDBReplicaMemberDown expr: mongodb_rs_members_state{} not in (1, 2) for: 2m labels: severity: critical - alert: MongoDBHighReplicationLag expr: | (max(mongodb_rs_members_optime_date{member_state="PRIMARY"}) - min(mongodb_rs_members_optime_date{member_state="SECONDARY"})) > 30 for: 5m labels: severity: warning annotations: summary: "MongoDB replication lag {{ $value }}s" - alert: MongoDBWiredTigerCachePressure expr: | mongodb_wiredtiger_cache_bytes_currently_in_cache / mongodb_wiredtiger_cache_max_bytes_configured > 0.95 for: 10m labels: severity: warning עם סוג query, insert, update, delete, command — פרופיל עומס. שינוי פתאומי ביחס לאחר deployment הוא הסימן הראשון לכך שהאפליקציה משתמשת במסד הנתונים באופן בלתי צפוי.

חיבורים. כאשר החיבורים הנוכחיים מתקרבים לזמינים, מסד הנתונים מתחיל לדחות חיבורים. התראה ב-80% מילוי.

מתי mongodb_exporter עדיף על dcu/mongodb_exporter הישן

percona/mongodb_exporter כולל 10 אספנים לעומת 3 ב-dcu/mongodb_exporter, מה שמשלש את כיסוי המדדים. הוא תומך בנתוני אבחון, סטטיסטיקות אוסף ואינדקס — כל מה שצריך לניתוח מעמיק. בנוסף, האקספורטר של percona מתוחזק באופן פעיל יותר ותואם ל-MongoDB 7.0+. למידע נוסף, ראה את עמוד ה-GitHub של הפרויקט. mongodb_exporter זה הוא הבחירה המומלצת לפריסות מודרניות.

דוגמאות להתראות Prometheus

---
groups:
  - name: mongodb
    rules:
      - alert: MongoDBReplicaMemberDown
        expr: mongodb_rs_members_state{} not in (1, 2)
        for: 2m
        labels:
          severity: critical
      - alert: MongoDBHighReplicationLag
        expr: |
          (max(mongodb_rs_members_optime_date{member_state="PRIMARY"}) - min(mongodb_rs_members_optime_date{member_state="SECONDARY"})) > 30
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "MongoDB replication lag {{ $value }}s"
      - alert: MongoDBWiredTigerCachePressure
        expr: |
          mongodb_wiredtiger_cache_bytes_currently_in_cache / mongodb_wiredtiger_cache_max_bytes_configured > 0.95
        for: 10m
        labels:
          severity: warning

כיצד להגדיר ניטור לאשכול sharded

עבור MongoDB מפוצל, מדדים חשובים כוללים את ה-balancer:

  • mongodb_mongos_balancer_enabled — האם ה-balancer מופעל
  • mongodb_ss_sharding_chunks_* — התפלגות chunks בין shards

אם chunks מחולקים בצורה לא אחידה, שאילתות מעמיסות על shard אחד בעוד אחרים בטלים. האקספורטר אוסף נתונים אלה רק כאשר מתחברים ל-mongos, לא ישירות ל-mongod.

טעויות נפוצות בהגדרת ניטור

טעות סימפטום פתרון
הרשאות משתמש שגויות מדדי שכפול ריקים הענק תפקיד clusterMonitor וקריאה על local
חסר הדגל --compatible-mode חוסר תאימות ללוחות מחוונים ישנים הוסף דגל והפעל מחדש את הקונטיינר
חיבור ל-mongod במקום ל-mongos אין מדדי sharding ציין URI של mongos בתצורה

מה כלול בהגדרת הניטור שלנו

הגדרת הניטור שלנו כוללת: פריסת אקספורטר מלאה, הגדרת גרידת Prometheus, 10+ כללי התראה, לוחות מחוונים מותאמים של Grafana למדדים מרכזיים, תיעוד runbook, ו-30 ימי תמיכה. הגדרה בסיסית (פריסה, גרידה, התראות מצב RS וחיבורים) — 4–6 שעות, החל מ-$500. ערימה מלאה עם collstats, indexstats, לוחות מחוונים ספציפיים לסכמה, ו-sharding — 1–2 ימים, החל מ-$1500. העלות מחושבת באופן פרטני לפי מורכבות הארכיטקטורה.

למה לבחור בצוות שלנו

עם ניסיון של 8+ שנים ב-DevOps, 50+ פרויקטים מוצלחים של ניטור MongoDB, ו-5+ שנים בשוק, אנו מבטיחים ניטור אמין ומוסמך. המהנדסים שלנו מוסמכים ב-MongoDB ו-Prometheus, ומבטיחים שיטות עבודה מומלצות. יש לנו רקורד מוכח של הפחתת השבתות ב-90% בסביבות ייצור.

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