تقریباً هر برنامه تجاری موفق دیر یا زود وارد مرحله ای می شود که مقیاس افقی مورد نیاز است. در بسیاری از موارد، می توانید به سادگی یک نمونه جدید را شروع کنید و میانگین بار را کاهش دهید. اما موارد کمتر پیش پا افتاده ای نیز وجود دارد که باید اطمینان حاصل کنیم که گره های مختلف در مورد یکدیگر می دانند و حجم کار را به دقت توزیع می کنند.
معلوم شد خیلی خوش شانس است که لغتکه به دلیل نحو دلپذیر و هیاهوی اطراف آن انتخاب کردیم، درجه یک دارد
ارسال پیام بین فرآیندها در گره های مختلف و همچنین بین پیوندها و مانیتورها شفاف است […]
در عمل، همه چیز کمی پیچیده تر است. توزیع شده است لغت زمانی توسعه یافت که "کانتینر" به معنای جعبه آهنی بزرگ برای حمل و نقل بود، و "بارانداز" به سادگی مترادفی برای مرد درازکش بود. که در 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: :rehashing
→ status: :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