הסופר בחר ב־קרן ההקלה לקורונה (COVID-19) לקבל תרומה כחלק מתוכנית כתיבה לתרומות (Write for Donations).
הקדמה
MongoDB הוא אחד ממנועי מסדי הנתונים NoSQL הפופולריים ביותר. הוא ידוע בגלל הסקאלה, העמידות, האמינות והקלות בשימוש שלו. במאמר זה, תבצעו גיבוי, שחזור והעברה של מסד נתונים של MongoDB דוגמתי.
ייבוא וייצוא של מסד נתונים מהווה עיסוק בנתונים בתבנית שקולה לבני אדם המתאימה למוצרי תוכנה אחרים. לעומת זאת, פעולות הגיבוי והשחזור של MongoDB יוצרות או משתמשות בנתונים בינאריים ספציפיים ל־MongoDB, ששומרות לא רק על הקוהרנטיות והתקינות של הנתונים שלך אלא גם על המאפיינים הספציפיים של MongoDB. לכן, במהלך ההעברה, כלול להשתמש בגיבוי ושחזור כל עוד המערכות המקור והיעד תואמות.
דרישות קדם
לפני שתמשיך במדריך זה, וודא כי השלמת את הדרישות הבאות:
- שרת Ubuntu 20.04 עם משתמש לא-רוט עם הרשאות sudo וגם עם חומת אש, אשר תוכל להגדיר עם המדריך הגדרת השרת הראשונית של Ubuntu 20.04.
- התקנת והגדרת MongoDB באמצעות המדריך איך להתקין את MongoDB על Ubuntu 20.04.
- דוגמא למסד נתונים של MongoDB מיובאת באמצעות ההוראות במדריך איך לייבא ולייצא מסד נתונים של MongoDB.
אלא אם נאמר אחרת, כל הפקודות שדורשות הרשאות שורש במדריך זה צריכות להיות מורצות על ידי משתמש ללא הרשאות רוט אך עם הרשאות sudo.
שלב 1 — שימוש ב-JSON ו-BSON ב-MongoDB
לפני שתמשיך עם המאמר הזה, נדרשת הבנה בסיסית של הנושא. אם יש לך ניסיון עם מערכות מסד נתונים NoSQL אחרות כמו Redis, ייתכן ותמצא דמויות כאשר תעבוד עם MongoDB.
MongoDB משתמשת בתבניות JSON ו-BSON (JSON בינארי) לאחסון המידע שלה. JSON הוא התבנית שניתן לקרוא שמושלמת לייצוא ובסופו של דבר, ייבוא של הנתונים שלך. ניתן לנהל נתונים שיוצאו עם כל כלי שתומך ב-JSON, כולל עורך טקסט פשוט.
דוגמה למסמך .json
נראית כך:
{"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
:
לאחר מכן הרץ את mongodump
:
תראה פלט כזה:
Output2020-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:
כאשר אתה מריץ sudo crontab
, תערוך את משימות ה-cron עבור משתמש ה-root. זה מומלץ מכיוון שאם תגדיר את ה-cron עבור המשתמש שלך, יתכן שהן לא יתבצעו בצורה נכונה, במיוחד אם הפרופיל שלך ל-sudo מחייב אימות סיסמה.
בתוך פקודת ה-crontab, הוסף את הפקודה הבאה של mongodump
:
בפקודה לעיל, אנו משמיעים את הפרמטר --db
מתכוון ככה שנרצה לגבות את כל המסדי הנתונים שלך. גם, יש לברור שהתו המיוחד %
צריך להיות מופלט כדי לעמוד בתחביר ה-cron.
בהתאם לגדלי מסד הנתונים שלך ב-MongoDB, תוכל בקרוב להיתקע במקום בדיסק עם יותר מדי גיבויים. לכן, גם מומלץ לנקות את הגיבויים הישנים באופן רגולי או לדחוס אותם.
לדוגמה, כדי למחוק את כל הגיבויים שיש להם יותר משבעה ימים, תוכל להשתמש בפקודת bash הבאה:
דומה לפקודת ה-mongodump
הקודמת, תוכל גם להוסיף זאת כמשימת cron. היא צריכה להתבצע ישירות לפני שאתה מתחיל את הגיבוי הבא; עבור המשימה בשעה 03:03 בבוקר, מחיקה זו תתבצע ב-03:01 בבוקר. פתח מחדש את ה-crontab:
הוסף את השורה הבאה:
שמור וסגור את הקובץ.
השלמת כל המשימות בשלב זה תבטיח פתרון גיבוי מתאים עבור מסדי הנתונים שלך ב-MongoDB. למשך, תמשיך לשחזר את המסד נתונים.
שלב 3 — שימוש ב־mongorestore
כדי לשחזר ולהעביר בסיס נתונים של MongoDB
כאשר אתה משחזר את בסיס הנתונים שלך של MongoDB מגיבוי קודם, יש לך העתק מדויק של מידע MongoDB שלך שנלקח בזמן מסוים, כולל כל האינדקסים וסוגי הנתונים, דבר שמיוחד אודות כאשר אתה רוצה להעביר את מסדי הנתונים שלך של MongoDB. לשחזר את MongoDB, נשתמש בפקודה mongorestore
, שעובדת עם הגיבויים הבינאריים שיוצר mongodump
.
נמשיך את הדוגמאות שלנו עם בסיס הנתונים newdb
ונראה איך נוכל לשחזר אותו מהגיבוי שנלקח לפני כן. נציין תחילה את שם בסיס הנתונים עם הארגומנט --nsInclude
. נשתמש ב־newdb.*
כדי לשחזר את כל האוספים. כדי לשחזר אוסף יחיד כגון restaurants
, נשתמש ב־newdb.restaurants
במקום זאת.
לאחר מכן, באמצעות --drop
, נוודא שבסיס הנתונים היעד מוסר לפני שהגיבוי מוחזר בבסיס נתונים נקי. כארגומנט אחרון נציין את ספריית הגיבוי האחרונה, שתיראה משהו כזה: /var/backups/mongobackups/10-29-20/newdb/
.
כאשר יש לך גיבוי עם חותמת זמן, אתה יכול לשחזר אותו באמצעות הפקודה הזו (עליך לעדכן את התאריך כדי להתאים לשלך):
תראה פלט כזה:
Output2020-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.