Shading MongoDB و بهترین روشها چیست؟

چگونه مقیاس MongoDB را ارزیابی کنیم؟ بهترین روش های برشکاری چیست?


در حالی که شمای قابل انعطاف این است که چگونه بیشتر مردم با MongoDB آشنا می شوند ، این نیز یکی از بهترین پایگاه داده ها (شاید حتی بهترین برنامه ها در هنگام استفاده از برنامه های روزمره باشد) برای کار با مجموعه داده های بسیار بزرگ است. در حالی که توجیه این استدلال به دنبال یک مقاله کامل است (امیدوارم روزی بتوانم برای آن روز بیابم!) ، ایده کلی این است که راه حل های مبتنی بر SQL از سایه زنی پشتیبانی نمی کنند ، و ساختن آن بر روی مکنده های شما سخت است..

بهترین موردی که می توانید به آن امیدوار باشید ، ایجاد یک خوشه است (که البته هیچ ارتباطی با خرد کردن اصول ندارد) یا به دنبال راه حل مدیریتی مانند RDS آمازون یا Cloud SQL Google باشید که با رشد داده های شما بسیار گران می شوند..

در این مقاله ، ما به یکی از تکنیک های اساسی برای این مقاله خواهیم پرداخت مقیاس گذاری بانک اطلاعاتی افقی: سایه بان, برای MongoDB ، و برخی از بهترین روشها را برای همین توصیه می کنید. با این حال ، من احساس می کنم بهتر است که با اصول اصطکاک شروع شود ، زیرا ممکن است بسیاری از افرادی که به دنبال مقیاس گذاری MongoDB هستند ، خیلی با آن آشنا نباشند.

اگر از سایه زنی آگاه هستید ، با این وجود در بخش بعدی احساس راحتی کنید.

مبانی اصطکاک

شاید در پاراگراف آخر بخش قبلی استفاده از کلمه “افقی” را متوجه شده باشید. بدون راه اندازی در مسیر انحراف گسترده دیگر ، می خواهم این نکته را به سرعت مطرح کنم. مقیاس بندی به دو نوع در نظر گرفته می شود: یا شما یک دستگاه قدرتمند تر با ظرفیت ذخیره سازی بالاتر می گیرید (عمودی) ، یا چندین کامپیوتر کوچکتر را به هم وصل می کنید و یک مجموعه را تشکیل می دهید (افقی).

حال ، با توجه به اینکه حتی بهترین سرورها در حال حاضر بیش از 256 گیگابایت رم یا 16 TB هارد دیسک ندارند ، شما به زودی می توانید به یک دیوار آجری ضربه بزنید که سعی می کنید به صورت عمودی مقیاس کنید (یا اصطلاحات “مقیاس بالا”). با این حال ، شما می توانید به عنوان بسیاری از دستگاه های واحد به هم متصل شوید (حداقل از لحاظ تئوری) و این محدودیت را به راحتی دور بزنید.

البته چالش اکنون هماهنگی بین همه این ماشین ها است.

shading پایگاه داده

اصطلاح “سایه زنی” عموماً در مورد بانکهای اطلاعاتی صدق می کند ، با این تصور که یک ماشین واحد هرگز نمی تواند برای نگهداری همه داده ها کافی باشد هنگام خرد کردن ، بانک اطلاعاتی به قطعات جداگانه ای که در ماشین های مختلف ساکن هستند شکسته می شود. یک مثال ساده ممکن است این باشد: فرض کنید یک شرکت تجاری دارای ماشینهایی است که می توانند حداکثر 2 میلیون مورد داده مشتری را ذخیره کنند. اکنون ، مشاغل در حال دستیابی به آن نقطه شکست هستند و به زودی 2.5 میلیون کاربر پیشی خواهند گرفت. بنابراین ، آنها تصمیم می گیرند که پایگاه داده خود را به دو بخش تقسیم کنند:

و به طرز جادویی ، اکنون ظرفیت سیستم دو برابر شده است!

خوب ، اگر فقط زندگی خیلی ساده بود! ��

چالش ها در خرد کردن بانک اطلاعاتی

به محض اینکه کمی عمیق به فکر خرد کردن فکر کردید ، برخی از چالش های سرسختانه سر زشت آنها را عقب می اندازند.

کلید اصلی وجود ندارد

به محض اینکه از یک پایگاه داده واحد خارج شوید ، کلیدهای اصلی معنای خود را از دست می دهند. به عنوان نمونه ، اگر کلیدهای اصلی شما روی افزایش خودکار قرار دارند و نیمی از داده ها را به پایگاه داده دیگری منتقل می کنید ، اکنون برای هر کلید اصلی دو مورد مختلف دارید.

بدون کلید خارجی

از آنجا که در پایگاه های داده هیچ گونه حمایتی برای اشاره به اشخاص خارج از پایگاه داده فعلی وجود ندارد (خوب ، حتی یک بانک اطلاعاتی مختلف نیز در همان دستگاه پشتیبانی نمی شود ، بنابراین یک دیتابیس را در یک دستگاه دیگر فراموش کنید) ، مفهوم کلیدهای خارجی برای یک شیر یا خط در نظر گرفته می شود. خوب. ناگهان ، پایگاه داده “لال” می شود ، و یکپارچگی داده ها مشکل شماست.

خطاهای داده های عجیب و غریب

اگر یک دستگاه واحد از بین برود ، به کاربر نهایی می توان “اوه ، چیزی را شکست!” صفحه ، که بدون شک اذیت خواهد شد ، اما زندگی پس از مدتی در مسیر خود قرار خواهد گرفت.

حال آنچه را که در یک بانک اطلاعاتی sharded اتفاق می افتد در نظر بگیرید. فرض کنید بانک اطلاعاتی خرد شده در مثال اولیه ما یک بانک اطلاعاتی بانکی است و یک مشتری در حال ارسال پول به مشتری دیگر است. بیایید فرض کنیم اولین داده مشتری در بخش اول زندگی می کند ، در حالی که داده های مشتری دوم در بخش دوم زندگی می کند (می بینید که من با این کار کجا می روم ؟!). اگر دستگاه حاوی قسمت دوم شکست بخورد ، می توانید تصور کنید که سیستم در چه وضعیتی قرار خواهد گرفت؟ پول تراکنش کجا خواهد رفت؟ اولین کاربر چه خواهد دید؟ کاربر دوم چه خواهد دید؟ چه اتفاقی می افتد که هر دو وقتی که بندها آنلاین می شوند?

مدیریت تراکنش

بیایید پرونده بحرانی همیشه مدیریت معامله را نیز در نظر بگیریم. این بار فرض کنید سیستم 100٪ خوب کار می کند. اکنون دو نفر (الف و ب) مبلغی را به یک نفر سوم (C) پرداخت می کنند. بسیار محتمل است که هر دو تراکنش ، مانده حساب C را همزمان بخوانند و باعث این سردرگمی شود:

  • مانده حساب C = 100 دلار.
  • معامله A تعادل C را می خواند: 100 دلار.
  • معامله B تعادل C را می خواند: 100 دلار.
  • معامله 50 دلار اضافه می کند و مانده حساب را به روز می کند: 100 دلار + 50 = 150 دلار.
  • معامله B 50 دلار اضافه می کند و مانده حساب را به روز می کند: 100 $ + 50 = 150 $.

لعنتی! 50 دلار فقط در هوای نازک ناپدید شد!

سیستم های SQL سنتی با ارائه مدیریت تراکنش داخلی ، شما را از این امر نجات می دهند ، اما به محض اینکه از یک دستگاه واحد خارج شوید ، شما نان تست می کنید..

نکته این که با وجود چنین سیستمهایی ، می توان به راحتی در موضوعات فساد اطلاعاتی که بازیابی از آن غیرممکن است ، استفاده کرد. با کشیدن موهای شما کمک نمی کند! ��

Shading MongoDB

برای معماران نرم افزار ، هیجان در مورد MongoDB آنقدرها در طرح انعطاف پذیر آن نیست ، همانطور که در پشتیبانی از ذوب آن وجود دارد. فقط با چند قانون ساده و ماشینهای متصل ، شما آماده بودید که در هر زمان یک خوشه سایه دار MongoDB را اجرا کنید.

تصویر زیر نشان می دهد که چگونه این در استقرار یک برنامه وب معمولی به نظر می رسد.

اعتبار تصویر: mongodb.com

بهترین نکته در مورد سایه زدن MongoDB این است که حتی متعادل کردن محافظ ها خودکار است. این بدان معناست که اگر پنج بند دارید و دو تا از آنها تقریباً خالی نیست ، می توانید به MongoDB بگویید که چیزها را به گونه ای تعادل برقرار کند که همه قسمت های آن به همان اندازه پر شوند..

به عنوان یک توسعه دهنده یا سرپرست ، دیگر نیازی به نگرانی نیست ، زیرا MongoDB در پشت صحنه بیشتر کارهای سنگین را انجام می دهد. همین کار برای عدم موفقیت گره ها نیز انجام می شود. اگر مجموعه های ماکت به طور صحیح تنظیم شده و روی خوشه شما اجرا شده باشد ، قطع شدن جزئی تا به زمان سیستم تأثیر نمی گذارد.

کل توضیحات بسیار کوتاه خواهد بود ، بنابراین من می گویم که MongoDB چندین ابزار داخلی برای خرد کردن ، تکثیر و بازیابی دارد و ساختن برنامه های بزرگ را برای توسعه دهندگان بسیار آسان می کند. اگر می خواهید راهنمای جامع تری در مورد قابلیت های سایه زدن MongoDB ، آن را داشته باشید اسناد رسمی مکان برای بودن.

همچنین ممکن است شما به این موضوع علاقه مند باشید راهنمای کامل برنامه نویس.

بهترین روش های Shanding MongoDB

در حالی که MongoDB “فقط عمل می کند” خارج از جعبه برای خرد کردن ، به این معنی نیست که می توانیم بر روی برگهای خود استراحت کنیم. بسته به اینکه چقدر خوب یا ضعیف انجام شده است ، سایه زدن می تواند پروژه شما را برای همیشه بسازد یا خراب کند.

علاوه بر این ، بسیاری از جزئیات کوچک برای حساب کردن وجود دارد ، که شکست خورده نیست ، دیدن یکپارچه پروژه ها غیر معمول نیست. هدف این نیست که شما را بترسانید ، بلکه نیاز به برنامه ریزی را برجسته کنید و حتی با تصمیمات کوچک نیز بسیار مراقب باشید.

کلید Shading Key به ناچار کنترل سایه زنی در MongoDB را کنترل می کند ، بنابراین ایده آل است که نظرسنجی خود را با آن شروع کنیم.

کاردینال بالا

کاردینال بودن به معنای میزان تنوع است. به عنوان مثال ، مجموعه ای از کشور مورد علاقه 1 میلیون نفری تغییرات کمی خواهد داشت (فقط تعداد بسیاری از کشورها در جهان وجود دارند!) ، در حالی که مجموعه ای از آدرس های ایمیل آنها (کاملاً عالی) کاردینالیت بالایی دارند. چرا مهم است؟ فرض کنید شما یک طرح ساده و بی تکلف را انتخاب کنید که داده ها را بر اساس نام خانوادگی کاربر محافظت می کند.

در اینجا ما یک ترتیب نسبتاً ساده داریم. سند دریافتی برای نام کاربری اسکن می شود و بسته به جایی که حرف اول در الفبای انگلیسی قرار دارد ، در یکی از سه قسمت قرار می گیرد. به طور مشابه ، جستجوی یک سند آسان است: برای مثال ، جزئیات “پیتر” در بخش دوم خواهد بود.

همه چیز خوب به نظر می رسد ، اما نکته اینجاست که ما اسامی کاربران اسناد ورودی را کنترل نمی کنیم. چه می شود اگر بیشتر اوقات نام خود را در محدوده B تا F بگیریم؟ اگر چنین است ، ما آنچه را “jumbo” به نام shard1 خواهیم داشت ، خواهیم داشت: بیشتر داده های سیستم در آنجا شلوغ می شوند ، و این کار را به یک سیستم پایگاه داده واحد تبدیل می کند..

درمان?

یک کلید با کارتن بودن بالا را انتخاب کنید – به عنوان مثال ، آدرس ایمیل کاربران ، یا حتی می توانید به دنبال یک کلید shard مرکب باشید که ترکیبی از چندین زمینه است.

تغییر یکنواخت

یک اشتباه رایج در سایه زدن MongoDB استفاده از کلیدهای یکدست افزایش (یا افزایش خودکار) در صورت تمایل به عنوان کلید shard است..

به طور کلی از کلید اصلی سند استفاده می شود. ایده در اینجا کاملاً معنادار است ، یعنی وقتی اسناد جدیدی ساخته می شوند ، به طور مساوی در یکی از بندهای موجود قرار می گیرند. متأسفانه ، چنین پیکربندی یک اشتباه کلاسیک است. این امر به این دلیل است که اگر کلید shard همیشه در حال افزایش است ، پس از یک نقطه ، داده های نقطه شروع به جمع شدن در قسمت با ارزش زیاد می کنند و باعث عدم تعادل در سیستم می شوند.

اعتبار تصویر: mongodb.com

همانطور که در تصویر مشاهده می کنید ، پس از گذر از محدوده 20 ، تمام اسناد در جمع آوری Chunk C شروع به جمع آوری می کنند و باعث ایجاد یکپارچه در آنجا می شوند. راه حل این است که به دنبال یک کلید کلید خرد کن باشید که با استفاده از هشدار یکی از قسمت های ارائه شده و استفاده از آن برای تعیین قطعه ، یک کلید خرد کننده ایجاد می کند..

اعتبار تصویر: Mongodb.com

یک کلید hash shard مانند این است:

{
"_شناسه" :"6b85117af532da651cc912cd"
}

. . . و می توان آن را در پوسته مشتری Mongo با استفاده از:

db.collection.createIndex ({_id: hashedValue)

Shard Early

یکی از مفیدترین توصیه های مستقیم از سنگرها ، خرد کردن زود هنگام است ، حتی اگر به یک خوشه کوچک و دو تکه برسید. هنگامی که داده ها از 500 گیگابایت یا چیزی عبور کرده است ، تیغ زدن به یک روند کثیف در MongoDB تبدیل می شود ، و شما باید برای غافلگیری های ناخوشایند آماده باشید. علاوه بر این ، فرایند برقراری مجدد مقدار بسیار زیادی از پهنای باند شبکه را مصرف می کند ، که اگر دقت نکنید ، می تواند سیستم را خفه کند..

همه افراد طرفدار اصلاح نیستند. به عنوان یک مثال جالب (یادگیری واقعاً در نظرات است) ، این Percona خوب را ببینید وبلاگ.

اجرای balancer

ایده خوب دیگر این است که الگوهای راهنمایی و رانندگی خود را رصد کنید و بالانسر بند را فقط در مواقع کم ترافیک اجرا کنید. همانطور که قبلاً هم اشاره کردم ، تعادل مجدد خودش پهنای باند قابل توجهی را به خود اختصاص می دهد ، که می تواند به سرعت کل سیستم را به خزیدن برساند. بخاطر داشته باشید که بندهای نامتعادل دلیلی برای وحشت فوری نیست. فقط بگذارید استفاده عادی ادامه یابد ، منتظر فرصتهای کم ترافیک باشید و اجازه دهید balancer بقیه را انجام دهد!

در اینجا نحوه انجام این کار آورده شده است (با فرض اینکه از 3 صبح تا 5 صبح ترافیک کم دارید):

از پیکربندی استفاده کنید
db.settings.update (
{ _شناسه: "متعادل کننده" },
set $ set: {ActiveWindow: {شروع: "03:00", متوقف کردن : "05:00" }},
{تأیید کنید: true
)

نتیجه

اشتراک و مقیاس هر بانک اطلاعاتی یک کار دشوار است ، اما خوشبختانه MongoDB آن را قابل مدیریت تر از سایر پایگاه های داده محبوب در آنجا می کند..

در واقع زمانی بود که MongoDB انتخاب مناسبی برای هیچ پروژه ای نبود (به لطف چندین موضوع مهم و رفتارهای پیش فرض) ، اما مدت هاست که از بین نمی روند. همزمان با سایه زدن ، تعادل مجدد ، فشرده سازی خودکار ، قفل توزیع شده در سطح کل و بسیاری از ویژگی های این چنینی ، MongoDB مایل ها به جلو پیش رفته است که امروز اولین انتخاب معمار نرم افزار است.

من امیدوارم که این مقاله قادر به روشن کردن چیزی باشد که سایه زنی در MongoDB است ، و توسعه دهنده باید هنگام انجام مقیاس از چه چیزی مراقبت کند. برای کسب اطلاعات بیشتر ، شما می توانید این را دریافت کنید دوره آنلاین برای استاد MongoDB.

برچسب ها:

  • بانک اطلاعات

Jeffrey Wilson Administrator
Sorry! The Author has not filled his profile.
follow me
    Like this post? Please share to your friends:
    Adblock
    detector
    map