Përshëndetje të gjithëve! Gjatë punës time për projektin, kam исследовал mundësitë e një platforme cloud vendase siç është . Kjo platformë ofron shërbime të ndryshme për zgjidhjen e problemeve praktike. Megjithatë, ndonjëherë është e nevojshme të krijoni një aplikacion cloud mbi këto shërbime me një infrastrukturë mjaft të gjerë. Në këtë artikull, do të ndajem përvojën time në ngritjen e një aplikacioni të tillë.

Çfarë dëshirojmë të marrim?
— një instrument të fuqishëm për zgjidhjen e detyrave analitike ose për monitorimin e disa sistemeve. Në konfigurimin e saj bazë, kjo është një makinë virtuale me një server web Grafana, si dhe një bazë të dhënash (ClickHouse, InfluxDB, etj.) me një set të dhënash mbi të cilin do të ndërtohet analiza.
Pas aktivizimit të makinës virtuale me serverin web, do të mund të hyni në hostin e saj dhe të merrni një UI të bukur, të specifikoni bazat e të dhënave si burime për punën e mëtejshme, të krijoni dashboard-e dhe grafika.

Versioni bazë ka një disavantazh të dukshëm — ai nuk është aspak i qëndrueshëm. Kështu, gjithë funksionaliteti i aplikacionit varet nga vitaliteti i një makine virtuale. Nëse ajo dështon ose 10 persona e hapin njëherësh UI-në, do të kemi probleme.
Këto zgjidhen lehtë: duhet thjesht… të ngriten disa makina virtuale të njëjta me serverin web dhe t'i vendosim nën një balancues L3. Por këtu situata nuk është kaq e thjeshtë. Grafana ruan konfigurimet e përdoruesve (rrugët e bazave të të dhënave, dashboard-e, grafika etj.) direkt në diskun e makinës së saj virtuale. Kështu, nëse ndryshoni disa konfigurime në UI, ato do të reflektohen vetëm në atë makinë virtuale ku na dërgoi balancuesi. Kjo do të çojë në konfigurime jo të qëndruara të aplikacionit tonë, do të ketë probleme në funksionim dhe përdorim.
Këtu do të na ndihmojë një bazë tjetër të dhënash, për shembull, MySQL ose një ekuivalent i saj. I themi Grafana-s se ajo duhet të ruajë konfigurimet e përdoruesve pikërisht në këtë bazë "rezervë". Pas kësaj, mjafton të specifikoni një herë rrugën për çdo makinë në këtë BDB, dhe të gjitha konfigurimet e tjera të përdoruesve të redaktohen në çdo makinë virtuale, ato do të shpërndahen në makinat e tjera.
Ja skema e infrastrukturës përfundimtare të aplikacionit:

Mësojmë të ngritim me duar
MySQL dhe ClickHouse
Para se të ngrinim një aplikacion të tillë me një klikim, duhej të mësoheshim të ngrinim me duar çdo komponent të tij dhe t'i integrojmë ata me njëri-tjetrin.
Këtu na ndihmon Yandex.Cloud, i cili ofron balancues L3, ClickHouse dhe MySQL si shërbime të menaxhuara. Përdoruesit duhet vetëm të specifikojnë parametrat dhe të presin derisa platforma të sjellë gjithçka në gjendje funksionale.
Unë u regjistrova, krijova një cloud dhe një llogari pagese. Pas kësaj, hyra në cloud dhe ngrita klasterët MySQL dhe ClickHouse me konfigurime minimale. Pritëm që ata të bëhen aktivë.


Po ashtu, nuk duhet harruar të krijoni një bazë të dhënash në secilin klaster dhe të konfiguroni aksesin e saj me emër përdoruesi dhe fjalëkalim. Nuk do të thellohem këtu — në ndërfaqe gjithçka është mjaft evidente.
Një detaj i padukshëm ishte se këto Baza të Dhënash kanë shumë hoste, të cilat sigurojnë qëndrueshmërinë e tyre. Megjithatë, Grafana kërkon vetëm një host për çdo Baze të Dhënash me të cilin ajo punon. Leximi i gjatë i Cloud-it më çoi në zgjidhje. Rrjedhimisht, hosti i tipit c-<cluster_id>.rw.mdb.yandexcloud.net në fakt mapohet me hostin aktual aktiv të klasit me ID-në përkatëse. Këtë do t'ia japim Grafana-s.
Server web
Tani është radha e serverit web. Do të ngrisim një makinë virtuale të zakonshme me Linux dhe do ta konfiguroni Grafana-n me duar.


Do të lidhemi përmes ssh dhe do të instalojmë paketat e nevojshme.
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
Pas kësaj, do ta nisë Grafana-n përmes systemctl dhe do të instalojmë plugin-in për të punuar me ClickHouse (po, në konfigurimin bazë ai nuk ofrohet).
sudo systemctl start grafana-server
sudo systemctl enable grafana-server
sudo grafana-cli plugins install vertamedia-clickhouse-datasourceKjo ështё mjaft: me komandën e thjeshtë
sudo service grafana-server startne do të lëshojmë serverin web. Tani mund të shkruani në shfletuesin tuaj IP-në e jashtme të makinës virtuale, të specifikoni portin 3000 dhe të shihni një UI të bukur të grafanës.

Por nuk është koha për të nxituar, para se të konfiguroni Grafana-n, mos harroni të specifikoni rrugën e saj në MySQL për të ruajtur konfigurimet aty.
E gjithë konfigurimi i serverit web të Grafana-s ndodhet në skedarin /etc/grafana/grafana.ini. Rreshti që na nevojitet duket kështu:
;url =Për të vendosur hostin në klasterin MySQL. Në këtë skedar gjenden emri i përdoruesit dhe fjalëkalimi për akses në Grafana-n e ilustruar më sipër, të cilat të dyja që në fillim janë të barabarta me admin.
Mund të përdorim komandat 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
Është koha për të rinuar serverin e web-it!
sudo service grafana-server restartTani në UI të Grafanës le të caktuam ClickHouse si DataSource.
Arrita një konfigurim funksional me këto parametra:

Si URL kam caktuar https://c-.rw.mdb.yandexcloud.net:8443
Kaq! Kemi një makinë virtuale funksionale me server web të lidhur me CH dhe MySQL. Tani mund të ngarkojmë dataset në ClickHouse dhe të ndalojmë dashboarde. Megjithatë, nuk e kemi arritur ende qëllimin tonë dhe nuk kemi vendosur një infrastrukturë të plotë.
Packer
Yandex.Cloud lejon krijimin e një imazhi disku nga një makinë virtuale ekzistuese, dhe mbi këtë bazë — sa më shumë makina identike që dëshiron. Ashtu siç do ta përdorim. Për të mbledhur imazhin më lehtësisht, do të përdorim mjetin nga HashiCorp. Ai merr si input një skedar json me udhëzime për ndërtimin e imazhit.
Skedari ynë json do të përbëhet nga dy blloqe: builders dhe provisioners. Blloku i parë përshkruan parametrat e imazhit si një entitet, dhe e dyta — udhëzimet për mbushjen me përmbajtjen e nevojshme.
Builders
{
"builders": [
{
"type": "yandex",
"endpoint": "{{user `endpoint`}}",
"folder_id": "",
"subnet_id": "{{user `subnet_id`}}",
"zone": "{{user `zone`}}",
"labels": {},
"use_ipv4_nat": true,
"use_internal_ip": false,
"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"
}
],
...
}Në këtë shabllon duhet caktuar identifikuesi i seksionit në cloud, ku dëshiron të krijosh imazhin, si dhe rruga për skedarin me çelësat e llogarisë shërbimi, të krijuar më parë në atë seksion. Më shumë për krijimin e llogarive shërbimi dhe çelësave si skedar mund të lexosh në seksionin përkatës. .
Kjo konfigurim tregon se imazhi i diskut do të ndërtohet mbi platformën ubuntu-1804-lts, i vendosur në seksionin përkatës të përdoruesit në familjen e imazheve GRAFANA me emrin grafana-{{timestamp}}.
Provisioners
Tani pjesa më interesante e konfigurimit. Ajo do të përshkruajë sekuencën e veprimeve që duhet të kryhen në makinën virtuale përpara se të ngrijë gjendjen e saj në imazhin e diskut.
{
...,
"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"
]
}
]
}Këtu të gjitha veprimet janë të ndara në 3 faza. Në fazën e parë ekzekutohet një skenar i thjeshtë, i cili krijon një dosje ndihmëse.
prepare-ctg.sh:
#!/bin/bash
sudo mkdir -p /opt/grafana
sudo chown -R ubuntu:ubuntu /opt/grafanaNë fazën e ardhshme, në këtë dosje vendosim një skenar që do të ekzekutohet menjëherë pas nisjes së makinës virtuale. Ky skenar do të futë variablat e përdoruesit në konfigurimin e Grafanës dhe do të rinovojë serverin e web-it.
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 restartPas kësaj, mbeten për të bërë 3 gjëra:
1) instaloni paketat
2) aktivizoni Grafanën me systemctl dhe instaloni pluginin ClickHouse
3) vendosni skenarin setup.sh në radhë për t'u ekzekutuar menjëherë pas ndezjes së makinës virtuale.
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-datasourcerun-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;Tani mbetet të nisim Packer dhe në fund të marrim një imazh, i vendosur në seksionin e caktuar. Kur krijohet makina virtuale, mund ta zgjedhim atë si disk të fillimit dhe pas aktivizimit të bëjmë një server web të gatshëm të Grafanës.


Grupi i instancave dhe balancuesi
Pas krijimit të imazhit të diskut, i cili lejon krijimin e shumë serverëve web të identikë të Grafanës, ne mund të krijojmë një grup instancash. Në platformën Yandex.Cloud, ky term përfaqëson një grup makinash virtuale me karakteristika të njëjta. Kur krijohet një grup instancash, konfigurohet prototipi i të gjitha makinave në këtë grup dhe pastaj karakteristikat e vetë grupit (p.sh., numri minimal dhe maksimal i makinave aktive). Nëse numri aktual nuk përputhet me këto kritere, grupi i instancave do t'i heqë vetë makinat e panevojshme ose do të krijojë të reja sipas imazhit dhe ngjashmërisë.
Në kuadrin e detyrës sonë, ne do të krijojmë një grup instancash serverësh web, të cilët do të krijohen nga imazhi të krijuar më parë.


Ajo që është vërtet e veçantë është konfigurimi i fundit i grupit të instancave. Grupi synues, në integrim me Load Balancer, do të ndihmojë të konfigurosh një balancues L3 mbi makinat virtuale të këtij grupi me disa klikime.

Gjatë konfigurimit të balancuesit, realizova dy pika të rëndësishme:
- E kam bërë që balancuesi të pranojë trafikun e përdoruesve në portin 80 dhe ta drejtojë atë në portin 3000 të makinave virtuale, aty ku ndodhet Grafana.
- Kam konfiguruar verifikimin e vitalitetit të makinave duke i pingutur ato në portin 3000.

Përmbledhje e shkurtër
Më në fund, arritëm të vendosim infrastrukturën e dëshiruar të aplikacionit me duar, dhe tani kemi një shërbim të qëndrueshëm të Grafana. Nevojitet vetëm të dinë adresën IP të balancuesit si pikë hyrjeje në aplikacion dhe hostin e grupit të ClickHouse për të ngarkuar datasetin.
Duket si një fitore? Po, është një fitore. Por gjithsesi, diçka është shqetësuese. I gjithë procesi i mësipërm kërkon shumë veprime manuale dhe nuk është i shkallëzueshëm, do të doja ta automatizoja sa më shumë të jetë e mundur. Këtij do i kushtohet seksioni tjetër.
Integrimi me Terraform
Përsëri do të shfrytëzojmë mjetin nga kompania HashiCorp të quajtur . Ai do të na ndihmojë me një klikim butoni të vendosim të gjithë infrastrukturën e aplikacionit, duke u bazuar në disa variabla të kaluar nga përdoruesi. Le të shkruajmë një recetë që mund të ekzekutohet shumë herë në seksione të ndryshme të përdoruesve të ndryshëm.
Të gjithë punën me Terraform e përmbledhim në shkruajtjen e një skedari konfigurimi (*.tf) dhe krijimin e infrastrukturës mbi bazën e saj.
Variablat
Në fillim të skedarit do të vendosim variablat, nga të cilat varet se ku dhe si do të vendoset infrastruktura e ardhshme.
variable "oauth_token" {
type = string
default = ""
}
variable "cloud_id" {
type = string
default = ""
}
variable "folder_id" {
type = string
default = ""
}
variable "service_account_id" {
type = string
default = ""
}
variable "image_id" {
type = string
default = ""
}
variable "username" {
type = string
default = ""
}
variable "password" {
type = string
default = ""
}
variable "dbname" {
type = string
default = ""
}
variable "public_key_path" {
type = string
default = ""
}E gjithë procesi i vendosjes së aplikacionit do të përqendrohet në ndërtimin e imazhit të diskut dhe vendosjen e këtyre variablave. Do të shpjegoj se për çfarë shërbejnë ato:
oauth_token — token për qasje në cloud. Mund të merret nga .
cloud_id — identifikuesi i cloud-it ku do të vendosim aplikacionin
folder_id — identifikuesi i seksionit ku do të vendosim aplikacionin
service_account_id — identifikuesi i llogarisë shërbyese në seksionin përkatës të cloud-it.
image_id — identifikuesi i imazhit të disku, i marrë përmes Packer
username dhe password — emri i përdoruesit dhe fjalëkalimi për qasje në të dyja bazat e të dhënave dhe serverin web të Grafana-s
dbname — emri i bazës së të dhënave brenda grupeve CH dhe MySQL
public_key_path — rruga e skedarit me çelësin tuaj publik ssh, me të cilin do të lidheni si ubuntu në makinat virtuale me serverë web.
Konfigurimi i ofruesit
Tani duhet të konfigurojmë ofruesin e Terraform - në rastin tonë, Yandex:
provider "yandex" {
token = var.oauth_token
cloud_id = var.cloud_id
folder_id = var.folder_id
zone = "ru-central1-a"
}
Vëreni se këtu ne përdorim variablat e shënuara më lart.
Rrjeti dhe grupet
Tani do të krijojmë një rrjet, ku do të komunikojnë elementet e infrastrukturës sonë, tre subnetet (një në çdo rajon) dhe do të ngremë grupet CH dhe 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
}
}Si mund të vëreni, secili nga dy klasterët është krijuar mjaft fleksibël përmes shpërndarjes në tri zona disponibiliteti.
Serverët e uebit
Duket se mund të vazhdojmë në të njëjtën linjë, por u ndesha me një vështirësi. Më parë, unë fillimisht ngrita klasterin MySQL dhe vetëm pas kësaj, duke e ditur ID-në e tij, përgatita imazhin e diskut me konfigurimin e nevojshëm, ku specifikoja hostin në klaster. Por tani ne nuk e dimë ID-në e klasterit përpara se të fillojmë Terraform-in, përfshirë edhe në momentin e ndërtimit të imazhit. Kështu që na duhej të përdorim këtë .
Duke përdorur shërbimin e metadatave nga Amazon, ne do t'i kalojmë në makinë disa parametra, të cilat ajo do t'i pranojë dhe do t'i përpunojë. Na nevojitet që pas ndezjes makina të shkojë te metadatet për hostin e klasterit MySQL dhe për username-ndërlidhjen që përdoruesi e specifikoi në skedarin Terraform. Do ta ndryshojmë pak përmbajtjen e skedarit setup.sh, i cili ekzekutohet kur ndizet makina virtuelle.
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 restartGrupi i instancës dhe balancuesi
Pasi të kemi përgatitur një imazh të ri disku, përfundojmë me shkrimin e skedarit tonë për Terraform.
Do të specifikojmë se duam të përdorim imazhin ekzistues të diskut:
data "yandex_compute_image" "grafana_image" {
image_id = var.image_id
}Tani le të krijojmë grupin e instancave:
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"
}
}Vlen të theksohet se si ne kaluam në metadatat cluster_uri, username dhe password. Pikërisht ato makina virtuale do t'i nxjerrin dhe do t'i vendosin në konfigurimin e Grafanës.
Tani kemi punën e balancuesit.
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
}
}
}
}Pak sheqer
Ka mbetur pak punë. Pasi infrastruktura të jetë ngritur, do të duhet të shkojmë në UI të Grafanës dhe të shtojmë manualisht klasterin CH (ID-në e së cilës duam të nxjerrim) si Burim të Dhënash. Por Terraform e di ID-në e klasterit. Le ta përfundojmë atë detyrë.
Do të shtojmë një ofrues të ri - Grafanën, dhe si host do t'i japim adresën IP të balancuesit. Të gjitha ndryshimet që do të bëjë Terraform në makinën që do të përcaktojë balancuesi do të ndikojnë në MySQL, dhe kështu në të gjitha makinat e tjera.
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"
}Le të rregullojmë
do të nxjerrim adresën IP të balancuesit dhe hostin e klasterit 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"
}Mund të fillojmë
Mbaroi! Skedari ynë i konfigurimit është gati dhe mund ta ngremë gjithçka që e përshkruam më sipër, pasi të vendosim variablat. Procesi më mori rreth 15 minuta.
Në fund mund të shihni një mesazh të bukur:
Applikimi përfundoi! Burime: 9 të shtuar, 0 të ndryshuar, 0 të shkatërruara.
Daljet:
clickhouse_cluster_host = https://c-c9q14ipa2ngadqsbp2iq.rw.mdb.yandexcloud.net:8443
grafana_balancer_ip_address = 130.193.50.25Dhe në re do të jenë të dukshme elementët e infrastrukturës së ndërtuar:

Të bëjmë përmbledhje
Tani, përmes Grafanës, secili mund të mësojë si të ndihmojë në ngritjen e aplikacioneve me një arkitekturë të gjerë në platformën Yandex.Cloud. Mjetet e dobishme nga HashiCorp, si Packer dhe Terraform, mund të ndihmojnë në këtë. Shpresoj se kjo artikull do t’i sjellë dobi dikujt 🙂
P.S. Më poshtë do t'i bashkëngjis një lidhje për depozitën e cila përmban receta të gatshme për Packer dhe Terraform, disa fragmente të cilat i kam përmendur në këtë artikull.
Burimi: habr.com
