Yandex.Cloud-da 10 hadisəni qəbul edirik. 000-ci hissə

Hər kəsə salam dostlar!

* Bu məqalə REBRAIN & Yandex.Cloud açıq emalatxanasına əsaslanır, əgər siz videolara daha çox baxmağı sevirsinizsə, onu bu linkdə tapa bilərsiniz - https://youtu.be/cZLezUm0ekE

Bu yaxınlarda Yandex.Cloud-u canlı hiss etmək imkanımız oldu. Uzun müddət və möhkəm hiss etmək istədiyimiz üçün bulud bazası ilə sadə bir wordpress bloquna başlamaq fikrindən dərhal imtina etdik - bu çox darıxdırıcıdır. Bəzi müzakirələrdən sonra hadisələrin real vaxt rejimində qəbulu və təhlili üçün xidmətin istehsal arxitekturasına bənzər bir şey tətbiq etmək qərarına gəldik.

Mən tam əminəm ki, onlayn (təkcə yox) müəssisələrin böyük əksəriyyəti istifadəçiləri və bu və ya digər şəkildə onların hərəkətləri haqqında çoxlu məlumat toplayır. Ən azı, bu, müəyyən qərarlar qəbul etmək üçün lazımdır - məsələn, əgər siz onlayn oyunu idarə edirsinizsə, istifadəçilərin hansı səviyyədə ilişib qalması və oyuncağını çıxarması ehtimalı ilə bağlı statistikaya baxa bilərsiniz. Və ya istifadəçilər niyə heç nə almadan saytınızı tərk edirlər (salam, Yandex.Metrica).

Beləliklə, bizim hekayəmiz: qolanq dilində necə bir proqram yazdıq, kafka vs rabbitmq vs yqs sınadıq, Clickhouse klasterinə məlumat axını yazdıq və yandex datalens istifadə edərək məlumatları vizuallaşdırdıq. Təbii ki, bütün bunlar docker, terraform, gitlab ci və əlbəttə ki, prometey şəklində infrastruktur zövqləri ilə təravətləndirildi. Gedək!

Dərhal qeyd etmək istərdim ki, hər şeyi bir oturuşda qura bilməyəcəyik - bunun üçün bir sıra məqalələrə ehtiyacımız var. Quruluş haqqında bir az:

1-ci hissə (siz oxuyursunuz). Biz texniki tapşırıqları və həllin arxitekturasını müəyyənləşdirəcəyik, həmçinin qolanq dilində ərizə yazacağıq.
2 hissə. Tətbiqimizi istehsala yükləyirik, onu miqyaslı hala gətiririk və yükü sınaqdan keçiririk.
3 hissə. Mesajları niyə fayllarda deyil, buferdə saxlamalı olduğumuzu anlamağa çalışaq, həmçinin kafka, rabbitmq və yandex növbə xidmətini bir-biri ilə müqayisə edək.
4 hissə. Biz Clickhouse klasterini yerləşdirəcəyik, orada buferdən məlumat ötürmək üçün axın yazacağıq və datalens-də vizuallaşdırma quracağıq.
5 hissə. Gəlin bütün infrastrukturu lazımi formaya gətirək - gitlab ci istifadə edərək ci / cd qurun, prometey və konsuldan istifadə edərək monitorinq və xidmət kəşfini birləşdirək.

ТЗ

Əvvəlcə texniki tapşırıqları tərtib edək - nəticədə dəqiq nə əldə etmək istəyirik.

  1. HTTPS istifadə edərək hadisələri qəbul etməli olan events.kis.im (kis.im məqalələr boyu istifadə edəcəyimiz test domenidir) kimi son nöqtəyə sahib olmaq istəyirik.
  2. Hadisələr formanın sadə jsonudur: {"event": "view", "os": "linux", "brauzer": "chrome"}. Son mərhələdə bir az daha sahələr əlavə edəcəyik, lakin bu, böyük rol oynamayacaq. İstəyirsinizsə, protobufa keçə bilərsiniz.
  3. Xidmət saniyədə 10 hadisəni emal edə bilməlidir.
  4. Sadəcə həllimizə yeni nümunələr əlavə etməklə üfüqi şəkildə miqyaslaşdırmaq mümkün olmalıdır. Müştəri sorğuları üçün gecikməni azaltmaq üçün ön hissəni müxtəlif geolokasiyalara köçürə bilsək, yaxşı olar.
  5. Səhv tolerantlığı. Həll kifayət qədər sabit olmalı və hər hansı hissə düşəndə ​​(əlbəttə ki, müəyyən bir məbləğə qədər) sağ qala bilməlidir.

memarlıq

Ümumiyyətlə, bu tip tapşırıqlar üçün effektiv miqyaslaşdırmaya imkan verən klassik arxitekturalar çoxdan icad edilmişdir. Şəkil həllimizin bir nümunəsini göstərir.

Yandex.Cloud-da 10 hadisəni qəbul edirik. 000-ci hissə

Beləliklə, bizdə nə var:

1. Solda, smartfonda oyuncaqda oyunçuların səviyyəsini keçməsindən və ya adi brauzer vasitəsilə onlayn mağazada sifariş yaratmaqdan asılı olmayaraq müxtəlif hadisələr yaradan cihazlarımız göstərilir. Tədbir, TOR-da göstərildiyi kimi, son nöqtəmizə - events.kis.im-ə göndərilən sadə bir jsondur.

2. İlk iki server sadə balanslaşdırıcılardır, onların əsas vəzifələri bunlardır:

  • Daim əlçatan olun. Bunu etmək üçün, məsələn, problem olduqda virtual IP-ni qovşaqlar arasında dəyişdirəcək keepalived-dən istifadə edə bilərsiniz.
  • TLS-ni dayandırın. Bəli, biz onlar üzrə TLS-ni dayandıracağıq. Birincisi, həllimizin TOR-a uyğun olması üçün, ikincisi, arxa serverlərimizdən şifrəli bir əlaqə qurmaq yükünü aradan qaldırmaq üçün.
  • Mövcud backend serverlərinə daxil olan sorğuları balanslaşdırın. Burada əsas söz əlçatandır. Buna əsaslanaraq, yük balanslaşdırıcılarının serverlərimizi tətbiqlərlə izləyə bilməli və uğursuz qovşaqlara trafik balansını dayandırmağı bacarmalı olduğunu başa düşdük.

3. Balanslaşdırıcıların arxasında kifayət qədər sadə proqramla işləyən proqram serverlərimiz var. O, HTTP vasitəsilə daxil olan sorğuları qəbul etməyi, göndərilən json-u təsdiq etməyi və məlumatları bufer etməyi bacarmalıdır.

4. Diaqram kafkanı bufer kimi göstərir, baxmayaraq ki, təbii ki, bu səviyyədə digər oxşar xidmətlərdən də istifadə etmək olar. Üçüncü məqalədə Kafka, rabbitmq və yqs müqayisə edəcəyik.

5. Arxitekturamızın sondan əvvəlki nöqtəsi Clickhouse-dur - böyük həcmdə məlumatı saxlamağa və emal etməyə imkan verən sütun verilənlər bazası. Bu səviyyədə biz məlumatları buferdən faktiki olaraq saxlama sisteminə ötürməliyik (bu barədə ətraflı 4-cü məqalədə).

Bu sxem hər bir təbəqəni müstəqil olaraq üfüqi olaraq ölçməyə imkan verir. Backend serverləri öhdəsindən gələ bilmir - daha çox əlavə edək - çünki onlar vətəndaşlığı olmayan proqramlardır və buna görə də bu, ən azı avtomatik olaraq edilə bilər. Kafka formasındakı bufer çəkilmir - gəlin daha çox server əlavə edək və mövzumuzun bölmələrinin bir hissəsini onlara köçürək. Klikxana öhdəsindən gələ bilmir - bu mümkün deyil 🙂 Əslində, biz də serverləri dok edəcəyik və məlumatları parçalayacağıq.

Yeri gəlmişkən, texniki tapşırığımızın isteğe bağlı bir hissəsini və müxtəlif geolokasiyalarda miqyasını həyata keçirmək istəyirsinizsə, onda daha asan bir şey yoxdur:

Yandex.Cloud-da 10 hadisəni qəbul edirik. 000-ci hissə

Hər bir geolokasiyada proqram və kafka ilə yük balanslaşdırıcısını yerləşdiririk. Ümumiyyətlə, müştərinin mənbə IP ünvanı əsasında geolokasiya ilə tətbiq qovşaqlarının və balans sorğularının mövcudluğunu yoxlayacaq 2 proqram serveri, 3 kafka qovşağı və cloudflare kimi bulud balanslaşdırıcısı kifayətdir. Bu yolla ABŞ müştərisi tərəfindən göndərilən məlumatlar ABŞ serverlərinə düşəcək. Afrikadan gələn məlumatlar isə Afrikadadır.

Onda hər şey olduqca sadədir - biz Kafka dəstindəki güzgü alətindən istifadə edirik və bütün məlumatları bütün yerlərdən Rusiyada yerləşən mərkəzi məlumat mərkəzimizə kopyalayırıq. İçəridə biz məlumatları təhlil edirik və sonrakı vizuallaşdırma üçün Clickhouse-a yazırıq.

Beləliklə, biz memarlığı anladıq - Yandex.Cloud-u silkələməyə başlayırıq!

Ərizə yazmaq

Buluddan əvvəl hələ də bir az səbirli olmalı və daxil olan hadisələri emal etmək üçün kifayət qədər sadə bir xidmət yazmalısınız. Biz qolanqdan istifadə edəcəyik, çünki o, şəbəkə proqramlarının yazılması üçün bir dil kimi özünü çox yaxşı sübut etmişdir.

Bir saat vaxt sərf etdikdən sonra (bəlkə də bir neçə saat) belə bir şey əldə edirik: https://github.com/RebrainMe/yandex-cloud-events/blob/master/app/main.go.

Burada qeyd edilməli olan əsas məqamlar nələrdir:

1. Proqramı işə salarkən siz iki bayraq təyin edə bilərsiniz. Onlardan biri daxil olan http sorğularını (-addr) dinləyəcəyimiz porta cavabdehdir. İkincisi, hadisələrimizi (-kafka) yazacağımız kafka serverinin ünvanı üçündür:

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

2. Tətbiq sarama kitabxanasından istifadə edir ([] github.com/Shopify/sarama) kafka klasterinə mesaj göndərmək üçün. Dərhal maksimum emal sürətinə yönəlmiş parametrləri təyin etdik:

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

3. Həmçinin, prometheus müştərisi müxtəlif ölçüləri toplayan tətbiqimizə quraşdırılmışdır, məsələn:

  • ərizəmizə edilən sorğuların sayı;
  • sorğunun icrası zamanı xətaların sayı (post sorğusunu oxumaq mümkün deyil, xarab json, kafkaya yazmaq mümkün deyil);
  • kafkaya mesajın yazılma vaxtı da daxil olmaqla müştəridən bir sorğunun işlənmə vaxtı.

4. Tətbiqimizin emal etdiyi üç son nöqtə:

  • /status - sağ olduğumuzu göstərmək üçün sadəcə ok qayıdın. Baxmayaraq ki, kafka klasterinin mövcudluğu kimi bəzi çeklər əlavə edə bilərsiniz.
  • /metrics — bu url-dən istifadə edərək, prometheus müştərisi topladığı ölçüləri qaytaracaq.
  • /post - daxilində json olan POST sorğularının gələcəyi əsas son nöqtə. Tətbiqimiz json-un etibarlılığını yoxlayır və hər şey qaydasındadırsa, məlumatları kafka klasterinə yazır.

Kodun mükəmməl olmadığını qeyd edəcəyəm - o, tamamlana bilər (və olmalıdır!). Məsələn, siz daxili net/http-dən istifadəni dayandırıb daha sürətli http-ə keçə bilərsiniz. Və ya json etibarlılıq yoxlanışını sonrakı mərhələyə - verilənlərin buferdən klikxana çoxluğuna köçürüləcəyi vaxta köçürməklə emal vaxtını və cpu resurslarını qazanın.

Məsələnin inkişaf tərəfinə əlavə olaraq, biz dərhal gələcək infrastrukturumuz haqqında düşündük və tətbiqimizi docker vasitəsilə yerləşdirməyə qərar verdik. Tətbiqi qurmaq üçün son Dockerfile −-dir https://github.com/RebrainMe/yandex-cloud-events/blob/master/app/Dockerfile. Ümumiyyətlə, olduqca sadədir, diqqət yetirmək istədiyim yeganə məqam konteynerimizin son görüntüsünü azaltmağa imkan verən çoxmərhələli montajdır.

Buludda ilk addımlar

Əvvəlcə qeydiyyatdan keçin cloud.yandex.ru. Bütün tələb olunan sahələri doldurduqdan sonra bizim üçün hesab açılacaq və bulud xidmətlərini sınaqdan keçirmək üçün istifadə edilə bilən müəyyən məbləğdə qrant veriləcək. Məqaləmizdəki bütün addımları təkrarlamaq istəyirsinizsə, bu qrant sizin üçün kifayət etməlidir.

Qeydiyyatdan keçdikdən sonra sizin üçün ayrıca bulud və standart kataloq yaradılacaq, orada bulud resursları yaratmağa başlaya bilərsiniz. Ümumiyyətlə, Yandex.Cloud-da resursların əlaqəsi belə görünür:

Yandex.Cloud-da 10 hadisəni qəbul edirik. 000-ci hissə

Hər hesaba birdən çox bulud yarada bilərsiniz. Bulud daxilində isə şirkətin müxtəlif layihələri üçün müxtəlif kataloqlar hazırlayın. Bu barədə ətraflı məlumatı sənədlərdə oxuya bilərsiniz - https://cloud.yandex.ru/docs/resource-manager/concepts/resources-hierarchy. Yeri gəlmişkən, aşağıda mətndə tez-tez ona istinad edəcəyəm. Mən bütün infrastrukturu sıfırdan quranda sənədlər mənə bir dəfədən çox kömək etdi, ona görə də sizə onu öyrənməyi məsləhət görürəm.

Buludu idarə etmək üçün həm veb interfeysdən, həm də konsol yardım proqramından istifadə edə bilərsiniz - yc. Quraşdırma bir əmrlə həyata keçirilir (Linux və Mac Os üçün):

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

Daxili təhlükəsizliyiniz İnternetdən skriptləri işlətməkdən ötrü qəzəblənirsə, onda birincisi, skripti aça və oxuya bilərsiniz, ikincisi, biz onu istifadəçimizin altında işlədirik - kök hüquqları olmadan.

Windows üçün müştəri quraşdırmaq istəyirsinizsə, təlimatlardan istifadə edə bilərsiniz burada və sonra icra edin yc inittam fərdiləşdirmək üçün:

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

Prinsipcə, proses sadədir - əvvəlcə buludu idarə etmək, istifadə edəcəyiniz buludu və qovluğu seçmək üçün bir oauth tokeni əldə etməlisiniz.

Eyni buludda bir neçə hesab və ya qovluğunuz varsa, yc konfiqurasiya profili yaratmaq və onlar arasında keçid vasitəsilə ayrı parametrlərlə əlavə profillər yarada bilərsiniz.

Yuxarıda göstərilən üsullara əlavə olaraq, Yandex.Cloud komandası çox yaxşı yazdı terraform üçün plagin bulud resurslarını idarə etmək. Mən öz növbəmdə məqalənin bir hissəsi kimi yaradılacaq bütün resursları təsvir etdiyim bir git anbarı hazırladım - https://github.com/rebrainme/yandex-cloud-events/. Biz master filialı ilə maraqlanırıq, gəlin onu yerli olaraq klonlayaq:


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/

Terraformda istifadə olunan bütün əsas dəyişənlər main.tf faylında qeyd olunur. Başlamaq üçün terraform qovluğunda aşağıdakı məzmunlu private.auto.tfvars faylı yaradın:

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

Bütün dəyişənlər yc konfiqurasiya siyahısından götürülə bilər, çünki biz artıq konsol yardım proqramını konfiqurasiya etmişik. Şəxsi məlumatları təsadüfən dərc etməmək üçün dərhal private.auto.tfvars-ı .gitignore-a əlavə etməyi məsləhət görürəm.

Şəxsi.auto.tfvars-da biz həmçinin Cloudflare-dən məlumatları göstərdik - dns qeydləri yaratmaq və serverlərimizə əsas events.kis.im domenini proksi etmək. Cloudflare-dən istifadə etmək istəmirsinizsə, main.tf-də cloudflare provayderinin işə salınmasını və lazımi dns qeydlərinin yaradılmasına cavabdeh olan dns.tf faylını silin.

İşimizdə biz hər üç üsulu birləşdirəcəyik - veb interfeysi, konsol yardım proqramı və terraform.

Virtual şəbəkələr

Düzünü desəm, bu addım atlana bilərdi, çünki yeni bulud yaratdığınız zaman siz avtomatik olaraq ayrıca şəbəkə və 3 alt şəbəkə yaradacaqsınız - hər bir mövcudluq zonası üçün bir. Amma yenə də layihəmiz üçün öz ünvanlı ayrıca şəbəkə yaratmaq istərdim. Yandex.Cloud-da şəbəkənin ümumi sxemi aşağıdakı şəkildə göstərilmişdir (dürüstcə götürülmüşdür https://cloud.yandex.ru/docs/vpc/concepts/)

Yandex.Cloud-da 10 hadisəni qəbul edirik. 000-ci hissə

Beləliklə, siz resursların bir-biri ilə əlaqə saxlaya biləcəyi ümumi bir şəbəkə yaradırsınız. Hər bir mövcudluq zonası üçün öz ünvanlı alt şəbəkə yaradılır və ümumi şəbəkəyə qoşulur. Nəticədə, içindəki bütün bulud resursları, hətta müxtəlif mövcudluq zonalarında olsa da, əlaqə saxlaya bilər. Müxtəlif bulud şəbəkələrinə qoşulan resurslar bir-birini yalnız xarici ünvanlar vasitəsilə görə bilir. Yeri gəlmişkən, bu sehr içəridə necə işləyir, Habré-də yaxşı təsvir edilmişdir.

Şəbəkənin yaradılması repozitoriyadan network.tf faylında təsvir edilmişdir. Orada biz daxili bir ümumi şəxsi şəbəkə yaradırıq və ona müxtəlif əlçatanlıq zonalarında üç alt şəbəkə birləşdiririk - daxili-a (172.16.1.0/24), daxili-b (172.16.2.0/24), daxili-c (172.16.3.0/24). ).

Terraformu işə salın və şəbəkələr yaradın:

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.

Əla! Biz şəbəkəmizi yaratdıq və indi daxili xidmətlərimizi yaratmağa hazırıq.

Virtual maşınlar yaradın

Tətbiqi sınaqdan keçirmək üçün bizə iki virtual maşın yaratmaq kifayət edəcək - birincisi tətbiqi qurmaq və işə salmaq üçün, ikincisi - gələn mesajları saxlamaq üçün istifadə edəcəyimiz kafka-nı işə salmaq lazımdır. Və proqrama nəzarət etmək üçün prometey quracağımız başqa bir maşın yaradacağıq.

Virtual maşınlar ansible istifadə edərək konfiqurasiya ediləcək, ona görə də terraformu işə salmazdan əvvəl ansible-in ən son versiyalarından birinə sahib olduğunuzdan əmin olun. Və lazımi rolları ansible galaxy ilə quraşdırın:

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 qovluğunun içərisində mənim istifadə etdiyim nümunə .ansible.cfg konfiqurasiya faylı var. Bəlkə də faydalıdır.

Virtual maşınlar yaratmazdan əvvəl ssh-agent işlədiyinə və ssh açarının əlavə olunduğuna əmin olun, əks halda terraform yaradılmış maşınlara qoşula bilməyəcək. Mən, əlbəttə ki, os x-də bir səhvlə qarşılaşdım: https://github.com/ansible/ansible/issues/32499#issuecomment-341578864. Belə bir hekayənin təkrarlanmasının qarşısını almaq üçün Terraform-a başlamazdan əvvəl env-ə kiçik bir dəyişən əlavə edin:

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

Terraformu olan qovluqda lazımi resursları yaradırıq:

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

Hər şey uğurla başa çatdısa (lazım olduğu kimi), onda üç virtual maşınımız olacaq:

  1. qurmaq - tətbiqi sınaqdan keçirmək və qurmaq üçün maşın. Docker avtomatik olaraq ansible tərəfindən quraşdırılıb.
  2. monitorinq - monitorinq maşını - prometheus & grafana quraşdırılıb. Giriş / parol standartı: admin / admin
  3. kafka kafka quraşdırılmış kiçik maşındır, 9092 portunda mövcuddur.

Onların hamısının yerində olduğundan əmin olaq:

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 yerindədir və buradan onların ip-ünvanlarını çıxara bilərik. Aşağıdakı hər yerdə ssh vasitəsilə qoşulmaq və tətbiqi sınaqdan keçirmək üçün ip-ünvanlardan istifadə edəcəyəm. Terraforma qoşulmuş cloudflare hesabınız varsa, yeni yaradılmış DNS adlarından istifadə etməkdən çekinmeyin.
Yeri gəlmişkən, virtual maşın yaratarkən daxili ip və daxili DNS adı verilir, beləliklə siz şəbəkə daxilindəki serverlərə adla daxil ola bilərsiniz:

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, proqrama kafk ilə son nöqtəni təyin etmək üçün faydalıdır.

Tətbiqin birləşdirilməsi

Əla, serverlər var, bir proqram var - onu toplamaq və dərc etmək qalır. Montaj üçün biz adi docker quruluşundan istifadə edəcəyik, lakin bir şəkil deposu olaraq Yandex - konteyner reyestrindən bir xidmət alacağıq. Ancaq ilk şeylər.

Tətbiqi quraşdırma maşınına kopyalayırıq, ssh vasitəsilə gedirik və şəkli qururuq:

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

İşin yarısı tamamlandı - indi tətbiqimizi işə salaraq və onu kafkaya yönəltməklə onun işini yoxlaya bilərik:

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

Tətbiq müvəffəqiyyətlə yazmaq və bölmənin id-si və mesajın düşdüyü ofsetin göstəricisi ilə cavab verdi. Ediləcək yeganə şey Yandex.Cloud-da reyestr yaratmaq və şəklimizi ora yükləməkdir (bunu üç sətirdən istifadə etməklə necə etmək registry.tf faylında təsvir edilmişdir). Yaddaş yaradın:

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 reyestrində autentifikasiya etməyin bir neçə yolu var - oauth token, iam token və ya xidmət hesabı açarından istifadə etməklə. Bu üsullar haqqında ətraflı məlumatı sənədlərdə tapa bilərsiniz. https://cloud.yandex.ru/docs/container-registry/operations/authentication. Xidmət hesabı açarından istifadə edəcəyik, ona görə də hesab yaradacağıq:

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.

İndi bunun üçün bir açar hazırlamaq qalır:

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

Yaddaşımızın id-si haqqında məlumat alırıq, açarı köçürür və daxil oluruq:

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

Şəkli reyestrə yükləmək üçün bizə konteyner reyestrinin identifikatoru lazımdır, onu yc yardım proqramından götürürük:

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

Bundan sonra şəklimizi yeni adla etiketləyirik və yükləyirik:

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

Şəklin uğurla yükləndiyini yoxlaya bilərik:

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

Yeri gəlmişkən, yc yardım proqramını linux maşınına quraşdırsanız, əmrdən istifadə edə bilərsiniz

yc container registry configure-docker

docker-i konfiqurasiya etmək üçün.

Nəticə

Biz çox ağır iş görmüşük və nəticədə:

  1. Gələcək xidmətimizin arxitekturası ilə gəldik.
  2. Qolanq dilində iş məntiqimizi həyata keçirən ərizə yazdıq.
  3. Biz onu topladıq və şəxsi konteyner reyestrinə tökdük.

Növbəti hissədə maraqlı hissəyə keçək - tətbiqimizi istehsala tökəcəyik və nəhayət, onun üzərindəki yükü işə salacağıq. Dəyişməyin!

Bu material REBRAIN & Yandex.Cloud açıq emalatxanasının videosundadır: Biz Yandex Cloud-a saniyədə 10 sorğu qəbul edirik - https://youtu.be/cZLezUm0ekE

Bu cür tədbirlərdə onlayn iştirak etmək və real vaxt rejimində suallar vermək istəyirsinizsə, əlaqə saxlayın REBRAIN kanalı tərəfindən DevOps.

Belə bir tədbir keçirmək imkanına görə Yandex.Cloud-a xüsusi təşəkkür etmək istəyirik. Onlara keçid - https://cloud.yandex.ru/prices

Buluda keçmək lazımdırsa və ya infrastrukturunuzla bağlı suallarınız varsa, Sorğu göndərməkdən çekinmeyin.

PS Ayda 2 pulsuz auditimiz var, bəlkə də layihəniz onlardan biri olacaq.

Mənbə: www.habr.com

Добавить комментарий