از الزامات امنیتی و گوچاهای نمایه سازی گرفته تا نکات تکراری و اشتراک گذاری، این بایدها و نبایدهای ضروری را دنبال کنید تا از سیستم های پایگاه داده MongoDB خود نهایت استفاده را ببرید.
MongoDB یک پایگاه داده اسناد غیر رابطه ای است که از ذخیره سازی JSON مانند پشتیبانی می کند. مدل داده انعطاف پذیر آن به شما امکان می دهد به راحتی داده های بدون ساختار را ذخیره کنید. این پایگاه داده برای اولین بار در سال ۲۰۰۹ منتشر شد و رایج ترین پایگاه داده NoSQL است. بیش از ۳۲۵ میلیون بار دانلود شده است.
MongoDB بین توسعه دهندگان محبوب است زیرا شروع کار با آن آسان است. طی سالها، MongoDB ویژگیهای بسیاری را معرفی کرده است که پایگاه داده را به یک راهحل قوی تبدیل کرده است که میتواند ترابایت داده را برای برنامهها ذخیره کند.
همانند هر پایگاه داده، توسعه دهندگان و DBAهایی که با MongoDB کار می کنند باید به نحوه بهینه سازی عملکرد پایگاه داده خود نگاه کنند، به خصوص امروزه با سرویس های ابری، که در آن پردازش، انتقال و ذخیره هر بایت هزینه دارد. توانایی شروع سریع با MongoDB به این معنی است که به راحتی می توان مشکلات احتمالی را نادیده گرفت یا بهبودهای ساده عملکرد را از دست داد.
در این مقاله، ما به ۱۰ تکنیک ضروری که میتوانید برای استفاده حداکثری از MongoDB برای برنامههای خود استفاده کنید، نگاه میکنیم.
بهترین روش MongoDB شماره ۱: از همان ابتدا مجوز و احراز هویت را در پایگاه داده خود فعال کنید
هرچه پایگاه داده بزرگتر باشد، آسیب ناشی از نشت بیشتر است. به دلیل این واقعیت ساده که هنگام استقرار MongoDB برای اولین بار، مجوز و احراز هویت به طور پیشفرض غیرفعال میشوند، نشت دادههای زیادی وجود دارد. اگرچه این یک نکته عملکرد نیست، ضروری است که مجوز و احراز هویت را از همان ابتدا فعال کنید، زیرا در طول زمان از هرگونه درد احتمالی ناشی از دسترسی غیرمجاز یا نشت داده ها جلوگیری می کند.
وقتی یک نمونه جدید از MongoDB را مستقر می کنید، نمونه به طور پیش فرض کاربر، رمز عبور یا کنترل دسترسی ندارد. در نسخههای اخیر MongoDB، پیوند IP پیشفرض به ۱۲۷.۰.۰.۱ تغییر کرد و یک استثنای localhost اضافه شد که پتانسیل قرار گرفتن در معرض پایگاه داده هنگام نصب پایگاه داده را کاهش داد.
با این حال، این هنوز از منظر امنیتی ایده آل نیست. اولین توصیه این است که کاربر ادمین را ایجاد کنید و نمونه را مجدداً با فعال کردن گزینه مجوز راه اندازی مجدد کنید. این از هرگونه دسترسی غیرمجاز به نمونه جلوگیری می کند.
برای ایجاد کاربر مدیر:
> use admin switched to db admin > db.createUser({ ... user: "zelmar", ... pwd: "password", ... roles : [ "root" ] ... }) Successfully added user: { "user" : "zelmar", "roles" : [ "root" ] }
سپس، باید مجوز را فعال کنید و نمونه را مجددا راه اندازی کنید. اگر MongoDB را از خط فرمان مستقر می کنید:
mongod --port 27017 --dbpath /data/db --auth
یا اگر MongoDB را با استفاده از یک فایل پیکربندی اجرا میکنید، باید موارد زیر را اضافه کنید:
security: authorization: "enabled"
MongoDB بهترین رویه شماره ۲: از “نسخه های توصیه نشده” یا “نسخه های پایان عمر” در نمونه های تولید استفاده نکنید و به روز بمانید
باید واضح به نظر برسد، اما یکی از رایجترین مشکلاتی که در نمونههای تولید مشاهده میکنیم، به دلیل اجرای یک نسخه MongoDB توسط توسعهدهندگان است که در واقع برای تولید در وهله اول مناسب نیست. این ممکن است به دلیل قدیمی بودن نسخه باشد، مانند نسخه بازنشسته ای که باید به نسخه جدیدتر به روز شود که حاوی تمام رفع اشکالات لازم است.
یا ممکن است به این دلیل باشد که نسخه خیلی زود است و هنوز به اندازه کافی برای استفاده در تولید آزمایش نشده است. بهعنوان توسعهدهنده، معمولاً مایلیم از جدیدترین و بهترین نسخههای ابزار خود استفاده کنیم. ما همچنین میخواهیم در تمام مراحل توسعه، از ساخت اولیه و آزمایش گرفته تا تولید، سازگار باشیم، زیرا این امر تعداد متغیرهایی را که باید پشتیبانی کنیم، پتانسیل مشکلات و هزینه مدیریت همه نمونههایمان را کاهش میدهد.< /p>
برای برخی، این میتواند به معنای استفاده از نسخههایی باشد که هنوز برای استقرار تولید امضا نشدهاند. برای دیگران، این می تواند به معنای چسبیدن به نسخه خاصی باشد که آزمایش شده و قابل اعتماد است. این یک مشکل از منظر عیبیابی زمانی است که مشکلی در نسخه بعدی MongoDB که برای تولید تأیید شده است اما هنوز اجرا نشده است برطرف شود. از طرف دیگر، ممکن است آن نمونه پایگاه داده را که در پسزمینه «فقط کار میکند» فراموش کنید و زمانی را که نیاز به پیادهسازی یک وصله دارید از دست بدهید.
در پاسخ به این، باید مرتباً با استفاده از یادداشتهای انتشار هر نسخه، بررسی کنید که آیا نسخه شما برای تولید مناسب است یا خیر. به عنوان مثال، MongoDB 5.0 راهنمایی های زیر را در یادداشت های انتشار خود ارائه می دهد: https:// www.mongodb.com/docs/upcoming/release-notes/5.0/
راهنمای اینجا استفاده از MongoDB 5.0.11 زیرا این نسخه دارای به روز رسانی های مورد نیاز است. اگر به این نسخه بهروزرسانی نکنید، در خطر از دست دادن دادهها خواهید بود.
در حالی که ممکن است وسوسه انگیز باشد که به یک نسخه پایبند باشید، اما همگام بودن با ارتقاء برای جلوگیری از مشکلات در تولید ضروری است. ممکن است بخواهید از ویژگیهای جدید اضافه شده استفاده کنید، اما ابتدا باید این ویژگیها را در مراحل آزمایشی خود قرار دهید. قبل از انتقال آنها به تولید، میخواهید ببینید آیا آنها مشکلاتی دارند که ممکن است بر عملکرد کلی شما تأثیر بگذارد.
در آخر، باید برنامههای چرخه عمر نرمافزار MongoDB را بررسی کنید و ارتقاء خوشههای خود را قبل از پایان عمر هر نسخه پیشبینی کنید: https://www.mongodb.com/support-policy/lifecycles
نسخههای پایان عمر وصلهها، رفع اشکالها یا هر نوع بهبودی دریافت نمیکنند. این می تواند نمونه های پایگاه داده شما را در معرض دید و آسیب پذیر قرار دهد.
از منظر عملکرد، دریافت نسخه مناسب MongoDB برای برنامههای تولیدی شما مستلزم “درست” بودن است – نه آنقدر نزدیک به لبه خونریزی که با اشکال یا مشکلات دیگری مواجه شوید، اما همچنین نه آنقدر عقبتر که از دست ندهید. در مورد به روز رسانی های حیاتی.
بهترین روش MongoDB شماره ۳: از تکرار MongoDB برای اطمینان از HA و بررسی وضعیت ماکت خود اغلب استفاده کنید
مجموعه replica مجموعهای از فرآیندهای MongoDB است که دادههای یکسانی را در تمام گرههای مورد استفاده برای یک برنامه حفظ میکند. افزونگی و در دسترس بودن داده را برای داده های شما فراهم می کند. هنگامی که چندین نسخه از داده های خود را در سرورهای مختلف پایگاه داده دارید – یا حتی بهتر از آن، در مراکز داده مختلف در سراسر جهان – تکرار سطح بالایی از تحمل خطا را در صورت بروز فاجعه فراهم می کند.
مجموعههای MongoDB replica با یک گره نویسنده (که سرور اصلی نیز نامیده میشود) کار میکند. بهترین توصیه این است که همیشه تعداد اعضای فرد فرد باشد. بهطور سنتی، مجموعههای replica حداقل سه نمونه دارند:
- اصلی (گره نویسنده)
- ثانویه (گره خواننده)
- ثانویه (گره خواننده)
همه گرههای مجموعه replica با هم کار خواهند کرد، زیرا گره اصلی نوشتهها را از سرور برنامه دریافت میکند و سپس دادهها در ثانویهها کپی میشوند. اگر اتفاقی برای گره اولیه بیفتد، مجموعه replica یک ثانویه را به عنوان اصلی جدید انتخاب می کند. برای اینکه این فرآیند کارآمدتر عمل کند و از یک شکست نرم اطمینان حاصل شود، مهم است که تمام گرههای مجموعه replica دارای پیکربندی سختافزاری یکسانی باشند. مزیت دیگر مجموعه replica این است که امکان ارسال عملیات خواندن به سرورهای ثانویه وجود دارد که مقیاس پذیری خواندن پایگاه داده را افزایش می دهد.
بعد از اینکه یک مجموعه ماکت را برای تولید مستقر کردید، مهم است که سلامت ماکت و گره ها را بررسی کنید. MongoDB دو دستور مهم برای این منظور دارد:
rs.status()< /code> با استفاده از داده های مشتق شده از بسته های ضربان قلب ارسال شده توسط سایر اعضای مجموعه ماکت، اطلاعاتی در مورد وضعیت فعلی مجموعه ماکت ارائه می دهد. این یک ابزار بسیار مفید برای بررسی وضعیت همه گرهها در یک مجموعه کپی است.
rs.printSecondaryReplicationInfo()< /code> یک گزارش فرمت شده از وضعیت مجموعه replica ارائه می دهد. بسیار مفید است که بررسی کنید آیا هر یک از ثانویه ها پشت نسخه اولیه در تکرار داده ها هستند یا خیر، زیرا این امر بر توانایی شما برای بازیابی تمام داده های خود در صورت بروز مشکل تأثیر می گذارد. اگر ثانویه ها خیلی عقب تر از اولیه هستند، در نهایت ممکن است داده های بسیار بیشتری از آنچه که راحت هستید از دست بدهید.
با این حال، توجه داشته باشید که این دستورات به جای نظارت مداوم برای سلامت مجموعه ماکت شما، اطلاعات لحظه به لحظه را ارائه می دهند. در یک محیط تولید واقعی، یا اگر خوشههای زیادی برای بررسی دارید، اجرای این دستورات میتواند زمانبر و آزاردهنده باشد. بنابراین توصیه میکنیم از یک سیستم نظارتی مانند PMM Percona استفاده کنید. مراقب خوشه های خود باشید.
بهترین روش MongoDB شماره ۴: از پرس و جوهای $regex فقط در صورت لزوم استفاده کنید و به جای آن جستجوی متنی را در جایی که می توانید انتخاب کنید
گاهی اوقات ساده ترین راه برای جستجوی چیزی در پایگاه داده استفاده از عبارت منظم یا عملیات $regex
است. بسیاری از توسعه دهندگان این گزینه را انتخاب می کنند، اما در واقع استفاده از عبارات منظم می تواند به عملیات جستجوی شما در مقیاس آسیب برساند. شما باید از استفاده از پرس و جوهای $regex
خودداری کنید، به خصوص زمانی که پایگاه داده شما بزرگ است.
یک جستار $regex
زمان زیادی از CPU مصرف می کند و معمولاً بسیار کند و ناکارآمد خواهد بود. ایجاد یک نمایه کمک چندانی نمی کند و گاهی اوقات عملکرد با ایندکس ها بدتر از بدون آنها است.
به عنوان مثال، بیایید یک پرس و جو $regex
را روی مجموعه ای از ۱۰ میلیون سند اجرا کنیم و از .explain(true)
برای مشاهده چند میلی ثانیه زمان استفاده کنیم.< /p>
بدون نمایه:
> db.people.find({"name":{$regex: "Zelmar"}}).explain(true) - - Output omitted - - "executionStats" : { "nReturned" : 19851, "executionTimeMillis" : 4171, "totalKeysExamined" : 0, "totalDocsExamined" : 10000000, - - Output omitted - -
و اگر یک نمایه در "name" ایجاد کنیم:
db.people.find({"name":{$regex: "Zelmar"}}).explain(true) - - Output omitted - - "executionStats" : { "nReturned" : 19851, "executionTimeMillis" : 4283, "totalKeysExamined" : 10000000, "totalDocsExamined" : 19851, - - Output omitted - -
در این مثال میتوانیم ببینیم که این شاخص به بهبود عملکرد $regex
کمکی نکرده است.
دیدن یک برنامه جدید با استفاده از عملیات $regex
برای درخواستهای جستجو، معمول است. این به این دلیل است که نه توسعه دهندگان و نه DBA ها در ابتدا متوجه هیچ مشکلی در عملکرد نمی شوند، زمانی که اندازه مجموعه ها کوچک است و کاربران برنامه بسیار کم هستند.
با این حال، هنگامی که مجموعه ها بزرگتر می شوند و برنامه کاربران بیشتری را جمع آوری می کند، عملیات $regex
شروع به کند کردن خوشه می کند و تبدیل به یک کابوس برای تیم می شود. با گذشت زمان، همانطور که برنامه شما مقیاس می شود و کاربران بیشتری می خواهند درخواست های جستجو را انجام دهند، سطح عملکرد می تواند به طور قابل توجهی کاهش یابد.
به جای استفاده از جستارهای $regex
، از نمایه های متنی برای پشتیبانی از جستجوی متنی خود استفاده کنید. جستجوی متن کارآمدتر از $regex
است، اما از شما میخواهد که فهرستهای متنی را از قبل به مجموعه دادههای خود اضافه کنید. ایندکس ها می توانند شامل هر فیلدی باشند که مقدار آن رشته یا آرایه ای از عناصر رشته باشد. یک مجموعه میتواند تنها یک فهرست جستجوی متنی داشته باشد، اما این فهرست میتواند چندین فیلد را پوشش دهد.
با استفاده از همان مجموعه مثال بالا، میتوانیم زمان اجرای همان عبارت را با استفاده از جستجوی متنی آزمایش کنیم:
> db.people.find({$text:{$search: "Zelmar"}}).explain(true) - - Output omitted - - "executionStages" : { "nReturned" : 19851, "executionTimeMillisEstimate" : 445, "works" : 19852, "advanced" : 19851, - - Output omitted - -
در عمل، جستجوی مشابه با جستجوی متنی چهار ثانیه کمتر از $regex
طول کشید. چهار ثانیه در "زمان پایگاه داده"، چه رسد به زمان برنامه آنلاین، یک ابدیت است.
برای نتیجه گیری، اگر می توانید پرس و جو را با استفاده از جستجوی متن حل کنید، این کار را انجام دهید. جستارهای $regex
را به مواردی که واقعاً ضروری هستند محدود کنید.
بهترین روش MongoDB شماره ۵: در مورد استراتژی شاخص خود عاقلانه فکر کنید
در ابتدا فکر کردن به سوالات شما می تواند تاثیر زیادی بر عملکرد در طول زمان داشته باشد. ابتدا، باید درخواست خود و انواع درخواست هایی را که انتظار دارید به عنوان بخشی از خدمات خود پردازش کنید، درک کنید. بر این اساس، می توانید شاخصی ایجاد کنید که از آنها پشتیبانی کند.
نمایه سازی می تواند به سرعت بخشیدن به درخواست های خواندن کمک کند، اما با هزینه اضافی ذخیره سازی همراه است و آنها عملیات نوشتن را کند می کنند. در نتیجه، باید به این فکر کنید که کدام فیلدها باید ایندکس شوند تا بتوانید از ایجاد نمایه های زیاد جلوگیری کنید.
به عنوان مثال، اگر در حال ایجاد یک شاخص ترکیبی هستید، قانون ESR (برابری، مرتبسازی، محدوده) ضروری است، و استفاده از شاخص برای مرتبسازی نتایج، سرعت پرسوجو را بهبود میبخشد.
به طور مشابه، همیشه میتوانید بررسی کنید که آیا درخواستهای شما واقعاً از نمایههایی استفاده میکنند که با .explain()
ایجاد کردهاید. گاهی اوقات مجموعهای را میبینیم که نمایههایی ایجاد شده است، اما پرسوجوها یا از ایندکسها استفاده نمیکنند یا در عوض به طور کامل از فهرست اشتباه استفاده میکنند. مهم است که فقط نمایه هایی ایجاد کنید که واقعاً برای پرس و جوهای خوانده شده استفاده می شوند. داشتن ایندکسهایی که هرگز استفاده نمیشوند باعث اتلاف فضای ذخیرهسازی میشود و عملیات نوشتن را کند میکند.
وقتی به خروجی .explain()
نگاه می کنید، سه فیلد اصلی وجود دارد که رعایت آنها مهم است. به عنوان مثال:
keysExamined:0 docsExamined:207254 nreturned:0
در این مثال، هیچ نمایه ای استفاده نمی شود. ما این را می دانیم زیرا تعداد کلیدهای بررسی شده ۰ است در حالی که تعداد اسناد بررسی شده ۲۰۷۲۵۴ است. در حالت ایده آل، پرس و جو باید دارای نسبت nreturned/keysExamined=1 باشد. به عنوان مثال:
keysExamined:5 docsExamined: 0 nreturned:5
در نهایت، اگر .explain()
به شما نشان دهد که یک جستجوی خاص از شاخصی استفاده می کند که اشتباه است، می توانید پرس و جو را مجبور کنید از یک نمایه خاص با .hint()
. فراخوانی متد .hint()
در یک پرس و جو، فرآیند انتخاب فهرست پیشفرض و بهینهسازی پرس و جو MongoDB را لغو میکند، و به شما امکان میدهد شاخص مورد استفاده را مشخص کنید، یا یک مجموعه رو به جلو یا اسکن مجموعه معکوس را انجام دهید.< /p>
پست های مرتبط
۱۰ بهترین روش برای هر استقرار MongoDB
۱۰ بهترین روش برای هر استقرار MongoDB
۱۰ بهترین روش برای هر استقرار MongoDB