איך לגבות, לשחזר ולהעביר מסד נתונים של MongoDB על Ubuntu 20.04

הסופר בחר ב־קרן ההקלה לקורונה (COVID-19) לקבל תרומה כחלק מתוכנית כתיבה לתרומות (Write for Donations).

הקדמה

MongoDB הוא אחד ממנועי מסדי הנתונים NoSQL הפופולריים ביותר. הוא ידוע בגלל הסקאלה, העמידות, האמינות והקלות בשימוש שלו. במאמר זה, תבצעו גיבוי, שחזור והעברה של מסד נתונים של MongoDB דוגמתי.

ייבוא וייצוא של מסד נתונים מהווה עיסוק בנתונים בתבנית שקולה לבני אדם המתאימה למוצרי תוכנה אחרים. לעומת זאת, פעולות הגיבוי והשחזור של MongoDB יוצרות או משתמשות בנתונים בינאריים ספציפיים ל־MongoDB, ששומרות לא רק על הקוהרנטיות והתקינות של הנתונים שלך אלא גם על המאפיינים הספציפיים של MongoDB. לכן, במהלך ההעברה, כלול להשתמש בגיבוי ושחזור כל עוד המערכות המקור והיעד תואמות.

דרישות קדם

לפני שתמשיך במדריך זה, וודא כי השלמת את הדרישות הבאות:

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

שלב 1 — שימוש ב-JSON ו-BSON ב-MongoDB

לפני שתמשיך עם המאמר הזה, נדרשת הבנה בסיסית של הנושא. אם יש לך ניסיון עם מערכות מסד נתונים NoSQL אחרות כמו Redis, ייתכן ותמצא דמויות כאשר תעבוד עם MongoDB.

MongoDB משתמשת בתבניות JSON ו-BSON (JSON בינארי) לאחסון המידע שלה. JSON הוא התבנית שניתן לקרוא שמושלמת לייצוא ובסופו של דבר, ייבוא של הנתונים שלך. ניתן לנהל נתונים שיוצאו עם כל כלי שתומך ב-JSON, כולל עורך טקסט פשוט.

דוגמה למסמך .json נראית כך:

Example of JSON Format
{"address":[
    {"building":"1007", "street":"Park Ave"},
    {"building":"1008", "street":"New Ave"},
]}

JSON נוח לעבוד איתו, אך הוא לא תומך בכל סוגי הנתונים הזמינים ב-BSON. זה אומר שישנה כינוי כנפיים למידע אם תשתמש ב-JSON. לצורך גיבוי ושחזור, עדיף להשתמש ב-BSON הבינארי.

שנית, אין צורך לדאוג ליצירת בסיס נתונים באופן ברור ב-MongoDB. אם המסד שהגדרת לייבוא עדיין לא קיים, הוא ייווצר אוטומטית. ואף יותר טוב הוא המקרה של מבני האוספים (טבלאות בסיס הנתונים). בניגוד למנועי בסיסי נתונים אחרים, ב-MongoDB, המבנה נוצר שוב באופן אוטומטי בכניסת המסמך הראשון (שורת בסיס נתונים).

שלישית, ב-MongoDB, קריאה או הכנסת כמויות גדולות של נתונים, כמו משימות המאמר הזה, עשויים לדרוש משאבי מערכת ולצרוך הרבה מ-CPU, זיכרון, ושטח אחסון. זה חיוני לקרוא את זה כשמתייחסים לעבודה עם בסיסי נתונים גדולים וBig Data. הפתרון הפשוט ביותר לבעיה הזו הוא להפעיל את הייצואים והגיבויים במהלך הלילה או שעות לא פופולריות.

רביעי, עקביות במידע עשויה להיות בעיה אם יש לך שרת MongoDB תפוס שבו המידע משתנה במהלך תהליך ייצוא או גיבוי של הבסיס נתונים. פתרון אפשרי לבעיה זו הוא שיבוצים, אותם תוכל לשקול כאשר אתה מתקדם בנושא MongoDB.

בעוד שניתן להשתמש ב פונקציות ייבוא וייצוא כדי לגבות ולשחזר את הנתונים שלך, יש דרכים טובות יותר להבטיח את השלמות המלאה של בסיסי הנתונים שלך ב־MongoDB. כדי לגבות את הנתונים שלך, עליך להשתמש בפקודת mongodump. לשחזור, השתמש ב mongorestore. בואו נראה כיצד הם עובדים.

שלב 2 — בשימוש ב mongodump כדי לגבות בסיס נתונים של MongoDB

בוא נכסה את גיבוי בסיס הנתונים של MongoDB שלך תחילה.

אחד הארגומנטים החיוניים ל־mongodump הוא --db, המציין את שם מסד הנתונים שברצונך לגבות. אם לא ציינת שם מסד נתונים, mongodump יגבה את כל המסדים שלך. הארגומנט השני החשוב הוא --out, שמגדיר את התיקייה אליה הנתונים יושמרו. לדוגמה, בואו נגבה את מסד הנתונים newdb ונאחסן אותו בתיקייה /var/backups/mongobackups. רעיון טוב הוא לשמור כל גיבוי בתיקייה עם התאריך הנוכחי, כמו /var/backups/mongobackups/10-29-20.

התחל על ידי יצירת התיקייה הזו /var/backups/mongobackups:

  1. sudo mkdir /var/backups/mongobackups

לאחר מכן הרץ את mongodump:

  1. sudo mongodump --db newdb --out /var/backups/mongobackups/$(date +'%m-%d-%y')

תראה פלט כזה:

Output
2020-10-29T19:22:36.886+0000 writing newdb.restaurants to 2020-10-29T19:22:36.969+0000 done dumping newdb.restaurants (25359 documents)

שים לב שבנתיב התיקייה לעיל, השתמשת ב־date +'%m-%d-%y' כדי לקבל אוטומטית את התאריך הנוכחי. זה יאפשר לך לקבל גיבויים בתוך התיקייה כמו /var/backups/10-29-20/, מה שהופך את זה לנוח במיוחד לאוטומציה של גיבויים.

בנקודה זו, יש לך גיבוי מלא של מסד הנתונים newdb בתיקייה /var/backups/mongobackups/10-29-20/newdb/. הגיבוי הזה מכיל הכול כדי לשחזר את newdb כראוי ולשמור על "אמינותו".

ככלל כללי, עליך לבצע גיבויים רגולריים, רצוי כאשר השרת פחות עמוס. לכן, ניתן להגדיר את פקודת mongodump כמשימת cron כך שתרוץ באופן קבוע, לדוגמה כל יום בשעה 03:03 בבוקר.

כדי לבצע זאת, פתח את crontab, עורך ה־cron:

  1. sudo crontab -e

כאשר אתה מריץ sudo crontab, תערוך את משימות ה-cron עבור משתמש ה-root. זה מומלץ מכיוון שאם תגדיר את ה-cron עבור המשתמש שלך, יתכן שהן לא יתבצעו בצורה נכונה, במיוחד אם הפרופיל שלך ל-sudo מחייב אימות סיסמה.

בתוך פקודת ה-crontab, הוסף את הפקודה הבאה של mongodump:

crontab
  1. 3 3 * * * mongodump --out /var/backups/mongobackups/$(date +'\%m-\%d-\%y')

בפקודה לעיל, אנו משמיעים את הפרמטר --db מתכוון ככה שנרצה לגבות את כל המסדי הנתונים שלך. גם, יש לברור שהתו המיוחד % צריך להיות מופלט כדי לעמוד בתחביר ה-cron.

בהתאם לגדלי מסד הנתונים שלך ב-MongoDB, תוכל בקרוב להיתקע במקום בדיסק עם יותר מדי גיבויים. לכן, גם מומלץ לנקות את הגיבויים הישנים באופן רגולי או לדחוס אותם.

לדוגמה, כדי למחוק את כל הגיבויים שיש להם יותר משבעה ימים, תוכל להשתמש בפקודת bash הבאה:

  1. find /var/backups/mongobackups/ -mtime +7 -exec rm -rf {} \;

דומה לפקודת ה-mongodump הקודמת, תוכל גם להוסיף זאת כמשימת cron. היא צריכה להתבצע ישירות לפני שאתה מתחיל את הגיבוי הבא; עבור המשימה בשעה 03:03 בבוקר, מחיקה זו תתבצע ב-03:01 בבוקר. פתח מחדש את ה-crontab:

  1. sudo crontab -e

הוסף את השורה הבאה:

crontab
  1. 1 3 * * * find /var/backups/mongobackups/ -mtime +7 -exec rm -rf {} \;

שמור וסגור את הקובץ.

השלמת כל המשימות בשלב זה תבטיח פתרון גיבוי מתאים עבור מסדי הנתונים שלך ב-MongoDB. למשך, תמשיך לשחזר את המסד נתונים.

שלב 3 — שימוש ב־mongorestore כדי לשחזר ולהעביר בסיס נתונים של MongoDB

כאשר אתה משחזר את בסיס הנתונים שלך של MongoDB מגיבוי קודם, יש לך העתק מדויק של מידע MongoDB שלך שנלקח בזמן מסוים, כולל כל האינדקסים וסוגי הנתונים, דבר שמיוחד אודות כאשר אתה רוצה להעביר את מסדי הנתונים שלך של MongoDB. לשחזר את MongoDB, נשתמש בפקודה mongorestore, שעובדת עם הגיבויים הבינאריים שיוצר mongodump.

נמשיך את הדוגמאות שלנו עם בסיס הנתונים newdb ונראה איך נוכל לשחזר אותו מהגיבוי שנלקח לפני כן. נציין תחילה את שם בסיס הנתונים עם הארגומנט --nsInclude. נשתמש ב־newdb.* כדי לשחזר את כל האוספים. כדי לשחזר אוסף יחיד כגון restaurants, נשתמש ב־newdb.restaurants במקום זאת.

לאחר מכן, באמצעות --drop, נוודא שבסיס הנתונים היעד מוסר לפני שהגיבוי מוחזר בבסיס נתונים נקי. כארגומנט אחרון נציין את ספריית הגיבוי האחרונה, שתיראה משהו כזה: /var/backups/mongobackups/10-29-20/newdb/.

כאשר יש לך גיבוי עם חותמת זמן, אתה יכול לשחזר אותו באמצעות הפקודה הזו (עליך לעדכן את התאריך כדי להתאים לשלך):

  1. sudo mongorestore --db newdb --drop /var/backups/mongobackups/10-29-20/newdb/

תראה פלט כזה:

Output
2020-10-29T19:25:45.825+0000 the --db and --collection args should only be used when restoring from a BSON file. Other uses are deprecated and will not exist in the future; use --nsInclude instead 2020-10-29T19:25:45.826+0000 building a list of collections to restore from /var/backups/mongobackups/10-29-20/newdb dir 2020-10-29T19:25:45.829+0000 reading metadata for newdb.restaurants from /var/backups/mongobackups/10-29-20/newdb/restaurants.metadata.json 2020-10-29T19:25:45.834+0000 restoring newdb.restaurants from /var/backups/mongobackups/10-29-20/newdb/restaurants.bson 2020-10-29T19:25:46.130+0000 no indexes to restore 2020-10-29T19:25:46.130+0000 finished restoring newdb.restaurants (25359 documents) 2020-10-29T19:25:46.130+0000 done

במקרה שלמעלה, אנו משחזרים את הנתונים על השרת אותו השימרנו בו את הגיבוי. אם ברצונך להעביר את הנתונים לשרת אחר ולהשתמש בטכניקה זו, עליך להעתיק את ספריית הגיבוי, הנמצאת ב־/var/backups/mongobackups/10-29-20/newdb/ במקרה שלנו, אל השרת האחר.

מסקנה

ביצעת כעת מספר משימות עיקריות הקשורות לגיבוי, שחזור והעברה של מסדי הנתונים שלך ב־MongoDB. שרתי MongoDB לייצור אינם צריכים להפעיל אף פעם בלי אסטרטגיית גיבוי אמינה, דומה לזו שתוארה כאן.

ניתן למצוא מדריכים נוספים על איך להגדיר ולהשתמש ב־MongoDB במאמרים בקהילה של DigitalOcean. אנו ממליצים גם לבדוק את התיעוד הרשמי של MongoDB, שהוא מקור מצוין למידע על האפשרויות שמציעה MongoDB.

Source:
https://www.digitalocean.com/community/tutorials/how-to-back-up-restore-and-migrate-a-mongodb-database-on-ubuntu-20-04