Netramesh - engil xizmat ko'rsatish to'r yechimi

Monolit dasturdan mikroservislar arxitekturasiga o'tayotganimizda biz yangi muammolarga duch kelamiz.

Monolitik dasturda, odatda, tizimning qaysi qismida xatolik yuz berganligini aniqlash juda oson. Ehtimol, muammo monolitning kodida yoki ma'lumotlar bazasida. Ammo biz mikroservis arxitekturasida muammo qidira boshlaganimizda, hamma narsa endi aniq bo'lmaydi. Biz so'rov boshidan oxirigacha bo'lgan butun yo'lni topishimiz va uni yuzlab mikroservislar orasidan tanlashimiz kerak. Bundan tashqari, ularning ko'pchiligida o'z saqlash joylari mavjud bo'lib, ular mantiqiy xatolarga olib kelishi mumkin, shuningdek, ishlash va xatolarga chidamlilik bilan bog'liq muammolarga olib kelishi mumkin.

Netramesh - engil xizmat ko'rsatish to'r yechimi

Men uzoq vaqtdan beri bunday muammolarni engishga yordam beradigan vositani izlayapman (men bu haqda Habré-da yozganman: 1, 2), lekin oxirida men o'zimning ochiq manba echimimni yaratdim. Ushbu maqolada men xizmat mesh yondashuvining afzalliklari haqida gapiraman va uni amalga oshirish uchun yangi vositani baham ko'raman.

Taqsimlangan kuzatuv taqsimlangan tizimlardagi xatolarni topish muammosining umumiy yechimidir. Ammo, agar tarmoqdagi o'zaro ta'sirlar haqida ma'lumot to'plashning ushbu yondashuvi tizimda hali joriy etilmagan bo'lsa yoki undan ham yomoni, tizimning bir qismida u allaqachon to'g'ri ishlasa-da, lekin qisman ishlamasa-chi, chunki u eski xizmatlarga qo'shilmagan. ? Muammoning aniq ildiz sababini aniqlash uchun tizimda nima sodir bo'layotgani haqida to'liq tasavvurga ega bo'lish kerak. Qaysi mikroservislar biznesning muhim yo'llarida ishtirok etishini tushunish ayniqsa muhimdir.

Bu erda xizmat ko'rsatish tarmog'i yondashuvi yordamimizga kelishi mumkin, bu tarmoq ma'lumotlarini yig'ish uchun barcha mexanizmlar bilan xizmatlarning o'zi ishlayotganidan pastroq darajada ishlaydi. Ushbu yondashuv bizga barcha trafikni ushlab turish va uni tezda tahlil qilish imkonini beradi. Bundan tashqari, ilovalar bu haqda hech narsa bilishlari shart emas.

Xizmat mesh yondashuvi

Xizmat mesh yondashuvining asosiy g'oyasi tarmoq orqali boshqa infratuzilma qatlamini qo'shishdan iborat bo'lib, u bizga xizmatlararo o'zaro aloqada har qanday narsani qilish imkonini beradi. Aksariyat ilovalar quyidagicha ishlaydi: har bir mikroservisga shaffof proksi-serverga ega bo'lgan qo'shimcha yonbosh konteyneri qo'shiladi, u orqali xizmatning barcha kiruvchi va chiquvchi trafiklari o'tkaziladi. Aynan shu joy biz mijozlarni muvozanatlash, xavfsizlik siyosatini qo'llash, so'rovlar soniga cheklovlar qo'yish va xizmatlarning ishlab chiqarishdagi o'zaro ta'siri haqida muhim ma'lumotlarni to'plashimiz mumkin.

Netramesh - engil xizmat ko'rsatish to'r yechimi

Yechimlar

Ushbu yondashuvning bir nechta ilovalari allaqachon mavjud: Istio и linkerd2. Ular qutidan tashqarida juda ko'p xususiyatlarni taqdim etadi. Ammo shu bilan birga, resurslarga katta yuk tushadi. Bundan tashqari, bunday tizim ishlaydigan klaster qanchalik katta bo'lsa, yangi infratuzilmani saqlash uchun ko'proq resurslar talab qilinadi. Avito-da biz minglab xizmat ko'rsatish nusxalarini o'z ichiga olgan kubernetlar klasterlarini ishlatamiz (va ularning soni tez sur'atlar bilan o'sishda davom etmoqda). Joriy tatbiqida Istio har bir xizmat namunasi uchun ~ 300 Mb RAM iste'mol qiladi. Imkoniyatlarning ko'pligi tufayli shaffof balanslash xizmatlarning umumiy javob vaqtiga ham ta'sir qiladi (10 ms gacha).

Natijada, biz aynan qanday imkoniyatlarga muhtoj ekanligimizni ko'rib chiqdik va bunday echimlarni amalga oshirishni boshlaganimizning asosiy sababi butun tizimdan kuzatuv ma'lumotlarini shaffof tarzda to'plash qobiliyati deb qaror qildik. Shuningdek, biz xizmatlarning o'zaro ta'sirini nazorat qilishni va xizmatlar o'rtasida uzatiladigan sarlavhalar bilan turli xil manipulyatsiyalarni qilishni xohladik.

Natijada biz shunday qarorga keldik:  Netramesh.

Netramesh

Netramesh tizimdagi xizmatlar sonidan qat'iy nazar cheksiz o'lchov qobiliyatiga ega bo'lgan engil xizmat ko'rsatish tarmog'i yechimidir.

Yangi yechimning asosiy maqsadlari kam resurs xarajatlari va yuqori samaradorlik edi. Asosiy xususiyatlardan biz darhol Jaeger tizimimizga kuzatuv oralig'ini shaffof tarzda yuborishni xohladik.

Bugungi kunda bulutli echimlarning aksariyati Golangda amalga oshirilmoqda. Va, albatta, buning sabablari bor. Golang-da kiritish-chiqarish bilan asinxron ishlaydigan va kerak bo'lganda yadrolar bo'ylab miqyosda ishlaydigan tarmoq ilovalarini yozish qulay va juda oddiy. Va eng muhimi, bu muammoni hal qilish uchun ishlash etarli. Shuning uchun biz ham Golangni tanladik.

unumdorlik

Biz sa'y-harakatlarimizni maksimal mahsuldorlikka erishishga qaratdik. Xizmatning har bir nusxasi yonida o'rnatiladigan yechim uchun RAM va protsessor vaqtining ozgina iste'moli talab qilinadi. Va, albatta, javob kechikishi ham kichik bo'lishi kerak.

Keling, qanday natijalarga erishganimizni ko'ramiz.

Ram

Netramesh trafiksiz ~ 10 Mb va har bir misol uchun 50 10000 RPS yuklamasi bilan maksimal XNUMX Mb sarflaydi.

Istio envoy proksi-server har doim minglab misollar bilan bizning klasterlarimizda ~ 300 Mb sarflaydi. Bu uni butun klasterga masshtablash imkonini bermaydi.

Netramesh - engil xizmat ko'rsatish to'r yechimi

Netramesh - engil xizmat ko'rsatish to'r yechimi

Netramesh yordamida biz xotira sarfini ~ 10 baravar kamaytirdik.

Markaziy protsessor

Protsessordan foydalanish yuk ostida nisbatan teng. Bu yon vagonga vaqt birligidagi so'rovlar soniga bog'liq. Eng yuqori nuqtada soniyada 3000 so'rov bo'lgan qiymatlar:

Netramesh - engil xizmat ko'rsatish to'r yechimi

Netramesh - engil xizmat ko'rsatish to'r yechimi

Yana bir muhim nuqta bor: Netramesh - boshqaruv tekisligisiz va yuksiz yechim CPU vaqtini sarflamaydi. Istio bilan yonboshlar har doim xizmat ko'rsatish nuqtalarini yangilaydi. Natijada biz ushbu rasmni yuklamasdan ko'rishimiz mumkin:

Netramesh - engil xizmat ko'rsatish to'r yechimi

Biz xizmatlar o'rtasidagi aloqa uchun HTTP/1 dan foydalanamiz. Elchi orqali proksi-server yuborishda Istio uchun javob vaqtining o'sishi 5-10 ms gacha bo'lgan, bu bir millisekundda javob berishga tayyor bo'lgan xizmatlar uchun juda ko'p. Netramesh bilan bu vaqt 0.5-2ms gacha kamaydi.

Miqyosi

Har bir proksi-server tomonidan iste'mol qilinadigan resurslarning kichik miqdori uni har bir xizmatning yonida joylashtirish imkonini beradi. Netramesh har bir yon aravachaning engil vaznini saqlab qolish uchun boshqaruv tekisligi komponentisiz ataylab yaratilgan. Ko'pincha xizmat ko'rsatish tarmog'i echimlarida boshqaruv tekisligi xizmatni aniqlash ma'lumotlarini har bir yon aravaga tarqatadi. U bilan birga vaqt tugashi va muvozanat sozlamalari haqida ma'lumot keladi. Bularning barchasi sizga juda ko'p foydali narsalarni qilish imkonini beradi, lekin, afsuski, bu kattalikdagi yonboshlarni shishiradi.

Xizmat kashfiyoti

Netramesh - engil xizmat ko'rsatish to'r yechimi

Netramesh xizmatlarni aniqlash uchun qo'shimcha mexanizmlarni qo'shmaydi. Barcha trafik shaffof tarzda netra sidecar orqali proksilangan.

Netramesh HTTP/1 dastur protokolini qo'llab-quvvatlaydi. Uni aniqlash uchun sozlanishi mumkin bo'lgan portlar ro'yxati ishlatiladi. Odatda tizimda HTTP aloqasi amalga oshiriladigan bir nechta portlar mavjud. Misol uchun, biz xizmatlar va tashqi so'rovlar o'rtasidagi o'zaro aloqa uchun 80, 8890, 8080 dan foydalanamiz.Bu holda, ular muhit o'zgaruvchisi yordamida o'rnatilishi mumkin. NETRA_HTTP_PORTS.

Agar siz Kubernetes-dan xizmatlar o'rtasida klaster ichidagi aloqa uchun orkestr va uning Xizmat ob'ekt mexanizmi sifatida foydalansangiz, mexanizm xuddi shunday bo'lib qoladi. Birinchidan, mikroservis kube-dns yordamida xizmat IP-manzilini oladi va unga yangi ulanishni ochadi. Bu ulanish birinchi navbatda mahalliy netra-sidecar bilan o'rnatiladi va barcha TCP paketlari dastlab netraga keladi. Keyinchalik, netra-sidecar asl manzil bilan aloqa o'rnatadi. Tugundagi pod IP-dagi NAT netrasiz bo'lgani kabi qoladi.

Tarqalgan kuzatish va kontekstni yo'naltirish

Netramesh HTTP o'zaro ta'sirlari haqida kuzatish oralig'ini yuborish uchun zarur bo'lgan funksiyalarni taqdim etadi. Netra-sidecar HTTP protokolini tahlil qiladi, so'rov kechikishlarini o'lchaydi va HTTP sarlavhalaridan kerakli ma'lumotlarni chiqaradi. Oxir-oqibat, biz yagona Jaeger tizimidagi barcha izlarni olamiz. Nozik konfiguratsiya uchun siz rasmiy kutubxona tomonidan taqdim etilgan muhit o'zgaruvchilaridan ham foydalanishingiz mumkin jaeger kutubxonasiga boring.

Netramesh - engil xizmat ko'rsatish to'r yechimi

Netramesh - engil xizmat ko'rsatish to'r yechimi

Lekin muammo bor. Xizmatlar maxsus uber sarlavhasini yaratmaguncha va yubormaguncha, biz tizimda ulangan kuzatuv oraliqlarini ko'rmaymiz. Va bu muammoning sababini tezda topishimiz kerak. Bu erda yana Netramesh yechimga ega. Proksi-serverlar HTTP sarlavhalarini o'qiydi va agar ularda uber trace identifikatori bo'lmasa, uni yarating. Netramesh, shuningdek, kiruvchi va chiquvchi so'rovlar haqidagi ma'lumotlarni yon vagonda saqlaydi va ularni kerakli chiquvchi so'rov sarlavhalari bilan boyitish orqali moslashtiradi. Xizmatlarda qilishingiz kerak bo'lgan yagona narsa - faqat bitta sarlavha yuborish X-Request-Id, bu muhit o'zgaruvchisi yordamida sozlanishi mumkin NETRA_HTTP_REQUEST_ID_HEADER_NAME. Netramesh-da kontekst hajmini boshqarish uchun siz quyidagi muhit o'zgaruvchilarini o'rnatishingiz mumkin: NETRA_TRACING_CONTEXT_EXPIRATION_MILLISECONDS (kontekst saqlanadigan vaqt) va NETRA_TRACING_CONTEXT_CLEANUP_INTERVAL (kontekstni tozalash chastotasi).

Shuningdek, tizimingizda bir nechta yo'llarni maxsus seans tokeni bilan belgilash orqali birlashtirish mumkin. Netra o'rnatish imkonini beradi HTTP_HEADER_TAG_MAP HTTP sarlavhalarini mos keladigan kuzatuv oralig'i teglariga aylantirish uchun. Bu, ayniqsa, sinov uchun foydali bo'lishi mumkin. Funktsional testdan o'tganingizdan so'ng, tegishli seans kaliti orqali filtrlash tizimning qaysi qismiga ta'sir qilganligini ko'rishingiz mumkin.

So'rov manbasini aniqlash

So'rov qayerdan kelganligini aniqlash uchun siz manba bilan avtomatik ravishda sarlavha qo'shish funksiyasidan foydalanishingiz mumkin. Atrof-muhit o'zgaruvchisidan foydalanish NETRA_HTTP_X_SOURCE_HEADER_NAME Siz avtomatik ravishda o'rnatiladigan sarlavha nomini belgilashingiz mumkin. Yordamida NETRA_HTTP_X_SOURCE_VALUE barcha chiquvchi so'rovlar uchun X-Source sarlavhasi o'rnatiladigan qiymatni o'rnatishingiz mumkin.

Bu ushbu foydali sarlavhani taqsimlashni butun tarmoq bo'ylab bir xilda taqsimlash imkonini beradi. Keyin uni xizmatlarda ishlatishingiz va jurnallar va ko'rsatkichlarga qo'shishingiz mumkin.

Trafik marshruti va Netramesh ichki qismlari

Netramesh ikkita asosiy komponentdan iborat. Birinchisi, netra-init, trafikni ushlab turish uchun tarmoq qoidalarini o'rnatadi. U foydalanadi iptables qayta yo'naltirish qoidalari Netrameshning ikkinchi asosiy komponenti bo'lgan yonbosh vagonda harakatning to'liq yoki bir qismini ushlab turish. Siz kiruvchi va chiquvchi TCP seanslari uchun qaysi portlar tutilishi kerakligini sozlashingiz mumkin: INBOUND_INTERCEPT_PORTS, OUTBOUND_INTERCEPT_PORTS.

Asbob shuningdek, qiziqarli xususiyatga ega - ehtimollik marshrutlash. Agar siz Netramesh-dan faqat kuzatuv oralig'ini yig'ish uchun foydalansangiz, ishlab chiqarish muhitida siz resurslarni tejashingiz va o'zgaruvchilar yordamida ehtimollik marshrutini yoqishingiz mumkin. NETRA_INBOUND_PROBABILITY и NETRA_OUTBOUND_PROBABILITY (0 dan 1 gacha). Standart qiymat 1 (barcha trafik to'xtatiladi).

Muvaffaqiyatli ushlashdan so'ng, netra sidecar yangi ulanishni qabul qiladi va foydalanadi SO_ORIGINAL_DST asl maqsadni olish uchun rozetka opsiyasi. Keyin Netra asl IP-manzilga yangi ulanishni ochadi va tomonlar o'rtasida ikki tomonlama TCP aloqasini o'rnatadi, bu orqali o'tayotgan barcha trafikni tinglaydi. Agar port HTTP sifatida aniqlansa, Netra uni tahlil qilishga va kuzatishga harakat qiladi. Agar HTTP tahlili muvaffaqiyatsiz tugasa, Netra TCP ga qaytadi va baytlarni shaffof tarzda proksi qiladi.

Bog'liqlik grafigini qurish

Jaeger-da katta hajmdagi kuzatuv ma'lumotlarini olganimdan so'ng, men tizimdagi o'zaro ta'sirlarning to'liq grafigini olishni xohlayman. Ammo agar sizning tizimingiz juda yuklangan bo'lsa va kuniga milliardlab kuzatuv oralig'i to'plansa, ularni yig'ish unchalik oson ish emas. Buning uchun rasmiy usul mavjud: uchqunga bog'liqliklar. Biroq, to'liq grafikni yaratish uchun bir necha soat kerak bo'ladi va sizni oxirgi XNUMX soat davomida Jaeger-dan butun ma'lumotlar to'plamini yuklab olishga majbur qiladi.

Agar siz kuzatish oralig'ini saqlash uchun Elasticsearch-dan foydalansangiz, foydalanishingiz mumkin oddiy Golang yordam dasturi, bu Elasticsearch xususiyatlari va imkoniyatlaridan foydalangan holda bir necha daqiqada bir xil grafikni yaratadi.

Netramesh - engil xizmat ko'rsatish to'r yechimi

Netrameshdan qanday foydalanish kerak

Netra har qanday orkestrni boshqaradigan har qanday xizmatga osongina qo'shilishi mumkin. Siz misolni ko'rishingiz mumkin shu yerda.

Ayni paytda Netra’da servislarga yonbosh mashinalarni avtomatik kiritish imkoniyati yo‘q, biroq amalga oshirish rejalari mavjud.

Netramesh kelajagi

Asosiy maqsad Netramesh xizmatlararo aloqani kuzatish va nazorat qilish uchun asosiy imkoniyatlarni ta'minlovchi minimal resurs xarajatlari va yuqori ko'rsatkichlarga erishishdan iborat.

Kelajakda Netramesh HTTP-dan tashqari boshqa amaliy qatlam protokollarini ham qo'llab-quvvatlaydi. L7 marshrutlash yaqin kelajakda mavjud bo'ladi.

Agar shunga o'xshash muammolarga duch kelsangiz, Netramesh-dan foydalaning va savollar va takliflar bilan bizga yozing.

Manba: www.habr.com

a Izoh qo'shish