Бид Yandex.Cloud дээр 10 үйл явдлыг хүлээн авдаг. 000-р хэсэг

Бүгдээрээ сайн уу найзуудаа!

* Энэхүү нийтлэлийг REBRAIN & Yandex.Cloud нээлттэй семинар дээр үндэслэсэн бөгөөд хэрэв та видеог үзэхийг хүсвэл энэ холбоосоос олж болно - https://youtu.be/cZLezUm0ekE

Саяхан бидэнд Yandex.Cloud-ийг шууд үзэх боломж олдсон. Бид удаан, шаргуу шалгахыг хүссэн тул үүлэн суурьтай энгийн Wordpress блог нээх санаагаа шууд орхисон - энэ нь хэтэрхий уйтгартай байсан. Хэсэг хугацааны дараа бид бодит цагийн горимд үйл явдлыг хүлээн авах, дүн шинжилгээ хийх үйлдвэрлэлийн үйлчилгээний архитектуртай төстэй зүйлийг байрлуулахаар шийдсэн.

Онлайн (зөвхөн биш) бизнесүүдийн дийлэнх нь ямар нэгэн байдлаар хэрэглэгчид болон тэдний үйлдлийн талаар асар их мэдээлэл цуглуулдаг гэдэгт би бүрэн итгэлтэй байна. Наад зах нь энэ нь тодорхой шийдвэр гаргахад шаардлагатай байдаг - жишээлбэл, хэрэв та онлайн тоглоом удирдаж байгаа бол хэрэглэгчид ямар түвшинд ихэвчлэн гацаж, тоглоомоо устгадаг статистикийг харж болно. Эсвэл яагаад хэрэглэгчид юу ч худалдаж авалгүй танай сайтыг орхиж байгаа юм (Сайн уу, Yandex.Metrica).

Тиймээс бидний түүх: бид хэрхэн голанг хэл дээр програм бичиж, kafka vs rabbitmq vs yqs-г туршиж үзсэн, Clickhouse кластерт өгөгдлийн урсгал бичиж, yandex datalens ашиглан өгөгдлийг дүрсэлсэн. Мэдээжийн хэрэг, энэ бүхэн нь докер, terraform, gitlab ci болон мэдээжийн хэрэг прометей хэлбэрээр дэд бүтцийн таашаалд нийцсэн байв. Явцгаая!

Бид бүгдийг нэг суултаар тохируулах боломжгүй гэдгийг би даруй захиалахыг хүсч байна - үүний тулд бидэнд цувралын хэд хэдэн нийтлэл хэрэгтэй болно. Бүтцийн талаар бага зэрэг:

1-р хэсэг (та үүнийг уншиж байна). Бид шийдлийн техникийн үзүүлэлт, архитектурыг шийдэж, голанг хэл дээр өргөдөл бичих болно.
2-р хэсэг. Бид програмаа үйлдвэрлэлд нэвтрүүлж, өргөтгөх боломжтой болгож, ачааллыг туршина.
3-р хэсэг. Бид яагаад мессежийг файлд биш буферт хадгалах хэрэгтэйг олж мэдэхийг хичээцгээе, мөн kafka, rabbitmq, yandex queue үйлчилгээг харьцуулцгаая.
4-р хэсэг Бид Clickhouse кластер байрлуулж, буферээс өгөгдөл дамжуулах стриминг үйлчилгээг бичиж, datalens дээр дүрслэлийг тохируулах болно.
5-р хэсэг Дэд бүтцийг бүхэлд нь зөв хэлбэрт оруулцгаая - gitlab ci ашиглан ci/cd-г тохируулж, хяналт болон үйлчилгээний нээлтийг prometheus болон consul ашиглан холбоно.

TK

Эхлээд техникийн даалгавраа томъёолъё - үр дүнд нь бид яг юу авахыг хүсч байна.

  1. Бид HTTPS ашиглан үйл явдлуудыг хүлээн авах ёстой events.kis.im (kis.im нь бидний бүх нийтлэлд ашиглах туршилтын домэйн) шиг төгсгөлийн цэгтэй болохыг хүсч байна.
  2. Үйл явдал нь энгийн json юм: {“event”: “view”, “os”: “linux”, “browser”: “chrome”}. Эцсийн шатанд бид бага зэрэг илүү талбар нэмэх болно, гэхдээ энэ нь тийм ч чухал үүрэг гүйцэтгэхгүй. Хэрэв та хүсвэл protobuf руу шилжиж болно.
  3. Үйлчилгээ нь секундэд 10 үйл явдлыг боловсруулах чадвартай байх ёстой.
  4. Бидний шийдэлд шинэ тохиолдлуудыг нэмэх замаар хэвтээ байдлаар масштаблах боломжтой байх ёстой. Хэрэв бид үйлчлүүлэгчийн хүсэлтийн хоцролтыг багасгахын тулд урд хэсгийг өөр өөр газарзүйн байршилд шилжүүлж чадвал сайхан байх болно.
  5. Алдааг тэсвэрлэх чадвар. Шийдэл нь хангалттай тогтвортой байх ёстой бөгөөд ямар ч хэсгүүдийн уналтаас (мэдээж тодорхой тоо хүртэл) амьд үлдэх чадвартай байх ёстой.

архитектур

Ерөнхийдөө энэ төрлийн даалгаврын хувьд үр дүнтэй масштаблах боломжийг олгодог сонгодог архитектурууд эртнээс зохион бүтээгдсэн байдаг. Зураг нь бидний шийдлийн жишээг харуулж байна.

Бид Yandex.Cloud дээр 10 үйл явдлыг хүлээн авдаг. 000-р хэсэг

Тэгэхээр бидэнд юу байна:

1. Зүүн талд ухаалаг гар утсан дээрх тоглоомын түвшинг дүүргэх эсвэл ердийн хөтчөөр дамжуулан онлайн дэлгүүрт захиалга хийх гэх мэт янз бүрийн үйл явдлуудыг үүсгэдэг манай төхөөрөмжүүд байдаг. Тодорхойлолтод заасан үйл явдал нь бидний төгсгөлийн цэг рүү илгээгддэг энгийн json юм - events.kis.im.

2. Эхний хоёр сервер нь энгийн тэнцвэржүүлэгчид бөгөөд тэдгээрийн үндсэн үүрэг нь:

  • Байнга бэлэн байх. Үүнийг хийхийн тулд та жишээ нь keepalived-ийг ашиглаж болно, энэ нь асуудал гарсан тохиолдолд виртуал IP-г зангилаа хооронд шилжүүлэх болно.
  • TLS-ийг дуусгах. Тийм ээ, бид тэдэн дээрх TLS-ийг цуцлах болно. Нэгдүгээрт, бидний шийдэл нь техникийн үзүүлэлтүүдтэй нийцэхийн тулд, хоёрдугаарт, арын серверүүдээс шифрлэгдсэн холболт үүсгэх ачааллыг хөнгөвчлөхийн тулд.
  • Боломжтой backend серверүүд рүү ирж буй хүсэлтийг тэнцвэржүүлэх. Энд байгаа түлхүүр үг нь хүртээмжтэй байна. Үүний үндсэн дээр ачааллыг тэнцвэржүүлэгчид манай серверүүдийг програмын тусламжтайгаар хянаж, бүтэлгүйтсэн зангилаа руу чиглэсэн урсгалыг тэнцвэржүүлэхээ болих ёстой гэсэн ойлголттой болсон.

3. Тэнцвэржүүлэгчдийн дараа бид нэлээн энгийн програм ажиллуулж байгаа програмын серверүүдтэй болсон. Энэ нь HTTP-ээр дамжуулан ирж буй хүсэлтийг хүлээн авч, илгээсэн json-г баталгаажуулж, өгөгдлийг буферт оруулах боломжтой байх ёстой.

4. Диаграмм нь кафкаг буфер болгон харуулсан боловч мэдээжийн хэрэг бусад ижил төстэй үйлчилгээг энэ түвшинд ашиглаж болно. Гурав дахь өгүүллээр бид Кафка, rabbitmq, yqs-ийг харьцуулах болно.

5. Манай архитектурын эцсийн өмнөх цэг бол Clickhouse - багана хэлбэрийн мэдээллийн сан бөгөөд танд асар их хэмжээний өгөгдлийг хадгалах, боловсруулах боломжийг олгодог. Энэ түвшинд бид буферээс өгөгдлийг хадгалах систем рүү шилжүүлэх хэрэгтэй (энэ талаар дэлгэрэнгүйг 4-р зүйлээс).

Энэхүү загвар нь давхарга бүрийг бие даан хэвтээ байдлаар масштаблах боломжийг олгодог. Арын серверүүд үүнийг даван туулж чадахгүй - дахиад нэг зүйл нэмье - эцэст нь эдгээр нь харьяалалгүй програмууд тул үүнийг автоматаар хийх боломжтой. Кафка маягийн буфер ажиллахгүй байна - өөр сервер нэмж, сэдвийнхээ зарим хэсгийг тэдгээрт шилжүүлье. Clickhouse үүнийг зохицуулж чадахгүй - энэ боломжгүй :) Үнэндээ бид серверүүдийг холбож, өгөгдлийг хуваах болно.

Дашрамд хэлэхэд, хэрэв та манай техникийн үзүүлэлтүүдийн нэмэлт хэсгийг өөр өөр газарзүйн байршилд хэрэгжүүлэхийг хүсч байвал үүнээс илүү хялбар зүйл байхгүй.

Бид Yandex.Cloud дээр 10 үйл явдлыг хүлээн авдаг. 000-р хэсэг

Газарзүйн байршил бүрт бид програм болон кафка бүхий ачаалал тэнцвэржүүлэгчийг байрлуулдаг. Ерөнхийдөө 2 програмын сервер, 3 кафка зангилаа, үүлэн тэнцвэржүүлэгч, жишээ нь cloudflare хангалттай бөгөөд энэ нь үйлчлүүлэгчийн эх IP хаяг дээр үндэслэн газарзүйн байршлаар програмын зангилаа болон балансын хүсэлтийг шалгах болно. Тиймээс Америкийн үйлчлүүлэгчийн илгээсэн өгөгдөл Америкийн серверүүд дээр буух болно. Африкийн мэдээлэл Африкт байна.

Дараа нь бүх зүйл маш энгийн байдаг - бид Кафка багцаас толин тусгал хэрэгслийг ашиглаж, бүх байршлаас бүх өгөгдлийг Орос улсад байрладаг манай төв мэдээллийн төв рүү хуулж авдаг. Дотооддоо бид өгөгдлийг задлан шинжилж, дараа нь дүрслэх зорилгоор Clickhouse-д бичдэг.

Тиймээс, бид архитектурыг ангилсан - Yandex.Cloud-ийг сэгсэрч эхэлцгээе!

Өргөдөл бичиж байна

Үүлээс өмнө та бага зэрэг тэвчээртэй байж, ирж буй үйл явдлыг боловсруулахын тулд нэлээд энгийн үйлчилгээг бичих хэрэгтэй. Голанг нь сүлжээний программ бичих хэл гэдгээ маш сайн баталсан учраас бид ашиглах болно.

Нэг цаг (магадгүй хоёр цаг) зарцуулсны дараа бид дараах зүйлийг олж авна. https://github.com/RebrainMe/yandex-cloud-events/blob/master/app/main.go.

Энд тэмдэглэхийг хүсч буй гол санаанууд юу вэ:

1. Аппликешныг эхлүүлэхдээ та хоёр тугийг зааж өгч болно. Нэг нь бидний ирж ​​буй http хүсэлтийг (-addr) сонсох портыг хариуцдаг. Хоёр дахь нь kafka серверийн хаяг бөгөөд бид үйл явдлуудаа бүртгэх болно (-kafka):

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

2. Уг програм нь sarama номын санг ашигладаг ([] github.com/Shopify/sarama) Кафка кластер руу мессеж илгээх. Бид нэн даруй боловсруулах хамгийн дээд хурдад чиглэсэн тохиргоог тохируулна.

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

3. Манай аппликейшн нь мөн суулгасан prometheus клиенттэй бөгөөд энэ нь янз бүрийн хэмжигдэхүүнүүдийг цуглуулдаг, тухайлбал:

  • манай өргөдөлд ирсэн хүсэлтийн тоо;
  • хүсэлтийг гүйцэтгэх үед гарсан алдааны тоо (шуудангийн хүсэлтийг унших боломжгүй, json эвдэрсэн, Кафка руу бичих боломжгүй);
  • Үйлчлүүлэгчийн нэг хүсэлтийг боловсруулах хугацаа, үүнд Кафка руу мессеж бичих хугацаа орно.

4. Манай програмын боловсруулдаг гурван төгсгөл:

  • /төлөв - зүгээр л ok гэж буцаад бид амьд гэдгээ харуулна. Хэдийгээр та Кафка кластер байгаа эсэх гэх мэт зарим шалгалтуудыг нэмж болно.
  • / хэмжигдэхүүн - энэ url-ийн дагуу prometheus үйлчлүүлэгч цуглуулсан хэмжигдэхүүнээ буцаана.
  • /post бол json доторх POST хүсэлтийг илгээх үндсэн цэг юм. Манай програм json-ийн хүчинтэй эсэхийг шалгадаг бөгөөд хэрэв бүх зүйл хэвийн бол Кафка кластерт өгөгдлийг бичдэг.

Код төгс биш гэдгийг би захиалах болно - үүнийг бөглөж болно (мөн хийх ёстой!). Жишээлбэл, та суулгасан net/http-г ашиглахаа больж, илүү хурдан http руу шилжих боломжтой. Эсвэл өгөгдлийг буферээс clickhouse кластер руу шилжүүлэх үед json хүчинтэй байдлын шалгалтыг дараагийн шат руу шилжүүлснээр процессын хугацаа болон CPU-ийн нөөцийг олж авах боломжтой.

Асуудлын хөгжлийн талаас гадна бид ирээдүйн дэд бүтцийнхээ талаар нэн даруй бодож, програмаа docker-ээр дамжуулан ашиглахаар шийдсэн. Програмыг бүтээх эцсийн Dockerfile нь https://github.com/RebrainMe/yandex-cloud-events/blob/master/app/Dockerfile. Ерөнхийдөө энэ нь маш энгийн бөгөөд миний анхаарахыг хүсч буй цорын ганц зүйл бол бидний савны эцсийн дүрсийг багасгах боломжийг олгодог олон үе шаттай угсралт юм.

Үүлэн дэх эхний алхамууд

Юуны өмнө бүртгүүлээрэй cloud.yandex.ru. Шаардлагатай бүх талбарыг бөглөсний дараа бид данс үүсгэж, үүлэн үйлчилгээг туршихад ашиглаж болох тодорхой хэмжээний мөнгөн тэтгэлэг олгоно. Хэрэв та манай нийтлэлийн бүх алхмуудыг давтахыг хүсч байвал энэ тэтгэлэг танд хангалттай байх болно.

Бүртгүүлсний дараа танд зориулж тусдаа үүл болон анхдагч лавлах үүсгэх бөгөөд үүгээрээ үүлэн нөөцийг үүсгэж эхлэх боломжтой. Ерөнхийдөө Yandex.Cloud дээр нөөцийн харилцаа дараах байдалтай байна.

Бид Yandex.Cloud дээр 10 үйл явдлыг хүлээн авдаг. 000-р хэсэг

Та нэг дансанд хэд хэдэн үүл үүсгэж болно. Мөн үүлэн дотор компанийн янз бүрийн төслүүдэд зориулж өөр өөр лавлахуудыг хий. Та энэ тухай баримт бичигт дэлгэрэнгүй уншиж болно - https://cloud.yandex.ru/docs/resource-manager/concepts/resources-hierarchy. Дашрамд хэлэхэд би үүнийг текстийн доор ихэвчлэн дурдах болно. Би бүхэл бүтэн дэд бүтцийг эхнээс нь бий болгоход баримт бичиг надад нэг бус удаа тусалсан тул үүнийг судлахыг танд зөвлөж байна.

Үүлийг удирдахын тулд та вэб интерфэйс болон консолын хэрэглүүрийг хоёуланг нь ашиглаж болно - yc. Суулгацыг нэг тушаалаар гүйцэтгэдэг (Linux болон Mac Os-д):

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

Хэрэв таны дотоод аюулгүй байдлын мэргэжилтэн интернетээс скрипт ажиллуулахаар улайрч байгаа бол нэгдүгээрт, та скриптийг нээж уншиж болно, хоёрдугаарт, бид үүнийг үндсэн эрхгүйгээр хэрэглэгчийн доор ажиллуулдаг.

Хэрэв та Windows-д зориулсан клиент суулгахыг хүсвэл зааврыг ашиглаж болно энд тэгээд гүйцэтгэнэ yc initбүрэн тохируулахын тулд:

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

Зарчмын хувьд үйл явц нь энгийн байдаг - эхлээд та үүлийг удирдахын тулд oauth токен авах хэрэгтэй, үүл болон ашиглах хавтасаа сонгох хэрэгтэй.

Хэрэв танд нэг үүлэн дотор хэд хэдэн бүртгэл эсвэл фолдер байгаа бол yc тохиргооны профайл үүсгэх замаар тусдаа тохиргоотой нэмэлт профайл үүсгэж, тэдгээрийн хооронд шилжих боломжтой.

Дээрх аргуудаас гадна Yandex.Cloud баг маш сайн бичсэн terraform-д зориулсан залгаас үүлэн нөөцийг удирдахад зориулагдсан. Миний хувьд би git репозитор бэлтгэсэн бөгөөд тэнд өгүүллийн нэг хэсэг болгон бий болох бүх нөөцийг тайлбарлав. https://github.com/rebrainme/yandex-cloud-events/. Бид мастер салбарыг сонирхож байна, үүнийг орон нутагт хувилъя:


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/

Terraform-д хэрэглэгддэг бүх үндсэн хувьсагчдыг main.tf файлд бичдэг. Эхлэхийн тулд terraform хавтсанд дараах контент бүхий private.auto.tfvars файл үүсгэнэ үү.

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

Бүх хувьсагчдыг yc тохиргооны жагсаалтаас авч болно, учир нь бид консолын хэрэглүүрийг аль хэдийн тохируулсан. Хувийн мэдээллийг санамсаргүйгээр нийтлэхгүйн тулд private.auto.tfvars-г .gitignore-д нэн даруй нэмэхийг би танд зөвлөж байна.

private.auto.tfvars дээр бид мөн Cloudflare-аас өгөгдлийг зааж өгсөн - DNS бүртгэл үүсгэх, үндсэн event.kis.im домайныг серверүүддээ прокси болгох. Хэрэв та cloudflare-г ашиглахыг хүсэхгүй байгаа бол main.tf болон шаардлагатай dns бичлэгүүдийг үүсгэх үүрэгтэй dns.tf файл дахь cloudflare үйлчилгээ үзүүлэгчийн анхны тохиргоог устгана уу.

Бид ажилдаа вэб интерфэйс, консолын хэрэгсэл, terraform гэсэн гурван аргыг хослуулах болно.

Виртуал сүлжээнүүд

Үнэнийг хэлэхэд, та энэ алхамыг алгасаж болно, учир нь та шинэ үүл үүсгэх үед автоматаар тусдаа сүлжээ болон 3 дэд сүлжээ үүсгэгдэх болно. Гэхдээ бид төслийнхөө хаягжилттай тусдаа сүлжээ хиймээр байна. Yandex.Cloud дахь сүлжээ хэрхэн ажилладаг тухай ерөнхий диаграммыг доорх зурагт үзүүлэв (үнэнээр хэлэхэд https://cloud.yandex.ru/docs/vpc/concepts/)

Бид Yandex.Cloud дээр 10 үйл явдлыг хүлээн авдаг. 000-р хэсэг

Тиймээс та нөөцүүд хоорондоо харилцах боломжтой нийтлэг сүлжээг бий болгодог. Боломжтой бүс бүрийн хувьд өөрийн хаягтай дэд сүлжээ үүсгэн ерөнхий сүлжээнд холбогдсон байна. Үүний үр дүнд доторх бүх үүлэн нөөцүүд нь өөр өөр бүсэд байгаа ч гэсэн харилцах боломжтой. Өөр өөр үүлэн сүлжээнд холбогдсон нөөцүүд зөвхөн гадаад хаягаар дамжуулан бие биенээ харж болно. Дашрамд хэлэхэд энэ ид шид дотор хэрхэн ажилладаг вэ? Хабре дээр маш сайн дүрсэлсэн.

Сүлжээ үүсгэхийг репозитороос network.tf файлд тайлбарласан болно. Тэнд бид дотоод нэг нийтлэг хувийн сүлжээ үүсгэж, түүнд гурван дэд сүлжээг өөр өөр боломжит бүсэд холбодог - дотоод-a (172.16.1.0/24), дотоод-b (172.16.2.0/24), дотоод-c (172.16.3.0/24). ).

Терраформыг эхлүүлж, сүлжээ үүсгэнэ үү:

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.

Агуу их! Бид сүлжээгээ үүсгэсэн бөгөөд одоо дотоод үйлчилгээгээ бий болгоход бэлэн байна.

Виртуал машин үүсгэх

Аппликешныг туршихын тулд бид зөвхөн хоёр виртуал машин үүсгэх хэрэгтэй болно - эхнийх нь програмыг бүтээж ажиллуулах, хоёр дахь нь ирж буй мессежийг хадгалахын тулд кафка ажиллуулах хэрэгтэй. Мөн бид програмыг хянахын тулд prometheus-ийг тохируулах өөр машин үүсгэх болно.

Виртуал машинуудыг ansible ашиглан тохируулах тул terraform-г эхлүүлэхийн өмнө танд ansible-ийн хамгийн сүүлийн хувилбар байгаа эсэхээ шалгаарай. Мөн ansible galaxy-тай шаардлагатай дүрүүдийг суулгана уу:

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 хавтас дотор миний ашигладаг жишээ .ansible.cfg тохиргооны файл байна. Энэ нь хэрэг болж магадгүй юм.

Виртуал машин үүсгэхээсээ өмнө ssh-agent ажиллаж байгаа, ssh түлхүүр нэмсэн эсэхээ шалгаарай, тэгэхгүй бол terraform нь үүсгэсэн машинуудтай холбогдох боломжгүй болно. Би мэдээж os x дээр алдаатай таарсан: https://github.com/ansible/ansible/issues/32499#issuecomment-341578864. Үүнийг дахин гаргахгүйн тулд Terraform-ийг эхлүүлэхийн өмнө env-д жижиг хувьсагч нэмнэ үү:

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

Terraform бүхий хавтсанд бид шаардлагатай нөөцийг бий болгодог.

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

Хэрэв бүх зүйл амжилттай дууссан бол (мөн тийм байх ёстой) бид гурван виртуал машинтай болно.

  1. бүтээх - програмыг турших, бүтээх машин. Docker-ийг Ansible автоматаар суулгасан.
  2. мониторинг - хяналтын машин - prometheus & grafana дээр суурилуулсан. Нэвтрэх / нууц үгийн стандарт: админ / админ
  3. Кафка бол 9092 порт дээр нэвтрэх боломжтой кафка суулгасан жижиг машин юм.

Тэд бүгд байрандаа байгаа эсэхийг шалгацгаая:

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

Нөөцүүд бэлэн байгаа бөгөөд эндээс бид тэдний IP хаягийг авах боломжтой. Дараах бүх зүйлд би IP хаягуудыг ашиглан ssh-ээр холбогдож, програмыг туршиж үзэх болно. Хэрэв танд terraform-д холбогдсон cloudflare бүртгэл байгаа бол шинээр үүсгэсэн DNS нэрийг чөлөөтэй ашиглаж болно.
Дашрамд хэлэхэд, виртуал машин үүсгэх үед дотоод IP болон дотоод DNS нэрийг өгдөг тул та сүлжээн дэх серверүүдэд нэрээр хандах боломжтой.

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

Энэ нь програмын төгсгөлийн цэгийг kafk-ээр зааж өгөхөд бидэнд ашигтай байх болно.

Програмыг угсарч байна

Гайхалтай, серверүүд байна, програм байна - үүнийг угсарч, нийтлэх л үлдлээ. Бүтээлийн хувьд бид ердийн докерын бүтээцийг ашиглах болно, гэхдээ зургийн хадгалалтын хувьд бид Yandex - container registry-ийн үйлчилгээг ашиглах болно. Гэхдээ хамгийн түрүүнд хийх зүйл.

Бид програмыг бүтээх машин руу хуулж, ssh-ээр нэвтэрч, зургийг угсардаг.

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

Тулааны тал нь дууслаа - одоо бид програмаа ажиллуулж, кафка руу илгээх замаар програмынхаа ажиллагааг шалгаж болно.

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

Аппликешн нь бичлэгийг амжилттай хийсэн бөгөөд мессежийг оруулсан хуваалт болон офсетийн id-г зааж өгсөн. Yandex.Cloud дээр бүртгэл үүсгэж, тэнд бидний зургийг байршуулах л үлдлээ (XNUMX мөр ашиглан үүнийг хэрхэн хийх талаар registry.tf файлд тайлбарласан болно). Хадгалах сан үүсгэх:

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.

Контейнерын бүртгэлд баталгаажуулах хэд хэдэн арга байдаг - oauth токен, iam токен эсвэл үйлчилгээний дансны түлхүүр ашиглан. Эдгээр аргуудын талаарх дэлгэрэнгүй мэдээллийг баримтаас олж болно. https://cloud.yandex.ru/docs/container-registry/operations/authentication. Бид үйлчилгээний дансны түлхүүрийг ашиглах тул бүртгэл үүсгэнэ:

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.

Одоо түүнд түлхүүр хийх л үлдлээ.

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

Бид хадгалах сангийнхаа id-ийн талаарх мэдээллийг хүлээн авч, түлхүүрээ шилжүүлж, нэвтэрнэ:

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

Бүртгэлд зургийг байршуулахын тулд бидэнд контейнер бүртгэлийн ID хэрэгтэй, бид үүнийг yc хэрэгслээс авдаг.

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

Үүний дараа бид зургаа шинэ нэрээр таглаж, байршуулна:

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

Бид зураг амжилттай ачаалагдсан эсэхийг шалгаж болно:

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

Дашрамд хэлэхэд, хэрэв та Линукс машин дээр yc хэрэгслийг суулгасан бол тушаалыг ашиглаж болно

yc container registry configure-docker

докерыг тохируулахын тулд.

дүгнэлт

Бид маш их шаргуу ажил хийсэн бөгөөд үүний үр дүнд:

  1. Бид ирээдүйн үйлчилгээнийхээ архитектурыг боловсруулсан.
  2. Бид өөрсдийн бизнесийн логикийг хэрэгжүүлдэг голанг хэл дээр програм бичсэн.
  3. Бид үүнийг цуглуулж, хувийн чингэлэгийн бүртгэлд цутгасан.

Дараагийн хэсэгт бид сонирхолтой зүйл рүү шилжих болно - бид програмаа үйлдвэрлэлд гаргаж, эцэст нь ачааллыг эхлүүлэх болно. Битгий соль!

Энэ материал нь REBRAIN & Yandex.Cloud нээлттэй семинарын видео бичлэгт байна: Бид Yandex Cloud дээр секундэд 10 хүсэлт хүлээн авдаг - https://youtu.be/cZLezUm0ekE

Хэрэв та ийм арга хэмжээнд онлайнаар оролцож, бодит цаг хугацаанд асуулт асуух сонирхолтой байгаа бол холбогдоорой REBRAIN сувгийн DevOps.

Ийм арга хэмжээг зохион байгуулах боломж олгосон Yandex.Cloud-д онцгой талархал илэрхийлье. Тэдэнтэй холбох - https://cloud.yandex.ru/prices

Хэрэв та үүлэн рүү шилжих эсвэл дэд бүтцийнхээ талаар асуух зүйл байвал Хүсэлтийг чөлөөтэй илгээнэ үү.

Жич: Бид сард 2 удаа үнэгүй аудит хийдэг, магадгүй таны төсөл тэдний нэг байх болно.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх