Ҷойгиркунии хидматҳои тақсимшуда дар Yandex.Cloud бо истифода аз Grafana ҳамчун намуна

Салом ба ҳама! Дар доираи кори курсии худ ман имкониятҳои чунин платформаи абрии ватаниро таҳқиқ кардам Yandex.Cloud. Платформа хидматҳои гуногунро барои ҳалли мушкилоти амалӣ пешниҳод мекунад. Аммо, баъзан ба шумо лозим меояд, ки барномаи абрии худро бо инфрасохтори хеле васеъ дар асоси ин хидматҳо насб кунед. Дар ин мақола ман мехоҳам таҷрибаи худро дар бораи ҷойгиркунии чунин барнома мубодила кунам.

Ҷойгиркунии хидматҳои тақсимшуда дар Yandex.Cloud бо истифода аз Grafana ҳамчун намуна

Шумо чӣ қабул кардан мехоҳед?

Графана — воситаи пурқувват барои ҳалли масъалаҳои таҳлилӣ ё мушкилоти мониторинги ҳама гуна системаҳо. Дар конфигуратсияи асосии он, ин як мошини маҷозӣ бо веб-сервери Grafana ва инчунин пойгоҳи додаҳо (ClickHouse, InfluxDB ва ғайра) бо маҷмӯаи додаҳоест, ки ба он таҳлил асос меёбад.

Пас аз ба кор андохтани мошини маҷозӣ бо веб-сервер, шумо метавонед ба мизбони он равед ва UI-и зебо ба даст оред, пойгоҳи додаҳоро ҳамчун манбаъ барои кори минбаъда муайян кунед, панелҳои идоракунӣ ва графикҳо созед.

Ҷойгиркунии хидматҳои тақсимшуда дар Yandex.Cloud бо истифода аз Grafana ҳамчун намуна

Варианти асосӣ як камбудии назаррас дорад - он ба хатогиҳо тамоман тобовар нест. Яъне, тамоми фаъолияти барнома аз қобилияти як мошини виртуалӣ вобаста аст. Агар он рад кунад ё дар як вақт 10 нафар UI-ро кушоянд, пас мушкилот ба миён меоянд.

Онҳоро ба осонӣ ҳал кардан мумкин аст: ба шумо танҳо лозим аст, ки... бисёр мошинҳои виртуалии якхеларо бо веб-сервер ҷойгир кунед ва онҳоро дар зери тавозуни L3 ҷойгир кунед. Аммо на ҳама чиз дар ин ҷо оддӣ аст. Grafana танзимоти корбарро (роҳҳо ба пойгоҳи додаҳо, панелҳои идоракунӣ, графикҳо ва ғ.) мустақиман дар диски мошини виртуалии худ нигоҳ медорад. Ҳамин тариқ, агар мо баъзе танзимотро дар UI тағир диҳем, ин тағирот танҳо дар мошини маҷозӣ, ки мувозинат ба мо фиристодааст, инъикос хоҳад шуд. Ин ба танзимоти номувофиқ барои замимаи мо ва мушкилот дар оғоз ва истифодаи он оварда мерасонад.

Дар ин ҷо як пойгоҳи додаи дигар ба наҷот меояд, масалан, MySQL ё муодили он. Мо ба Grafana мегӯем, ки ӯ бояд танзимоти корбарро дар ин махзани "эхтиётӣ" нигоҳ дорад. Баъдан, як маротиба дар ҳар як мошин муайян кардани роҳ ба ин махзани маълумот кифоя хоҳад буд ва ҳама танзимоти корбарро дар ҳама гуна мошинҳои виртуалӣ таҳрир кунед; онҳо ба дигарон паҳн мешаванд.

Ин аст диаграммаи инфрасохтори ниҳоии барнома:

Ҷойгиркунии хидматҳои тақсимшуда дар Yandex.Cloud бо истифода аз Grafana ҳамчун намуна

Биёед бо даст бардоштанро ёд гирем

MySQL ва ClickHouse

Пеш аз он ки ин гуна замимаро бо пахши тугма истифода барем, бояд тарзи коркарди ҳар як ҷузъҳои он ва муттаҳид кардани онҳоро бо ҳамдигар омӯхтан лозим буд.

Дар ин ҷо Yandex.Cloud ба мо кӯмак мекунад, ки баланси L3, ClickHouse ва MySQL-ро ҳамчун хидматҳои идорашаванда таъмин мекунад. Истифодабаранда танҳо бояд параметрҳоро муайян кунад ва интизор шавад, ки платформа ҳама чизро ба ҳолати корӣ меорад.

Ман сабти ном шудам, абр ва ҳисоби пардохт эҷод кардам. Пас аз он, ман ба абр рафтам ва кластерҳои MySQL ва ClickHouse-ро бо танзимоти ҳадди аққал насб кардам. Ман интизор будам, ки онҳо фаъол шаванд.

Ҷойгиркунии хидматҳои тақсимшуда дар Yandex.Cloud бо истифода аз Grafana ҳамчун намунаҶойгиркунии хидматҳои тақсимшуда дар Yandex.Cloud бо истифода аз Grafana ҳамчун намуна

Шумо инчунин бояд дар хотир доред, ки дар ҳар як кластер пойгоҳи додаҳо эҷод кунед ва дастрасӣ ба он бо истифода аз логин ва парол танзим кунед. Ман дар ин ҷо ба тафсилот намеравам - ҳама чиз дар интерфейс хеле равшан аст.

Тафсилоти ғайриоддӣ дар он буд, ки ин пойгоҳи додаҳо ҳостҳои зиёде доранд, ки таҳаммулпазирии хатогиҳои онҳоро таъмин мекунанд. Аммо, Grafana барои ҳар як махзани маълумоте, ки бо он кор мекунад, маҳз як ҳост талаб мекунад. Хониши дароз хуччатхо Абрҳо маро ба як қарор оварданд. Маълум мешавад, ки мизбони намуд c-<cluster_id>.rw.mdb.yandexcloud.net ба мизбони фаъоли фаъоли кластер бо ID-и мувофиқ харита карда шудааст. Ин аст он чизе ки мо ба Графана медиҳем.

сервери веб

Акнун он ба сервери веб аст. Биёед як мошини муқаррарии виртуалиро бо Linux эҷод кунем ва дар он Grafana-ро дастӣ танзим кунем.

Ҷойгиркунии хидматҳои тақсимшуда дар Yandex.Cloud бо истифода аз Grafana ҳамчун намуна

Ҷойгиркунии хидматҳои тақсимшуда дар Yandex.Cloud бо истифода аз 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 

Пас аз ин, биёед Grafana-ро зери 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

мо сервери вебро оғоз мекунем. Акнун шумо метавонед суроғаи IP-и берунаи мошини виртуалиро дар браузер ворид кунед, порти 3000-ро муайян кунед ва интерфейси зебои Grafana UI-ро бубинед.
Ҷойгиркунии хидматҳои тақсимшуда дар Yandex.Cloud бо истифода аз Grafana ҳамчун намуна

Аммо шитоб накунед, пеш аз насб кардани Grafana, шумо бояд фаромӯш накунед, ки ба он роҳи MySQL-ро гӯед, то танзимотро дар он ҷо нигоҳ доред.

Тамоми конфигуратсияи веб-сервери Grafana дар файл аст /etc/grafana/grafana.ini. Сатри зарурӣ чунин менамояд:

;url =

Мо мизбонро ба кластери MySQL гузоштем. Дар ҳамон файл логин ва парол барои дастрасӣ ба Grafana дар расми боло мавҷуд аст, ки ба таври пешфарз ҳарду баробаранд 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 Grafana мо ClickHouse-ро ҳамчун Сарчашмаи маълумот муайян мекунем.

Ман тавонистам ба конфигуратсияи корӣ бо танзимоти зерин ноил шавам:

Ҷойгиркунии хидматҳои тақсимшуда дар Yandex.Cloud бо истифода аз Grafana ҳамчун намуна

Ман ҳамчун URL нишон додам https://c-<cluster_id>.rw.mdb.yandexcloud.net:8443

Ҳама! Мо як мошини виртуалии корӣ дорем, ки сервери веб ба CH ва MySQL пайваст аст. Шумо аллакай метавонед маҷмӯи маълумотро ба ClickHouse бор кунед ва панелҳои идоракунӣ созед. Вале мо то хол ба максади худ нарасидаем ва инфраструктураи мукаммалро ба кор набаровардаем.

Packer

Yandex.Cloud ба шумо имкон медиҳад, ки тасвири диски мошини виртуалии мавҷуда ва дар асоси он - ҳама гуна шумораи мошинҳои ба ҳамдигар шабеҳро эҷод кунед. Ин маҳз ҳамон чизест, ки мо истифода хоҳем кард. Барои ба осонӣ васл кардани тасвир, асбобро гиред Packer аз HashiCorp. Он ҳамчун вуруд як файли json бо дастурҳо барои ҷамъ кардани тасвир мегирад.

Файли json мо аз ду блок иборат хоҳад буд: бинокорон ва таъминкунандагон. Блоки якум параметрҳои худи тасвирро ҳамчун объект тавсиф мекунад ва блоки дуюм дастурҳоро барои пур кардани он бо мундариҷаи зарурӣ тавсиф мекунад.

бинокорони

{
"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": [
    {
            "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 марҳила тақсим мешаванд. Дар марҳилаи аввал скрипти оддӣ иҷро карда мешавад, ки директорияи ёрирасонро эҷод мекунад.

hazır-ctg.sh:

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

Дар марҳилаи навбатӣ, мо скриптро дар ин директория ҷойгир мекунем, ки онро фавран пас аз оғози мошини виртуалӣ оғоз кардан лозим аст. Ин скрипт тағирёбандаҳои корбарро ҷойгир мекунад, ки бояд дар конфигуратсияи 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) Grafana-ро зери 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 мегиред.

Ҷойгиркунии хидматҳои тақсимшуда дар Yandex.Cloud бо истифода аз Grafana ҳамчун намуна
Ҷойгиркунии хидматҳои тақсимшуда дар Yandex.Cloud бо истифода аз Grafana ҳамчун намуна

Гурӯҳи мисол ва мувозинат

Вақте ки мо як тасвири диск дорем, ки ба мо имкон медиҳад, ки бисёр веб-серверҳои якхелаи Grafana эҷод кунем, мо метавонем як гурӯҳи мисол эҷод кунем. Дар платформаи Yandex.Cloud, ин истилоҳ ба иттиҳоди мошинҳои маҷозӣ, ки дорои хусусиятҳои якхела мебошанд, ишора мекунад. Ҳангоми сохтани гурӯҳи намунавӣ, прототипи ҳамаи мошинҳои ин гурӯҳ ва баъд хусусиятҳои худи гурӯҳ (масалан, шумораи минималӣ ва максималии мошинҳои фаъол) танзим карда мешавад. Агар рақами ҷорӣ ба ин меъёрҳо мувофиқат накунад, пас худи гурӯҳи мисол мошинҳои нолозимро хориҷ мекунад ё дар симои худ мошинҳои нав эҷод мекунад.

Ҳамчун як қисми вазифаи худ, мо як гурӯҳи намунаҳои веб-серверҳоро эҷод мекунем, ки аз тасвири диски қаблан сохташуда тавлид мешаванд.

Ҷойгиркунии хидматҳои тақсимшуда дар Yandex.Cloud бо истифода аз Grafana ҳамчун намуна

Ҷойгиркунии хидматҳои тақсимшуда дар Yandex.Cloud бо истифода аз Grafana ҳамчун намуна

Он чизе, ки воқеан аҷиб аст, насби охирини гурӯҳи намунавӣ мебошад. Гурӯҳи мақсаднок дар ҳамгироӣ бо Load Balancer ба шумо кӯмак мекунад, ки баланси L3-ро дар болои мошинҳои виртуалии ин гурӯҳ тавассути клик кардани якчанд тугма танзим кунед.

Ҷойгиркунии хидматҳои тақсимшуда дар Yandex.Cloud бо истифода аз Grafana ҳамчун намуна

Ҳангоми насб кардани тавозун, ман ду нуктаи муҳимро амалӣ кардам:

  1. Ман мувозинатро водор кардам, ки трафики корбарро дар бандари 80 қабул кунад ва онро ба бандари 3000 мошинҳои виртуалӣ, ки маҳз дар он ҷо зиндагӣ мекунад, Графана равона кунад.
  2. Ман санҷиши қобилияти мошинҳоро тавассути пинг ба порти 3000 насб кардам.

Ҷойгиркунии хидматҳои тақсимшуда дар Yandex.Cloud бо истифода аз Grafana ҳамчун намуна

Хулосаи хурд

Ниҳоят, мо тавонистем инфрасохтори дилхоҳи барномаро дастӣ ҷойгир кунем ва ҳоло мо хидмати хеле устувори Grafana дорем. Шумо танҳо бояд суроғаи IP-и мувозинатро ҳамчун нуқтаи вуруд ба барнома ва мизбони кластери ClickHouse донед, то маҷмӯи додаҳо ба он бор карда шавад.

Чунин ба назар мерасад, ки ин пирӯзӣ аст? Ҳа, ғалаба. Аммо чизе то ҳол маро парешон мекунад. Тамоми раванди дар боло зикршуда қадамҳои зиёди дастӣ талаб мекунад ва умуман миқёспазир нест; Ман мехоҳам онро автоматӣ кунам, агар имконпазир бошад. Ин аст он чизе ки боби оянда ба он бахшида мешавад.

Интегратсияи терраформ

Мо боз як асбоби 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 гирифта шудааст
Логин и гузарвожа — номи корбар ва парол барои дастрасӣ ба пойгоҳи додаҳо ва веб-сервери Grafana
dbname — номи пойгоҳи додаҳо дар дохили кластерҳои CH ва MySQL
роҳи оммавии_калиди — роҳ ба файл бо калиди ҷамъиятии ssh, ки шумо метавонед онро барои пайваст шудан бо ном истифода баред ubuntu ба мошинҳои виртуалӣ бо серверҳои веб

Танзимоти провайдер

Акнун шумо бояд провайдери Terraform-ро танзим кунед - дар ҳолати мо, Яндекс:

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 кластерро пеш аз оғози Terraform, аз ҷумла ҳангоми сохтани тасвир намедонем. Бинобар ин, ба ман лозим омад, ки ба зерин муроҷиат кунам найранг.

Бо истифода аз хидмати метамаълумоти Amazon, мо баъзе параметрҳоро ба мошини маҷозӣ интиқол медиҳем, ки он онҳоро қабул ва коркард мекунад. Мо ба мошин лозим аст, ки пас аз оғоз ба метамаълумот дар паси мизбони кластери MySQL ва номи корбар-парол, ки корбар онро дар файли 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

Гурӯҳи интенсивӣ ва мувозинаткунанда

Пас аз барқарор кардани тасвири нави диск, мо дар ниҳоят метавонем файли худро барои Terraform илова кунем.

Биёед нишон диҳем, ки мо мехоҳем тасвири диски мавҷударо истифода барем:

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. Маҳз инҳоянд, ки мошини маҷозӣ ҳангоми оғозёбӣ хориҷ карда, конфигуратсияи Grafana-ро ҷойгир мекунад.

Ин ба мувозинат вобаста аст.

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 Grafana равед ва кластери CH-ро (идентификатсияи он ҳоло ҳам бояд гирифта шавад) ҳамчун манбаи маълумот илова кунед. Аммо Terraform ID кластерро медонад. Биёед ба ӯ бовар кунем, ки ин масъаларо ба анҷом расонад.

Биёед провайдери нав - Grafana -ро илова кунем ва ба ӯ суроғаи IP-и мувозинатро ҳамчун мизбон диҳем. Ҳама тағиротҳое, ки Terraform дар мошине, ки мувозинати он муайян мекунад, дар 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"
}

Биёед мӯи худро шона кунем

Биёед суроғаи IP-и мувозинат ва мизбони кластери 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"
}

Шумо метавонед давед

Ҳама! Файли конфигуратсияи мо омода аст ва мо метавонем бо гузоштани тағирёбандаҳо ба Terraform бигӯем, ки ҳама чизеро, ки мо дар боло тавсиф кардем, баланд бардорад. Тамоми раванд ба ман тақрибан 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

Ва дар абр, унсурҳои инфрасохтори баландшуда намоён хоҳанд шуд:

Ҷойгиркунии хидматҳои тақсимшуда дар Yandex.Cloud бо истифода аз Grafana ҳамчун намуна

Биёед, натиҷаҳои онро бифаҳмем

Ҳоло, бо истифода аз Grafana ҳамчун мисол, ҳар яки шумо метавонед замимаҳои дорои меъмории абрии васеъро дар платформаи Yandex.Cloud ҷойгир кунед. Асбобҳои муфид аз HashiCorp ба монанди Packer ва Terraform метавонанд дар ин кор ба шумо кӯмак расонанд. Ман умедворам, ки касе ин мақоларо муфид меҳисобад :)

P.S. Дар зер ман пайвандеро ба анбор замима хоҳам кард, ки дар он шумо метавонед рецептҳои тайёрро барои Packer ва Terraform пайдо кунед, ки порчаҳои онҳоро ман дар ин мақола овардаам.

анбор

Манбаъ: will.com

Илова Эзоҳ