MongoDB یکی از محبوبترین موتورهای پایگاه داده غیر SQL محسوب میشود. مقیاسپذیری، سرعت، قابلاتکا بودن و سهولت استفاده از مزایای آن محسوب میشود. در این مطلب قصد داریم که با نحوه پشتیبانگیری، بازیابی و مهاجرت به یک پایگاه داده MongoDB آشنا شویم.
وارد کردن و انتقال یک پایگاه به معنای برخورد با دادههایی است که در یک فرمت قابلفهم قرار دارند و میتوانند با سایر محصولات نرمافزاری سازگاری داشته باشند. در مقابل، عملیات پشتیبانگیری و بازیابی پایگاه داده MongoDB از دادههای باینری ویژهای استفاده میکند که نه تنها به قالب اولیه داده، بلکه به نسخه MongoDB نیز وفاداری خواهد داشت. براین اساس، برای انجام مهاجرت، بهتر است ابتدا سازگاری سیستمهای مبدأ و مقصد را درنظر بگیریم.
پیشنیازها
قبل از دنبال کردن مراحل این آموزش، حتماً پیشنیازهای زیر را تکمیل کنید.
- یک سیستم مبتنی بر CentOS 8 با انجام تنظمیات اولیه سرور شامل یک کاربر غیر روت با دسترسی sudo و یک فایروال
- نصب پایگاه داده MongoDB و تنظمیات اولیه آن
این آموزش با توجه به سیستم عامل اوبونتو نوشته شده، ولی در عین حال میتوانید آن را برای سایر توزیعهای لینوکس استفاده کنید. چرا که فرمان ورود و صدور همان کارآیی را خواهند داشت. برای CentOS 8 تنها کافی است که از نصب wget در سیستمتان مطمئن باشید. البته این کار را میتوانید با فرمان sudo dnf install wget انجام دهید.
به غیر از فرمانهایی که مشخصاً در طول متن برای داشتن دسترس روت اشاره شدهاند، سایر فرمانها باید با کاربر غیر روت با دسترسی sudo اجرا گردند.
گام ۱) استفاده از JSON و BSON در پایگاه داده MongoDB
قبل از اینکه در این آموزش جلوتر برویم، دانستن برخی مفاهیم اهمیت دارد. اگر تجربه کار با سایر سیستمهای پایگاه داده غیر SQL مانند Redis را داشته باشید، ممکن است برخی مشابهتها را در هنگام کار با پایگاه داده MongoDB مشاهده کنید.
MongoDB برای ذخیره اطلاعات از فرمتهای JSON و BSON استفاده میکند. JSON یک فرمت قابلفهم و خواندنی است که برای صدور، و گاهی برای ورود دادههایتان مناسب خواهد بود. در نتیجه، میتوانید با هر ابزار دیگری که از فرمت JSON پشتیبانی کند، از جمله یک ویرایشگر متنی ساده دادههای صادر شده خود را مدیریت کنید.
یک نمونه سند با فرمت json به صورت زیر خواهد بود.
{"address":[ {"building":"1007", "street":"Park Ave"}, {"building":"1008", "street":"New Ave"}, ]}
۱- JSON یک فرمت مناسب است؛ با این وجود تمام انواع دادههای موجود در BSON را پشتیبانی نمیکند. به این معنا که در صورت استفاده از فرمت JSON موجب از دست رفتن برخی جزئیات در هنگام پشتیبانگیری و بازیابی اطلاعات خواهد شد.
۲- در همین حال، ایجاد یک پایگاه داده MongoDB کار چندان مشکلی نخواهد بود. اگر پایگاه دادهای را که برای ورود انتخاب کردهاید، وجود خارجی نداشته باشد، به صورت اتوماتیک تولید خواهد شد. مزیّت دیگر در ساختار جداول پایگاه داده است. در مقایسه با سایر موتورهای پایگاه داده، در MongoDB، ساختار پایگاه داده بلافاصله پس قرار دادن اولین سند (ردیف پایگاه داده) ساخته میشود.
۳- البته این نکته را نیز درنظر داشته باشید که در پایگاه داده MongoDB، خواندن یا وارد کردن مقدار قابلتوجه دادهها میتواند منابع زیادی را به خود اختصاص دهد و بخش بزرگی از پردازنده، حافظه و فضای دیسک شما را مصرف کند. این موضوع بهویژه با توجه به اینکه MongoDB معمولاً برای پایگاههای دادههای بزرگ مورد استفاده قرار میگیرد، بسیار مهم و حیاتی است. سادهترین راهحل برای این منظور انجام کارهای انتقال و پشتیبانگیری در طول ساعات شب و خلوت شبکه است.
۴- در صورتی که یک سرور شلوغ MongoDB داشته باشید و اطلاعات در طول انتقال یا فرآیند پشتیبانگیری تغییرات داشته باشند، موضوع «ثبات» در اطلاعات برایتان اهمیت خواهد داشت. یکی از راهحلهای احتمالی برای این موضوع، ایجاد نسخه تکراری است. چنین کاری ممکن است در سطح پیشرفته کار با پایگاه داده MongoDB درنظر گرفته شود.
با اینکه امکان استفاده از توابع import و export برای پشتیبانگیری و بازیابی دادهها وجود دارد، روشهای بهتری نیز برای کار با پایگاه داده MongoDB وجود دارد. برای پشتیبانگیری از دادهها میبایست از فرمان mongodump استفاده کنید. برای بازیابی نیز فرمان mongorestore به کمک شما خواهد آمد. در ادامه، نحوه کار این فرمانها را میبینیم.
گام ۲) استفاده از mongodump برای پشتیبانگیری از یک پایگاه داده MongoDB
ابتدا به پشتیبانگیری از پایگاه داده MongoDB میپردازیم.
اساسیترین گزینه برای فرمان mongodump به صورت –db تعریف میشود. این گزینه پایگاه داده موردنظرتان را برای پشتیبانگیری مشخص میکند. در صورتی که نام پایگاه دادهای برای این فرمان مشخص نکنید، از تمام پایگاههای داده، نسخه پشتیبان تهیه میشود. دومین گزینه مهم در این فرمان، –out که دایرکتوری موردنیاز برای قرارگیری دادههای پشتیبان را مشخص میکند. به عنوان مثال، فرض کنید که میخواهیم از پایگاه دادهای با نام newdb در دایرکتوری /var/backups/mongobackups پشتیبان بگیریم. هر کدام از نسخههای پشتیبان مطابق تاریخ روز در یک دایرکتوری ذخیره خواهند شد.
ابتدا دایرکتوری /var/backups/mongobackups را ایجاد میکنیم.
sudo mkdir -p /var/backups/mongobackups
سپس فرمان mongodump را تایپ میکنیم.
sudo mongodump --db newdb --out /var/backups/mongobackups/`date +"%m-%d-%y"`
در نتیجه با یک خروجی مشابه زیر روبرو میشوید.
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/ ذخیره کردهاید. این نسخه پشتیبان حاوی تمام اطلاعات لازم برای بازیابی پایگاه داده به صورت جامع و کامل خواهد بود.
به عنوان یک قانون کلی، باید همیشه نسخههای پشتیبان به صورت مداوم از سرور تهیه کنید. بنابراین، میتوانید فرمان mongodump را به عنوان یک وظیفه cron، مثلا روزانه در ساعت ۳ بامداد تنظیم نمایید.
برای این منظور، ابزار ویرایشگر cron را باز کنید.
sudo crontab -e
به خاطر داشته باشید که وقتی فرمان sudo crontab را اجرا میکنید، وظایف cron را برای کاربر روت ویرایش نمایید. در غیر این صورت و تنظیم cron برای کاربر دیگر، ممکن است این وظایف به خوبی اجرا نشوند. به ویژه اینکه پروفایل sudo نیازمند تأیید پسورد خواهد بود.
درون پنجره crontab، فرمان mongodump را به صورت زیر وارد کنید.
3 3 * * * mongodump --out /var/backups/mongobackups/`date +"%m-%d-%y"`
در فرمان بالا استفاده از گزینه –db به این علت است که میخواهید از تمام پایگاههای داده پشتیبانگیری کنید.
بسته به ابعاد پایگاه داده MongoDB، ممکن است خیلی زود با کمبود فضای هارد دیسک مواجه شوید. به همین دلیل است که حذف مداوم نسخه پشتیبان قدیمی توصیه میشود. به عنوان مثال برای حذف تمام پشتیبانهای قدیمیتر از ۷ روز، میتوانید از فرمان bash زیر استفاده کنید.
find /var/backups/mongobackups/ -mtime +7 -exec rm -rf {} \;
همانند فرمان قبلی mongodump میتوانید آن را به عنوان یک وظیفه cron نیز اضافه کنید. این فرمان باید درست قبل از پشتیبانگیری بعدی انجام شود. برای این منظور، دوباره crontab را باز کنید.
sudo crontab -e
حالا خط زیر را وارد کنید.
3 1 * * * find /var/backups/mongobackups/ -mtime +7 -exec rm -rf {} \;
فایل ذخیره کرده و ببندید.
تکمیل کلیه قسمتهای این مرحله موجب میشود تا همیشه پشتیبان مناسبی از پایگاه داده MongoDB در اختیار داشته باشید.
گام ۳) کاربرد mongorestore برای بازیابی و انتقال پایگاه داده
وقتی یک پایگاه داده MongoDB را از یک نسخه پشتیبان قبلی بازیابی میکنید، یک نسخه دقیق از اطلاعات این پایگاه داده در یک زمان مشخص با تمام فهرستها و انواع مختلف دادهها در دسترس خواهید داشت. این موضوع بهویژه در هنگام انتقال و مهاجرت پایگاههای داده MongoDB مفید خواهد بود. برای بازیابی MongoDB از فرمان mongorestore استفاده میکنید. این فرمان با نسخههای پشتیبان باینری که mongodump تولید میکند، کار خواهد کرد.
در اینجا کار را با پایگاه داده newdb ادامه میدهیم و میبینیم که چگونه میتوان آن را با یک نسخه پشتیبان از قبل، بازیابی کرد. ابتدا عنوان پایگاه داده را با گزینه –nsInclude مشخص میکنیم. در اینجا از newdb.* استفاده میکنیم تا تمام بستهها و مجموعهها بازیابی شوند. برای بازیابی یک مجموعه خاص مانند restaurants میتوانید از عنوان newdb.restaurants استفاده کنید.
سپس با استفاده از گزینه –drop مطمئن میشویم که پایگاه داده مقصد حتماً خالی شود و نسخه پشتیبان ما در یک فضای مناسب و پاک وارد شود. به عنوان آخرین پارامتر، دایرکتوری آخرین پشتیبانگیری را مشخص میکنیم که در اینجا در آدرس /var/backups/mongobackups/10-29-20/newdb/ است.
وقتی زمان پشتیبانگیری را تنظیم کردید، میتوانید با فرمان زیر آن را بازیابی کنید.
sudo mongorestore --db newdb --drop /var/backups/mongobackups/10-29-20/newdb/
در نتیجه با خروجیای شبیه به زیر مواجه میشوید.
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
در مثال بالا، ما دادهها را در همان سروری که پشتیبانگیری کردهایم، بازیابی کردیم. در صورتی که بخواهید دادهها را به سرور دیگر و با همین تکنیک انتقال دهید، میتوانید دایرکتوری نسخه پشتیبان را به سرور موردنظر انتقال دهید.
جمعبندی
حالا میتوانید کارهای اساسی مربوط به پشتیبانگیری، بازیابی و انتقال پایگاه داده MongoDB را انجام دهید. به خاطر داشته باشید که هیچ سرور MongoDB نباید بدون یک استراتژی پشتیبانگیری مناسب راهاندازی شود.