ہم Yandex.Cloud میں 10 ایونٹس کو قبول کرتے ہیں۔ حصہ 000

سب کو ہیلو، دوستو!

* یہ مضمون REBRAIN اور Yandex.Cloud اوپن ورکشاپ پر مبنی ہے، اگر آپ ویڈیو دیکھنا پسند کرتے ہیں، تو آپ اسے اس لنک پر دیکھ سکتے ہیں۔ https://youtu.be/cZLezUm0ekE

ہمیں حال ہی میں Yandex.Cloud لائیو آزمانے کا موقع ملا۔ چونکہ ہم طویل اور سخت تحقیقات کرنا چاہتے تھے، ہم نے فوری طور پر کلاؤڈ بیس کے ساتھ ایک سادہ ورڈپریس بلاگ شروع کرنے کا خیال ترک کر دیا - یہ بہت بورنگ تھا۔ کچھ سوچ بچار کے بعد، ہم نے قریب قریب حقیقی وقت کے موڈ میں واقعات کو وصول کرنے اور ان کا تجزیہ کرنے کے لیے پروڈکشن سروس کے فن تعمیر سے ملتی جلتی کوئی چیز تعینات کرنے کا فیصلہ کیا۔

مجھے پورا یقین ہے کہ آن لائن (اور نہ صرف) کاروباروں کی اکثریت کسی نہ کسی طرح اپنے صارفین اور ان کے اعمال کے بارے میں معلومات کا ایک پہاڑ جمع کرتی ہے۔ کم از کم، کچھ فیصلے کرنے کے لیے یہ ضروری ہے - مثال کے طور پر، اگر آپ آن لائن گیم کا انتظام کرتے ہیں، تو آپ اعدادوشمار کو دیکھ سکتے ہیں کہ کس سطح پر صارفین اکثر پھنس جاتے ہیں اور آپ کا کھلونا حذف کر دیتے ہیں۔ یا صارفین آپ کی سائٹ کو بغیر کچھ خریدے کیوں چھوڑ دیتے ہیں (ہیلو، Yandex.Metrica)۔

تو، ہماری کہانی: ہم نے گولانگ میں ایک ایپلیکیشن کیسے لکھی، کافکا بمقابلہ rabbitmq بمقابلہ yqs کا تجربہ کیا، کلک ہاؤس کلسٹر میں ڈیٹا سٹریمنگ لکھا اور yandex datalens کا استعمال کرتے ہوئے ڈیٹا کا تصور کیا۔ قدرتی طور پر، یہ سب ڈوکر، ٹیرافارم، گٹلاب سی آئی اور یقیناً پرومیٹیس کی شکل میں بنیادی ڈھانچے کی لذتوں سے مزین تھا۔ چلو!

میں فوری طور پر ایک ریزرویشن کرنا چاہوں گا کہ ہم ایک ہی نشست میں ہر چیز کو ترتیب دینے کے قابل نہیں ہوں گے - اس کے لیے ہمیں سیریز میں کئی مضامین درکار ہوں گے۔ ساخت کے بارے میں تھوڑا سا:

حصہ 1 (آپ اسے پڑھ رہے ہیں)۔ ہم حل کی خصوصیات اور فن تعمیر پر فیصلہ کریں گے، اور گولانگ میں ایک درخواست بھی لکھیں گے۔
حصہ 2. ہم اپنی ایپلیکیشن کو پروڈکشن میں جاری کرتے ہیں، اسے قابل توسیع بناتے ہیں اور بوجھ کی جانچ کرتے ہیں۔
حصہ 3۔ آئیے یہ جاننے کی کوشش کریں کہ ہمیں پیغامات کو فائلوں میں نہیں بلکہ بفر میں کیوں ذخیرہ کرنے کی ضرورت ہے، اور کافکا، rabbitmq اور yandex queue سروس کا موازنہ بھی کریں۔
حصہ 4 ہم کلک ہاؤس کلسٹر تعینات کریں گے، وہاں بفر سے ڈیٹا منتقل کرنے کے لیے ایک اسٹریمنگ سروس لکھیں گے، اور ڈیٹا لینز میں ویژولائزیشن ترتیب دیں گے۔
حصہ 5 آئیے پورے انفراسٹرکچر کو مناسب شکل میں لائیں - gitlab ci کا استعمال کرتے ہوئے ci/cd سیٹ کریں، prometheus اور قونصل کا استعمال کرتے ہوئے مانیٹرنگ اور سروس کی دریافت کو مربوط کریں۔

TK

سب سے پہلے، آئیے حوالہ کی شرائط تیار کریں - اس کے نتیجے میں ہم اصل میں کیا حاصل کرنا چاہتے ہیں۔

  1. ہم Events.kis.im جیسا ایک اینڈ پوائنٹ رکھنا چاہتے ہیں (kis.im وہ ٹیسٹ ڈومین ہے جسے ہم تمام مضامین میں استعمال کریں گے)، جسے HTTPS کا استعمال کرتے ہوئے ایونٹس کو موصول ہونا چاہیے۔
  2. ایونٹس ایک سادہ json ہیں جیسے: {"event": "view"، "os": "linux"، "browser": "chrome"}۔ آخری مرحلے میں ہم کچھ اور فیلڈز شامل کریں گے، لیکن یہ کوئی بڑا کردار ادا نہیں کرے گا۔ اگر آپ چاہیں تو، آپ protobuf پر سوئچ کر سکتے ہیں۔
  3. سروس کو فی سیکنڈ 10 واقعات پر کارروائی کرنے کے قابل ہونا چاہیے۔
  4. ہمارے حل میں صرف نئی مثالیں شامل کرکے افقی طور پر پیمانہ کرنا ممکن ہونا چاہئے۔ اور یہ اچھا ہو گا اگر ہم کلائنٹ کی درخواستوں میں تاخیر کو کم کرنے کے لیے سامنے والے حصے کو مختلف جغرافیائی مقامات پر منتقل کر سکیں۔
  5. غلطی کی رواداری۔ حل کافی مستحکم ہونا چاہئے اور کسی بھی حصے کے گرنے سے بچنے کے قابل ہونا چاہئے (یقینا ایک مخصوص تعداد تک)۔

فن تعمیر

عام طور پر، اس قسم کے کام کے لیے، کلاسیکی فن تعمیرات طویل عرصے سے ایجاد کیے گئے ہیں جو موثر پیمانے کی اجازت دیتے ہیں۔ اعداد و شمار ہمارے حل کی ایک مثال دکھاتا ہے۔

ہم Yandex.Cloud میں 10 ایونٹس کو قبول کرتے ہیں۔ حصہ 000

تو ہمارے پاس کیا ہے:

1. بائیں جانب ہماری ڈیوائسز ہیں جو مختلف ایونٹس تیار کرتی ہیں، چاہے وہ کھلاڑی اسمارٹ فون پر کھلونا میں لیول مکمل کر رہے ہوں یا باقاعدہ براؤزر کے ذریعے آن لائن اسٹور میں آرڈر بنائیں۔ ایک واقعہ، جیسا کہ تصریح میں بیان کیا گیا ہے، ایک سادہ json ہے جو ہمارے اینڈ پوائنٹ - events.kis.im پر بھیجا جاتا ہے۔

2. پہلے دو سرور سادہ بیلنسرز ہیں، ان کے اہم کام یہ ہیں:

  • مسلسل دستیاب رہیں۔ ایسا کرنے کے لیے، آپ مثال کے طور پر Keepalived استعمال کر سکتے ہیں، جو مسائل کی صورت میں ورچوئل آئی پی کو نوڈس کے درمیان تبدیل کر دے گا۔
  • TLS کو ختم کریں۔ ہاں، ہم ان پر TLS ختم کر دیں گے۔ سب سے پہلے، تاکہ ہمارا حل تکنیکی خصوصیات کے مطابق ہو، اور دوسرا، ہمارے بیک اینڈ سرورز سے ایک خفیہ کنکشن قائم کرنے کے بوجھ کو دور کرنے کے لیے۔
  • آنے والی درخواستوں کو دستیاب بیک اینڈ سرورز پر بیلنس کریں۔ یہاں کلیدی لفظ قابل رسائی ہے۔ اس کی بنیاد پر، ہم اس بات کو سمجھتے ہیں کہ لوڈ بیلنسرز کو ایپلی کیشنز کے ساتھ ہمارے سرورز کی نگرانی کرنے اور ناکام نوڈس پر ٹریفک کو متوازن کرنے کے قابل ہونا چاہیے۔

3. بیلنسرز کے بعد، ہمارے پاس ایپلیکیشن سرورز ہیں جو کافی آسان ایپلیکیشن چلا رہے ہیں۔ اسے HTTP کے ذریعے آنے والی درخواستوں کو قبول کرنے، بھیجے گئے json کی توثیق کرنے اور ڈیٹا کو بفر میں ڈالنے کے قابل ہونا چاہیے۔

4. خاکہ کافکا کو بفر کے طور پر دکھاتا ہے، حالانکہ، یقیناً، اس سطح پر دیگر اسی طرح کی خدمات استعمال کی جا سکتی ہیں۔ ہم تیسرے مضمون میں کافکا، rabbitmq اور yqs کا موازنہ کریں گے۔

5. ہمارے فن تعمیر کا آخری نقطہ کلک ہاؤس ہے - ایک کالم ڈیٹا بیس جو آپ کو ڈیٹا کی ایک بڑی مقدار کو ذخیرہ کرنے اور اس پر کارروائی کرنے کی اجازت دیتا ہے۔ اس سطح پر، ہمیں بفر سے ڈیٹا کو خود اسٹوریج سسٹم میں منتقل کرنے کی ضرورت ہے (اس پر مزید مضمون 4 میں)۔

یہ ڈیزائن ہمیں ہر پرت کو آزادانہ طور پر افقی طور پر پیمانہ کرنے کی اجازت دیتا ہے۔ بیک اینڈ سرورز کا مقابلہ نہیں کر سکتے ہیں - آئیے ایک اور چیز کا اضافہ کرتے ہیں - آخر کار، وہ اسٹیٹ لیس ایپلی کیشنز ہیں، اور اس لیے یہ خود بخود بھی ہو سکتا ہے۔ کافکا طرز کا بفر کام نہیں کرتا — آئیے مزید سرورز شامل کریں اور اپنے موضوع کے کچھ پارٹیشنز کو ان میں منتقل کریں۔ کلک ہاؤس اسے سنبھال نہیں سکتا - یہ ناممکن ہے :) درحقیقت، ہم سرورز کو بھی جوڑیں گے اور ڈیٹا کو شارڈ کریں گے۔

ویسے، اگر آپ ہماری تکنیکی خصوصیات کے اختیاری حصے کو لاگو کرنا چاہتے ہیں اور مختلف جغرافیائی محل وقوع میں اسکیل کرنا چاہتے ہیں، تو کچھ بھی آسان نہیں ہے:

ہم Yandex.Cloud میں 10 ایونٹس کو قبول کرتے ہیں۔ حصہ 000

ہر جغرافیائی محل وقوع میں ہم ایپلیکیشن اور کافکا کے ساتھ ایک لوڈ بیلنسر لگاتے ہیں۔ عام طور پر، 2 ایپلیکیشن سرورز، 3 کافکا نوڈس اور ایک کلاؤڈ بیلنسر، مثال کے طور پر، کلاؤڈ فلیئر، کافی ہیں، جو کلائنٹ کے سورس آئی پی ایڈریس کی بنیاد پر جغرافیائی محل وقوع کے ذریعے ایپلیکیشن نوڈس اور بیلنس کی درخواستوں کی دستیابی کو چیک کریں گے۔ اس طرح، ایک امریکی کلائنٹ کی طرف سے بھیجا گیا ڈیٹا امریکی سرورز پر اتر جائے گا۔ اور افریقہ کا ڈیٹا افریقی زبان میں ہے۔

پھر سب کچھ بہت آسان ہے - ہم کافکا سیٹ سے آئینے کا آلہ استعمال کرتے ہیں اور تمام مقامات سے تمام ڈیٹا کو روس میں واقع ہمارے مرکزی ڈیٹا سینٹر میں کاپی کرتے ہیں۔ اندرونی طور پر، ہم ڈیٹا کو پارس کرتے ہیں اور اسے بعد میں دیکھنے کے لیے کلک ہاؤس میں ریکارڈ کرتے ہیں۔

لہذا، ہم نے فن تعمیر کو ترتیب دیا ہے - آئیے Yandex.Cloud کو ہلانا شروع کریں!

درخواست لکھنا

کلاؤڈ سے پہلے، آپ کو ابھی بھی تھوڑا صبر کرنا ہوگا اور آنے والے واقعات پر کارروائی کرنے کے لیے کافی آسان سروس لکھنی ہوگی۔ ہم گولانگ استعمال کریں گے کیونکہ اس نے نیٹ ورک ایپلی کیشنز لکھنے کے لیے خود کو بہت اچھی زبان کے طور پر ثابت کیا ہے۔

ایک گھنٹہ (شاید چند گھنٹے) گزارنے کے بعد، ہمیں کچھ اس طرح ملتا ہے: https://github.com/RebrainMe/yandex-cloud-events/blob/master/app/main.go.

میں یہاں کون سے اہم نکات نوٹ کرنا چاہوں گا:

1. ایپلیکیشن شروع کرتے وقت، آپ دو جھنڈوں کی وضاحت کر سکتے ہیں۔ ایک اس پورٹ کا ذمہ دار ہے جس پر ہم آنے والی HTTP درخواستوں (-addr) کو سنیں گے۔ دوسرا کافکا سرور ایڈریس کا ہے جہاں ہم اپنے واقعات ریکارڈ کریں گے (-کافکا):

addr     = flag.String("addr", ":8080", "TCP address to listen to")
kafka    = flag.String("kafka", "127.0.0.1:9092", "Kafka endpoints”)

2. ایپلیکیشن سراما لائبریری کا استعمال کرتی ہے (github.com/Shopify/sarama) کافکا کلسٹر کو پیغامات بھیجنے کے لیے۔ ہم نے فوری طور پر زیادہ سے زیادہ پروسیسنگ کی رفتار کا مقصد سیٹنگیں سیٹ کیں:

config := sarama.NewConfig()
config.Producer.RequiredAcks = sarama.WaitForLocal
config.Producer.Compression = sarama.CompressionSnappy
config.Producer.Return.Successes = true

3. ہماری ایپلیکیشن میں بلٹ ان پرومیتھیس کلائنٹ بھی ہے، جو مختلف میٹرکس کو جمع کرتا ہے، جیسے:

  • ہماری درخواست پر درخواستوں کی تعداد؛
  • درخواست پر عمل کرتے وقت غلطیوں کی تعداد (پوسٹ کی درخواست کو پڑھنا ناممکن، ٹوٹا ہوا json، کافکا کو لکھنا ناممکن)؛
  • کلائنٹ کی طرف سے ایک درخواست پر کارروائی کا وقت، بشمول کافکا کو پیغام لکھنے کا وقت۔

4. تین اختتامی نکات جن پر ہماری درخواست عمل کرتی ہے:

  • /status - یہ ظاہر کرنے کے لیے ٹھیک ہے کہ ہم زندہ ہیں۔ اگرچہ آپ کچھ چیک شامل کر سکتے ہیں، جیسے کافکا کلسٹر کی دستیابی۔
  • /metrics - اس url کے مطابق، prometheus کلائنٹ اپنے جمع کردہ میٹرکس کو واپس کرے گا۔
  • /post مرکزی اختتامی نقطہ ہے جہاں json کے ساتھ POST کی درخواستیں بھیجی جائیں گی۔ ہماری ایپلیکیشن درستگی کے لیے json کو چیک کرتی ہے اور اگر سب کچھ ٹھیک ہے، تو یہ ڈیٹا کو کافکا کلسٹر میں لکھتا ہے۔

میں ایک ریزرویشن کروں گا کہ کوڈ کامل نہیں ہے - اسے مکمل کیا جا سکتا ہے (اور ہونا چاہیے!)۔ مثال کے طور پر، آپ بلٹ ان نیٹ/http استعمال کرنا بند کر سکتے ہیں اور تیز تیز HTTP پر جا سکتے ہیں۔ یا آپ json validity check کو بعد کے مرحلے میں منتقل کرکے پروسیسنگ کا وقت اور cpu وسائل حاصل کرسکتے ہیں - جب ڈیٹا بفر سے کلک ہاؤس کلسٹر میں منتقل ہوتا ہے۔

مسئلے کے ترقیاتی پہلو کے علاوہ، ہم نے فوری طور پر اپنے مستقبل کے بنیادی ڈھانچے کے بارے میں سوچا اور اپنی درخواست کو docker کے ذریعے تعینات کرنے کا فیصلہ کیا۔ ایپلیکیشن بنانے کے لیے حتمی ڈاکر فائل ہے۔ https://github.com/RebrainMe/yandex-cloud-events/blob/master/app/Dockerfile. عام طور پر، یہ بہت آسان ہے، واحد نقطہ جس پر میں توجہ دینا چاہوں گا وہ ہے ملٹی اسٹیج اسمبلی، جو ہمیں اپنے کنٹینر کی حتمی تصویر کو کم کرنے کی اجازت دیتی ہے۔

بادل میں پہلے قدم

سب سے پہلے، رجسٹر کریں cloud.yandex.ru. تمام ضروری فیلڈز کو پُر کرنے کے بعد، ہمیں ایک اکاؤنٹ بنایا جائے گا اور ہمیں ایک مخصوص رقم کے لیے گرانٹ دی جائے گی، جسے کلاؤڈ سروسز کی جانچ کے لیے استعمال کیا جا سکتا ہے۔ اگر آپ ہمارے مضمون کے تمام مراحل کو دہرانا چاہتے ہیں تو یہ گرانٹ آپ کے لیے کافی ہوگی۔

رجسٹریشن کے بعد، آپ کے لیے ایک الگ کلاؤڈ اور ایک ڈیفالٹ ڈائرکٹری بنائی جائے گی، جس میں آپ کلاؤڈ ریسورسز بنانا شروع کر سکتے ہیں۔ عام طور پر، Yandex.Cloud میں، وسائل کا تعلق اس طرح نظر آتا ہے:

ہم Yandex.Cloud میں 10 ایونٹس کو قبول کرتے ہیں۔ حصہ 000

آپ ایک اکاؤنٹ کے لیے کئی کلاؤڈ بنا سکتے ہیں۔ اور کلاؤڈ کے اندر، کمپنی کے مختلف پروجیکٹس کے لیے مختلف ڈائریکٹریز بنائیں۔ آپ دستاویزات میں اس کے بارے میں مزید پڑھ سکتے ہیں - https://cloud.yandex.ru/docs/resource-manager/concepts/resources-hierarchy. ویسے، میں اکثر ذیل میں متن میں اس کا حوالہ دوں گا۔ جب میں نے شروع سے پورے انفراسٹرکچر کو ترتیب دیا، تو دستاویزات نے ایک سے زیادہ بار میری مدد کی، اس لیے میں آپ کو مشورہ دیتا ہوں کہ اس کا مطالعہ کریں۔

کلاؤڈ کو منظم کرنے کے لیے، آپ ویب انٹرفیس اور کنسول یوٹیلیٹی - yc دونوں استعمال کر سکتے ہیں۔ تنصیب ایک کمانڈ کے ساتھ کی جاتی ہے (لینکس اور میک او ایس کے لیے):

curl https://storage.yandexcloud.net/yandexcloud-yc/install.sh | bash

اگر آپ کا داخلی سلامتی کا ماہر انٹرنیٹ سے اسکرپٹ چلانے کے بارے میں مشتعل ہے، تو، سب سے پہلے، آپ اسکرپٹ کو کھول سکتے ہیں اور اسے پڑھ سکتے ہیں، اور دوسرا، ہم اسے اپنے صارف کے تحت چلاتے ہیں - روٹ رائٹس کے بغیر۔

اگر آپ ونڈوز کے لیے کلائنٹ انسٹال کرنا چاہتے ہیں، تو آپ ہدایات استعمال کر سکتے ہیں۔ یہاں اور پھر پھانسی yc initاسے مکمل طور پر اپنی مرضی کے مطابق کرنے کے لیے:

vozerov@mba:~ $ yc init
Welcome! This command will take you through the configuration process.
Please go to https://oauth.yandex.ru/authorize?response_type=token&client_id= in order to obtain OAuth token.

Please enter OAuth token:
Please select cloud to use:
 [1] cloud-b1gv67ihgfu3bp (id = b1gv67ihgfu3bpt24o0q)
 [2] fevlake-cloud (id = b1g6bvup3toribomnh30)
Please enter your numeric choice: 2
Your current cloud has been set to 'fevlake-cloud' (id = b1g6bvup3toribomnh30).
Please choose folder to use:
 [1] default (id = b1g5r6h11knotfr8vjp7)
 [2] Create a new folder
Please enter your numeric choice: 1
Your current folder has been set to 'default' (id = b1g5r6h11knotfr8vjp7).
Do you want to configure a default Compute zone? [Y/n]
Which zone do you want to use as a profile default?
 [1] ru-central1-a
 [2] ru-central1-b
 [3] ru-central1-c
 [4] Don't set default zone
Please enter your numeric choice: 1
Your profile default Compute zone has been set to 'ru-central1-a'.
vozerov@mba:~ $

اصولی طور پر، عمل آسان ہے - سب سے پہلے آپ کو کلاؤڈ کو منظم کرنے کے لیے اوتھ ٹوکن حاصل کرنے کی ضرورت ہے، اس کلاؤڈ اور فولڈر کو منتخب کریں جسے آپ استعمال کریں گے۔

اگر آپ کے پاس ایک ہی کلاؤڈ میں کئی اکاؤنٹس یا فولڈرز ہیں، تو آپ yc config پروفائل کے ذریعے علیحدہ سیٹنگز کے ساتھ اضافی پروفائلز بنا سکتے ہیں اور ان کے درمیان سوئچ کر سکتے ہیں۔

مندرجہ بالا طریقوں کے علاوہ، Yandex.Cloud ٹیم نے ایک بہت اچھا لکھا ٹیرافارم کے لیے پلگ ان کلاؤڈ وسائل کے انتظام کے لیے۔ اپنے حصے کے لیے، میں نے ایک گٹ ذخیرہ تیار کیا، جہاں میں نے ان تمام وسائل کو بیان کیا جو مضمون کے حصے کے طور پر بنائے جائیں گے۔ https://github.com/rebrainme/yandex-cloud-events/. ہم ماسٹر برانچ میں دلچسپی رکھتے ہیں، آئیے اسے مقامی طور پر کلون کریں:


vozerov@mba:~ $ git clone https://github.com/rebrainme/yandex-cloud-events/ events
Cloning into 'events'...
remote: Enumerating objects: 100, done.
remote: Counting objects: 100% (100/100), done.
remote: Compressing objects: 100% (68/68), done.
remote: Total 100 (delta 37), reused 89 (delta 26), pack-reused 0
Receiving objects: 100% (100/100), 25.65 KiB | 168.00 KiB/s, done.
Resolving deltas: 100% (37/37), done.
vozerov@mba:~ $ cd events/terraform/

تمام اہم متغیرات جو ٹیرافارم میں استعمال ہوتے ہیں main.tf فائل میں لکھے جاتے ہیں۔ شروع کرنے کے لیے، درج ذیل مواد کے ساتھ terraform فولڈر میں ایک private.auto.tfvars فائل بنائیں:

# Yandex Cloud Oauth token
yc_token = ""
# Yandex Cloud ID
yc_cloud_id = ""
# Yandex Cloud folder ID
yc_folder_id = ""
# Default Yandex Cloud Region
yc_region = "ru-central1-a"
# Cloudflare email
cf_email = ""
# Cloudflare token
cf_token = ""
# Cloudflare zone id
cf_zone_id = ""

تمام متغیرات yc config فہرست سے لیے جا سکتے ہیں، کیونکہ ہم نے کنسول یوٹیلیٹی کو پہلے ہی کنفیگر کر لیا ہے۔ میں آپ کو مشورہ دیتا ہوں کہ فوری طور پر .gitignore میں private.auto.tfvars شامل کریں، تاکہ غلطی سے پرائیویٹ ڈیٹا شائع نہ ہو۔

private.auto.tfvars میں ہم نے Cloudflare سے ڈیٹا بھی مخصوص کیا ہے - DNS ریکارڈ بنانے اور مرکزی ڈومین events.kis.im کو اپنے سرورز پر پراکسی کرنے کے لیے۔ اگر آپ کلاؤڈ فلیئر استعمال نہیں کرنا چاہتے ہیں، تو main.tf اور dns.tf فائل میں کلاؤڈ فلیئر فراہم کنندہ کی شروعات کو ہٹا دیں، جو ضروری dns ریکارڈ بنانے کے لیے ذمہ دار ہے۔

اپنے کام میں ہم تینوں طریقوں کو یکجا کریں گے - ویب انٹرفیس، کنسول یوٹیلیٹی، اور ٹیرافارم۔

ورچوئل نیٹ ورکس

سچ پوچھیں تو، آپ اس مرحلے کو چھوڑ سکتے ہیں، کیونکہ جب آپ نیا کلاؤڈ بنائیں گے، تو آپ کے پاس خود بخود ایک علیحدہ نیٹ ورک اور 3 سب نیٹس بن جائیں گے - ہر ایک دستیابی زون کے لیے۔ لیکن ہم پھر بھی اپنے پراجیکٹ کے لیے اس کے اپنے ایڈریس کے ساتھ ایک علیحدہ نیٹ ورک بنانا چاہیں گے۔ Yandex.Cloud میں نیٹ ورک آپریشن کا عمومی خاکہ نیچے دیے گئے اعداد و شمار میں دکھایا گیا ہے (ایمانداری سے لیا گیا ہے۔ https://cloud.yandex.ru/docs/vpc/concepts/)

ہم Yandex.Cloud میں 10 ایونٹس کو قبول کرتے ہیں۔ حصہ 000

لہذا، آپ ایک مشترکہ نیٹ ورک بناتے ہیں جس کے اندر وسائل ایک دوسرے کے ساتھ بات چیت کرسکتے ہیں۔ ہر دستیابی زون کے لیے، ایک سب نیٹ اس کے اپنے ایڈریسنگ کے ساتھ بنایا جاتا ہے اور عام نیٹ ورک سے منسلک ہوتا ہے۔ نتیجے کے طور پر، اس میں موجود تمام کلاؤڈ وسائل بات چیت کر سکتے ہیں، چاہے وہ مختلف دستیابی والے علاقوں میں ہوں۔ مختلف کلاؤڈ نیٹ ورکس سے منسلک وسائل صرف بیرونی پتوں کے ذریعے ایک دوسرے کو دیکھ سکتے ہیں۔ ویسے یہ جادو اندر کیسے کام کرتا ہے، Habré پر اچھی طرح سے بیان کیا گیا تھا۔.

نیٹ ورک کی تخلیق کو ریپوزٹری سے network.tf فائل میں بیان کیا گیا ہے۔ وہاں ہم ایک مشترکہ نجی نیٹ ورک اندرونی بناتے ہیں اور مختلف دستیابی زونز میں اس سے تین ذیلی نیٹ جوڑتے ہیں - اندرونی-a (172.16.1.0/24)، اندرونی-b (172.16.2.0/24)، اندرونی-c (172.16.3.0/24) )۔

ٹیرافارم شروع کریں اور نیٹ ورک بنائیں:

vozerov@mba:~/events/terraform (master) $ terraform init
... skipped ..

vozerov@mba:~/events/terraform (master) $ terraform apply -target yandex_vpc_subnet.internal-a -target yandex_vpc_subnet.internal-b -target yandex_vpc_subnet.internal-c

... skipped ...

Plan: 4 to add, 0 to change, 0 to destroy.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

yandex_vpc_network.internal: Creating...
yandex_vpc_network.internal: Creation complete after 3s [id=enp2g2rhile7gbqlbrkr]
yandex_vpc_subnet.internal-a: Creating...
yandex_vpc_subnet.internal-b: Creating...
yandex_vpc_subnet.internal-c: Creating...
yandex_vpc_subnet.internal-a: Creation complete after 6s [id=e9b1dad6mgoj2v4funog]
yandex_vpc_subnet.internal-b: Creation complete after 7s [id=e2liv5i4amu52p64ac9p]
yandex_vpc_subnet.internal-c: Still creating... [10s elapsed]
yandex_vpc_subnet.internal-c: Creation complete after 10s [id=b0c2qhsj2vranoc9vhcq]

Apply complete! Resources: 4 added, 0 changed, 0 destroyed.

زبردست! ہم نے اپنا نیٹ ورک بنا لیا ہے اور اب اپنی داخلی خدمات بنانے کے لیے تیار ہیں۔

ورچوئل مشینیں بنانا

ایپلیکیشن کو جانچنے کے لیے، ہمیں صرف دو ورچوئل مشینیں بنانے کی ضرورت ہوگی - ہمیں ایپلیکیشن بنانے اور چلانے کے لیے پہلی کی ضرورت ہوگی، دوسری کافکا کو چلانے کے لیے، جسے ہم آنے والے پیغامات کو ذخیرہ کرنے کے لیے استعمال کریں گے۔ اور ہم ایک اور مشین بنائیں گے جہاں ہم ایپلیکیشن کی نگرانی کے لیے پرومیتھیس کو ترتیب دیں گے۔

ورچوئل مشینوں کو جوابدہی کا استعمال کرتے ہوئے ترتیب دیا جائے گا، لہذا ٹیرافارم شروع کرنے سے پہلے، یقینی بنائیں کہ آپ کے پاس جوابدہ کے تازہ ترین ورژن میں سے ایک ہے۔ اور جوابدہ کہکشاں کے ساتھ ضروری کرداروں کو انسٹال کریں:

vozerov@mba:~/events/terraform (master) $ cd ../ansible/
vozerov@mba:~/events/ansible (master) $ ansible-galaxy install -r requirements.yml
- cloudalchemy-prometheus (master) is already installed, skipping.
- cloudalchemy-grafana (master) is already installed, skipping.
- sansible.kafka (master) is already installed, skipping.
- sansible.zookeeper (master) is already installed, skipping.
- geerlingguy.docker (master) is already installed, skipping.
vozerov@mba:~/events/ansible (master) $

جوابی فولڈر کے اندر ایک مثال .ansible.cfg کنفیگریشن فائل ہے جسے میں استعمال کرتا ہوں۔ یہ کام آ سکتا ہے۔

ورچوئل مشینیں بنانے سے پہلے، اس بات کو یقینی بنائیں کہ آپ کے پاس ssh-agent چل رہا ہے اور ایک ssh کلید شامل ہے، بصورت دیگر ٹیرافارم تخلیق شدہ مشینوں سے رابطہ نہیں کر سکے گا۔ مجھے، یقینا،، os x میں ایک بگ ملا: https://github.com/ansible/ansible/issues/32499#issuecomment-341578864. اسے دوبارہ ہونے سے روکنے کے لیے، Terraform شروع کرنے سے پہلے env میں ایک چھوٹا متغیر شامل کریں:

vozerov@mba:~/events/terraform (master) $ export OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES

ٹیرافارم والے فولڈر میں ہم ضروری وسائل بناتے ہیں:

vozerov@mba:~/events/terraform (master) $ terraform apply -target yandex_compute_instance.build -target yandex_compute_instance.monitoring -target yandex_compute_instance.kafka
yandex_vpc_network.internal: Refreshing state... [id=enp2g2rhile7gbqlbrkr]
data.yandex_compute_image.ubuntu_image: Refreshing state...
yandex_vpc_subnet.internal-a: Refreshing state... [id=e9b1dad6mgoj2v4funog]

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  + create

... skipped ...

Plan: 3 to add, 0 to change, 0 to destroy.

... skipped ...

اگر سب کچھ کامیابی سے ختم ہو گیا (اور یہ ہونا چاہیے)، تو ہمارے پاس تین ورچوئل مشینیں ہوں گی:

  1. تعمیر - جانچ اور ایپلیکیشن بنانے کے لیے ایک مشین۔ ڈاکر جوابی کے ذریعہ خود بخود انسٹال ہوا تھا۔
  2. نگرانی - ایک مانیٹرنگ مشین - اس پر پرومیتھیس اور گرافانا نصب ہے۔ لاگ ان / پاس ورڈ معیاری: منتظم / منتظم
  3. کافکا ایک چھوٹی مشین ہے جس میں کافکا نصب ہے، جو پورٹ 9092 پر قابل رسائی ہے۔

آئیے یقینی بنائیں کہ وہ سب جگہ پر ہیں:

vozerov@mba:~/events (master) $ yc compute instance list
+----------------------+------------+---------------+---------+---------------+-------------+
|          ID          |    NAME    |    ZONE ID    | STATUS  |  EXTERNAL IP  | INTERNAL IP |
+----------------------+------------+---------------+---------+---------------+-------------+
| fhm081u8bkbqf1pa5kgj | monitoring | ru-central1-a | RUNNING | 84.201.159.71 | 172.16.1.35 |
| fhmf37k03oobgu9jmd7p | kafka      | ru-central1-a | RUNNING | 84.201.173.41 | 172.16.1.31 |
| fhmt9pl1i8sf7ga6flgp | build      | ru-central1-a | RUNNING | 84.201.132.3  | 172.16.1.26 |
+----------------------+------------+---------------+---------+---------------+-------------+

وسائل اپنی جگہ پر ہیں، اور یہاں سے ہم ان کے IP پتے حاصل کر سکتے ہیں۔ اس کے بعد میں ssh کے ذریعے جڑنے اور ایپلیکیشن کی جانچ کرنے کے لیے آئی پی ایڈریس استعمال کروں گا۔ اگر آپ کے پاس ٹیرافارم سے منسلک کلاؤڈ فلیئر اکاؤنٹ ہے، تو بلا جھجھک تازہ تخلیق کردہ DNS نام استعمال کریں۔
ویسے، ورچوئل مشین بناتے وقت، ایک اندرونی IP اور ایک اندرونی DNS نام دیا جاتا ہے، تاکہ آپ نام کے ذریعے نیٹ ورک کے اندر موجود سرورز تک رسائی حاصل کر سکیں:

ubuntu@build:~$ ping kafka.ru-central1.internal
PING kafka.ru-central1.internal (172.16.1.31) 56(84) bytes of data.
64 bytes from kafka.ru-central1.internal (172.16.1.31): icmp_seq=1 ttl=63 time=1.23 ms
64 bytes from kafka.ru-central1.internal (172.16.1.31): icmp_seq=2 ttl=63 time=0.625 ms
^C
--- kafka.ru-central1.internal ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.625/0.931/1.238/0.308 ms

یہ ہمارے لیے ایپلی کیشن کو kafk کے ساتھ اختتامی نقطہ کی نشاندہی کرنے کے لیے مفید ہوگا۔

درخواست جمع کرنا

بہت اچھا، سرورز ہیں، ایک ایپلیکیشن ہے - بس اسے جمع کرنا اور اسے شائع کرنا باقی ہے۔ تعمیر کے لیے ہم عام ڈوکر بلڈ استعمال کریں گے، لیکن امیج اسٹوریج کے طور پر ہم Yandex - کنٹینر رجسٹری کی سروس استعمال کریں گے۔ لیکن سب سے پہلے چیزیں.

ہم ایپلیکیشن کو بلڈ مشین میں کاپی کرتے ہیں، ssh کے ذریعے لاگ ان کرتے ہیں اور امیج کو جمع کرتے ہیں:

vozerov@mba:~/events/terraform (master) $ cd ..
vozerov@mba:~/events (master) $ rsync -av app/ [email protected]:app/

... skipped ...

sent 3849 bytes  received 70 bytes  7838.00 bytes/sec
total size is 3644  speedup is 0.93

vozerov@mba:~/events (master) $ ssh 84.201.132.3 -l ubuntu
ubuntu@build:~$ cd app
ubuntu@build:~/app$ sudo docker build -t app .
Sending build context to Docker daemon  6.144kB
Step 1/9 : FROM golang:latest AS build
... skipped ...

Successfully built 9760afd8ef65
Successfully tagged app:latest

آدھی جنگ ہو چکی ہے - اب ہم اپنی ایپلیکیشن کو لانچ کرکے اور کافکا کو بھیج کر اس کی فعالیت کو چیک کر سکتے ہیں:

ubuntu@build:~/app$ sudo docker run --name app -d -p 8080:8080 app /app/app -kafka=kafka.ru-central1.internal:9092</code>

С локальной машинки можно отправить тестовый event и посмотреть на ответ:

<code>vozerov@mba:~/events (master) $ curl -D - -s -X POST -d '{"key1":"data1"}' http://84.201.132.3:8080/post
HTTP/1.1 200 OK
Content-Type: application/json
Date: Mon, 13 Apr 2020 13:53:54 GMT
Content-Length: 41

{"status":"ok","partition":0,"Offset":0}
vozerov@mba:~/events (master) $

درخواست نے ریکارڈنگ کی کامیابی کے ساتھ جواب دیا اور پارٹیشن اور آفسیٹ کی شناخت کی نشاندہی کی جس میں پیغام شامل تھا۔ صرف Yandex.Cloud میں ایک رجسٹری بنانا اور وہاں اپنی تصویر اپ لوڈ کرنا باقی ہے (یہ تین لائنوں کا استعمال کرتے ہوئے کیسے کیا جائے یہ registry.tf فائل میں بیان کیا گیا ہے)۔ اسٹوریج بنائیں:

vozerov@mba:~/events/terraform (master) $ terraform apply -target yandex_container_registry.events

... skipped ...

Plan: 1 to add, 0 to change, 0 to destroy.

... skipped ...

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

کنٹینر رجسٹری میں تصدیق کرنے کے کئی طریقے ہیں - ایک oauth ٹوکن، iam ٹوکن، یا سروس اکاؤنٹ کی کلید کا استعمال کرتے ہوئے۔ ان طریقوں کے بارے میں مزید تفصیلات دستاویزات میں مل سکتی ہیں۔ https://cloud.yandex.ru/docs/container-registry/operations/authentication. ہم سروس اکاؤنٹ کی کلید استعمال کریں گے، لہذا ہم ایک اکاؤنٹ بنائیں گے:

vozerov@mba:~/events/terraform (master) $ terraform apply -target yandex_iam_service_account.docker -target yandex_resourcemanager_folder_iam_binding.puller -target yandex_resourcemanager_folder_iam_binding.pusher

... skipped ...

Apply complete! Resources: 3 added, 0 changed, 0 destroyed.

اب صرف اس کے لیے ایک کلید بنانا باقی ہے:

vozerov@mba:~/events/terraform (master) $ yc iam key create --service-account-name docker -o key.json
id: ajej8a06kdfbehbrh91p
service_account_id: ajep6d38k895srp9osij
created_at: "2020-04-13T14:00:30Z"
key_algorithm: RSA_2048

ہمیں اپنے اسٹوریج کی آئی ڈی کے بارے میں معلومات موصول ہوتی ہیں، کلید کو منتقل کرتے ہیں اور لاگ ان ہوتے ہیں:

vozerov@mba:~/events/terraform (master) $ scp key.json [email protected]:
key.json                                                                                                                    100% 2392   215.1KB/s   00:00

vozerov@mba:~/events/terraform (master) $ ssh 84.201.132.3 -l ubuntu

ubuntu@build:~$ cat key.json | sudo docker login --username json_key --password-stdin cr.yandex
WARNING! Your password will be stored unencrypted in /home/ubuntu/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
ubuntu@build:~$

تصویر کو رجسٹری میں اپ لوڈ کرنے کے لیے، ہمیں کنٹینر رجسٹری آئی ڈی کی ضرورت ہے، ہم اسے yc یوٹیلیٹی سے لیتے ہیں:

vozerov@mba:~ $ yc container registry get events
id: crpdgj6c9umdhgaqjfmm
folder_id:
name: events
status: ACTIVE
created_at: "2020-04-13T13:56:41.914Z"

اس کے بعد، ہم اپنی تصویر کو ایک نئے نام سے ٹیگ کرتے ہیں اور اپ لوڈ کرتے ہیں:

ubuntu@build:~$ sudo docker tag app cr.yandex/crpdgj6c9umdhgaqjfmm/events:v1
ubuntu@build:~$ sudo docker push cr.yandex/crpdgj6c9umdhgaqjfmm/events:v1
The push refers to repository [cr.yandex/crpdgj6c9umdhgaqjfmm/events]
8c286e154c6e: Pushed
477c318b05cb: Pushed
beee9f30bc1f: Pushed
v1: digest: sha256:1dd5aaa9dbdde2f60d833be0bed1c352724be3ea3158bcac3cdee41d47c5e380 size: 946

ہم تصدیق کر سکتے ہیں کہ تصویر کامیابی سے لوڈ ہو گئی ہے:

vozerov@mba:~/events/terraform (master) $ yc container repository list
+----------------------+-----------------------------+
|          ID          |            NAME             |
+----------------------+-----------------------------+
| crpe8mqtrgmuq07accvn | crpdgj6c9umdhgaqjfmm/events |
+----------------------+-----------------------------+

ویسے، اگر آپ لینکس مشین پر yc یوٹیلیٹی انسٹال کرتے ہیں، تو آپ کمانڈ استعمال کر سکتے ہیں۔

yc container registry configure-docker

ڈوکر کو ترتیب دینے کے لیے۔

حاصل يہ ہوا

ہم نے بہت محنت کی ہے اور اس کے نتیجے میں:

  1. ہم اپنی مستقبل کی خدمت کے فن تعمیر کے ساتھ آئے ہیں۔
  2. ہم نے گولانگ میں ایک درخواست لکھی جو ہماری کاروباری منطق کو نافذ کرتی ہے۔
  3. ہم نے اسے اکٹھا کیا اور نجی کنٹینر رجسٹری میں ڈال دیا۔

اگلے حصے میں، ہم دلچسپ چیزوں کی طرف بڑھیں گے - ہم اپنی ایپلیکیشن کو پروڈکشن میں ریلیز کریں گے اور آخر میں اس پر لوڈ شروع کریں گے۔ سوئچ مت کرو!

یہ مواد کھلی ورکشاپ REBRAIN & Yandex.Cloud کی ویڈیو ریکارڈنگ میں ہے: ہم Yandex Cloud پر فی سیکنڈ 10 درخواستیں قبول کرتے ہیں۔ https://youtu.be/cZLezUm0ekE

اگر آپ اس طرح کے پروگراموں میں آن لائن شرکت کرنے اور حقیقی وقت میں سوالات پوچھنے میں دلچسپی رکھتے ہیں، تو رابطہ کریں۔ REBRAIN کے ذریعے چینل DevOps.

ہم Yandex.Cloud کا خصوصی شکریہ کہنا چاہیں گے کہ اس طرح کی تقریب کی میزبانی کرنے کا موقع ملا۔ ان سے لنک - https://cloud.yandex.ru/prices

اگر آپ کو کلاؤڈ پر جانے کی ضرورت ہے یا آپ کے بنیادی ڈھانچے کے بارے میں سوالات ہیں، ایک درخواست چھوڑنے کے لئے آزاد محسوس کریں.

PS ہمارے پاس ہر ماہ 2 مفت آڈٹ ہوتے ہیں، شاید آپ کا پروجیکٹ ان میں سے ایک ہو۔

ماخذ: www.habr.com

نیا تبصرہ شامل کریں