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

 

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

 

مقیاس پذیری چیست؟

مقیاس پذیری یک برنامه را می‌توان با تعداد درخواست‌هایی که می‌تواند به طور همزمان پشتیبانی کند، اندازه گیری کرد. نقطه‌ای که در آن یک برنامه، دیگر نمی‌تواند به طور مؤثر به درخواست‌های اضافی رسیدگی کند، محدودیت مقیاس پذیری آن است. این محدودیت، زمانی به دست می‌آید که یک منبع سخت افزاری اصلی به پایان برسد و به ماشین‌های مختلف یا بیشتر نیاز داشته باشد. مقیاس بندی این منابع می‌تواند شامل ترکیبی از تنظیمات CPU و حافظه فیزیکی (دستگاه‌های مختلف یا بیشتر)،‌ هارد دیسک (هارد دیسک‌های بزرگ‌تر، داده‌های “live” کمتر، درایوهای حالت solid) و/یا پهنای باند شبکه (چندین کنترل کننده رابط شبکه، NICهای بزرگتر، فیبر و غیره) باشد.

مقیاس بندی افقی و مقیاس بندی عمودی شبیه به هم هستند؛ زیرا هر دو شامل افزودن منابع محاسباتی به زیرساخت شما می‌شوند. تفاوت‌های متمایزی بین این دو از نظر اجرا و عملکرد وجود دارد که در ادامه به آن اشاره می‌شود.

 

تفاوت اصلی چیست؟

مقیاس بندی افقی به عنوان مقیاس بندی با افزودن ماشین‌های بیشتر به مجموعه منابع شما (همچنین به عنوان “scaling out”) توصیف می‌شود، در حالی که مقیاس بندی عمودی به مقیاس بندی به افزودن قدرت بیشتر (به عنوان مثال CPU و RAM) به یک دستگاه موجود (همچنین به عنوان “scaling up” توصیف می‌شود) اشاره می‌کند.

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

 

پایگاه‌های داده:

مقیاس بندی افقی (scaling out)

در جهان پایگاه داده، مقیاس بندی افقی معمولاً بر اساس تقسیم بندی داده‌ها است (هر node تنها شامل قسمتی از داده‌ها است).

مقیاس بندی عمودی (scaling up)

در مقیاس بندی عمودی، داده‌ها روی یک node واحد قرار دارند و مقیاس بندی از طریق چند هسته‌ای انجام می‌شود. یک نمونه از آن می‌تواند توزیع بار بین منابع CPU و RAM دستگاه باشد.

 

زمان خرابی (Downtime):

مقیاس بندی افقی (scaling out)

از لحاظ تئوری، افزودن ماشین‌های بیشتر به مجموعه ماشین‌های موجود به این معنی است که شما محدود به ظرفیت یک واحد نیستید و این امکان را برای مقیاس بندی با زمان خرابی کمتر فراهم می‌کند.

مقیاس بندی عمودی (scaling up)

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

 

همزمانی (cocurrency):

مقیاس بندی افقی (scaling out)

به عنوان برنامه نویسی توزیع شده نیز توصیف می‌شود؛ زیرا شامل توزیع jobها در ماشین‌ها از طریق شبکه است. چندین الگوی مرتبط با این مدل عبارتند از: Master/Worker* ،Tuple Spaces ،Blackboard ،MapReduce.

مقیاس بندی عمودی (scaling up)

مدل Actor: برنامه نویسی همزمان بر روی ماشین‌های چند هسته‌ای اغلب از طریق ارسال در حین فرآیند و پیام چند رشته‌ای (multi-threading) انجام می‌شود.

 

انتقال پیام (Message passing):

مقیاس بندی افقی (scaling out)

در محاسبات توزیع شده، فقدان فضای آدرس مشترک، اشتراک گذاری داده‌ها را پیچیده‌تر می‌کند. همچنین فرآیند اشتراک گذاری، ارسال یا به روزرسانی داده‌ها را گران‌تر می‌کند؛ زیرا مجبور به ارسال کپی داده‌ها هستید.

مقیاس بندی عمودی (scaling up)

در یک سناریوی چند رشته‌ای (multi-threading)، شما می‌توانید وجود یک فضای آدرس مشترک را فرض کنید؛ بنابراین اشتراک گذاری داده‌ها و ارسال پیام را می‌توان با ارسال یک مرجع انجام داد.

 

مثال:

مقیاس بندی افقی (scaling out)

Cassandra ،MongoDB ،Google Cloud Spanner

مقیاس بندی عمودی (scaling up)

MySQL ،Amazon RDS

 

انتخاب scale out یا scale up

در انتخاب بین این دو، عوامل مختلفی باید در نظر گرفته شود که شامل موارد زیر است:

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

انعطاف پذیری: اگر سیستم شما تنها برای مقیاس بندی عمودی طراحی شده باشد، به طور مؤثر برروی یک حداقل قیمتی که سخت افزار مورد استفاده شما تعیین کرده است، تحمیل شده‌اید. اگر می‌خواهید انعطاف پذیری برای انتخاب تنظیمات پیکربندی مطلوب در هر زمان به منظور بهینه سازی هزینه و عملکرد باشد، مقیاس بندی افقی می‌تواند گزینه بهتری باشد.

به روزرسانی منظم: در اینجا نیز انعطاف پذیری مهم است. ایجاد یک برنامه کاربردی به عنوان یک واحد بزرگ، افزودن یا تغییر قطعات کد را به صورت جداگانه بدون قطع کردن کل سیستم دشوارتر می‌کند. به منظور ارائه یک روند ارتقاء مداوم، جدا کردن برنامه و استفاده از مقیاس بندی افقی آسان‌تر است.

افزونگی: مقیاس بندی افقی در مقایسه با مقیاس عمودی (با داشتن تنها یک سیستم و در نتیجه یک نقطه شکست)، افزونگی داخلی را ارائه می‌دهد.

توزیع جغرافیایی: هنگامی‌که برای کاهش تأخیر جغرافیایی، رعایت الزامات قانونی یا رسیدگی به سناریوهای بازیابی خطاها، باید برنامه‌ای را در مناطق جغرافیایی یا مراکز داده پخش کنید، این امکان را ندارید که برنامه خود را در یک box واحد قرار دهید؛ بلکه باید آن را توزیع نمایید.

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

 

نتیجه نهایی در انتخاب بین دو مدل

همیشه انتخاب بین مقیاس بندی افقی و عمودی منطقی نیست. حرکت بین دو مدل اغلب انتخاب بهتری است. به عنوان مثال، در ذخیره سازی، ما اغلب می‌خواهیم بین یک دیسک محلی واحد در یک سیستم ذخیره سازی توزیع شده جابجا شویم.

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

به احتمال زیاد، صنعت به طور فزاینده‌ای به سمت رویکرد افقی توزیع شده برای معماری مقیاس بندی مهاجرت می‌کند. این روند ناشی از تقاضای قابلیت اطمینان بیشتر از طریق یک استراتژی افزونگی و نیاز به استفاده بهتر از طریق به اشتراک گذاری منابع و در نتیجه مهاجرت به محیط‌های cloud/SaaS است. با این حال، ترکیب این با یک روش مقیاس بندی عمودی می‌تواند به ما اجازه دهد، از هر دو پارادایم بهره‌مند شویم.

 

 

 

منبع:

section