Biz Yandex.Cloud-da 10 000 ta hodisani qabul qilamiz. 1-qism

Hammaga salom, do'stlar!

* Ushbu maqola REBRAIN & Yandex.Cloud ochiq ustaxonasiga asoslangan, agar siz videoni tomosha qilishni xohlasangiz, uni ushbu havolada topishingiz mumkin - https://youtu.be/cZLezUm0ekE

Biz yaqinda Yandex.Cloud-ni jonli ravishda sinab ko'rish imkoniga ega bo'ldik. Biz uzoq va qattiq tekshirmoqchi bo'lganimiz sababli, bulutli bazaga ega oddiy Wordpress blogini ochish g'oyasidan darhol voz kechdik - bu juda zerikarli edi. Biroz o'ylab, biz real vaqt rejimida hodisalarni qabul qilish va tahlil qilish uchun ishlab chiqarish xizmati arxitekturasiga o'xshash narsani o'rnatishga qaror qildik.

Ishonchim komilki, onlayn (va nafaqat) korxonalarning aksariyati qandaydir tarzda o'z foydalanuvchilari va ularning harakatlari haqida to'plangan ma'lumot to'playdi. Hech bo'lmaganda, bu muayyan qarorlar qabul qilish uchun zarurdir - masalan, agar siz onlayn o'yinni boshqarsangiz, foydalanuvchilar qaysi darajadagi statistik ma'lumotlarni ko'rib chiqishingiz va o'yinchoqingizni o'chirib tashlashingiz mumkin. Yoki nima uchun foydalanuvchilar hech narsa sotib olmasdan saytingizni tark etishadi (salom, Yandex.Metrica).

Shunday qilib, bizning hikoyamiz: biz qanday qilib golang tilida dastur yozdik, kafka va rabbitmq va yqsni sinab ko'rdik, Clickhouse klasterida ma'lumotlar oqimini yozdik va yandex datalens yordamida ma'lumotlarni vizualizatsiya qildik. Tabiiyki, bularning barchasi docker, terraform, gitlab ci va, albatta, prometey ko'rinishidagi infratuzilma zavqlari bilan ta'minlangan. Qani ketdik!

Men darhol rezervlashni xohlayman, biz bir o'tirishda hamma narsani sozlay olmaymiz - buning uchun bizga ketma-ket bir nechta maqolalar kerak bo'ladi. Tuzilishi haqida bir oz:

1-qism (siz uni o'qiyapsiz). Yechimning texnik xususiyatlari va arxitekturasi haqida qaror qabul qilamiz, shuningdek, golang tilida ariza yozamiz.
2-qism. Biz o'z ilovamizni ishlab chiqarishga chiqaramiz, uni masshtablashtiramiz va yukni sinab ko'ramiz.
3-qism. Keling, nima uchun xabarlarni fayllarda emas, buferda saqlashimiz kerakligini aniqlashga harakat qilaylik, shuningdek, kafka, rabbitmq va yandex navbat xizmatini solishtiramiz.
4-qism Biz Clickhouse klasterini joylashtiramiz, u yerdagi buferdan ma'lumotlarni uzatish uchun oqim xizmatini yozamiz va datalensda vizualizatsiyani o'rnatamiz.
5-qism Keling, butun infratuzilmani to'g'ri shaklga keltiraylik - gitlab ci yordamida ci/cd-ni sozlang, prometey va konsul yordamida monitoring va xizmatlarni kashf qilishni ulang.

Π’Π—

Birinchidan, texnik topshiriqni shakllantiramiz - natijada biz nimani olishni xohlaymiz.

  1. Biz voqealar.kis.im (kis.im - biz barcha maqolalarda foydalaniladigan sinov domeni) kabi so'nggi nuqtaga ega bo'lishni xohlaymiz, u HTTPS yordamida hodisalarni qabul qilishi kerak.
  2. Voqealar oddiy json bo'lib: {β€œvoqea”: β€œview”, β€œos”: β€œlinux”, β€œbrauzer”: β€œchrome”}. Yakuniy bosqichda biz biroz ko'proq maydonlarni qo'shamiz, ammo bu katta rol o'ynamaydi. Agar xohlasangiz, protobufga o'tishingiz mumkin.
  3. Xizmat soniyada 10 000 hodisani qayta ishlashga qodir bo'lishi kerak.
  4. Bizning yechimimizga oddiygina yangi misollar qo'shish orqali gorizontal ravishda o'lchash mumkin bo'lishi kerak. Mijoz so'rovlari uchun kechikishni kamaytirish uchun old qismni turli xil geolokatsiyalarga o'tkaza olsak, yaxshi bo'ladi.
  5. Xatolarga chidamlilik. Yechim etarlicha barqaror bo'lishi va har qanday qismlarning yiqilishidan omon qolishi kerak (albatta, ma'lum bir raqamgacha).

arxitektura

Umuman olganda, ushbu turdagi vazifalar uchun klassik arxitekturalar uzoq vaqtdan beri ixtiro qilingan, ular samarali masshtablash imkonini beradi. Rasmda bizning yechimimiz misoli ko'rsatilgan.

Biz Yandex.Cloud-da 10 000 ta hodisani qabul qilamiz. 1-qism

Shunday qilib, bizda nima bor:

1. Chap tomonda turli hodisalarni yaratuvchi qurilmalarimiz mavjud, xoh u o'yinchilar smartfondagi o'yinchoqda darajani yakunlaydilar yoki oddiy brauzer orqali onlayn-do'konda buyurtma yaratadilar. Hodisa, spetsifikatsiyada ko'rsatilganidek, bizning so'nggi nuqtamizga yuboriladigan oddiy json - events.kis.im.

2. Dastlabki ikkita server oddiy balanslovchilar boβ€˜lib, ularning asosiy vazifalari:

  • Doimiy mavjud bo'ling. Buni amalga oshirish uchun, masalan, muammolar yuzaga kelganda tugunlar o'rtasida virtual IP-ni almashtiradigan keepalived-dan foydalanishingiz mumkin.
  • TLSni tugatish. Ha, biz ulardagi TLSni bekor qilamiz. Birinchidan, bizning yechimimiz texnik xususiyatlarga mos kelishi uchun, ikkinchidan, bizning serverlarimizdan shifrlangan ulanishni o'rnatish yukini engillashtirish uchun.
  • Mavjud backend serverlariga kiruvchi so'rovlarni muvozanatlash. Bu erda kalit so'z mavjud. Shunga asoslanib, biz yuk balanslagichlari bizning serverlarimizni ilovalar bilan kuzatib borishi va muvaffaqiyatsiz tugunlar trafigini muvozanatlashni to'xtatishi kerak degan tushunchaga keldik.

3. Balanslashtiruvchilardan so'ng bizda juda oddiy dastur bilan ishlaydigan dastur serverlari mavjud. U HTTP orqali kiruvchi so'rovlarni qabul qilishi, yuborilgan jsonni tekshirishi va ma'lumotlarni buferga joylashtirishi kerak.

4. Diagrammada kafka bufer sifatida ko'rsatilgan, garchi, albatta, bu darajada boshqa shunga o'xshash xizmatlardan foydalanish mumkin. Uchinchi maqolada Kafka, rabbitmq va yqlarni solishtiramiz.

5. Bizning arxitekturamizning yakuniy nuqtasi bu Clickhouse - katta hajmdagi ma'lumotlarni saqlash va qayta ishlash imkonini beruvchi ustunli ma'lumotlar bazasi. Ushbu darajada biz ma'lumotlarni buferdan saqlash tizimining o'ziga o'tkazishimiz kerak (bu haqda batafsilroq 4-moddada).

Ushbu dizayn har bir qatlamni mustaqil ravishda gorizontal ravishda o'lchash imkonini beradi. Backend serverlari bardosh bera olmaydi - keling, yana bir narsani qo'shamiz - axir, ular fuqaroligi bo'lmagan ilovalar va shuning uchun bu hatto avtomatik ravishda amalga oshirilishi mumkin. Kafka uslubidagi bufer ishlamayapti - keling, ko'proq serverlar qo'shamiz va mavzuimizning ba'zi bo'limlarini ularga o'tkazamiz. Clickhouse buni uddalay olmaydi - bu mumkin emas :) Aslida, biz serverlarni ham ulaymiz va ma'lumotlarni parchalaymiz.

Aytgancha, agar siz bizning texnik xususiyatlarimizning ixtiyoriy qismini va turli geolokatsiyalarda o'lchovni amalga oshirishni istasangiz, unda oddiyroq narsa yo'q:

Biz Yandex.Cloud-da 10 000 ta hodisani qabul qilamiz. 1-qism

Har bir geolokatsiyada biz dastur va kafka bilan yuk balansini o'rnatamiz. Umuman olganda, 2 ta dastur serveri, 3 ta kafka tugunlari va bulut balanslagichi, masalan, cloudflare kifoya qiladi, bu mijozning manba IP-manziliga asoslangan holda geolokatsiya bo'yicha dastur tugunlari va balans so'rovlarining mavjudligini tekshiradi. Shunday qilib, amerikalik mijoz tomonidan yuborilgan ma'lumotlar Amerika serverlariga tushadi. Afrikadan olingan ma'lumotlar esa Afrikada.

Keyin hamma narsa juda oddiy - biz Kafka to'plamidagi oyna vositasidan foydalanamiz va barcha ma'lumotlarni barcha joylardan Rossiyada joylashgan markaziy ma'lumotlar markazimizga nusxalaymiz. Ichkarida biz ma'lumotlarni tahlil qilamiz va keyingi vizualizatsiya uchun Clickhouse-ga yozamiz.

Shunday qilib, biz arxitekturani saralab oldik - keling, Yandex.Cloud-ni silkitishni boshlaymiz!

Ariza yozish

Bulutdan oldin siz hali ham biroz sabrli bo'lishingiz va kiruvchi voqealarni qayta ishlash uchun juda oddiy xizmatni yozishingiz kerak. Biz golangdan foydalanamiz, chunki u tarmoq ilovalarini yozish uchun til sifatida o'zini juda yaxshi isbotlagan.

Bir soat (ehtimol bir necha soat) o'tkazganimizdan so'ng, biz shunga o'xshash narsani olamiz: https://github.com/RebrainMe/yandex-cloud-events/blob/master/app/main.go.

Bu erda qanday asosiy fikrlarni ta'kidlashni istardim:

1. Ilovani ishga tushirishda siz ikkita bayroqni belgilashingiz mumkin. Ulardan biri biz kiruvchi http so'rovlarini (-addr) tinglaydigan port uchun javobgardir. Ikkinchisi kafka server manzili uchun, u erda biz voqealarimizni yozib olamiz (-kafka):

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

2. Ilova sarama kutubxonasidan foydalanadi ([] github.com/Shopify/sarama) kafka klasteriga xabarlar yuborish uchun. Biz darhol maksimal ishlov berish tezligiga qaratilgan sozlamalarni o'rnatdik:

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

3. Bizning ilovamizda shuningdek, turli ko'rsatkichlarni to'playdigan o'rnatilgan prometey mijozi mavjud, masalan:

  • bizning arizamizga so'rovlar soni;
  • so'rovni bajarishda xatolar soni (post so'rovini o'qish mumkin emas, json buzilgan, Kafkaga yozish mumkin emas);
  • mijozning bitta so'rovini ko'rib chiqish vaqti, shu jumladan Kafkaga xabar yozish vaqti.

4. Ilovamiz tomonidan qayta ishlanadigan uchta yakuniy nuqta:

  • /status - biz tirik ekanligimizni ko'rsatish uchun shunchaki ok ni qaytaring. Garchi siz Kafka klasterining mavjudligi kabi ba'zi tekshiruvlarni qo'shishingiz mumkin.
  • /metrikalar - bu url-ga ko'ra, prometey mijozi o'zi to'plagan ko'rsatkichlarni qaytaradi.
  • /post - bu json bilan POST so'rovlari yuboriladigan asosiy so'nggi nuqta. Bizning ilovamiz json-ning haqiqiyligini tekshiradi va agar hamma narsa yaxshi bo'lsa, u ma'lumotlarni Kafka klasteriga yozadi.

Kod mukammal emasligini band qilaman - uni to'ldirish mumkin (va kerak!). Masalan, siz o'rnatilgan net/http-dan foydalanishni to'xtatib, tezroq http-ga o'tishingiz mumkin. Yoki json haqiqiyligini tekshirishni keyingi bosqichga o'tkazish orqali ishlov berish vaqti va protsessor resurslarini olishingiz mumkin - ma'lumotlar buferdan clickhouse klasteriga o'tkazilganda.

Muammoning rivojlanish tomoniga qo'shimcha ravishda, biz darhol kelajakdagi infratuzilmamiz haqida o'yladik va ilovamizni docker orqali joylashtirishga qaror qildik. Ilovani yaratish uchun oxirgi Dockerfile https://github.com/RebrainMe/yandex-cloud-events/blob/master/app/Dockerfile. Umuman olganda, bu juda oddiy, men e'tibor bermoqchi bo'lgan yagona nuqta - bu ko'p bosqichli yig'ilish, bu bizga konteynerimizning yakuniy tasvirini kamaytirishga imkon beradi.

Bulutdagi birinchi qadamlar

Avvalo, ro'yxatdan o'ting cloud.yandex.ru. Barcha kerakli maydonlarni to'ldirgandan so'ng, bizda hisob yaratiladi va bulut xizmatlarini sinab ko'rish uchun ishlatilishi mumkin bo'lgan ma'lum miqdordagi pul uchun grant beriladi. Agar siz bizning maqolamizdagi barcha bosqichlarni takrorlashni istasangiz, ushbu grant siz uchun etarli bo'lishi kerak.

Ro'yxatdan o'tgandan so'ng siz uchun alohida bulut va standart katalog yaratiladi, unda siz bulutli resurslarni yaratishni boshlashingiz mumkin. Umuman olganda, Yandex.Cloud-da resurslarning aloqasi quyidagicha ko'rinadi:

Biz Yandex.Cloud-da 10 000 ta hodisani qabul qilamiz. 1-qism

Bitta hisob uchun bir nechta bulut yaratishingiz mumkin. Bulut ichida esa turli kompaniya loyihalari uchun turli kataloglar yarating. Bu haqda ko'proq ma'lumotni hujjatlarda o'qishingiz mumkin - https://cloud.yandex.ru/docs/resource-manager/concepts/resources-hierarchy. Aytgancha, men tez-tez matnda unga murojaat qilaman. Men butun infratuzilmani noldan o'rnatganimda, hujjatlar menga bir necha marta yordam berdi, shuning uchun uni o'rganishni maslahat beraman.

Bulutni boshqarish uchun siz ham veb-interfeysdan, ham konsol yordam dasturidan foydalanishingiz mumkin - yc. O'rnatish bitta buyruq bilan amalga oshiriladi (Linux va Mac Os uchun):

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

Agar sizning ichki xavfsizlik bo'yicha mutaxassisingiz Internetdan skriptlarni ishga tushirish haqida g'azablansa, birinchidan, siz skriptni ochib, uni o'qishingiz mumkin, ikkinchidan, biz uni o'z foydalanuvchimiz ostida - ildiz huquqlarisiz ishga tushiramiz.

Agar siz Windows uchun mijozni o'rnatmoqchi bo'lsangiz, ko'rsatmalardan foydalanishingiz mumkin shu yerda va keyin bajaring yc inituni to'liq moslashtirish uchun:

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:~ $

Asosan, jarayon oddiy - avval bulutni boshqarish uchun oauth tokenini olishingiz kerak, bulutni va foydalanadigan papkani tanlang.

Agar bitta bulut ichida bir nechta hisob qaydnomangiz yoki papkangiz bo'lsa, yc config profili yaratish orqali alohida sozlamalar bilan qo'shimcha profillar yaratishingiz va ular o'rtasida almashishingiz mumkin.

Yuqoridagi usullardan tashqari, Yandex.Cloud jamoasi juda yaxshi yozgan Terraform uchun plagin bulutli resurslarni boshqarish uchun. O'z navbatida, men git omborini tayyorladim, u erda maqolaning bir qismi sifatida yaratiladigan barcha resurslarni tasvirlab berdim - https://github.com/rebrainme/yandex-cloud-events/. Bizni asosiy filial qiziqtiradi, keling, uni mahalliy sifatida klonlaylik:


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/

Terraformada ishlatiladigan barcha asosiy o'zgaruvchilar main.tf faylida yozilgan. Boshlash uchun terraform papkasida quyidagi tarkibga ega private.auto.tfvars faylini yarating:

# 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 = ""

Barcha o'zgaruvchilar yc konfiguratsiya ro'yxatidan olinishi mumkin, chunki biz allaqachon konsol yordam dasturini sozlaganmiz. Shaxsiy ma'lumotlarni tasodifan e'lon qilmaslik uchun darhol private.auto.tfvars ni .gitignore-ga qo'shishingizni maslahat beraman.

Private.auto.tfvars-da biz Cloudflare-dan ma'lumotlarni ham ko'rsatdik - DNS yozuvlarini yaratish va voqealar.kis.im asosiy domenini serverlarimizga proksi-server qilish. Agar siz cloudflare-dan foydalanishni xohlamasangiz, main.tf-dagi cloudflare provayderining ishga tushirilishini va kerakli DNS yozuvlarini yaratish uchun mas'ul bo'lgan dns.tf faylini olib tashlang.

Bizning ishimizda biz uchta usulni - veb-interfeysni, konsol yordam dasturini va terraformni birlashtiramiz.

Virtual tarmoqlar

Rostini aytsam, bu bosqichni o'tkazib yuborishingiz mumkin, chunki siz yangi bulutni yaratganingizda, siz avtomatik ravishda alohida tarmoq va 3 ta pastki tarmoqqa ega bo'lasiz - har bir mavjudlik zonasi uchun bittadan. Ammo biz hali ham loyihamiz uchun o'z manziliga ega alohida tarmoq yaratmoqchimiz. Yandex.Cloud-da tarmoq qanday ishlashining umumiy diagrammasi quyidagi rasmda ko'rsatilgan (halol https://cloud.yandex.ru/docs/vpc/concepts/)

Biz Yandex.Cloud-da 10 000 ta hodisani qabul qilamiz. 1-qism

Shunday qilib, siz resurslar bir-biri bilan bog'lanishi mumkin bo'lgan umumiy tarmoq yaratasiz. Har bir mavjudlik zonasi uchun o'z manziliga ega va umumiy tarmoqqa ulangan kichik tarmoq yaratiladi. Natijada, undagi barcha bulut resurslari, hatto ular turli mavjudlik zonalarida bo'lsa ham, muloqot qilishi mumkin. Turli xil bulutli tarmoqlarga ulangan resurslar bir-birlarini faqat tashqi manzillar orqali ko'rishlari mumkin. Aytgancha, bu sehr ichkarida qanday ishlaydi? Habreda yaxshi tasvirlangan.

Tarmoqni yaratish repozitoriydan network.tf faylida tasvirlangan. U erda biz bitta umumiy xususiy tarmoqni ichki yaratamiz va unga turli xil mavjud zonalarda uchta pastki tarmoqni ulaymiz - ichki-a (172.16.1.0/24), ichki-b (172.16.2.0/24), ichki-c (172.16.3.0/24). ).

Terraformni ishga tushiring va tarmoqlarni yarating:

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.

Ajoyib! Biz tarmog'imizni yaratdik va endi ichki xizmatlarimizni yaratishga tayyormiz.

Virtual mashinalarni yaratish

Ilovani sinab ko'rish uchun bizga faqat ikkita virtual mashina yaratish kerak bo'ladi - birinchisi dasturni qurish va ishga tushirish uchun kerak bo'ladi, ikkinchisi esa kiruvchi xabarlarni saqlash uchun foydalaniladigan kafkani ishga tushirish uchun kerak bo'ladi. Va biz dasturni kuzatish uchun prometeyni sozlaydigan boshqa mashinani yaratamiz.

Virtual mashinalar ansible yordamida sozlanadi, shuning uchun terraformni ishga tushirishdan oldin sizda ansiblening so'nggi versiyalaridan biriga ega ekanligingizga ishonch hosil qiling. Va ansible galaxy bilan kerakli rollarni o'rnating:

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 papkasida men foydalanadigan .ansible.cfg konfiguratsiya fayli namunasi mavjud. Bu foydali bo'lishi mumkin.

Virtual mashinalarni yaratishdan oldin sizda ssh-agent ishlayotganligiga va ssh kaliti qo'shilganligiga ishonch hosil qiling, aks holda terraform yaratilgan mashinalarga ulana olmaydi. Men, albatta, OS x da xatolikka duch keldim: https://github.com/ansible/ansible/issues/32499#issuecomment-341578864. Bu yana sodir bo'lmasligi uchun, Terraformni ishga tushirishdan oldin env ga kichik o'zgaruvchini qo'shing:

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

Terraform papkasida biz kerakli resurslarni yaratamiz:

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 ...

Agar hamma narsa muvaffaqiyatli yakunlangan bo'lsa (va shunday bo'lishi kerak), bizda uchta virtual mashina bo'ladi:

  1. qurish - dasturni sinab ko'rish va qurish uchun mashina. Docker avtomatik ravishda Ansible tomonidan o'rnatildi.
  2. monitoring - monitoring mashinasi - prometey va grafana o'rnatilgan. Login / parol standarti: admin / admin
  3. kafka - bu kafka o'rnatilgan, 9092 portida foydalanish mumkin bo'lgan kichik mashina.

Keling, ularning hammasi joyida ekanligiga ishonch hosil qilaylik:

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 |
+----------------------+------------+---------------+---------+---------------+-------------+

Resurslar joyida va bu yerdan ularning IP manzillarini olishimiz mumkin. Keyingi ishlar davomida men ssh orqali ulanish va dasturni sinab ko'rish uchun IP manzillardan foydalanaman. Agar sizda terraform-ga ulangan cloudflare akkauntingiz bo'lsa, yangi yaratilgan DNS nomlaridan bemalol foydalaning.
Aytgancha, virtual mashinani yaratishda ichki IP va ichki DNS nomi beriladi, shuning uchun siz tarmoq ichidagi serverlarga nom bo'yicha kirishingiz mumkin:

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

Bu biz uchun kafk bilan dasturga oxirgi nuqtani ko'rsatish uchun foydali bo'ladi.

Ilovani yig'ish

Ajoyib, serverlar bor, dastur bor - uni yig'ish va nashr etish qoladi. Qurilish uchun biz odatiy docker qurilishidan foydalanamiz, lekin tasvirni saqlash sifatida biz Yandex - konteyner registridagi xizmatdan foydalanamiz. Lekin birinchi narsa birinchi.

Biz dasturni qurish mashinasiga nusxalaymiz, ssh orqali tizimga kiramiz va rasmni yig'amiz:

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

Jangning yarmi tugadi - endi biz dasturimizni ishga tushirish va kafkaga yuborish orqali uning funksionalligini tekshirishimiz mumkin:

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) $

Ilova yozishni muvaffaqiyatli yakunladi va xabar kiritilgan bo'lim va ofset identifikatorini ko'rsatdi. Faqat Yandex.Cloud-da ro'yxatga olish kitobini yaratish va u erda bizning rasmimizni yuklash qoladi (uchta qator yordamida buni qanday qilish registry.tf faylida tasvirlangan). Xotira yarating:

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.

Konteyner registrida autentifikatsiya qilishning bir necha usullari mavjud - oauth tokeni, iam tokeni yoki xizmat hisobi kaliti yordamida. Ushbu usullar haqida batafsil ma'lumotni hujjatlarda topishingiz mumkin. https://cloud.yandex.ru/docs/container-registry/operations/authentication. Biz xizmat hisobi kalitidan foydalanamiz, shuning uchun biz hisob yaratamiz:

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.

Endi uning kalitini yaratish qoladi:

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

Saqlash identifikatori haqida ma'lumot olamiz, kalitni uzatamiz va tizimga kiramiz:

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:~$

Rasmni ro'yxatga olish kitobiga yuklash uchun bizga konteyner registrining identifikatori kerak, biz uni yc yordam dasturidan olamiz:

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

Shundan so'ng biz rasmimizni yangi nom bilan belgilaymiz va yuklaymiz:

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

Rasm muvaffaqiyatli yuklanganligini tekshirishimiz mumkin:

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

Aytgancha, agar siz yc yordam dasturini Linux mashinasiga o'rnatsangiz, buyruqni ishlatishingiz mumkin

yc container registry configure-docker

dockerni sozlash uchun.

xulosa

Biz juda ko'p mehnat qildik va natijada:

  1. Biz kelajakdagi xizmatimizning arxitekturasini o'ylab topdik.
  2. Biz biznes mantiqimizni amalga oshiradigan golang tilida dastur yozdik.
  3. Biz uni yig'ib, maxsus konteyner registriga quydik.

Keyingi qismda biz qiziqarli narsalarga o'tamiz - biz o'z ilovamizni ishlab chiqarishga chiqaramiz va nihoyat unga yukni ishga tushiramiz. O'zgartirmang!

Ushbu material REBRAIN & Yandex.Cloud ochiq ustaxonasining video yozuvida: Yandex Cloud-da soniyada 10 000 so'rovni qabul qilamiz - https://youtu.be/cZLezUm0ekE

Agar siz bunday tadbirlarda onlayn tarzda qatnashishni va real vaqtda savollar berishni xohlasangiz, ulaning REBRAIN tomonidan DevOps kanali.

Biz Yandex.Cloud kompaniyasiga bunday tadbirni o'tkazish imkoniyati uchun alohida rahmat aytmoqchimiz. Ularga havola - https://cloud.yandex.ru/prices

Agar siz bulutga o'tmoqchi bo'lsangiz yoki infratuzilmangiz haqida savollaringiz bo'lsa, iltimos qoldiring.

PS Bizda oyiga 2 ta bepul audit bor, ehtimol sizning loyihangiz ulardan biri bo'ladi.

Manba: www.habr.com

a Izoh qo'shish