تقریباً ہر کامیاب کاروباری درخواست جلد یا بدیر ایک ایسے مرحلے میں داخل ہوتی ہے جہاں افقی پیمانے کی ضرورت ہوتی ہے۔ بہت سے معاملات میں، آپ آسانی سے ایک نئی مثال شروع کر سکتے ہیں اور بوجھ کی اوسط کو کم کر سکتے ہیں۔ لیکن کم معمولی معاملات بھی ہیں جہاں ہمیں یہ یقینی بنانا ہوگا کہ مختلف نوڈس ایک دوسرے کے بارے میں جانتے ہیں اور کام کے بوجھ کو احتیاط سے تقسیم کرتے ہیں۔
یہ اتنا خوش قسمت نکلا کہ ایرلنگ، جسے ہم نے اس کے خوشگوار نحو اور اس کے ارد گرد ہائپ کے لیے منتخب کیا ہے، اس کا پہلا درجہ ہے۔
مختلف نوڈس پر عمل کے ساتھ ساتھ لنکس اور مانیٹر کے درمیان پیغام گزرنا شفاف ہے […]
عملی طور پر، سب کچھ تھوڑا زیادہ پیچیدہ ہے. تقسیم کیا گیا۔ ایرلنگ اس وقت تیار کیا گیا تھا جب "کنٹینر" کا مطلب شپنگ کے لیے لوہے کا ایک بڑا ڈبہ ہوتا تھا، اور "ڈاکر" صرف لانگ شور مین کا مترادف تھا۔ میں IP4 وہاں بہت سے غیرمقبول پتے تھے، نیٹ ورک ٹوٹنا عام طور پر چوہوں کے کیبل کے ذریعے چبانے کی وجہ سے ہوتا تھا، اور پیداواری نظام کا اوسط اپ ٹائم دہائیوں میں ناپا جاتا تھا۔
اب ہم سب ناقابل یقین حد تک خود کفیل، پیکڈ، اور تقسیم شدہ چل رہے ہیں۔ ایرلنگ ایک ایسے ماحول میں جہاں متحرک آئی پی ایڈریس عظیم بے ترتیب ہونے کے اصول پر دیے جاتے ہیں، اور نوڈس شیڈیولر کی بائیں ایڑی کی خواہش پر ظاہر اور غائب ہو سکتے ہیں۔ تقسیم شدہ ہر پروجیکٹ میں بوائلر پلیٹ کوڈ کے ڈھیر سے بچنے کے لیے ایرلنگمخالف ماحول کا مقابلہ کرنے کے لیے مدد کی ضرورت ہے۔
نوٹ: میں جانتا ہوں کہ وہاں ہے۔ libcluster
کے تقاضے
مجھے ذاتی طور پر ایک لائبریری کی ضرورت تھی جو کلسٹر کا انتظام سنبھال لے اور اس میں درج ذیل خصوصیات ہوں گی۔
- نوڈس کی سخت کوڈ شدہ فہرست اور خدمات کے ذریعے متحرک دریافت دونوں کے ساتھ شفاف کام ایرلنگ;
- ہر ٹوپولوجی تبدیلی کے لیے مکمل طور پر فعال کال بیک (وہاں نوڈ، یہاں نوڈ، نیٹ ورک کی عدم استحکام، تقسیم)؛
- لمبے اور مختصر ناموں کے ساتھ کلسٹر شروع کرنے کے لیے شفاف انٹرفیس، جیسا کہ
:nonode@nohost
; - ڈوکر سپورٹ آؤٹ آف دی باکس، بغیر انفراسٹرکچر کوڈ لکھے۔
مؤخر الذکر کا مطلب یہ ہے کہ جب میں نے مقامی طور پر درخواست کی جانچ کی۔ :nonode@nohost
، یا استعمال کرتے ہوئے مصنوعی طور پر تقسیم شدہ ماحول میں test_cluster_task
docker-compose up --scale my_app=3
اور دیکھیں کہ یہ بغیر کسی کوڈ کی تبدیلی کے ڈوکر میں تین مثالوں کو کیسے انجام دیتا ہے۔ میں بھی اس طرح کی منحصر ایپلی کیشنز چاہتا ہوں۔ 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
، استعمال کرتا ہے۔ ایرلنگ سروس کی دریافت نوڈس کو جوڑنے کے لیے، کم از کم تین، اور 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
پرواز میں
استعمال کرنے کا بنیادی فائدہ کلسٹر یہ ہے کہ یہ ٹوپولوجی میں تبدیلی کے بعد کلسٹر کو دوبارہ بنانے کے لیے تمام ضروری کارروائیاں انجام دیتا ہے۔ ٹوپی کے نیچے. ایپلیکیشن پہلے سے تیار شدہ تقسیم شدہ ماحول میں چلتی ہے، تمام نوڈس منسلک ہوتے ہیں، قطع نظر اس کے کہ ہم آئی پی ایڈریس اور اس لیے نوڈ کے نام پہلے سے جانتے ہیں، یا انہیں متحرک طور پر تفویض/تبدیل کیا گیا ہے۔ اس کے لیے قطعی طور پر کوئی خاص ڈوکر کنفیگریشن سیٹنگز کی ضرورت نہیں ہے اور ایپلیکیشن ڈویلپر کے نقطہ نظر سے، تقسیم شدہ ماحول میں چلنے یا مقامی ماحول میں چلانے میں کوئی فرق نہیں ہے۔ :nonode@nohost
. آپ اس کے بارے میں مزید پڑھ سکتے ہیں۔
اگرچہ ٹوپولوجی تبدیلیوں کا پیچیدہ ہینڈلنگ حسب ضرورت نفاذ کے ذریعے ممکن ہے۔ MyApp.Listener
، ہمیشہ ایسے معاملات ہوسکتے ہیں جہاں لائبریری کی یہ حدود اور کنفیگریشن تعصب عمل درآمد کی بنیاد ثابت ہوتے ہیں۔ یہ ٹھیک ہے، صرف اوپر لے لو libcluster
، جو زیادہ عام مقصد ہے، یا یہاں تک کہ نچلے درجے کے کلسٹر کو خود ہینڈل کریں۔ اس کوڈ لائبریری کا مقصد ہر ممکنہ منظر نامے کا احاطہ کرنا نہیں ہے، بلکہ غیر ضروری درد اور بوجھل کاپی پیسٹ کے بغیر عام ترین منظر نامے کو استعمال کرنا ہے۔
نوٹ: اس مقام پر اصل میں ایک جملہ تھا "Happy clustering!"، اور Yandex، جس کے ساتھ میں ترجمہ کرتا ہوں (مجھے خود لغات سے نہیں جانا پڑتا)، نے مجھے "Happy clustering!" کا آپشن پیش کیا۔ اس سے بہتر ترجمہ کا تصور کرنا شاید ناممکن ہے، خاص طور پر موجودہ جغرافیائی سیاسی صورتحال کی روشنی میں۔
ماخذ: www.habr.com