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.
Men uzoq vaqtdan beri bunday muammolarni engishga yordam beradigan vositani izlayapman (men bu haqda Habré-da yozganman:
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.
Yechimlar
Ushbu yondashuvning bir nechta ilovalari allaqachon mavjud:
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
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 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:
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:
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 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
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 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:
Agar siz kuzatish oralig'ini saqlash uchun Elasticsearch-dan foydalansangiz, foydalanishingiz mumkin
Netrameshdan qanday foydalanish kerak
Netra har qanday orkestrni boshqaradigan har qanday xizmatga osongina qo'shilishi mumkin. Siz misolni ko'rishingiz mumkin
Ayni paytda Netra’da servislarga yonbosh mashinalarni avtomatik kiritish imkoniyati yo‘q, biroq amalga oshirish rejalari mavjud.
Netramesh kelajagi
Asosiy maqsad
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