Netramesh - lightweight خدمت mesh حل

جيئن ته اسان هڪ واحد ايپليڪيشن کان هڪ microservices آرڪيٽيڪچر ڏانهن منتقل ڪريون ٿا، اسان کي نئين چئلينج کي منهن ڏيڻو پوي ٿو.

هڪ واحد ايپليڪيشن ۾، عام طور تي اهو طئي ڪرڻ بلڪل آسان آهي ته سسٽم جي ڪهڙي حصي ۾ غلطي ٿي. گهڻو ڪري، مسئلو پاڻ کي monolith جي ڪوڊ ۾ آهي، يا ڊيٽابيس ۾. پر جڏهن اسان هڪ microservice فن تعمير ۾ هڪ مسئلو ڳولڻ شروع ڪيو، هر شيء هاڻي واضح ناهي. اسان کي اهو سڄو رستو ڳولڻو پوندو جيڪو درخواست شروع کان ختم ٿيڻ تائين ورتو ۽ ان کي سوين مائڪرو سروسز مان چونڊيو. ان کان علاوه، انهن مان ڪيترن ئي وٽ پڻ پنهنجون اسٽوريج سهولتون آهن، جيڪي پڻ منطقي غلطيون ڪري سگهن ٿيون، انهي سان گڏ ڪارڪردگي ۽ غلطي رواداري سان مسئلا.

Netramesh - lightweight خدمت mesh حل

مان هڪ ڊگهي وقت تائين هڪ اوزار ڳولي رهيو آهيان جيڪو اهڙن مسئلن کي منهن ڏيڻ ۾ مدد ڪري سگهي ٿو (مون هن بابت لکيو آهي Habré: 1, 2)، پر آخر ۾ مون پنهنجو اوپن سورس حل ڪيو. هن آرٽيڪل ۾ آئون خدمت جي ميش جي فائدن جي باري ۾ ڳالهائيندس ۽ ان تي عمل ڪرڻ لاء هڪ نئون اوزار حصيداري ڪريو.

ورهايل ٽريڪنگ ورهايل سسٽم ۾ غلطيون ڳولڻ جي مسئلي جو هڪ عام حل آهي. پر ڇا ٿيندو ته نيٽ ورڪ رابطي جي باري ۾ معلومات گڏ ڪرڻ جو طريقو اڃا تائين سسٽم ۾ لاڳو نه ڪيو ويو آهي، يا، بدترين، سسٽم جي حصي ۾ اهو اڳ ۾ ئي صحيح ڪم ڪري ٿو، پر جزوي طور تي اهو ناهي، ڇاڪاڻ ته اهو پراڻي خدمتن ۾ شامل نه ڪيو ويو آهي. ؟ ڪنهن مسئلي جي اصلي سبب کي طئي ڪرڻ لاء، اهو ضروري آهي ته سسٽم ۾ ڇا ٿي رهيو آهي جي مڪمل تصوير هجي. اهو خاص طور تي سمجهڻ ضروري آهي ته ڪهڙيون مائڪرو سروسز اهم ڪاروباري-نازڪ رستن ۾ شامل آهن.

هتي سروس ميش جو طريقو اسان جي مدد لاءِ اچي سگهي ٿو، جيڪو نيٽ ورڪ جي معلومات گڏ ڪرڻ لاءِ سڀني مشينري سان ڊيل ڪندو، ان سطح تي جيڪي پاڻ هلائي رهيا آهن انهن کان گهٽ سطح تي. اهو طريقو اسان کي اجازت ڏئي ٿو ته سڀني ٽرئفڪ کي روڪيو ۽ ان کي اڏام تي تجزيو ڪيو. ان کان علاوه، ايپليڪيشنن کي ان بابت ڪجھ به ڄاڻڻ جي ضرورت ناهي.

خدمت جو طريقو

سروس ميش جي نقطي جو بنيادي خيال نيٽ ورڪ تي هڪ ٻيو انفراسٽرڪچر پرت شامل ڪرڻ آهي، جيڪو اسان کي ڪنهن به ڪم ڪرڻ جي اجازت ڏيندو بين الاقوامي رابطي سان. گهڻيون عملداريون هن ريت ڪم ڪن ٿيون: هڪ شفاف پراڪسي سان گڏ هڪ اضافي سائڊ ڪار ڪنٽينر هر مائڪرو سروس ۾ شامل ڪيو ويو آهي، جنهن جي ذريعي خدمت جي سڀني ايندڙ ۽ ٻاهرئين ٽرئفڪ کي منظور ڪيو ويندو آهي. ۽ اهو ئي جڳهه آهي جتي اسان ڪلائنٽ بيلنس ڪري سگهون ٿا، حفاظتي پاليسين لاڳو ڪري سگهون ٿا، درخواستن جي تعداد تي پابنديون لاڳو ڪري سگهون ٿا ۽ پيداوار ۾ خدمتن جي رابطي تي اهم معلومات گڏ ڪري سگهون ٿا.

Netramesh - lightweight خدمت mesh حل

حل

هن طريقي جي ڪيترن ئي عملن تي اڳ ۾ ئي موجود آهن: استيو и linkerd2. اهي باڪس مان تمام گهڻيون خاصيتون مهيا ڪن ٿيون. پر ساڳئي وقت، وسيلن تي هڪ وڏو مٿي اچي ٿو. ان کان علاوه، وڏو ڪلستر جنهن ۾ اهڙي سسٽم هلندي، نئين انفراسٽرڪچر کي برقرار رکڻ لاء وڌيڪ وسيلن جي ضرورت پوندي. Avito تي، اسان ڪبرنيٽس ڪلسٽرز کي هلائيندا آهيون جيڪي هزارين سروس مثالن تي مشتمل آهن (۽ انهن جو تعداد تيزي سان وڌي رهيو آهي). ان جي موجوده عمل ۾، Istio استعمال ڪري ٿو ~ 300Mb رام جو في خدمت مثال. امڪانن جي وڏي تعداد جي ڪري، شفاف توازن پڻ خدمتن جي مجموعي جوابي وقت کي متاثر ڪري ٿو (10ms تائين).

نتيجي طور، اسان ڏٺو ته اسان کي هن وقت ڪهڙين صلاحيتن جي ضرورت آهي، ۽ فيصلو ڪيو ته اسان اهڙن حلن کي لاڳو ڪرڻ جو بنيادي سبب سڄي سسٽم مان شفاف معلومات گڏ ڪرڻ جي صلاحيت هئي. اسان پڻ چاهيون ٿا ته خدمتن جي رابطي تي ڪنٽرول رکون ۽ هيڊرن سان مختلف ڌانڌليون ڪيون جيڪي خدمتن جي وچ ۾ منتقل ڪيا ويا آهن.

نتيجي طور، اسان اسان جي فيصلي تي آيا:  نيترميش.

نيترميش

نيترميش سسٽم ۾ خدمتن جي تعداد کان سواء، لامحدود پيماني تي ماپ ڪرڻ جي صلاحيت سان هڪ هلڪو وزن سروس ميش حل آهي.

نئين حل جا بنيادي مقصد گهٽ وسيلن جي مٿي ۽ اعلي ڪارڪردگي هئا. مکيه خصوصيتن مان، اسان فوري طور تي اسان جي جيجر سسٽم کي شفاف طور تي ٽريڪنگ اسپن موڪلڻ جي قابل ٿي چاهيو.

اڄ، اڪثر بادل حل گولانگ ۾ لاڳو ڪيا ويا آهن. ۽، يقينا، اتي هن لاء سبب آهن. Golang ۾ نيٽ ورڪ ايپليڪيشنون لکڻ جيڪي I/O سان هم وقت سازي سان ڪم ڪن ٿيون ۽ ضرورت مطابق ڪور جي سطح تي ماپڻ آسان ۽ بلڪل سادو آهي. ۽، جيڪو پڻ تمام ضروري آهي، ڪارڪردگي هن مسئلي کي حل ڪرڻ لاء ڪافي آهي. ان ڪري اسان به گولانگ جي چونڊ ڪئي.

پيداوار

اسان پنهنجي ڪوششن کي وڌ کان وڌ پيداوار حاصل ڪرڻ تي مرکوز ڪيو آهي. هڪ حل لاءِ جيڪو خدمت جي هر مثال جي اڳيان لڳايو ويو آهي، رام ۽ سي پي يو وقت جو هڪ ننڍڙو استعمال گهربل آهي. ۽، يقينا، جواب جي دير پڻ ننڍي هجڻ گهرجي.

اچو ته ڏسون ته ڪهڙا نتيجا مليا.

رام

Netramesh استعمال ڪري ٿو ~ 10Mb بغير ٽرئفڪ جي ۽ 50Mb وڌ ۾ وڌ لوڊ ڪري ٿو 10000 RPS في مثال تائين.

Istio envoy proxy اسان جي ڪلسٽرن ۾ ھزارين مثالن سان ھميشه ~300Mb استعمال ڪري ٿو. اهو اجازت نٿو ڏئي ته ان کي پوري ڪلستر تائين اسڪيل ڪيو وڃي.

Netramesh - lightweight خدمت mesh حل

Netramesh - lightweight خدمت mesh حل

Netramesh سان اسان حاصل ڪيو ~ 10x ياداشت جي استعمال ۾ گهٽتائي.

سي پي يو

سي پي يو استعمال نسبتا برابر آهي لوڊ هيٺ. اهو منحصر آهي درخواستن جي تعداد تي في يونٽ وقت جي سائڊ ڪار ڏانهن. قيمتون 3000 درخواستون في سيڪنڊ تي چوٽي تي:

Netramesh - lightweight خدمت mesh حل

Netramesh - lightweight خدمت mesh حل

اتي هڪ وڌيڪ اهم نقطو آهي: Netramesh - هڪ ڪنٽرول جهاز کان سواء هڪ حل ۽ لوڊ کان سواء CPU وقت استعمال نه ڪندو آھي. Istio سان، سائڊ ڪارز هميشه سروس جي آخري پوائنٽ کي اپڊيٽ ڪندا آهن. نتيجي طور، اسان هن تصوير کي بغير لوڊ ڏسي سگهون ٿا:

Netramesh - lightweight خدمت mesh حل

اسان استعمال ڪندا آهيون HTTP/1 خدمتن جي وچ ۾ رابطي لاءِ. Istio لاءِ جوابي وقت ۾ اضافو ٿيو جڏهن نمائندي ذريعي پراڪسي ڪندي 5-10ms تائين هئي، جيڪا انهن خدمتن لاءِ ڪافي آهي جيڪي هڪ ملي سيڪنڊ ۾ جواب ڏيڻ لاءِ تيار آهن. Netramesh سان هن وقت 0.5-2ms تائين گھٽجي ويو آهي.

اسڪاليبلٽي

هر پراکسي طرفان استعمال ڪيل وسيلن جو ننڍڙو مقدار ان کي هر خدمت جي اڳيان رکڻ ممڪن بڻائي ٿو. Netramesh ارادي طور تي ٺاهيو ويو بغير ڪنٽرول جهاز جي جزو کان سواءِ هر سائڊ ڪار کي هلڪو وزن رکڻ لاءِ. گهڻو ڪري سروس ميش حلن ۾، ڪنٽرول جهاز هر سائڊ ڪار کي سروس دريافت جي معلومات کي ورهائي ٿو. ان سان گڏ ٽائيم آئوٽ ۽ بيلنسنگ سيٽنگن بابت معلومات اچي ٿي. هي سڀ توهان کي تمام گهڻيون مفيد شيون ڪرڻ جي اجازت ڏئي ٿو، پر، بدقسمتي سان، اهو سائڊ ڪارن کي سائيز ۾ ڦٽو ڪري ٿو.

سروس دريافت

Netramesh - lightweight خدمت mesh حل

Netramesh خدمت جي دريافت لاء ڪو به اضافي ميڪانيزم شامل نٿو ڪري. سموري ٽريفڪ نيترا سائڊ ڪار ذريعي شفاف طريقي سان هلي ٿي.

Netramesh سپورٽ ڪري ٿو HTTP/1 ايپليڪيشن پروٽوڪول. ان کي بيان ڪرڻ لاء، بندرگاهن جي ترتيب واري فهرست استعمال ڪئي وئي آهي. عام طور تي، سسٽم ۾ ڪيترائي بندرگاهن آهن جن جي ذريعي HTTP مواصلات ٿئي ٿي. مثال طور، اسين استعمال ڪريون ٿا 80, 8890, 8080 خدمتن ۽ خارجي درخواستن جي وچ ۾ رابطي لاءِ. هن صورت ۾، اهي هڪ ماحولياتي متغير استعمال ڪندي سيٽ ڪري سگهجن ٿيون. NETRA_HTTP_PORTS.

جيڪڏھن توھان Kubernetes استعمال ڪندا آھيو آرڪيسٽرٽر جي طور تي ۽ ان جي سروس ائنٽي ميکانيزم لاءِ انٽرا ڪلسٽر ڪميونيڪيشن لاءِ سروسز جي وچ ۾، پوءِ ميکانيزم بلڪل ساڳيو رھندو. پهريون، microservice kube-dns استعمال ڪندي هڪ خدمت IP پتو حاصل ڪري ٿو ۽ ان لاءِ هڪ نئون ڪنيڪشن کولي ٿو. اهو ڪنيڪشن پهريون ڀيرو مقامي نيٽرا سائڊ ڪار سان قائم ڪيو ويو آهي ۽ سڀ TCP پيڪيٽ شروعاتي طور تي نيٽرا تي پهچندا آهن. اڳيون، netra-sidecar اصل منزل سان تعلق قائم ڪري ٿو. نوڊ تي پوڊ IP تي NAT بلڪل ائين ئي رهي ٿو جيئن نيٽرا کان سواءِ.

ورهايل ٽريڪنگ ۽ حوالي سان اڳتي وڌڻ

Netramesh ڪارڪردگي مهيا ڪري ٿو جيڪو HTTP رابطي بابت ٽريڪنگ اسپن موڪلڻ لاءِ گهربل آهي. Netra-sidecar HTTP پروٽوڪول کي پارس ڪري ٿو، دير جي درخواستن کي ماپ ڪري ٿو، ۽ HTTP هيڊرز مان ضروري معلومات ڪڍي ٿو. آخرڪار، اسان هڪ واحد جيجر سسٽم ۾ سڀئي نشان حاصل ڪندا آهيون. نفيس ڪنفيگريشن لاءِ، توھان پڻ استعمال ڪري سگھوٿا ماحوليات جي متغير کي سرڪاري لائبريري پاران مهيا ڪيل jaeger go لائبريري.

Netramesh - lightweight خدمت mesh حل

Netramesh - lightweight خدمت mesh حل

پر اتي هڪ مسئلو آهي. جيستائين خدمتون هڪ خاص اوبر هيڊر ٺاهي ۽ موڪليندا، اسان سسٽم ۾ ڳنڍيل ٽريڪنگ اسپن نه ڏسندا. ۽ اھو اھو آھي جيڪو اسان کي جلدي مسئلن جو سبب ڳولڻ جي ضرورت آھي. هتي وري Netramesh هڪ حل آهي. پراڪسز HTTP هيڊر پڙهن ٿا ۽، جيڪڏهن انهن ۾ uber ٽريڪ id شامل نه آهي، هڪ ٺاهي. Netramesh هڪ سائڊ ڪار ۾ ايندڙ ۽ ٻاهر نڪرڻ واري درخواستن بابت معلومات پڻ محفوظ ڪري ٿو ۽ انهن کي گهربل ٻاهر نڪرڻ واري درخواست جي هيڊرن سان گڏ ڪري ٿو. خدمتن ۾ توهان کي صرف هڪ هيڊر موڪلڻ جي ضرورت آهي X-Request-Id، جنهن کي ماحوليات جي متغير استعمال ڪندي ترتيب ڏئي سگهجي ٿو NETRA_HTTP_REQUEST_ID_HEADER_NAME. Netramesh ۾ تناظر جي سائيز کي ڪنٽرول ڪرڻ لاء، توھان ھيٺ ڏنل ماحوليات کي سيٽ ڪري سگھو ٿا: NETRA_TRACING_CONTEXT_EXPIRATION_MILLISECONDS (اهو وقت جنهن لاءِ حوالو محفوظ ڪيو ويندو) ۽ NETRA_TRACING_CONTEXT_CLEANUP_INTERVAL (سعودي جي صفائي جي تعدد).

اهو پڻ ممڪن آهي ته توهان جي سسٽم تي ڪيترن ئي رستن کي گڏ ڪري انهن کي خاص سيشن ٽوڪن سان نشان لڳايو. Netra توهان کي انسٽال ڪرڻ جي اجازت ڏئي ٿو HTTP_HEADER_TAG_MAP HTTP هيڊرز کي لاڳاپيل ٽريڪنگ اسپن ٽيگ ۾ تبديل ڪرڻ لاءِ. اهو خاص طور تي جانچ لاء مفيد ٿي سگهي ٿو. فنڪشنل ٽيسٽ پاس ڪرڻ کان پوء، توهان ڏسي سگهو ٿا ته سسٽم جو ڪهڙو حصو متاثر ڪيو ويو فلٽر ڪرڻ سان لاڳاپيل سيشن ڪيچ.

درخواست جو ذريعو طئي ڪرڻ

اهو طئي ڪرڻ لاءِ ته درخواست ڪٿان آئي آهي، توهان استعمال ڪري سگهو ٿا ڪارڪردگي خودڪار طريقي سان هڪ هيڊر شامل ڪرڻ جو ذريعو سان. ماحولياتي متغير استعمال ڪندي NETRA_HTTP_X_SOURCE_HEADER_NAME توھان وضاحت ڪري سگھوٿا ھڪڙو مٿو نالو جيڪو خودڪار طور تي نصب ڪيو ويندو. استعمال ڪندي NETRA_HTTP_X_SOURCE_VALUE توھان قيمت مقرر ڪري سگھو ٿا جنھن تي X-Source header مقرر ڪيو ويندو سڀني ٻاھرين درخواستن لاءِ.

هي هن مفيد هيڊر جي ورڇ جي اجازت ڏئي ٿو ته سڄي نيٽ ورڪ ۾ هڪجهڙائي سان ورهايو وڃي. پوء توھان ان کي استعمال ڪري سگھوٿا خدمتن ۾ ۽ ان کي لاگ ۽ ميٽرڪس ۾ شامل ڪريو.

ٽريفڪ جي رستي ۽ Netramesh اندروني

Netramesh ٻن مکيه حصن تي مشتمل آهي. پهريون، netra-init، ٽريفڪ کي روڪڻ لاءِ نيٽ ورڪ ضابطا مقرر ڪري ٿو. هو استعمال ڪري ٿو iptables redirect قاعدا سائڊ ڪار تي ٽريفڪ جو سڄو يا حصو روڪڻ لاءِ، جيڪو نيٽرامش جو ٻيو مکيه حصو آهي. توھان ترتيب ڪري سگھوٿا ڪھڙي بندرگاھ کي ايندڙ ۽ نڪرڻ واري TCP سيشن لاءِ مداخلت ڪرڻ جي ضرورت آھي: INBOUND_INTERCEPT_PORTS, OUTBOUND_INTERCEPT_PORTS.

اوزار پڻ هڪ دلچسپ خصوصيت آهي - امڪاني رستو. جيڪڏهن توهان استعمال ڪريو ٿا Netramesh خاص طور تي ٽريڪنگ اسپن کي گڏ ڪرڻ لاءِ، ته پوءِ پيداواري ماحول ۾ توهان وسيلن کي بچائي سگهو ٿا ۽ متغير استعمال ڪندي امڪاني روٽنگ کي فعال ڪري سگهو ٿا. NETRA_INBOUND_PROBABILITY и NETRA_OUTBOUND_PROBABILITY (0 کان 1 تائين). ڊفالٽ قيمت 1 آهي (سڀ ٽرئفڪ کي روڪيو ويو آهي).

ڪامياب مداخلت کان پوء، نيٽرا سائڊ ڪار نئين ڪنيڪشن کي قبول ڪري ٿو ۽ استعمال ڪري ٿو SO_ORIGINAL_DST اصل منزل حاصل ڪرڻ لاء ساکٽ آپشن. Netra پوءِ اصل IP پتي تي نئون ڪنيڪشن کوليندو آهي ۽ پارٽين جي وچ ۾ ٻه طرفي TCP ڪميونيڪيشن قائم ڪري ٿو، جتان گذرندڙ سموري ٽرئفڪ کي ٻڌي ٿو. جيڪڏهن پورٽ کي HTTP جي طور تي بيان ڪيو ويو آهي، نيٽرا ان کي پارس ڪرڻ ۽ ان کي ٽريڪ ڪرڻ جي ڪوشش ڪري ٿو. جيڪڏهن HTTP parsing ناڪام ٿئي ٿي، Netra واپس TCP ڏانهن پوي ٿو ۽ شفاف طور تي بائٽس کي پروڪس ڪري ٿو.

هڪ انحصار گراف جي تعمير

Jaeger ۾ ٽريڪنگ جي معلومات جي وڏي مقدار حاصل ڪرڻ کان پوء، مان سسٽم ۾ رابطي جو مڪمل گراف حاصل ڪرڻ چاهيان ٿو. پر جيڪڏهن توهان جو سسٽم ڪافي لوڊ ٿيل آهي ۽ اربين ٽريڪنگ اسپن روزانه گڏ ٿين ٿا، انهن کي گڏ ڪرڻ ايترو آسان ڪم نه هوندو. اهو ڪرڻ لاء هڪ سرڪاري طريقو آهي: چمڪندڙ انحصار. بهرحال، اهو مڪمل گراف ٺاهڻ ۾ ڪلاڪ لڳندو ۽ توهان کي گذريل 24 ڪلاڪن لاءِ Jaeger کان سڄو ڊيٽا سيٽ ڊائون لوڊ ڪرڻ تي مجبور ڪندو.

جيڪڏهن توهان استعمال ڪري رهيا آهيو Elasticsearch ٽريڪنگ اسپن کي ذخيرو ڪرڻ لاءِ، توهان استعمال ڪري سگهو ٿا هڪ سادي Golang افاديت، جيڪو Elasticsearch جي خاصيتن ۽ صلاحيتن کي استعمال ڪندي منٽن ۾ ساڳيو گراف ٺاهيندو.

Netramesh - lightweight خدمت mesh حل

Netramesh ڪيئن استعمال ڪجي

نيٽرا آساني سان ڪنهن به آرڪيسٽرٽر کي هلائيندڙ ڪنهن به خدمت ۾ شامل ڪري سگهجي ٿو. توھان ھڪڙو مثال ڏسي سگھو ٿا هتي.

هن وقت، نيٽرا وٽ خود بخود سائڊ ڪارز کي سروسز تي لاڳو ڪرڻ جي صلاحيت ناهي، پر عملدرآمد لاء منصوبا آهن.

Netramesh جو مستقبل

بنيادي مقصد نيترميش گھٽ ۾ گھٽ وسيلن جي قيمتن ۽ اعلي ڪارڪردگي حاصل ڪرڻ لاء، بنيادي صلاحيتون مهيا ڪرڻ ۽ بين الاقوامي خدمت مواصلات جي ڪنٽرول لاء.

مستقبل ۾، Netramesh HTTP کان علاوه ٻين ايپليڪيشن ليئر پروٽوڪول جي مدد ڪندو. L7 روٽنگ ويجهي مستقبل ۾ دستياب ٿي ويندي.

استعمال ڪريو Netramesh جيڪڏھن توھان ساڳين مسئلن کي منهن ڏيو ۽ اسان کي سوالن ۽ تجويزن سان لکو.

جو ذريعو: www.habr.com

تبصرو شامل ڪريو