نکاتی در مورد فصل 01 مقیاس پذیری وب برای مهندسان راه اندازی
نکاتی درباره فصل 01 مقیاس پذیری وب برای مهندسان راه اندازی (تصویر هربرت آسست از Pixabay)
هفته گذشته، می خواستم درباره طراحی سیستم و مقیاس پذیری اطلاعات بیشتری کسب کنم. بنابراین، من با تماشای ویدیوهای یوتیوب و خواندن پست های لینکدین شروع کردم تا یک ایده کلی به دست بیاورم. من همچنین به بررسی کتابها نگاه کردم و به نظر میرسد که «طراحی برنامههای کاربردی داده فشرده» یک انتخاب محبوب در میان بسیاری از مردم است.
میخواستم با چیز سادهتری شروع کنم، زیرا «طراحی برنامههای کاربردی داده فشرده» موضوعات مفصل زیادی را پوشش میدهد. پس از صحبت با یکی از دوستان و شنیدن توصیه های دیگران در زمینه خود، متوجه «مقیاس پذیری وب برای مهندسان استارتاپ» شدم. این هفته، با فصل اول شروع کردم، که در آن مروری بر موضوعاتی که کتاب به آنها خواهد پرداخت.
یادداشت:
مقیاس پذیری چیست:
توانایی سیستم ما برای رسیدگی به دادهها، درخواستها، کاربران و تراکنشهای بیشتر، باید بتوانیم به روشی ارزان و سریع مقیاسبندی کنیم.
ابعاد مقیاس پذیری:
- مدیریت داده های بیشتر : ذخیره سازی محتوای بیشتر، با محبوبیت در صورت تجزیه و تحلیل داده ها و داده های بزرگ، این نقش مهمی دارد.
- مدیریت سطوح همزمانی بالاتر: چند کاربر (اتصالات باز، رشتههای فعال، پیامهایی که همزمان پردازش میشوند) میتوانند سرور سیستم ما را به طور همزمان انجام دهند، چگونه میتوانیم مشکلات سرورهایی را که واحدهای پردازش کمی دارند حل کنیم، از اجرای موازی کد برای اطمینان از سازگاری دادهها اطمینان حاصل کنیم.
- مدیریت نرخ تعامل بالاتر : تعداد دفعاتی که کلاینتها با سرور ارتباط برقرار میکنند، باید بتوانند پاسخها را سریعتر، خواندن و نوشتن سریعتر و همزمانی بالاتر را مدیریت کنند.
مقیاس پذیری در مقابل عملکرد:
مقیاس پذیری با عملکرد مرتبط است. مقیاس پذیری ظرفیت رسیدگی به کاربران بیشتر را تعیین می کند، عملکرد به این اشاره دارد که سیستم با چه سرعتی درخواست ها را تحت بار انجام می دهد، مانند سرعتی که می تواند به 100 درخواست کاربر در هر 5 ثانیه پاسخ دهد.
مقیاس پذیری نیز در مورد اعضای تیم به کار می رود، هر چه تعداد افراد تیم بیشتر باشد، ارتباط سخت تر می شود.
DNS:
معمولاً در سرور دیگری میزبانی می شود، مشتری به آن متصل می شود و سرور dns آدرس IP دامنه را دریافت می کند و سپس شروع به درخواست محتوا از سرور ما می کند.
VPS:
آیا ماشین مجازی برای اجاره; میزبانی شده با ماشین های مجازی دیگر در یک ماشین فیزیکی، این رویکرد خوب نیست
پیکربندی سرور تک:
این گزینه بهتر است اما ممکن است تغییر دهیم اگر:
- پایگاه کاربر ما رشد می کند، و نیاز به cpu، i/o بیشتری برای ارائه خدمات به کاربران ما دارد
- پایگاه داده رشد میکند، ما دادههای زیادی اضافه کردهایم، کوئریها زمان بیشتری برای اجرا میبرند، بنابراین ما به قدرت cpu و I/O بیشتری نیاز داریم.
- ویژگی های جدیدی اضافه شده است که باعث می شود کاربران با سیستم تعامل بیشتری داشته باشند و این به منابع بیشتری نیاز دارد.
چگونه می توانیم به صورت عمودی مقیاس بندی کنیم:
1- افزودن ظرفیت ورودی/خروجی بیشتر با افزودن هارد دیسک های بیشتر در آرایه های RAID:
آرایههای RAID: مجموعهای از درایوهای حالت سخت یا جامد است که به یکدیگر متصل شدهاند تا یک ذخیرهسازی منطقی را تشکیل دهند تا از دادهها در صورت خرابی محافظت کنند، در اینجا برخی از پیکربندیهای محبوب RAID استفاده شده است:
- RAID 0 (هیچ درایو نمی تواند خراب شود): داده ها به طور مساوی بین دو درایو تقسیم می شوند
- RAID 1 (درایو 1 ممکن است خراب شود): آینهسازی، حداقل دو درایو دارای کپی دقیق از دادهها هستند، در صورت خرابی دیسک، دیگران میتوانند به کار خود ادامه دهند.
- RAID 5 (شکست درایو 1): حذف با برابری، نیاز به استفاده از 3 درایو، تقسیم داده ها در چندین مشتق دارد، اما همچنین دارای برابری توزیع شده در درایوها است.
- RAID 6 (2 درایو خراب): استریپ با برابری مضاعف، مشابه RAID 5، اما برابری در دو درایو اضافی نوشته شده است.
- RAID 10 (حداکثر یک درایو در هر آرایه): RAID 1 و RAID 0 را با هم ترکیب کنید، همه داده ها را در درایوهای ثانویه منعکس کنید، و از حذف هر مجموعه از درایوها برای سرعت بخشیدن به انتقال داده ها استفاده کنید.
برابری: مقدار محاسبه شده ای است که در یک درایو از درایوهای دیگر آرایه ذخیره می شود و برای بازسازی داده ها در صورت خرابی یکی از درایوها استفاده می شود.
2- بهبود زمان دسترسی I/O با جابجایی به درایوهای حالت جامد (SSD):
SSD سریعتر از hdd است، اما برای پایگاههای داده اینطور نیست، زیرا بسیاری از پایگاههای داده مانند mysql برای خواندن ترتیبی بهینهسازی شدهاند و پایگاههای دادهای مانند cassandra فراتر رفته و عمدتاً از خواندن ترتیبی استفاده میکنند.
عملیات دیسک ترتیبی مانند خواندن صفحه به صفحه دیسک است، در حالی که ورودی/خروجی دیسک radoù مانند انتخاب یک صفحه تصادفی از یک کتاب در هر بار است، ssd در موارد تصادفی بسیار سریعتر از hdd است و همچنین به دلیل کمبود آن، ترتیبی است. سر فیزیکی
3- کاهش I/O با افزایش رم:
فضای کش بیشتر، حافظه بیشتر برای کارکردن برنامه، بهتر برای DB زیرا دادههایی که اغلب به آنها دسترسی دارند را در حافظه پنهان ذخیره میکنند.
4- بهبود توان عملیاتی شبکه:
با ارتقاء رابط های شبکه، ارتقاء آداپتورهای شبکه، ارتقاء ارائه دهندگان.
5- تغییر به سرور قدرتمندتر:
یک سرور با هسته های مجازی بیشتر، سروری با 12 یا 24 رشته (هسته های مجازی)، فرآیندها نیازی به اشتراک گذاری cpu ندارند، cpu سوئیچ های زمینه کمتری را انجام می دهد.
مقیاس پذیری عمودی یک رویکرد ساده است زیرا ما مجبور نیستیم چیزی را که فقط برای ارتقای سخت افزار خود به آن نیاز داریم بازسازی کنیم و این با هزینه همراه است.
سیستمعامل ممکن است از مقیاس عمودی استفاده نیز جلوگیری کند، در برخی پایگاههای داده افزایش CPUها به دلیل افزایش اختلاف قفل هیچ پیشرفتی را انجام نمیدهد.
قفل ها: برای همگام سازی دسترسی بین رشته ها به یک منبع خاص مانند حافظه یا فایل ها استفاده می شود، اختلاف قفل زمانی اتفاق می افتد که از یک قفل برای منابع بزرگی استفاده می شود که عملیات زیادی دارد، برای حل این مشکل باید قفل هایی با دانه بندی ریز معرفی شود که ایجاد یک برای هر وظیفه در منبع قفل بسیار خاص تری دارد و به رشته ها اجازه می دهد تا با بهره وری بیشتری به منبع دسترسی داشته باشند. بنابراین افزودن cpu بیشتر در زمانی که مناقشه قفل اتفاق می افتد تأثیر قابل توجهی ندارد.
ما باید برنامه را با همزمانی بالا در ذهن طراحی کنیم، بنابراین وقتی هسته های بیشتری اضافه می کنیم، هدر نمی رود.
جداسازی خدمات:
جداسازی سرویسها (db، ftp، dns، کش، وب سرور) به چندین سرور فیزیکی است، وقتی این کار را انجام میدهیم جایی برای رشد نداریم.
تقسیم یک سیستم بر اساس عملکرد به مقیاس، پارتیشن بندی عملکردی نامیده می شود، به عنوان مثال تقسیم سرویس مدیریت و سرویس مشتری در چندین سرور فیزیکی.
CDN: شبکه تحویل محتوا، یک سرور میزبان که به توزیع جهانی محتوای ثابت مانند js، css، تصاویر، ویدئوها اهمیت می دهد، به عنوان یک پروکسی http کار می کند، اگر مشتری نیاز به دانلود محتوای ثابت داشته باشد، cdn را بررسی کنید که آیا این محتوا را دارد یا خیر. محتوا در غیر این صورت آن را از سرور درخواست می کند و آن را کش می کند و سایر کلاینت ها بدون تماس با سرور از cdn سرور می شوند.
مقیاس پذیری افقی
قبل از ساخت برنامه باید در نظر گرفته شود، سیستم هایی که به صورت افقی مقیاس پذیر هستند نیازی به یک ماشین قدرتمند ندارند، آنها معمولا بر روی چندین ماشین ارزان قیمت اجرا می شوند و شما می توانید هر تعداد سرور که می خواهید اضافه کنید، از قیمت بالای خرید جلوگیری می کنید. سخت افزار سطح بالا، و مشکل سقف مقیاس پذیری عمودی (بدون سخت افزار قوی تر).
مقیاس بندی با چندین مرکز داده در صورت داشتن مخاطب جهانی مهم است زیرا محافظت در برابر حوادث نادر قطع برق را فراهم می کند و مشتری در کشورهای دیگر می تواند سریعتر پاسخ دهد.
مقیاس بندی افقی با وب سرورها و کش ها آسان تر از مقیاس گذاری فروشگاه ها و پایگاه های داده پایدار است.
استفاده از dns دور روبین انتخابی است اگر از چندین وب سرور استفاده کنیم، این کار باعث توزیع ترافیک بین سرورها می شود، کاری که dns دور روبین انجام می دهد این است که او فقط یک نام دامنه دریافت می کند و اجازه می دهد تا نام دامنه را به آدرس های IP متعدد نگاشت کند. هنگامی که یک کلاینت درخواستی را ارسال می کند، dns دور روبین درخواست مشتری را به یک سرور ترسیم می کند، ممکن است دو مشتری بدون اینکه متوجه شوند به سرورهای مختلف متصل شوند.
زیرساخت مرکز داده:
- خط مقدم: اولین قسمتی که دستگاه های کاربر با آن تعامل دارند، هیچ منطق تجاری را در بر نمی گیرد، به ما کمک می کند، می تواند در مرکز داده یا خارج از آن وجود داشته باشد.
- مشتری اول ارسال یک درخواست , geoDNS برای حل نام دامنه و ارسال گنجه بار متعادل کننده آدرس IP . سپس به سرور کش frontend یا مستقیماً به سرور برنامه frontend توزیع می شود
- CDN، متعادل کننده بار، پراکسی معکوس، می تواند توسط اشخاص ثالث استفاده و میزبانی شود،
متعادل کننده بار: سخت افزار یا نرم افزاری است که امکان افزودن و حذف سرورها را به صورت پویا فراهم می کند و همچنین به توزیع ترافیک به چندین سرور کمک می کند.
پروکسی معکوس: یک واسطه بین درخواست مشتری و سرور واقعی است، می تواند به عنوان متعادل کننده بار یا برای شتاب دهنده وب استفاده شود که در آن داده های ورودی و خروجی را فشرده می کند و همچنین محتوای کش را ذخیره می کند و همچنین رمزگذاری ssl را انجام می دهد که عملکرد سرور اصلی را افزایش می دهد. پروکسی که از وظایف جانبی برای او مراقبت می کند)، می تواند به عنوان سروری عمل کند که ناشناس بودن را حفظ می کند و نحوه ظاهر سازنده داخلی واقعی را محصور می کند زیرا مشتریان می توانند از یک مکان یاب یا URL یک رکورد به مرکز داده یا سازنده داخلی ما دسترسی داشته باشند.
سرور کش لبه: سرور کش http در نزدیکی مشتریان قرار دارد، میتواند کل درخواست http را در حافظه پنهان کند، میتواند کل صفحه را کش کند یا بخشی از آن را کش کند و برخی از قسمتهای دیگر را به سرور واگذار کند، همچنین میتواند تصمیم بگیرد که صفحه قابل ذخیرهسازی نیست و کل صفحه را به سرور واگذار کنید.
یک مرکز داده میتواند با استفاده از حافظه پنهان لبه و cdn مقیاسبندی کند و نیازی به استفاده از مؤلفهها و فناوریهای زیادی برای مقیاسبندی نیست، در عوض باید از آنچه لازم است استفاده کنیم.
معماری برنامه نباید دربرگیرنده فناوریها (زبانهای برنامهنویسی، پایگاههای داده) باشد، بلکه باید بر روی مدل دامنه تمرکز کند تا تصویری ذهنی از مشکلی که ما سعی در حل آن داریم ایجاد کند.
Frontend باید تا حد امکان گنگ نگه داشته شود و به آن اجازه دهد از صف های پیام استفاده کند، و پشتیبان کش، کش کردن صفحه html همراه با کوئری پایگاه داده کارآمدتر از ذخیره کردن پرس و جوی پایگاه داده است، خدمات وب بخش مهمی از برنامه است. زیرا حاوی مهمترین بخش های منطق تجاری ما است.
سرورها ممکن است دارای سرورهای پردازش کار یا کارهایی باشند که طبق برنامه اجرا می شوند، با هدف رسیدگی به اعلان ها، تکمیل سفارش یا سایر وظایف با تأخیر بالا.
SOA: معماری سرویس گرا با تمرکز بر حل نیازهای تجاری، که در آن هر سرویس دارای قرارداد بسیار واضح است و از پروتکل های ارتباطی یکسانی استفاده می کند.
SOA چند جایگزین دارد. معماری لایه ای، معماری شش ضلعی، معماری رویداد محور.
معماری چند لایه راهی برای نمایش عملکرد در قالب لایههای مختلف است، اجزای لایه پایین عملکرد را در لایه بالایی قرار میدهند، لایههای پایین هرگز نمیتوانند به عملکرد لایه بالایی بستگی داشته باشند.
در معماری لایهای، داشتن ویژگیهای غنیتر در یک لایه خاص معمولاً به یک API پایدارتر منجر میشود. برعکس، ویژگیهای سادهتر ممکن است منجر به یک API کمتر پایدار شود، زیرا تغییرات در APIهای لایههای پایینتر به دلیل وابستگی به بسیاری از APIهای دیگر میتواند پرهزینه باشد.
معماری شش ضلعی فرض می کند که منطق تجاری برنامه مرکز برنامه است، قراردادی بین منطق تجاری و جزء منطق غیر تجاری وجود دارد، اما هیچ لایه ای وجود ندارد، دلیل اصلی این امر این است که می توانیم هر یک از غیر تجاری را جایگزین کنیم. مؤلفه منطقی در هر زمان بدون تأثیر بر برنامه اصلی ما.
معماری رویداد محور (EDA) تمرکز را از پاسخ به درخواستها به مدیریت اقدامات تغییر میدهد. این کار با ایجاد کنترلکنندههای رویدادی کار میکند که منتظر انجام یک عمل هستند و سپس به آن واکنش نشان میدهند.
در تمام معماریهایی که برنامه را به واحدهای کوچکتر تقسیم میکنند که به طور مستقل کار میکنند، مزایای عملکردی را نشان میدهند، ما میتوانیم این وب سرویسها را به عنوان یک برنامه کاربردی مستقل در نظر بگیریم که هر کدام به یک برنامه جداگانه تبدیل میشوند، هر برنامه جزئیات پیادهسازی خود را پنهان میکند و سطح بالایی را ارائه میکند. api.
صف پیام، حافظه پنهان برنامه، ذخیره اصلی داده، …، باید آنها را به عنوان افزونه هایی در نظر بگیریم که می توانیم هر زمان که بخواهیم آنها را با فناوری دیگری جایگزین کنیم.
جداسازی خدمات شخص ثالث برای ما خوب است زیرا نمی دانیم که آیا آنها مقیاس پذیر هستند یا اینکه کنترل کامل روی آنها داریم، بنابراین جداسازی آنها و امکان جایگزینی آنها در آینده مفید است.