Π”Π΅ΠΏΠ»ΠΎΠΉ распрСдСлСнных сСрвисов Π² ЯндСкс.ОблакС Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Grafana

ВсСм ΠΏΡ€ΠΈΠ²Π΅Ρ‚! Π’ Ρ€Π°ΠΌΠΊΠ°Ρ… курсовой Ρ€Π°Π±ΠΎΡ‚Ρ‹ я занимался исслСдованиями возмоТностСй Ρ‚Π°ΠΊΠΎΠΉ отСчСствСнной ΠΎΠ±Π»Π°Ρ‡Π½ΠΎΠΉ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹, ΠΊΠ°ΠΊ ЯндСкс.Облако. ΠŸΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ° ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ сСрвисы для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ практичСских Π·Π°Π΄Π°Ρ‡. Однако ΠΈΠ½ΠΎΠ³Π΄Π° Π±Ρ‹Π²Π°Π΅Ρ‚ Π½ΡƒΠΆΠ½ΠΎ Π½Π° основС этих сСрвисов Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ своё ΠΎΠ±Π»Π°Ρ‡Π½ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ с достаточно развСсистой инфраструктурой. Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ я Ρ…ΠΎΡ‡Ρƒ ΠΏΠΎΠ΄Π΅Π»ΠΈΡ‚ΡŒΡΡ ΠΎΠΏΡ‹Ρ‚ΠΎΠΌ Ρ€Π°Π·Π²Ρ‘Ρ€Ρ‚ΠΊΠΈ Ρ‚Π°ΠΊΠΎΠ³ΠΎ прилоТСния.

Π”Π΅ΠΏΠ»ΠΎΠΉ распрСдСлСнных сСрвисов Π² ЯндСкс.ОблакС Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Grafana

Π§Ρ‚ΠΎ хочСтся ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ?

Grafana β€” ΠΌΠΎΡ‰Π½Ρ‹ΠΉ инструмСнт для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ аналитичСских Π·Π°Π΄Π°Ρ‡ ΠΈΠ»ΠΈ Π·Π°Π΄Π°Ρ‡ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ систСм. Π’ своСй Π±Π°Π·ΠΎΠ²ΠΎΠΉ ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡ‚Π°Ρ†ΠΈΠΈ это Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ машина с Π²Π΅Π±-сСрвСром Π“Ρ€Π°Ρ„Π°Π½Ρ‹, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π±Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ… (ClickHouse, InfluxDB, etc.) с датасСтом, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π±ΡƒΠ΄Π΅Ρ‚ ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒΡΡ Π°Π½Π°Π»ΠΈΡ‚ΠΈΠΊΠ°.

ПослС запуска Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹ с Π²Π΅Π±-сСрвСром ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΉΡ‚ΠΈ Π½Π° Π΅Π³ΠΎ хост ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ красивый UI, ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… Π² качСствС источников для дальнСйшСй Ρ€Π°Π±ΠΎΡ‚Ρ‹, ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π΄Π°ΡˆΠ±ΠΎΡ€Π΄Ρ‹ ΠΈ Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ.

Π”Π΅ΠΏΠ»ΠΎΠΉ распрСдСлСнных сСрвисов Π² ЯндСкс.ОблакС Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Grafana

Π£ Π±Π°Π·ΠΎΠ²ΠΎΠΉ вСрсии Π΅ΡΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ сущСствСнный нСдостаток β€” ΠΎΠ½Π° ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π½Π΅ отказоустойчива. Π’ΠΎ Π΅ΡΡ‚ΡŒ вся Ρ€Π°Π±ΠΎΡ‚ΠΎΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒ прилоТСния зависит ΠΎΡ‚ ТизнСспособности ΠΎΠ΄Π½ΠΎΠΉ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹. Если ΠΎΠ½Π° ΠΎΡ‚ΠΊΠ°ΠΆΠ΅Ρ‚ ΠΈΠ»ΠΈ ΠΆΠ΅ 10 Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΎΡ‚ΠΊΡ€ΠΎΡŽΡ‚ UI, Ρ‚ΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹.

Π Π΅ΡˆΠ°ΡŽΡ‚ΡΡ ΠΎΠ½ΠΈ просто: Π½ΡƒΠΆΠ½ΠΎ всСго Π»ΠΈΡˆΡŒβ€¦ Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Ρ… Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… машин с Π²Π΅Π±-сСрвСром ΠΈ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ ΠΈΡ… ΠΏΠΎΠ΄ L3-балансСр. Но Π½Π΅ здСсь Π½Π΅ всС Ρ‚Π°ΠΊ ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎ. Π“Ρ€Π°Ρ„Π°Π½Π° Ρ…Ρ€Π°Π½ΠΈΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ настройки (ΠΏΡƒΡ‚ΠΈ ΠΊ Π±Π°Π·Π°ΠΌ Π΄Π°Π½Π½Ρ‹Ρ…, Π΄Π°ΡˆΠ±ΠΎΡ€Π΄Ρ‹, Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ ΠΈ Ρ‚.Π΄.) прямо Π½Π° дискС своСй Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ссли ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ настройки Π² UI, Ρ‚ΠΎ эти измСнСния отобразятся лишь Π½Π° Ρ‚ΠΎΠΉ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ машинС, ΠΊΡƒΠ΄Π° ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΠ» нас балансСр. Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ нСконсистСнтным настройкам нашСго прилоТСния, Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с запуском ΠΈ использованиСм.

Π—Π΄Π΅ΡΡŒ Π½Π° ΠΏΠΎΠΌΠΎΡ‰ΡŒ ΠΏΡ€ΠΈΠ΄Π΅Ρ‚ Π΅Ρ‰Π΅ ΠΎΠ΄Π½Π° Π±Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ…, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, MySQL ΠΈΠ»ΠΈ Π΅Π΅ Π°Π½Π°Π»ΠΎΠ³. Π“ΠΎΠ²ΠΎΡ€ΠΈΠΌ Π“Ρ€Π°Ρ„Π°Π½Π΅, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° Π΄ΠΎΠ»ΠΆΠ½Π° Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ настройки ΠΈΠΌΠ΅Π½Π½ΠΎ Π² этой "запасной" Π±Π°Π·Π΅. ПослС достаточно Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΉ машинС ΠΏΡƒΡ‚ΡŒ ΠΊ этой Π‘Π”, Π° всС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ настройки Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° любой ΠΈΠ· Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… машин, ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΎΡ€Π°ΡΡ‚Π°Ρ‚ΡŒ Π½Π° ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅.

Π’ΠΎΡ‚ схСма ΠΈΡ‚ΠΎΠ³ΠΎΠ²ΠΎΠΉ инфраструктуры прилоТСния:

Π”Π΅ΠΏΠ»ΠΎΠΉ распрСдСлСнных сСрвисов Π² ЯндСкс.ОблакС Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Grafana

Научимся ΠΏΠΎΠ΄Π½ΠΈΠΌΠ°Ρ‚ΡŒ Ρ€ΡƒΠΊΠ°ΠΌΠΈ

MySQL ΠΈ ClickHouse

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ Ρ€Π°Π·Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ΠΌ ΠΎΠ΄Π½ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΈ, Π½ΡƒΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π½Π°ΡƒΡ‡ΠΈΡ‚ΡŒΡΡ ΠΏΠΎΠ΄Π½ΠΈΠΌΠ°Ρ‚ΡŒ Ρ€ΡƒΡ‡ΠΊΠ°ΠΌΠΈ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π΅Π³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ΠΈ ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… Π΄Ρ€ΡƒΠ³ с Π΄Ρ€ΡƒΠ³ΠΎΠΌ.

Π—Π΄Π΅ΡΡŒ Π½Π°ΠΌ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ ЯндСкс.Облако, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ прСдоставляСт L3-балансСры, ClickHouse ΠΈ MySQL Π² качСствС managed-сСрвисов. ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΈ ΠΏΠΎΠ΄ΠΎΠΆΠ΄Π°Ρ‚ΡŒ, ΠΏΠΎΠΊΠ° ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ° ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ всС Π² работоспособноС состояниС.

Π― зарСгистрировался, создал сСбС ΠΎΠ±Π»Π°ΠΊΠΎ ΠΈ ΠΏΠ»Π°Ρ‚Π΅ΠΆΠ½Ρ‹ΠΉ Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚. ПослС этого зашСл Π² ΠΎΠ±Π»Π°ΠΊΠΎ ΠΈ поднял кластСры MySQL ΠΈ ClickHouse с ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ настройками. ДоТдался, ΠΏΠΎΠΊΠ° ΠΎΠ½ΠΈ станут Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹.

Π”Π΅ΠΏΠ»ΠΎΠΉ распрСдСлСнных сСрвисов Π² ЯндСкс.ОблакС Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ GrafanaΠ”Π΅ΠΏΠ»ΠΎΠΉ распрСдСлСнных сСрвисов Π² ЯндСкс.ОблакС Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Grafana

Π’Π°ΠΊΠΆΠ΅ Π½Π°Π΄ΠΎ Π½Π΅ Π·Π°Π±Ρ‹Ρ‚ΡŒ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ кластСрС Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ доступ ΠΊ Π½Π΅ΠΉ ΠΏΠΎ Π»ΠΎΠ³ΠΈΠ½Ρƒ ΠΈ ΠΏΠ°Ρ€ΠΎΠ»ΡŽ. Π’Π΄Π°Π²Π°Ρ‚ΡŒΡΡ здСсь Π² Π΄Π΅Ρ‚Π°Π»ΠΈ Π½Π΅ Π±ΡƒΠ΄Ρƒ β€” Π² интСрфСйсС всС достаточно ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ.

НСочСвидная Π΄Π΅Ρ‚Π°Π»ΡŒ Π±Ρ‹Π»Π° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρƒ этих Π‘Π” мноТСство хостов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ ΠΈΡ… ΠΎΡ‚ΠΊΠ°Π·ΠΎΡƒΡΡ‚ΠΎΠΉΡ‡ΠΈΠ²ΠΎΡΡ‚ΡŒ. Однако Π“Ρ€Π°Ρ„Π°Π½Π° Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Ρ€ΠΎΠ²Π½ΠΎ ΠΎΠ΄ΠΈΠ½ хост для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π‘Π”, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠ½Π° Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚. Π”Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Облака ΠΏΡ€ΠΈΠ²Π΅Π»ΠΎ мСня ΠΊ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡŽ. ΠžΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ΡΡ, хост Π²ΠΈΠ΄Π° c-<cluster_id>.rw.mdb.yandexcloud.net маппится Π² Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ мастСр-хост кластСра с ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ айдишником. ИмСнно Π΅Π³ΠΎ ΠΌΡ‹ ΠΈ ΠΎΡ‚Π΄Π°Π΄ΠΈΠΌ Π“Ρ€Π°Ρ„Π°Π½Π΅.

Π’Π΅Π±-сСрвСр

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄Π΅Π»ΠΎ Π·Π° Π²Π΅Π±-сСрвСром. ПоднимСм ΠΎΠ±Ρ‹Ρ‡Π½ΡƒΡŽ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΌΠ°ΡˆΠΈΠ½Ρƒ с Linux ΠΈ Ρ€ΡƒΠΊΠ°ΠΌΠΈ настроим Π½Π° Π½Π΅ΠΉ Π“Ρ€Π°Ρ„Π°Π½Ρƒ.

Π”Π΅ΠΏΠ»ΠΎΠΉ распрСдСлСнных сСрвисов Π² ЯндСкс.ОблакС Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Grafana

Π”Π΅ΠΏΠ»ΠΎΠΉ распрСдСлСнных сСрвисов Π² ЯндСкс.ОблакС Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Grafana

ΠŸΠΎΠ΄Π»ΡŽΡ‡ΠΈΠΌΡΡ ΠΏΠΎ ssh ΠΈ установим Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹.

sudo apt-get install -y apt-transport-https software-properties-common wget
wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add -
sudo add-apt-repository "deb https://packages.grafana.com/enterprise/deb stable main"
sudo apt-get update
sudo apt-get install -y grafana-enterprise 

ПослС этого Π·Π°Π²Π΅Π΄Π΅ΠΌ Π“Ρ€Π°Ρ„Π°Π½Ρƒ ΠΏΠΎΠ΄ systemctl ΠΈ установим ΠΏΠ»Π°Π³ΠΈΠ½ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ClickHouse (Π΄Π°, Π² Π±Π°Π·ΠΎΠ²ΠΎΠΉ ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡ‚Π°Ρ†ΠΈΠΈ ΠΎΠ½ Π½Π΅ поставляСтся).

sudo systemctl start grafana-server
sudo systemctl enable grafana-server
sudo grafana-cli plugins install vertamedia-clickhouse-datasource

ВсС, послС этого простой ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ

sudo service grafana-server start

ΠΌΡ‹ запустим Π²Π΅Π±-сСрвСр. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅ Π²Π±ΠΈΡ‚ΡŒ внСшний айпишник Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹, ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΏΠΎΡ€Ρ‚ 3000 ΠΈ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ красивый UI Π³Ρ€Π°Ρ„Π°Π½Ρ‹.
Π”Π΅ΠΏΠ»ΠΎΠΉ распрСдСлСнных сСрвисов Π² ЯндСкс.ОблакС Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Grafana

Но Π½Π΅ стоит ΡΠΏΠ΅ΡˆΠΈΡ‚ΡŒ, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ Π“Ρ€Π°Ρ„Π°Π½Ρƒ, Π½Π°Π΄ΠΎ Π½Π΅ Π·Π°Π±Ρ‹Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π΅ΠΉ ΠΏΡƒΡ‚ΡŒ ΠΊ MySQL, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ настройки Ρ‚Π°ΠΌ.

Вся конфигурация Π²Π΅Π±-сСрвСра Π“Ρ€Π°Ρ„Π°Π½Ρ‹ Π»Π΅ΠΆΠΈΡ‚ Π² Ρ„Π°ΠΉΠ»Π΅ /etc/grafana/grafana.ini. НуТная строка выглядит Ρ‚Π°ΠΊ:

;url =

ВыставляСм хост ΠΊ кластСру MySQL. Π’ этом ΠΆΠ΅ Ρ„Π°ΠΉΠ»Π΅ находятся Π»ΠΎΠ³ΠΈΠ½ ΠΈ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ для доступа ΠΊ Π“Ρ€Π°Ρ„Π°Π½Π΅ Π½Π° ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ΅ Π²Ρ‹ΡˆΠ΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΎΠ±Π° Ρ€Π°Π²Π½Ρ‹ admin.

МоТно Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ sed-ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌΠΈ:

sudo sed -i "s#.*;url =.*#url = mysql://${MYSQL_USERNAME}:${MYSQL_PASSWORD}@${MYSQL_CLUSTER_URI}#" /etc/grafana/grafana.ini
sudo sed -i "s#.*;admin_user =.*#admin_user = ${GRAFANA_USERNAME}#" /etc/grafana/grafana.ini
sudo sed -i "s#.*;admin_password =.*#admin_password = ${GRAFANA_PASSWORD}#" /etc/grafana/grafana.ini

Π‘Π°ΠΌΠΎΠ΅ врСмя ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π²Π΅Π±-сСрвСр!

sudo service grafana-server restart

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π² UI Π“Ρ€Π°Ρ„Π°Π½Ρ‹ ΡƒΠΊΠ°ΠΆΠ΅ΠΌ ClickHouse Π² качСствС DataSource.

Π”ΠΎΠ±ΠΈΡ‚ΡŒΡΡ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰Π΅ΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Ρƒ мСня ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ ΠΏΡ€ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… настройках:

Π”Π΅ΠΏΠ»ΠΎΠΉ распрСдСлСнных сСрвисов Π² ЯндСкс.ОблакС Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Grafana

Π’ качСствС URL я ΡƒΠΊΠ°Π·Π°Π» https://c-<cluster_id>.rw.mdb.yandexcloud.net:8443

Всё! Π£ нас Π΅ΡΡ‚ΡŒ ΠΎΠ΄Π½Π° работоспособная Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ машинка с Π²Π΅Π±-сСрвСром, ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹ΠΌ ΠΊ CH ΠΈ MySQL. Π£ΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ датасСт Π² ClickHouse ΠΈ ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π΄Π°ΡˆΠ±ΠΎΡ€Π΄Ρ‹. Однако ΠΌΡ‹ Π΅Ρ‰Π΅ Π½Π΅ достигли нашСй Ρ†Π΅Π»ΠΈ ΠΈ Π½Π΅ Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΠ»ΠΈ ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½ΡƒΡŽ инфраструктуру.

Packer

ЯндСкс.Облако позволяСт ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π· диска ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹, Π° Π½Π° Π΅Π³ΠΎ основС β€” сколько ΡƒΠ³ΠΎΠ΄Π½ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Ρ‹Ρ… Π΄Ρ€ΡƒΠ³ Π΄Ρ€ΡƒΠ³Ρƒ машин. ИмСнно этим ΠΌΡ‹ ΠΈ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ. Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π·, возьмСм инструмСнт Packer ΠΎΡ‚ HashiCorp. Он ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π½Π° Π²Ρ…ΠΎΠ΄ json-Ρ„Π°ΠΉΠ» с инструкциСй ΠΏΠΎ сборкС ΠΎΠ±Ρ€Π°Π·Π°.

Наш json-Ρ„Π°ΠΉΠ» Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΡΡ‚ΠΎΡΡ‚ΡŒ ΠΈΠ· Π΄Π²ΡƒΡ… Π±Π»ΠΎΠΊΠΎΠ²: builders ΠΈ provisioners. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ Π±Π»ΠΎΠΊ описываСт ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ самого ΠΎΠ±Ρ€Π°Π·Π° ΠΊΠ°ΠΊ сущности, Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ β€” ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ ΠΏΠΎ наполнСнию Π½ΡƒΠΆΠ½Ρ‹ΠΌ содСрТимым.

Builders

{
"builders": [
    {
      "type": "yandex",
      "endpoint": "{{user `endpoint`}}",
      "folder_id": "<folder_id>",
      "subnet_id": "{{user `subnet_id`}}",
      "zone": "{{user `zone`}}",
      "labels": {},
      "use_ipv4_nat": true,
      "use_internal_ip": false,
      "service_account_key_file": "<service_account_key_file>",
      "image_name": "grafana-{{timestamp}}",
      "image_family": "grafana",
      "image_labels": {},
      "image_description": "GRAFANA",
      "source_image_family": "ubuntu-1804-lts",
      "disk_size_gb": 3,
      "disk_type": "network-hdd",
      "ssh_username": "ubuntu"
    }
  ],
...
}

Π’ этом шаблонС Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Ρ€Π°Π·Π΄Π΅Π»Π° Π² ΠΎΠ±Π»Π°ΠΊΠ΅, Π³Π΄Π΅ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π·, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡƒΡ‚ΡŒ ΠΊ Ρ„Π°ΠΉΠ»Ρƒ с ΠΊΠ»ΡŽΡ‡Π°ΠΌΠΈ ΠΎΡ‚ сСрвисного Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚Π°, ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π·Π°Π²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ Π² этом Ρ€Π°Π·Π΄Π΅Π»Π΅. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΏΡ€ΠΎ созданиС сСрвисных Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚ΠΎΠ² ΠΈ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ Π² Π²ΠΈΠ΄Π΅ Ρ„Π°ΠΉΠ»Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ.

Вакая конфигурация Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ±Ρ€Π°Π· диска Π±ΡƒΠ΄Π΅Ρ‚ собран Π½Π° основС ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ ubuntu-1804-lts, ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½ Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π² сСмСйствС ΠΎΠ±Ρ€Π°Π·ΠΎΠ² GRAFANA ΠΏΠΎΠ΄ ΠΈΠΌΠ΅Π½Π΅ΠΌ grafana-{{timestamp}}.

Provisioners

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π±ΠΎΠ»Π΅Π΅ интСрСсная Ρ‡Π°ΡΡ‚ΡŒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ. Π’ Π½Π΅ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ описана ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ дСйствий, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°Π΄ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ Π½Π° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ машинС, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ Π·Π°ΠΌΠΎΡ€ΠΎΠ·ΠΈΡ‚ΡŒ Π΅Π΅ состояниС Π² ΠΎΠ±Ρ€Π°Π· диска.

{
...,
"provisioners": [
    {
            "type": "shell",
            "pause_before": "5s",
            "scripts": [
                "prepare-ctg.sh"
            ]
        },
    {
            "type": "file",
            "source": "setup.sh",
            "destination": "/opt/grafana/setup.sh"
        },
        {
            "type": "shell",
        "execute_command": "sudo {{ .Vars }} bash '{{ .Path }}'",
            "pause_before": "5s",
            "scripts": [
                "install-packages.sh",
                "grafana-setup.sh",
                "run-setup-at-reboot.sh"
        ]
        }
  ]
}

Π—Π΄Π΅ΡΡŒ всС дСйствия Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Ρ‹ Π½Π° 3 этапа. На ΠΏΠ΅Ρ€Π²ΠΎΠΌ этапС выполняСтся ΠΏΡ€ΠΎΡΡ‚Π΅Π½ΡŒΠΊΠΈΠΉ скрипт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ создаСт Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ.

prepare-ctg.sh:

#!/bin/bash
sudo mkdir -p /opt/grafana
sudo chown -R ubuntu:ubuntu /opt/grafana

На ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ этапС Π² эту Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌ скрипт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π°Π΄ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ сразу послС запуска Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹. Π­Ρ‚ΠΎΡ‚ скрипт ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°Π΄ΠΎ ΠΏΡ€ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ, Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³ Π“Ρ€Π°Ρ„Π°Π½Ρ‹ ΠΈ пСрСзапустит Π²Π΅Π±-сСрвСр.

setup.sh:

#!/bin/bash
CLUSTER_ID="<cluster_id>"
USERNAME="<username>"
PASSWORD="<password>"
sudo sed -i "s#.*;url =.*#url = mysql://${USERNAME}:${PASSWORD}@c-${CLUSTER_ID}.rw.mdb.yandexcloud.net#" /etc/grafana/grafana.ini
sudo sed -i "s#.*;admin_user =.*#admin_user = ${USERNAME}#" /etc/grafana/grafana.ini
sudo sed -i "s#.*;admin_password =.*#admin_password = ${PASSWORD}#" /etc/grafana/grafana.ini
sudo service grafana-server restart

ПослС этого ΠΎΡΡ‚Π°Π»ΠΎΡΡŒ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ 3 Π²Π΅Ρ‰ΠΈ:
1) ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹
2) завСсти Π“Ρ€Π°Ρ„Π°Π½Ρƒ ΠΏΠΎΠ΄ systemctl ΠΈ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΠ»Π°Π³ΠΈΠ½ ClickHouse
3) ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ скрипт setup.sh Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ Π½Π° запуск сразу послС Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹.

install-packages.sh:

#!/bin/bash
sudo systemd-run --property='After=apt-daily.service apt-daily-upgrade.service' --wait /bin/true
sudo apt-get install -y apt-transport-https
sudo apt-get install -y software-properties-common wget
wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add -
sudo add-apt-repository "deb https://packages.grafana.com/enterprise/deb stable main"
sudo apt-get update
sudo apt-get install -y grafana-enterprise 

grafana-setup.sh:

#!/bin/bash
sudo systemctl start grafana-server
sudo systemctl enable grafana-server
sudo grafana-cli plugins install vertamedia-clickhouse-datasource

run-setup-at-reboot.sh:

#!/bin/bash
chmod +x /opt/grafana/setup.sh
cat > /etc/cron.d/first-boot <<EOF
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
@reboot root /bin/bash /opt/grafana/setup.sh > /var/log/yc-setup.log 2>&1
EOF
chmod +x /etc/cron.d/first-boot;

Π’Π΅ΠΏΠ΅Ρ€ΡŒ остаСтся Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Packer ΠΈ Π½Π° Π²Ρ‹Ρ…ΠΎΠ΄Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΎΠ±Ρ€Π°Π·, ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½Π½Ρ‹ΠΉ Π² ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅. ΠŸΡ€ΠΈ создании Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π² качСствС Π·Π°Π³Ρ€ΡƒΠ·ΠΎΡ‡Π½ΠΎΠ³ΠΎ диска ΠΈ послС запуска ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΉ Π²Π΅Π±-сСрвСр Π“Ρ€Π°Ρ„Π°Π½Ρ‹.

Π”Π΅ΠΏΠ»ΠΎΠΉ распрСдСлСнных сСрвисов Π² ЯндСкс.ОблакС Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Grafana
Π”Π΅ΠΏΠ»ΠΎΠΉ распрСдСлСнных сСрвисов Π² ЯндСкс.ОблакС Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Grafana

Π˜Π½ΡΡ‚Π°Π½Ρ-Π³Ρ€ΡƒΠΏΠΏΠ° ΠΈ балансСр

ПослС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ появился ΠΎΠ±Ρ€Π°Π· диска, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ мноТСство ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Ρ… Π²Π΅Π±-сСрвСров Π“Ρ€Π°Ρ„Π°Π½Ρ‹, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ инстанс-Π³Ρ€ΡƒΠΏΠΏΡƒ. На ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅ ЯндСкс.Облако этим Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΎΠΌ называСтся объСдинСниС Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… машин, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΡ… ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ характСристики. ΠŸΡ€ΠΈ создании инстанс-Π³Ρ€ΡƒΠΏΠΏΡ‹ конфигурируСтся ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ всСх машин Π² этой Π³Ρ€ΡƒΠΏΠΏΠ΅, Π° ΠΏΠΎΡ‚ΠΎΠΌ ΠΈ характСристики самой Π³Ρ€ΡƒΠΏΠΏΡ‹ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, минимальноС ΠΈ максимальноС количСство Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ… машин). Если Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ количСство Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ этим ΠΊΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠ΅ΠΌ, Ρ‚ΠΎ инстанс-Π³Ρ€ΡƒΠΏΠΏΠ° сама ΡƒΠ΄Π°Π»ΠΈΡ‚ Π½Π΅Π½ΡƒΠΆΠ½Ρ‹Π΅ ΠΌΠ°ΡˆΠΈΠ½Ρ‹ ΠΈΠ»ΠΈ создаст Π½ΠΎΠ²Ρ‹Π΅ ΠΏΠΎ ΠΎΠ±Ρ€Π°Π·Ρƒ ΠΈ подобию.

Π’ Ρ€Π°ΠΌΠΊΠ°Ρ… нашСй Π·Π°Π΄Π°Ρ‡ΠΈ ΠΌΡ‹ создадим инстанс-Π³Ρ€ΡƒΠΏΠΏΡƒ Π²Π΅Π±-сСрвСров, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Ρ‚ΡŒΡΡ ΠΈΠ· созданного Ρ€Π°Π½Π΅Π΅ ΠΎΠ±Ρ€Π°Π·Π° диска.

Π”Π΅ΠΏΠ»ΠΎΠΉ распрСдСлСнных сСрвисов Π² ЯндСкс.ОблакС Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Grafana

Π”Π΅ΠΏΠ»ΠΎΠΉ распрСдСлСнных сСрвисов Π² ЯндСкс.ОблакС Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Grafana

По-настоящСму ΠΏΡ€ΠΈΠΌΠ΅Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½Π° послСдняя настройка инстанс-Π³Ρ€ΡƒΠΏΠΏΡ‹. ЦСлСвая Π³Ρ€ΡƒΠΏΠΏΠ° Π² ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ с Load Balancer ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ΠΌ ΠΏΠ°Ρ€Ρ‹ ΠΊΠ½ΠΎΠΏΠΎΠΊ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ L3-балансСр ΠΏΠΎΠ²Π΅Ρ€Ρ… Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… машин этой Π³Ρ€ΡƒΠΏΠΏΡ‹.

Π”Π΅ΠΏΠ»ΠΎΠΉ распрСдСлСнных сСрвисов Π² ЯндСкс.ОблакС Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Grafana

ΠŸΡ€ΠΈ настройкС балансСра я Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π» Π΄Π²Π° Π²Π°ΠΆΠ½Ρ‹Ρ… ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°:

  1. Π‘Π΄Π΅Π»Π°Π» Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ балансСр ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π» ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ Ρ‚Ρ€Π°Ρ„ΠΈΠΊ Π½Π° 80 ΠΏΠΎΡ€Ρ‚Π΅, Π° пСрСнаправлял Π΅Π³ΠΎ Π½Π° 3000 ΠΏΠΎΡ€Ρ‚ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… машин, ΠΊΠ°ΠΊ Ρ€Π°Π· Ρ‚ΡƒΠ΄Π°, Π³Π΄Π΅ ΠΆΠΈΠ²Π΅Ρ‚ Π“Ρ€Π°Ρ„Π°Π½Π°.
  2. Настроил ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ ТизнСспособности машин, пингуя ΠΈΡ… Π² 3000 ΠΏΠΎΡ€Ρ‚.

Π”Π΅ΠΏΠ»ΠΎΠΉ распрСдСлСнных сСрвисов Π² ЯндСкс.ОблакС Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Grafana

Мини-ΠΈΡ‚ΠΎΠ³

НаконСц ΠΌΡ‹ смогли Ρ€ΡƒΠΊΠ°ΠΌΠΈ Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΠΆΠ΅Π»Π°Π΅ΠΌΡƒΡŽ инфраструктуру прилоТСния, ΠΈ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Ρƒ нас Π΅ΡΡ‚ΡŒ высокоустойчивый сСрвис Grafana. НСобходимо лишь Π·Π½Π°Ρ‚ΡŒ IP-адрСс балансСра ΠΊΠ°ΠΊ Ρ‚ΠΎΡ‡ΠΊΡƒ Π²Ρ…ΠΎΠ΄Π° Π² ΠΏΡ€ΠΈΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈ хост кластСра ClickHouse, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ Π² Π½Π΅Π³ΠΎ датасСт.

Казалось Π±Ρ‹, ΠΏΠΎΠ±Π΅Π΄Π°? Π”Π°, ΠΏΠΎΠ±Π΅Π΄Π°. Но Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ всС-Ρ‚Π°ΠΊΠΈ смущаСт. Π’Π΅ΡΡŒ процСсс Π²Ρ‹ΡˆΠ΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ Ρ€ΡƒΡ‡Π½Ρ‹Ρ… дСйствий ΠΈ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π½Π΅ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅Ρ‚ΡΡ, хочСтся Π΅Π³ΠΎ ΠΏΠΎ возмоТности Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. Π­Ρ‚ΠΎΠΌΡƒ ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ посвящСн ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π°Π·Π΄Π΅Π».

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ с Terraform

ΠœΡ‹ снова Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ инструмСнтом ΠΎΡ‚ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ HashiCorp ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ Terraform. Он ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ΠΌ ΠΊΠ½ΠΎΠΏΠΊΠΈ Ρ€Π°Π·Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ всю инфраструктуру прилоТСния, ΠΎΡΠ½ΠΎΠ²Ρ‹Π²Π°ΡΡΡŒ Π½Π° Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ. Π”Π°Π²Π°ΠΉΡ‚Π΅ напишСм Ρ€Π΅Ρ†Π΅ΠΏΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ Π² Ρ€Π°Π·Π½Ρ‹Ρ… Ρ€Π°Π·Π΄Π΅Π»Π°Ρ… Ρ€Π°Π·Π½Ρ‹Ρ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ.

Вся Ρ€Π°Π±ΠΎΡ‚Π° с Π’Π΅Ρ€Ρ€Π°Ρ„ΠΎΡ€ΠΌΠΎΠΌ сводится ΠΊ написанию ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° (*.tf) ΠΈ созданию инфраструктуры Π½Π° Π΅Π³ΠΎ основС.

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅

Π’ самоС Π½Π°Ρ‡Π°Π»Π° Ρ„Π°ΠΉΠ»Π° вынСсСм ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, ΠΎΡ‚ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… зависит, Π³Π΄Π΅ ΠΈ ΠΊΠ°ΠΊ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚Π° будущая инфраструктура.

variable "oauth_token" {
    type = string
    default = "<oauth-token>"
}
variable "cloud_id" {
    type = string
    default = "<cloud-id>"
}
variable "folder_id" {
    type = string
    default = "<folder_id>"
}
variable "service_account_id" {
    type = string
    default = "<service_account_id>"
}
variable "image_id" {
    type = string
    default = "<image_id>"
}
variable "username" {
    type = string
    default = "<username>"
}
variable "password" {
    type = string
    default = "<password>"
}
variable "dbname" {
    type = string
    default = "<dbname>"
}
variable "public_key_path" {
    type = string
    default = "<path to ssh public key>"
}

Π’Π΅ΡΡŒ процСсс Ρ€Π°Π·Π²Ρ‘Ρ€Ρ‚ΠΊΠΈ прилоТСния свСдСтся ΠΊ сборкС ΠΎΠ±Ρ€Π°Π·Π° диска ΠΈ Π²Ρ‹ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΡŽ этих ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…. Поясню, Π·Π° Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‚:

oauth_token β€” Ρ‚ΠΎΠΊΠ΅Π½ для доступа ΠΊ ΠΎΠ±Π»Π°ΠΊΡƒ. МоТно ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΏΠΎ ссылкС.
cloud_id β€” ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΎΠ±Π»Π°ΠΊΠ°, Π³Π΄Π΅ Π±ΡƒΠ΄Π΅ΠΌ Ρ€Π°Π·Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅
folder_id β€” ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Ρ€Π°Π·Π΄Π΅Π»Π°, Π³Π΄Π΅ Π±ΡƒΠ΄Π΅ΠΌ Ρ€Π°Π·Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅
service_account_id β€” ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ сСрвисного Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚Π° Π² ΡΠΎΠΎΡ‚Π²Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΎΠ±Π»Π°ΠΊΠ°.
image_id β€” ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΎΠ±Ρ€Π°Π·Π° диска, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Packer
username ΠΈ password β€” имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ для доступа ΠΊ ΠΎΠ±Π΅ΠΈΠΌ Π±Π°Π·Π°ΠΌ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Π²Π΅Π±-сСрвСру Π“Ρ€Π°Ρ„Π°Π½Ρ‹
dbname β€” имя Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… Π²Π½ΡƒΡ‚Ρ€ΠΈ кластСров CH ΠΈ MySQL
public_key_path β€” ΠΏΡƒΡ‚ΡŒ ΠΊ Ρ„Π°ΠΉΠ»Ρƒ с вашим ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹ΠΌ ssh-ΠΊΠ»ΡŽΡ‡ΠΎΠΌ, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒΡΡ ΠΏΠΎΠ΄ ΠΈΠΌΠ΅Π½Π΅ΠΌ ubuntu ΠΊ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΌ машинам с Π²Π΅Π±-сСрвСрами

Настройка ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€Π°

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½ΡƒΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€ Π’Π΅Ρ€Ρ€Π°Ρ„ΠΎΡ€ΠΌΠ° β€” Π² нашСм случаС ЯндСкс:

provider "yandex" {
  token     = var.oauth_token
  cloud_id  = var.cloud_id
  folder_id = var.folder_id
  zone      = "ru-central1-a"
}

МоТно Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ здСсь ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, Π·Π°Π΄Π°Π½Π½Ρ‹Π΅ Π²Ρ‹ΡˆΠ΅.

Π‘Π΅Ρ‚ΡŒ ΠΈ кластСры

Π’Π΅ΠΏΠ΅Ρ€ΡŒ создадим ΡΠ΅Ρ‚ΡŒ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΠ±Ρ‰Π°Ρ‚ΡŒΡΡ элСмСнты нашСй инфраструктуры, Ρ‚Ρ€ΠΈ подсСти (ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΉ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Ρ€Π΅Π³ΠΈΠΎΠ½Π΅) ΠΈ ΠΏΠΎΠ΄Π½ΠΈΠΌΠ΅ΠΌ кластСры CH ΠΈ MySQL.


resource "yandex_vpc_network" "grafana_network" {}

resource "yandex_vpc_subnet" "subnet_a" {
  zone           = "ru-central1-a"
  network_id     = yandex_vpc_network.grafana_network.id
  v4_cidr_blocks = ["10.1.0.0/24"]
}

resource "yandex_vpc_subnet" "subnet_b" {
  zone           = "ru-central1-b"
  network_id     = yandex_vpc_network.grafana_network.id
  v4_cidr_blocks = ["10.2.0.0/24"]
}

resource "yandex_vpc_subnet" "subnet_c" {
  zone           = "ru-central1-c"
  network_id     = yandex_vpc_network.grafana_network.id
  v4_cidr_blocks = ["10.3.0.0/24"]
}

resource "yandex_mdb_clickhouse_cluster" "ch_cluster" {
  name        = "grafana-clickhouse"
  environment = "PRODUCTION"
  network_id  = yandex_vpc_network.grafana_network.id

  clickhouse {
    resources {
      resource_preset_id = "s2.micro"
      disk_type_id       = "network-ssd"
      disk_size          = 16
    }
  }

  zookeeper {
    resources {
      resource_preset_id = "s2.micro"
      disk_type_id       = "network-ssd"
      disk_size          = 10
    }
  }

  database {
    name = var.dbname
  }

  user {
    name     = var.username
    password = var.password
    permission {
      database_name = var.dbname
    }
  }

  host {
    type      = "CLICKHOUSE"
    zone      = "ru-central1-a"
    subnet_id = yandex_vpc_subnet.subnet_a.id
  }

  host {
    type      = "CLICKHOUSE"
    zone      = "ru-central1-b"
    subnet_id = yandex_vpc_subnet.subnet_b.id
  }

  host {
    type      = "CLICKHOUSE"
    zone      = "ru-central1-c"
    subnet_id = yandex_vpc_subnet.subnet_c.id
  }

  host {
    type      = "ZOOKEEPER"
    zone      = "ru-central1-a"
    subnet_id = yandex_vpc_subnet.subnet_a.id
  }

  host {
    type      = "ZOOKEEPER"
    zone      = "ru-central1-b"
    subnet_id = yandex_vpc_subnet.subnet_b.id
  }

  host {
    type      = "ZOOKEEPER"
    zone      = "ru-central1-c"
    subnet_id = yandex_vpc_subnet.subnet_c.id
  }
}

resource "yandex_mdb_mysql_cluster" "mysql_cluster" {
  name        = "grafana_mysql"
  environment = "PRODUCTION"
  network_id  = yandex_vpc_network.grafana_network.id
  version     = "8.0"

  resources {
    resource_preset_id = "s2.micro"
    disk_type_id       = "network-ssd"
    disk_size          = 16
  }

  database {
    name = var.dbname
  }

  user {
    name     = var.username
    password = var.password
    permission {
      database_name = var.dbname
      roles         = ["ALL"]
    }
  }

  host {
    zone      = "ru-central1-a"
    subnet_id = yandex_vpc_subnet.subnet_a.id
  }
  host {
    zone      = "ru-central1-b"
    subnet_id = yandex_vpc_subnet.subnet_b.id
  }
  host {
    zone      = "ru-central1-c"
    subnet_id = yandex_vpc_subnet.subnet_c.id
  }
}

Как ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· Π΄Π²ΡƒΡ… кластСров создан достаточно отказоустойчивым Π·Π° счСт размСщСния Π² Ρ‚Ρ€Π΅Ρ… Π·ΠΎΠ½Π°Ρ… доступности.

Π’Π΅Π±-сСрвСры

Казалось Π±Ρ‹, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ Π² Ρ‚ΠΎΠΌ ΠΆΠ΅ Π΄ΡƒΡ…Π΅, Π½ΠΎ я столкнулся со ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ. Π”ΠΎ этого я сначала ΠΏΠΎΠ΄Π½ΠΈΠΌΠ°Π» MySQL кластСр ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ послС этого, зная Π΅Π³ΠΎ ID, собирал ΠΎΠ±Ρ€Π°Π· диска с Π½ΡƒΠΆΠ½ΠΎΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠ΅ΠΉ, Π³Π΄Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π» хост ΠΊ кластСру. Но Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ Π½Π΅ Π·Π½Π°Π΅ΠΌ ID кластСра Π΄ΠΎ запуска Π’Π΅Ρ€Ρ€Π°Ρ„ΠΎΡ€ΠΌΠ°, Π² Ρ‚ΠΎΠΌ числС ΠΈ Π½Π° ΠΌΠΎΠΌΠ΅Π½Ρ‚ сборки ΠΎΠ±Ρ€Π°Π·Π°. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ ΠΏΡ€ΠΈΠ±Π΅Π³Π½ΡƒΡ‚ΡŒ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ Ρ‚Ρ€ΡŽΠΊΡƒ.

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ сСрвис ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΡ‚ Amazon, ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΄ΠΈΠΌ Π² Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΌΠ°ΡˆΠΈΠ½Ρƒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ‚ ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚. Нам Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ послС запуска машина сходила Π² ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Π΅ Π·Π° хостом MySQL кластСра ΠΈ Π·Π° username-password, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π» Π² Ρ„Π°ΠΉΠ»Π΅ Terraform. ΠΠ΅Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠΌ содСрТимоС Ρ„Π°ΠΉΠ»Π° setup.sh, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ запускаСтся ΠΏΡ€ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹.

setup.sh:

#!/bin/bash
CLUSTER_URI="$(curl -H 'Metadata-Flavor:Google' http://169.254.169.254/computeMetadata/v1/instance/attributes/mysql_cluster_uri)"
USERNAME="$(curl -H 'Metadata-Flavor:Google' http://169.254.169.254/computeMetadata/v1/instance/attributes/username)"
PASSWORD="$(curl -H 'Metadata-Flavor:Google' http://169.254.169.254/computeMetadata/v1/instance/attributes/password)"
sudo sed -i "s#.*;url =.*#url = mysql://${USERNAME}:${PASSWORD}@${CLUSTER_URI}#" /etc/grafana/grafana.ini
sudo sed -i "s#.*;admin_user =.*#admin_user = ${USERNAME}#" /etc/grafana/grafana.ini
sudo sed -i "s#.*;admin_password =.*#admin_password = ${PASSWORD}#" /etc/grafana/grafana.ini
sudo service grafana-server restart

Π˜Π½Ρ‚Π°Π½Ρ-Π³Ρ€ΡƒΠΏΠΏΠ° ΠΈ балансСр

ΠŸΠ΅Ρ€Π΅ΡΠΎΠ±Ρ€Π°Π² Π½ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±Ρ€Π°Π· диска, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π°ΠΊΠΎΠ½Π΅Ρ† Π΄ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ наш Ρ„Π°ΠΉΠ» для Π’Π΅Ρ€Ρ€Π°Ρ„ΠΎΡ€ΠΌΠ°.

Π£ΠΊΠ°ΠΆΠ΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠ±Ρ€Π°Π· диска:

data "yandex_compute_image" "grafana_image" {
  image_id = var.image_id
}

Π’Π΅ΠΏΠ΅Ρ€ΡŒ создадим инстанс-Π³Ρ€ΡƒΠΏΠΏΡƒ:

resource "yandex_compute_instance_group" "grafana_group" {
  name               = "grafana-group"
  folder_id          = var.folder_id
  service_account_id = var.service_account_id
  instance_template {
    platform_id = "standard-v1"
    resources {
      memory = 1
      cores  = 1
    }
    boot_disk {
      mode = "READ_WRITE"
      initialize_params {
        image_id = data.yandex_compute_image.grafana_image.id
        size     = 4
      }
    }
    network_interface {
      network_id = yandex_vpc_network.grafana_network.id
      subnet_ids = [yandex_vpc_subnet.subnet_a.id, yandex_vpc_subnet.subnet_b.id, yandex_vpc_subnet.subnet_c.id]
      nat = "true"
    }
    metadata = {
      mysql_cluster_uri = "c-${yandex_mdb_mysql_cluster.mysql_cluster.id}.rw.mdb.yandexcloud.net:3306/${var.dbname}"
      username = var.username
      password = var.password
      ssh-keys = "ubuntu:${file("${var.public_key_path}")}"
    }
    network_settings {
      type = "STANDARD"
    }
  }

  scale_policy {
    fixed_scale {
      size = 6
    }
  }

  allocation_policy {
    zones = ["ru-central1-a", "ru-central1-b", "ru-central1-c"]
  }

  deploy_policy {
    max_unavailable = 2
    max_creating    = 2
    max_expansion   = 2
    max_deleting    = 2
  }

  load_balancer {
    target_group_name = "grafana-target-group"
  }
}

Π‘Ρ‚ΠΎΠΈΡ‚ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π»ΠΈ Π² ΠΌΠ΅Ρ‚Π°Π΄Π°Ρ‚Ρƒ cluster_uri, username ΠΈ password. ИмСнно ΠΈΡ… Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ машина ΠΏΡ€ΠΈ запускС достанСт ΠΈ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³ Π“Ρ€Π°Ρ„Π°Π½Ρ‹.

Π”Π΅Π»ΠΎ Π·Π° балансСром.

resource "yandex_lb_network_load_balancer" "grafana_balancer" {
  name = "grafana-balancer"

  listener {
    name = "grafana-listener"
    port = 80
    target_port = 3000
    external_address_spec {
      ip_version = "ipv4"
    }
  }

  attached_target_group {
    target_group_id = yandex_compute_instance_group.grafana_group.load_balancer.0.target_group_id

    healthcheck {
      name = "healthcheck"
      tcp_options {
        port = 3000
      }
    }
  }
}

НСмного сахара

ΠžΡΡ‚Π°Π»Π°ΡΡŒ самая ΠΌΠ°Π»ΠΎΡΡ‚ΡŒ. ПослС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ инфраструктура развСрнСтся, придСтся ΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π² UI Π“Ρ€Π°Ρ„Π°Π½Ρ‹ ΠΈ Ρ€ΡƒΠΊΠ°ΠΌΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ кластСр CH (ID ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π΅Ρ‰Π΅ Π΄ΠΎΠ±Ρ‹Ρ‚ΡŒ) ΠΊΠ°ΠΊ Data Source. Но вСдь ID кластСра Π·Π½Π°Π΅Ρ‚ Π’Π΅Ρ€Ρ€Π°Ρ„ΠΎΡ€ΠΌ. ΠŸΠΎΡ€ΡƒΡ‡ΠΈΠΌ Π΅ΠΌΡƒ довСсти Π΄Π΅Π»ΠΎ Π΄ΠΎ ΡƒΠΌΠ°.

Π”ΠΎΠ±Π°Π²ΠΈΠΌ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€Π° β€” Π“Ρ€Π°Ρ„Π°Π½Ρƒ, Π° Π² качСствС хоста подсунСм Π΅ΠΉ айпишник балансСра. ВсС измСнСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ сдСлаСт Π’Π΅Ρ€Ρ€Π°Ρ„ΠΎΡ€ΠΌ Π½Π° машинС, ΠΊΡƒΠ΄Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ Π΅Π³ΠΎ балансСр, прорастут Π² MySQL, Π° Π·Π½Π°Ρ‡ΠΈΡ‚ ΠΈ Π½Π° всС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠ°ΡˆΠΈΠ½Ρ‹.

provider "grafana" {
  url  = "http://${[for s in yandex_lb_network_load_balancer.grafana_balancer.listener: s.external_address_spec.0.address].0}"
  auth = "${var.username}:${var.password}"
}

resource "grafana_data_source" "ch_data_source" {
  type          = "vertamedia-clickhouse-datasource"
  name          = "grafana"
  url           = "https://c-${yandex_mdb_clickhouse_cluster.ch_cluster.id}.rw.mdb.yandexcloud.net:8443"
  basic_auth_enabled = "true"
  basic_auth_username = var.username
  basic_auth_password = var.password
  is_default = "true"
  access_mode = "proxy"
}

ΠŸΡ€ΠΈΡ‡Π΅ΡˆΠ΅ΠΌ

Π’Ρ‹Π²Π΅Π΄Π΅ΠΌ айпишник балансСра ΠΈ хост кластСра ClickHouse

output "grafana_balancer_ip_address" {
  value = [for s in yandex_lb_network_load_balancer.grafana_balancer.listener: s.external_address_spec.0.address].0
}

output "clickhouse_cluster_host" {
  value = "https://c-${yandex_mdb_clickhouse_cluster.ch_cluster.id}.rw.mdb.yandexcloud.net:8443"
}

МоТно Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ

Всё! Наш ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» Π³ΠΎΡ‚ΠΎΠ² ΠΈ ΠΌΠΎΠΆΠ½ΠΎ, выставив ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, ΡΠΊΠ°Π·Π°Ρ‚ΡŒ Π’Π΅Ρ€Ρ€Π°Ρ„ΠΎΡ€ΠΌΡƒ ΠΏΠΎΠ΄Π½ΡΡ‚ΡŒ всС, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ описали Π²Ρ‹ΡˆΠ΅. Π’Π΅ΡΡŒ процСсс Ρƒ мСня занял ΠΎΠΊΠΎΠ»ΠΎ 15 ΠΌΠΈΠ½ΡƒΡ‚.
Π’ ΠΊΠΎΠ½Ρ†Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ красивоС сообщСниС:

Apply complete! Resources: 9 added, 0 changed, 0 destroyed.
Outputs:

clickhouse_cluster_host = https://c-c9q14ipa2ngadqsbp2iq.rw.mdb.yandexcloud.net:8443
grafana_balancer_ip_address = 130.193.50.25

А Π² ΠΎΠ±Π»Π°ΠΊΠ΅ Π±ΡƒΠ΄ΡƒΡ‚ Π²ΠΈΠ΄Π½Ρ‹ элСмСнты поднятой инфраструктуры:

Π”Π΅ΠΏΠ»ΠΎΠΉ распрСдСлСнных сСрвисов Π² ЯндСкс.ОблакС Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Grafana

ПодвСдСм ΠΈΡ‚ΠΎΠ³ΠΈ

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π“Ρ€Π°Ρ„Π°Π½Ρ‹ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· вас ΡƒΠΌΠ΅Π΅Ρ‚ Ρ€Π°Π·Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ прилоТСния с развСсистой ΠΎΠ±Π»Π°Ρ‡Π½ΠΎΠΉ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ΠΎΠΉ Π½Π° ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅ ЯндСкс.Облако. Π’ этом Π²Π°ΠΌ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠΌΠΎΡ‡ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Π΅ инструмСнты ΠΎΡ‚ HashiCorp, ΠΊΠ°ΠΊ Packer ΠΈ Terraform. НадСюсь, ΠΊΠΎΠΌΡƒ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ эта ΡΡ‚Π°Ρ‚ΡŒΡ окаТСтся ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ πŸ™‚

P.S. НиТС ΠΏΡ€ΠΈΠ»ΠΎΠΆΡƒ ссылочку Π½Π° Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π³ΠΎΡ‚ΠΎΠ²Ρ‹Π΅ Ρ€Π΅Ρ†Π΅ΠΏΡ‚Ρ‹ для ΠŸΠ°ΠΊΠ΅Ρ€Π° ΠΈ Π’Π΅Ρ€Ρ€Π°Ρ„ΠΎΡ€ΠΌΠ°, Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Ρ‹ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… я ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠ» Π² этой ΡΡ‚Π°Ρ‚ΡŒΠ΅.

Π Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com