ساختن یک API مقیاس پذیر در نمونه های AWS Spot

سلام به همه! نام من کریل است، من CTO در Adapty هستم. بیشتر معماری ما بر روی AWS است و امروز در مورد اینکه چگونه با استفاده از نمونه های نقطه ای در یک محیط تولید، هزینه های سرور را تا 3 برابر کاهش دادیم و همچنین نحوه تنظیم مقیاس خودکار آنها صحبت خواهم کرد. ابتدا مروری بر نحوه عملکرد آن و سپس دستورالعمل های دقیق برای شروع ارائه خواهد شد.

موارد نقطه ای چیست؟

نقطه نمونه ها سرورهای سایر کاربران AWS هستند که در حال حاضر غیرفعال هستند و آنها را با تخفیف زیادی می فروشند (Amazon می نویسد تا 90٪، در تجربه ما ~ 3x، بسته به منطقه، AZ و نوع نمونه متفاوت است). تفاوت اصلی آنها با نمونه های معمولی این است که می توانند در هر زمان خاموش شوند. بنابراین، برای مدت طولانی ما معتقد بودیم که استفاده از آنها برای محیط های بکر، یا برای کارهای محاسبه چیزی، با نتایج متوسط ​​ذخیره شده در S3 یا در پایگاه داده، طبیعی است، اما نه برای فروش. راه حل های شخص ثالثی وجود دارد که به شما امکان می دهد از نقاط تولید استفاده کنید، اما عصاهای زیادی برای مورد ما وجود دارد، بنابراین ما آنها را اجرا نکردیم. رویکرد توضیح داده شده در مقاله کاملاً در عملکرد استاندارد AWS بدون اسکریپت‌های اضافی، تاج‌ها و غیره کار می‌کند.

در زیر چند اسکرین شات وجود دارد که تاریخچه قیمت را برای نمونه های نقطه ای نشان می دهد.

m5.large در منطقه eu-west-1 (ایرلند). قیمت به مدت 3 ماه عمدتاً ثابت بوده است، در حال حاضر 2.9 برابر صرفه جویی شده است.

ساختن یک API مقیاس پذیر در نمونه های AWS Spot

m5.large در منطقه us-east-1 (N. Virginia). قیمت به طور مداوم در طول 3 ماه تغییر می کند، در حال حاضر بسته به منطقه در دسترس از 2.3 برابر به 2.8 برابر کاهش می یابد.

ساختن یک API مقیاس پذیر در نمونه های AWS Spot

t3.small در منطقه us-east-1 (N. Virginia). قیمت به مدت 3 ماه ثابت بوده است، در حال حاضر 3.4 برابر صرفه جویی شده است.

ساختن یک API مقیاس پذیر در نمونه های AWS Spot

معماری خدمات

معماری اولیه سرویس که در این مقاله در مورد آن صحبت خواهیم کرد در نمودار زیر نشان داده شده است.

ساختن یک API مقیاس پذیر در نمونه های AWS Spot

Application Load Balancer → EC2 Target Group → Elastic Container Service

Application Load Balancer (ALB) به عنوان متعادل کننده استفاده می شود که درخواست ها را به گروه هدف EC2 (TG) ارسال می کند. TG مسئول باز کردن پورت ها در نمونه های ALB و اتصال آنها به پورت های کانتینرهای Elastic Container Service (ECS) است. ECS آنالوگ Kubernetes در AWS است که کانتینرهای Docker را مدیریت می کند.

یک نمونه می تواند چندین کانتینر در حال اجرا با پورت های یکسان داشته باشد، بنابراین ما نمی توانیم آنها را به طور ثابت تنظیم کنیم. ECS به TG می‌گوید که در حال راه‌اندازی یک کار جدید است (در اصطلاح Kubernetes به آن پاد می‌گویند)، پورت‌های رایگان روی نمونه را بررسی می‌کند و یکی از آنها را به وظیفه راه‌اندازی اختصاص می‌دهد. TG همچنین به طور مرتب بررسی می کند که آیا نمونه و API با استفاده از بررسی سلامت روی آن کار می کنند یا خیر، و در صورت مشاهده هر گونه مشکلی، ارسال درخواست را متوقف می کند.

گروه های مقیاس خودکار EC2 + ارائه دهندگان ظرفیت ECS

نمودار بالا سرویس EC2 Auto Scaling Groups (ASG) را نشان نمی دهد. از نام می توانید متوجه شوید که مسئول مقیاس بندی نمونه ها است. با این حال، تا همین اواخر، AWS توانایی داخلی برای مدیریت تعداد ماشین‌های در حال اجرا از ECS نداشت. ECS این امکان را فراهم می کند که تعداد وظایف را به عنوان مثال بر اساس استفاده از CPU، RAM یا تعداد درخواست ها مقیاس بندی کنید. اما اگر وظایف تمام نمونه های رایگان را اشغال می کردند، ماشین های جدید به طور خودکار ایجاد نمی شدند.

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

الگوهای راه اندازی EC2

آخرین سرویسی که قبل از پرداختن به جزئیات در مورد ایجاد این زیرساخت در مورد آن صحبت خواهم کرد، EC2 Launch Templates است. این به شما امکان می دهد الگویی ایجاد کنید که طبق آن همه ماشین ها شروع به کار کنند تا هر بار این کار را از ابتدا تکرار نکنید. در اینجا می توانید نوع ماشین برای راه اندازی، گروه امنیتی، تصویر دیسک و بسیاری از پارامترهای دیگر را انتخاب کنید. همچنین می‌توانید داده‌های کاربر را مشخص کنید که در تمام نمونه‌های راه‌اندازی آپلود شوند. می توانید اسکریپت ها را در داده های کاربر اجرا کنید، به عنوان مثال، می توانید محتوای یک فایل را ویرایش کنید تنظیمات عامل ECS.

یکی از مهمترین پارامترهای پیکربندی برای این مقاله است ECS_ENABLE_SPOT_INSTANCE_DRAINING=درست اگر این پارامتر فعال باشد، به محض اینکه ECS سیگنالی مبنی بر حذف یک نمونه نقطه ای دریافت می کند، تمام وظایفی را که روی آن کار می کنند به وضعیت Draining منتقل می کند. هیچ کار جدیدی به این نمونه اختصاص داده نخواهد شد؛ اگر کارهایی وجود داشته باشد که بخواهند در حال حاضر به آن اضافه شوند، لغو خواهند شد. درخواست‌های متوازن نیز متوقف می‌شوند. اعلان حذف نمونه 2 دقیقه قبل از رویداد واقعی می آید. بنابراین، اگر سرویس شما وظایفی را بیش از 2 دقیقه انجام نمی دهد و چیزی را روی دیسک ذخیره نمی کند، می توانید از نمونه های نقطه ای بدون از دست دادن داده ها استفاده کنید.

در مورد دیسک - اخیراً AWS انجام داد امکان استفاده از Elastic File System (EFS) همراه با ECS وجود دارد؛ با این طرح، حتی دیسک نیز مانعی ندارد، اما ما این کار را امتحان نکردیم، زیرا در اصل برای ذخیره وضعیت نیازی به دیسک نداریم. به طور پیش فرض، پس از دریافت SIGINT (ارسال زمانی که یک کار به وضعیت تخلیه منتقل می شود)، تمام کارهای در حال اجرا پس از 30 ثانیه متوقف می شوند، حتی اگر هنوز تکمیل نشده باشند؛ می توانید این زمان را با استفاده از پارامتر تغییر دهید. ECS_CONTAINER_STOP_TIMEOUT. نکته اصلی این است که آن را برای ماشین های نقطه ای بیش از 2 دقیقه تنظیم نکنید.

ایجاد یک سرویس

بیایید به سمت ایجاد سرویس توصیف شده برویم. در این فرآیند، من چندین نکته مفید را که در بالا ذکر نشده است، توضیح خواهم داد. به طور کلی، این یک دستورالعمل گام به گام است، اما من برخی از موارد بسیار اساسی یا، برعکس، بسیار خاص را در نظر نخواهم گرفت. تمام اقدامات در کنسول بصری AWS انجام می شود، اما می توان با استفاده از CloudFormation یا Terraform به صورت برنامه ریزی شده بازتولید کرد. در Adapty ما از Terraform استفاده می کنیم.

الگوی راه اندازی EC2

این سرویس پیکربندی ماشین هایی را ایجاد می کند که مورد استفاده قرار خواهند گرفت. قالب ها در بخش EC2 -> Instances -> Launch templates مدیریت می شوند.

تصویر ماشین آمازون (AMI) - تصویر دیسکی را که همه نمونه ها با آن راه اندازی می شوند، مشخص کنید. برای ECS، در بیشتر موارد ارزش استفاده از تصویر بهینه شده از آمازون را دارد. این به طور مرتب به روز می شود و شامل همه چیزهایی است که برای کار ECS لازم است. برای پیدا کردن شناسه تصویر فعلی، به صفحه بروید AMI های بهینه سازی شده توسط آمازون ECS، منطقه ای را که استفاده می کنید انتخاب کنید و شناسه AMI را برای آن کپی کنید. به عنوان مثال، برای منطقه us-east-1، شناسه فعلی در زمان نوشتن این مقاله است ami-00c7c1cf5bdc913ed. این شناسه باید در آیتم Specify a custom value درج شود.

نوع نمونه - نوع نمونه را مشخص کنید. یکی را انتخاب کنید که برای کار شما مناسب است.

جفت کلید (ورود به سیستم) - گواهینامه ای را مشخص کنید که با آن می توانید در صورت لزوم از طریق SSH به نمونه متصل شوید.

تنظیمات شبکه - پارامترهای شبکه را مشخص کنید. بستر شبکه در بیشتر موارد باید یک ابر خصوصی مجازی (VPC) وجود داشته باشد. گروه های امنیتی - گروه های امنیتی برای نمونه های شما. از آنجایی که در جلوی نمونه ها از متعادل کننده استفاده خواهیم کرد، توصیه می کنم گروهی را در اینجا مشخص کنید که اتصالات ورودی را فقط از متعادل کننده مجاز می کند. یعنی شما 2 گروه امنیتی خواهید داشت، یکی برای متعادل کننده، که امکان اتصال ورودی از هر نقطه در پورت های 80 (http) و 443 (https) و دومی برای ماشین ها را فراهم می کند، که امکان اتصال ورودی به هر پورت از گروه متعادل کننده را فراهم می کند. . اتصالات خروجی در هر دو گروه باید با استفاده از پروتکل TCP به همه پورت ها به همه آدرس ها باز شود. می توانید پورت ها و آدرس ها را برای اتصالات خروجی محدود کنید، اما پس از آن باید دائماً نظارت کنید که سعی نمی کنید به چیزی در یک پورت بسته دسترسی پیدا کنید.

ذخیره سازی (حجم) - پارامترهای دیسک را برای ماشین ها مشخص کنید. اندازه دیسک نمی تواند کمتر از اندازه مشخص شده در AMI باشد، برای ECS Optimized 30 گیگابایت است.

جزئیات پیشرفته - پارامترهای اضافی را مشخص کنید.

گزینه خرید - آیا ما می خواهیم نمونه های نقطه ای بخریم. ما می خواهیم، ​​اما این کادر را در اینجا علامت نمی زنیم؛ آن را در Auto Scaling Group پیکربندی می کنیم، گزینه های بیشتری در آنجا وجود دارد.

نمایه نمونه IAM - نقشی را که نمونه ها با آن راه اندازی می شوند را مشخص کنید. برای اینکه نمونه‌ها در ECS اجرا شوند، به مجوزهایی نیاز دارند که معمولاً در نقش یافت می‌شوند ecsInstanceRole. در برخی موارد می توان آن را ایجاد کرد، اگر نه، پس در اینجا دستور العمل در مورد نحوه انجام این کار پس از ایجاد، آن را در قالب نشان می دهیم.
بعد پارامترهای زیادی وجود دارد، اساساً می توانید مقادیر پیش فرض را در همه جا بگذارید، اما هر یک از آنها توضیح واضحی دارند. من همیشه نمونه بهینه شده برای EBS و گزینه های نامحدود T2/T3 را در صورت استفاده فعال می کنم قابل ترکیدن نمونه ها

داده های کاربر - نشان دادن داده های کاربر ما فایل را ویرایش می کنیم /etc/ecs/ecs.config، که حاوی پیکربندی عامل ECS است.
نمونه ای از اینکه داده های کاربر ممکن است شبیه به آن باشند:

#!/bin/bash
echo ECS_CLUSTER=DemoApiClusterProd >> /etc/ecs/ecs.config
echo ECS_ENABLE_SPOT_INSTANCE_DRAINING=true >> /etc/ecs/ecs.config
echo ECS_CONTAINER_STOP_TIMEOUT=1m >> /etc/ecs/ecs.config
echo ECS_ENGINE_AUTH_TYPE=docker >> /etc/ecs/ecs.config
echo "ECS_ENGINE_AUTH_DATA={"registry.gitlab.com":{"username":"username","password":"password"}}" >> /etc/ecs/ecs.config

ECS_CLUSTER=DemoApiClusterProd — پارامتر نشان می دهد که نمونه متعلق به خوشه ای با نام داده شده است، یعنی این خوشه می تواند وظایف خود را در این سرور قرار دهد. ما هنوز خوشه ای ایجاد نکرده ایم، اما هنگام ایجاد آن از این نام استفاده خواهیم کرد.

ECS_ENABLE_SPOT_INSTANCE_DRAINING=true - پارامتر مشخص می کند که وقتی سیگنالی برای خاموش کردن یک نمونه نقطه ای دریافت می شود، تمام وظایف روی آن باید به وضعیت تخلیه منتقل شوند.

ECS_CONTAINER_STOP_TIMEOUT=1m - پارامتر مشخص می کند که پس از دریافت سیگنال SIGINT، تمام وظایف 1 دقیقه قبل از کشته شدن زمان دارند.

ECS_ENGINE_AUTH_TYPE=docker - پارامتر نشان می دهد که از طرح داکر به عنوان مکانیزم مجوز استفاده می شود

ECS_ENGINE_AUTH_DATA=... - پارامترهای اتصال به رجیستری کانتینر خصوصی، جایی که تصاویر Docker شما ذخیره می شوند. اگر عمومی است، پس نیازی به تعیین چیزی ندارید.

برای اهداف این مقاله، من از یک تصویر عمومی از Docker Hub استفاده خواهم کرد، بنابراین پارامترها را مشخص کنید. ECS_ENGINE_AUTH_TYPE и ECS_ENGINE_AUTH_DATA لازم نیست

خوب است بدانیم: توصیه می شود AMI را به طور منظم به روز کنید، زیرا نسخه های جدید نسخه های Docker، Linux، ECS و غیره را به روز می کنند. برای فراموش نکردن این موضوع می توانید اعلان ها را تنظیم کنید در مورد انتشار نسخه های جدید می‌توانید اعلان‌ها را از طریق ایمیل دریافت کنید و به‌صورت دستی به‌روزرسانی کنید، یا می‌توانید یک تابع Lambda بنویسید که به‌طور خودکار نسخه جدیدی از Launch Template را با یک AMI به‌روز شده ایجاد می‌کند.

EC2 Auto Scaling Group

Auto Scaling Group مسئول راه اندازی و مقیاس بندی نمونه ها است. گروه ها در بخش EC2 -> Auto Scaling -> Auto Scaling Groups مدیریت می شوند.

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

گزینه های خرید و انواع نمونه - انواع نمونه ها را برای خوشه مشخص کنید. به الگوی راه اندازی پایبند باشید از نوع نمونه از الگوی راه اندازی استفاده می کند. ترکیب گزینه های خرید و انواع نمونه به شما امکان می دهد انواع نمونه ها را به طور انعطاف پذیر پیکربندی کنید. از آن استفاده خواهیم کرد.

پایه درخواستی اختیاری - تعداد نمونه‌های معمولی و غیر نقطه‌ای که همیشه کار می‌کنند.

درصد درخواستی بالاتر از پایه - درصد نسبت نمونه های معمولی و نقطه ای، 50-50 به طور مساوی توزیع می شود، 20-80 برای هر نمونه معمولی 4 نقطه نقطه افزایش می یابد. برای اهداف این مثال، من 50-50 را نشان می دهم، اما در واقعیت ما اغلب 20-80، در برخی موارد 0-100 انجام می دهیم.

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

ساختن یک API مقیاس پذیر در نمونه های AWS Spot

شبکه ارتباطی — تنظیمات شبکه، VPC و زیرشبکه‌ها را برای ماشین‌ها انتخاب کنید، در بیشتر موارد باید همه زیرشبکه‌های موجود را انتخاب کنید.

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

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

سیاست های مقیاس بندی - پارامترهای مقیاس بندی، اما ما بر اساس وظایف در حال اجرا ECS مقیاس بندی می کنیم، بنابراین مقیاس بندی را بعداً پیکربندی می کنیم.

حفاظت از مقیاس به عنوان مثال - محافظت از نمونه ها در برابر حذف در هنگام کاهش مقیاس. ما آن را فعال می کنیم تا ASG دستگاهی را که دارای وظایف در حال اجرا است حذف نکند. ECS Capacity Provider حفاظت را برای مواردی که وظایفی ندارند غیرفعال می کند.

افزودن برچسب - می‌توانید برای نمونه‌ها برچسب‌ها را مشخص کنید (برای این کار، کادر بررسی Tag instances new باید علامت زده شود). توصیه می‌کنم تگ Name را مشخص کنید، سپس همه نمونه‌هایی که در گروه راه‌اندازی می‌شوند یک نام خواهند داشت و مشاهده آنها در کنسول راحت است.

ساختن یک API مقیاس پذیر در نمونه های AWS Spot

بعد از ایجاد گروه آن را باز کنید و به قسمت Advanced configurations بروید چرا در مرحله ایجاد همه گزینه ها در کنسول قابل مشاهده نیستند.

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

ساختن یک API مقیاس پذیر در نمونه های AWS Spot

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

Application Load Balancer و گروه هدف EC2

متعادل کننده در بخش EC2 → Load Balancing → Load Balancer ایجاد می شود. ما از Application Load Balancer استفاده خواهیم کرد؛ مقایسه انواع مختلف متعادل کننده ها را می توان در اینجا بخوانید صفحه خدمات.

شنوندگان - ایجاد پورت های 80 و 443 و تغییر مسیر از 80 به 443 با استفاده از قوانین متعادل کننده بعداً منطقی است.

مناطق در دسترس - در بیشتر موارد، ما مناطق دسترسی را برای همه انتخاب می کنیم.

تنظیمات امنیتی را پیکربندی کنید - گواهی SSL برای متعادل کننده در اینجا نشان داده شده است، راحت ترین گزینه است گواهی بساز در ACM در مورد تفاوت ها خط مشی امنیتی قابل خواندن است مستندات، می توانید آن را به صورت پیش فرض انتخاب کنید ELBSecurityPolicy-2016-08. پس از ایجاد متعادل کننده، آن را خواهید دید نام DNS، که باید CNAME را برای دامنه خود پیکربندی کنید. برای مثال، در Cloudflare اینگونه به نظر می رسد.

ساختن یک API مقیاس پذیر در نمونه های AWS Spot

گروه امنیتی - یک گروه امنیتی برای متعادل کننده ایجاد یا انتخاب کنید، من در قسمت بالا در قسمت راه اندازی EC2 Launch Template → Network بیشتر در مورد آن نوشتم.

گروه هدف — ما گروهی ایجاد می‌کنیم که مسئول مسیریابی درخواست‌ها از بالانس‌کننده به ماشین‌ها و بررسی در دسترس بودن آن‌ها است تا در صورت بروز مشکل، آنها را جایگزین کند. نوع هدف باید نمونه باشد، پروتکل и بندر در هر صورت، اگر از HTTPS برای ارتباط بین متعادل کننده و نمونه ها استفاده می کنید، باید گواهی را در آنها آپلود کنید. برای اهداف این مثال، ما این کار را انجام نمی دهیم، ما به سادگی پورت 80 را ترک می کنیم.

بررسی های سلامت - پارامترهای بررسی عملکرد سرویس. در یک سرویس واقعی، این باید یک درخواست جداگانه باشد که بخش‌های مهمی از منطق تجاری را پیاده‌سازی می‌کند؛ برای اهداف این مثال، تنظیمات پیش‌فرض را ترک می‌کنم. در مرحله بعد، می توانید فاصله درخواست، تایم اوت، کدهای موفقیت و غیره را انتخاب کنید. در مثال ما، کدهای موفقیت 200-399 را نشان می دهیم، زیرا تصویر Docker که استفاده می شود یک کد 304 را برمی گرداند.

ساختن یک API مقیاس پذیر در نمونه های AWS Spot

ثبت اهداف - در اینجا اتومبیل های گروه انتخاب می شوند، اما در مورد ما این کار توسط ECS انجام می شود، بنابراین ما فقط از این مرحله صرف نظر می کنیم.

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

تعریف وظیفه ECS

در مراحل قبلی، همه چیز مربوط به زیرساخت خدمات را ایجاد کردیم؛ اکنون به شرح کانتینرهایی که راه اندازی خواهیم کرد می پردازیم. این کار در قسمت ECS → Task Definitions انجام می شود.

سازگاری نوع راه اندازی - EC2 را انتخاب کنید.

اجرای وظیفه نقش IAM - انتخاب کنید ecsTaskExecutionRole. با استفاده از آن، گزارش ها نوشته می شوند، دسترسی به متغیرهای مخفی داده می شود و غیره.

در قسمت Container Definitions، روی Add Container کلیک کنید.

تصویر - پیوند به تصویر با کد پروژه؛ برای این مثال از یک تصویر عمومی از Docker Hub استفاده خواهم کرد bitnami/node-example:0.0.1.

محدودیت های حافظه - محدودیت حافظه برای ظرف. حد سخت - محدودیت سخت، اگر کانتینر از مقدار مشخص شده فراتر رود، دستور docker kill اجرا می شود، ظرف بلافاصله می میرد. محدودیت نرم - محدودیت نرم، ظرف می تواند فراتر از مقدار مشخص شده باشد، اما این پارامتر هنگام قرار دادن وظایف بر روی ماشین ها در نظر گرفته می شود. به عنوان مثال، اگر دستگاهی دارای 4 گیگابایت رم باشد و محدودیت نرم یک کانتینر 2048 مگابایت باشد، این دستگاه می تواند حداکثر 2 کار در حال اجرا با این کانتینر داشته باشد. در واقع، 4 گیگابایت رم کمی کمتر از 4096 مگابایت است، این را می توان در تب ECS Instances در کلاستر مشاهده کرد. حد نرم نمی تواند بیشتر از حد سخت باشد. درک این نکته مهم است که اگر چندین ظرف در یک کار وجود داشته باشد، محدودیت های آنها خلاصه می شود.

نقشه برداری بندر - در پورت میزبان ما 0 را نشان می دهیم، به این معنی که پورت به صورت پویا اختصاص داده می شود و توسط گروه هدف نظارت می شود. بندر کانتینری - پورتی که برنامه شما روی آن اجرا می شود اغلب در دستور اجرا مشخص می شود یا در کد برنامه شما، Dockerfile و غیره اختصاص داده می شود. برای مثال ما از 3000 استفاده می کنیم زیرا در لیست آمده است dockerfile تصویر مورد استفاده

بررسی سلامت - پارامترهای بررسی سلامت کانتینر، نباید با پارامترهای پیکربندی شده در گروه هدف اشتباه گرفته شود.

محیط - تنظیمات محیطی واحدهای CPU - مشابه محدودیت های حافظه، فقط در مورد پردازنده. هر هسته پردازنده 1024 واحد است، بنابراین اگر سرور دارای پردازنده دو هسته ای باشد و کانتینر روی 512 تنظیم شده باشد، می توان 4 کار با این کانتینر روی یک سرور راه اندازی کرد. واحدهای CPU همیشه با تعداد هسته‌ها مطابقت دارند، مانند حافظه، نمی‌توان از آنها کمی کمتر باشد.

فرمان - دستوری برای شروع یک سرویس در داخل یک ظرف، همه پارامترها با کاما از هم جدا شده اند. این می تواند گانیکورن، npm و غیره باشد. اگر مشخص نشده باشد، مقدار دستور CMD از Dockerfile استفاده خواهد شد. نشان می دهیم npm,start.

متغیرهای محیطی - متغیرهای محیط کانتینر. این می تواند داده های متنی ساده یا متغیرهای مخفی باشد مدیر اسرار یا فروشگاه پارامتر.

ذخیره سازی و ورود به سیستم - در اینجا ما ورود به CloudWatch Logs (سرویس برای گزارش‌های AWS) را تنظیم می‌کنیم. برای انجام این کار، فقط کادر بررسی تنظیمات خودکار CloudWatch Logs را فعال کنید. پس از ایجاد Task Definition، گروهی از گزارش‌ها به طور خودکار در CloudWatch ایجاد می‌شوند. به‌طور پیش‌فرض، لاگ‌ها به‌طور نامحدود در آن ذخیره می‌شوند؛ من توصیه می‌کنم دوره نگهداری را از Never Expire به دوره مورد نیاز تغییر دهید. این کار در گروه‌های CloudWatch Log انجام می‌شود، باید روی دوره فعلی کلیک کنید و دوره جدیدی را انتخاب کنید.

ساختن یک API مقیاس پذیر در نمونه های AWS Spot

ECS Cluster و ECS Capacity Provider

برای ایجاد یک خوشه به بخش ECS → Clusters بروید. ما EC2 Linux + Networking را به عنوان الگو انتخاب می کنیم.

نام خوشه - بسیار مهم است، ما در اینجا همان نامی را که در پارامتر Launch Template مشخص شده است ایجاد می کنیم ECS_CLUSTER، در مورد ما - DemoApiClusterProd. چک باکس Create an white cluster را علامت بزنید. به صورت اختیاری، می‌توانید Container Insights را برای مشاهده معیارهای خدمات در CloudWatch فعال کنید. اگر همه چیز را به درستی انجام دادید، در بخش ECS Instances ماشین هایی را خواهید دید که در گروه Auto Scaling ایجاد شده اند.

ساختن یک API مقیاس پذیر در نمونه های AWS Spot

به برگه بروید ارائه دهندگان ظرفیت و یک مورد جدید ایجاد کنید. اجازه دهید به شما یادآوری کنم که بسته به تعداد وظایف در حال اجرا ECS برای کنترل ایجاد و خاموش کردن ماشین ها لازم است. توجه به این نکته ضروری است که یک ارائه دهنده فقط می تواند به یک گروه اختصاص داده شود.

گروه مقیاس خودکار - گروه ایجاد شده قبلی را انتخاب کنید.

مقیاس بندی مدیریت شده - آن را فعال کنید تا ارائه دهنده بتواند سرویس را مقیاس کند.

ظرفیت هدف % - به چند درصد از ماشین های بارگیری شده با وظایف نیاز داریم. اگر 100% را مشخص کنید، همه ماشین‌ها همیشه مشغول اجرای وظایف خواهند بود. اگر 50% را مشخص کنید، نیمی از ماشین ها همیشه رایگان خواهند بود. در این حالت، در صورت جهش شدید بار، تاکسی‌های جدید بلافاصله به خودروهای رایگان می‌رسند، بدون اینکه منتظر بمانند تا نمونه‌های آن مستقر شوند.

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

سرویس ECS و تنظیم مقیاس

مرحله آخر :) برای ایجاد یک سرویس، باید به کلاستر ایجاد شده قبلی در تب Services بروید.

نوع راه اندازی - باید روی Switch to Capacity provider Strategy کلیک کنید و ارائه دهندگان ایجاد شده قبلی را انتخاب کنید.

ساختن یک API مقیاس پذیر در نمونه های AWS Spot

تعریف وظیفه - تعریف کار قبلی و ویرایش آن را انتخاب کنید.

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

نوع خدمات - همیشه ماکت

تعداد وظایف - تعداد مورد نظر وظایف فعال در سرویس. این پارامتر با مقیاس بندی کنترل می شود، اما همچنان باید مشخص شود.

حداقل درصد سالم и حداکثر درصد - تعیین رفتار وظایف در طول استقرار. مقادیر پیش فرض 100 و 200 هستند که نشان می دهد در زمان استقرار تعداد وظایف چندین برابر افزایش می یابد و سپس به مقدار مورد نظر باز می گردد. اگر 1 کار در حال اجرا داشته باشید min=0 و max=100 در حین استقرار کشته می شود و بعد از آن یک کار جدید بلند می شود یعنی downtime می شود. اگر 1 کار در حال اجرا باشد، min=50، max=150، در آن صورت استقرار به هیچ وجه اتفاق نمی افتد، زیرا یک کار را نمی توان به نصف یا یک و نیم برابر افزایش داد.

نوع استقرار - به‌روزرسانی Rolling را ترک کنید.

قالب های قرار دادن - قوانین برای قرار دادن وظایف بر روی ماشین ها. پیش‌فرض AZ Balanced Spread است - این بدان معناست که هر کار جدید روی یک نمونه جدید قرار می‌گیرد تا زمانی که ماشین‌ها در همه مناطق در دسترس بالا بیایند. ما معمولاً BinPack - CPU و Spread - AZ را انجام می دهیم؛ با این خط مشی، وظایف تا حد امکان متراکم بر روی یک ماشین در هر CPU قرار می گیرند. اگر نیاز به ایجاد یک ماشین جدید باشد، در یک منطقه در دسترس جدید ایجاد می شود.

ساختن یک API مقیاس پذیر در نمونه های AWS Spot

نوع متعادل کننده بار - Application Load Balancer را انتخاب کنید.

نقش IAM سرویس - انتخاب کنید ecsServiceRole.

نام متعادل کننده بار - متعادل کننده قبلی ایجاد شده را انتخاب کنید.

مهلت بررسی سلامت - قبل از انجام بررسی های سلامتی پس از اجرای یک کار جدید مکث می کنیم، معمولاً آن را روی 60 ثانیه تنظیم می کنیم.

کانتینری برای تعادل بار - در مورد نام گروه هدف، گروه ایجاد شده قبلی را انتخاب کنید و همه چیز به طور خودکار پر می شود.

ساختن یک API مقیاس پذیر در نمونه های AWS Spot

مقیاس خودکار خدمات - پارامترهای مقیاس بندی خدمات. برای تنظیم تعداد مورد نظر سرویس خود، پیکربندی مقیاس خودکار سرویس را انتخاب کنید. ما حداقل و حداکثر تعداد کارها را هنگام مقیاس بندی تنظیم می کنیم.

نقش IAM برای مقیاس خودکار خدمات - انتخاب کنید AWSServiceRoleForApplicationAutoScaling_ECSService.

سیاست های مقیاس بندی خودکار وظایف - قوانین برای مقیاس بندی 2 نوع وجود دارد:

  1. ردیابی هدف - ردیابی معیارهای هدف (مصرف CPU/RAM یا تعداد درخواست‌ها برای هر کار). به عنوان مثال، ما می خواهیم میانگین بار پردازنده 85٪ باشد، وقتی بیشتر شد، وظایف جدید اضافه می شود تا زمانی که به مقدار مورد نظر برسد. اگر بار کمتر باشد، برعکس، وظایف حذف خواهند شد، مگر اینکه محافظت در برابر کاهش مقیاس فعال باشد (scale-in را غیرفعال کنید).
  2. مقیاس بندی مرحله ای - واکنش به یک رویداد دلخواه در اینجا می‌توانید واکنشی را به هر رویدادی (CloudWatch Alarm) پیکربندی کنید، در صورت وقوع، می‌توانید تعداد مشخص شده کار را اضافه یا حذف کنید یا تعداد دقیق کارها را مشخص کنید.

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

نتیجه

اگر دستورالعمل‌ها را دنبال کردید و از همان تصویر Docker استفاده کردید، سرویس شما باید صفحه‌ای مانند این را برگرداند.

ساختن یک API مقیاس پذیر در نمونه های AWS Spot

  1. ما یک قالب ایجاد کرده ایم که بر اساس آن تمام ماشین های موجود در سرویس راه اندازی می شوند. ما همچنین یاد گرفتیم که چگونه وقتی قالب تغییر می کند ماشین ها را به روز کنیم.
  2. ما پردازش سیگنال توقف نمونه نقطه‌ای را پیکربندی کرده‌ایم، بنابراین در عرض یک دقیقه پس از دریافت آن، همه کارهای در حال اجرا از دستگاه حذف می‌شوند، بنابراین هیچ چیز از بین نمی‌رود یا قطع نمی‌شود.
  3. متعادل کننده را بالا بردیم تا بار به طور مساوی در بین ماشین ها توزیع شود.
  4. ما سرویسی ایجاد کرده‌ایم که در نمونه‌های نقطه‌ای اجرا می‌شود، که هزینه‌های دستگاه را حدود ۳ برابر کاهش می‌دهد.
  5. ما مقیاس خودکار را در هر دو جهت راه‌اندازی کردیم تا بدون پرداخت هزینه از کار افتادگی، بارهای کاری افزایش یافته را مدیریت کنیم.
  6. ما از Capacity Provider استفاده می کنیم تا برنامه زیرساخت (ماشین ها) را مدیریت کند و نه برعکس.
  7. ما عالی هستیم

اگر بارگیری‌های قابل پیش‌بینی دارید، مثلاً در یک کمپین ایمیل بزرگ تبلیغ می‌کنید، می‌توانید مقیاس‌بندی را با جدول زمانی.

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

خوشحال می شوم اگر در نظرات موارد جالب استفاده از نمونه های نقطه ای و ECS یا چیزی در مورد مقیاس بندی را به من بگویید.

به زودی مقالاتی در مورد نحوه پردازش هزاران رویداد تحلیلی در ثانیه در یک پشته عمدتاً بدون سرور (با پول) و نحوه استقرار خدمات با استفاده از GitLab CI و Terraform Cloud منتشر خواهد شد.

مشترک ما شوید، جالب خواهد بود!

فقط کاربران ثبت نام شده می توانند در نظرسنجی شرکت کنند. ورود، لطفا.

آیا از نمونه های نقطه ای در تولید استفاده می کنید؟

  • ٪۱۰۰بله 6

  • ٪۱۰۰شماره 18

  • ٪۱۰۰من در مورد آنها از یک مقاله یاد گرفتم و قصد دارم از آنها استفاده کنم

27 کاربر رای دادند. 5 کاربر رای ممتنع دادند.

منبع: www.habr.com

اضافه کردن نظر