Cloister → مدیریت ساده OTP خوشه

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

Cloister → مدیریت ساده OTP خوشه

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

ارسال پیام بین فرآیندها در گره های مختلف و همچنین بین پیوندها و مانیتورها شفاف است […]

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

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

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

مقررات

چیزی که من شخصاً به آن نیاز داشتم کتابخانه ای بود که مدیریت خوشه را بر عهده بگیرد و دارای ویژگی های زیر باشد:

  • کار شفاف هم با لیستی از گره ها کدگذاری شده و هم با کشف پویا از طریق خدمات لغت;
  • پاسخ به تماس کاملاً کاربردی برای هر تغییر توپولوژی (گره در آنجا، گره اینجا، ناپایداری شبکه، تقسیم)؛
  • رابط شفاف برای راه اندازی یک خوشه با نام های بلند و کوتاه، مانند :nonode@nohost;
  • پشتیبانی از Docker خارج از جعبه، بدون نیاز به نوشتن کد زیرساخت.

مورد دوم به این معنی است که پس از اینکه برنامه را به صورت محلی در آن تست کردم :nonode@nohost، یا در یک محیط توزیع مصنوعی با استفاده از test_cluster_task، من فقط می خواهم بدوم docker-compose up --scale my_app=3 و ببینید که چگونه سه نمونه را در docker بدون هیچ تغییری در کد اجرا می کند. من همچنین می خواهم برنامه های وابسته مانند mnesia - وقتی توپولوژی تغییر می کند، در پشت صحنه خوشه را به صورت زنده بدون هیچ ضربه اضافی از برنامه بازسازی می کنند.

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

رویکرد انتخاب شده

شبدر در نظر گرفته شده است که به عنوان یک برنامه اجرا شود، اگرچه کاربران پیشرفته می توانند با مونتاژ و نگهداری خوشه به صورت دستی با اجرای مستقیم کار کنند. Cloister.Manager در درخت سرپرست برنامه هدف.

هنگامی که به عنوان یک برنامه اجرا می شود، کتابخانه به آن متکی است config، که از آن مقادیر اساسی زیر را می خواند:

config :cloister,
  otp_app: :my_app,
  sentry: :"cloister.local", # or ~w|n1@foo n2@bar|a
  consensus: 3,              # number of nodes to consider
                             #    the cluster is up
  listener: MyApp.Listener   # listener to be called when
                             #    the ring has changed

پارامترهای بالا به معنای واقعی کلمه زیر هستند: شبدر برای برنامه OTP استفاده می شود :my_app، استفاده می کند کشف سرویس erlang برای اتصال گره ها، حداقل سه، و MyApp.Listener ماژول (در حال اجرا @behaviour Cloister.Listener) برای دریافت اعلان‌ها در مورد تغییرات توپولوژی پیکربندی شده است. شرح مفصلی از پیکربندی کامل را می توان در اینجا یافت مستندات.

با این پیکربندی، برنامه شبدر اراده راه اندازی مرحله ای، روند شروع برنامه اصلی را تا رسیدن به اجماع به تأخیر می اندازد (مانند مثال بالا، سه گره متصل و متصل هستند.) این به برنامه اصلی این فرصت را می دهد که فرض کند وقتی شروع می شود، خوشه از قبل در دسترس است. هر زمان که توپولوژی تغییر کند (تعدادی از آنها وجود خواهد داشت، زیرا گره ها به طور کامل همزمان شروع نمی شوند)، کنترل کننده فراخوانی می شود. MyApp.Listener.on_state_change/2. اکثر اوقات زمانی که یک پیام وضعیت دریافت می کنیم یک عمل انجام می دهیم %Cloister.Monitor{status: :up}، به این معنی است: "سلام، خوشه جمع شده است."

در اکثر موارد نصب consensus: 3 بهینه است زیرا حتی اگر انتظار داشته باشیم گره های بیشتری به هم متصل شوند، تماس برگشتی انجام خواهد شد status: :rehashingstatus: :up در هر گره ای که به تازگی اضافه یا حذف شده است.

هنگام شروع در حالت توسعه، فقط باید تنظیم کنید consensus: 1 и شبدر وقتی ببیند با خوشحالی از انتظار برای مونتاژ خوشه می گذرد :nonode@nohostیا :node@hostیا :[email protected] - بسته به نحوه پیکربندی گره (:none | :shortnames | :longnames).

مدیریت برنامه های توزیع شده

برنامه های کاربردی توزیع شده که در خلاء نیستند معمولاً شامل وابستگی های توزیع شده هستند، مانند mnesia. برای ما آسان است که پیکربندی مجدد آنها را از همان پاسخ تماس انجام دهیم on_state_change/2. برای مثال، در اینجا شرح مفصلی از نحوه پیکربندی مجدد ارائه شده است mnesia در حال پرواز در مستندات شبدر.

مزیت اصلی استفاده از شبدر این است که تمام عملیات لازم برای بازسازی خوشه را پس از تغییر توپولوژی انجام می دهد در زیر کاپوت. برنامه به سادگی در یک محیط توزیع شده از قبل آماده شده اجرا می شود و همه گره ها متصل هستند، صرف نظر از اینکه آدرس های IP و بنابراین نام گره ها را از قبل می دانیم یا به صورت پویا تخصیص/تغییر شده اند. این امر مطلقاً به تنظیمات پیکربندی docker خاصی نیاز ندارد و از دیدگاه توسعه‌دهنده برنامه، هیچ تفاوتی بین اجرای در یک محیط توزیع شده یا اجرای در یک محیط محلی وجود ندارد. :nonode@nohost. می توانید در این مورد بیشتر بخوانید مستندات.

اگرچه مدیریت پیچیده تغییرات توپولوژی از طریق یک پیاده سازی سفارشی امکان پذیر است MyApp.Listener، ممکن است همیشه موارد لبه ای وجود داشته باشد که این محدودیت های کتابخانه و سوگیری های پیکربندی، سنگ بنای پیاده سازی هستند. اشکالی نداره فقط موارد بالا رو بگیر libcluster، که بیشتر همه منظوره است، یا حتی خود خوشه سطح پایین را مدیریت کنید. هدف این کتابخانه کد پوشش هر سناریو ممکن نیست، بلکه استفاده از رایج ترین سناریو بدون دردسر غیر ضروری و کپی پیست دست و پا گیر است.

توجه: در این مرحله در نسخه اصلی عبارت "Happy clustering!" وجود داشت، و Yandex، که با آن ترجمه می کنم (من خودم مجبور نیستم فرهنگ لغت را مرور کنم)، گزینه "Happy clustering!" را به من پیشنهاد داد. شاید تصور ترجمه بهتری به خصوص با توجه به شرایط ژئوپلیتیک کنونی غیرممکن باشد.

منبع: www.habr.com

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