Dabeşkirina karûbarên belavkirî li Yandex.Cloud wekî mînakek Grafana bikar tîne

Silav hemû! Wekî beşek ji xebata xweya qursê, min li ser kapasîteyên platformek cloudê ya navxweyî wekî lêkolîn kir Yandex.Cloud. Platform ji bo çareserkirina pirsgirêkên pratîkî karûbarên cihêreng pêşkêşî dike. Lêbelê, carinan hûn hewce ne ku serîlêdana xweya ewr bi binesaziyek pir berfireh li ser bingeha van karûbaran saz bikin. Di vê gotarê de ez dixwazim ezmûna xwe di pêkanîna serîlêdanek wusa de parve bikim.

Dabeşkirina karûbarên belavkirî li Yandex.Cloud wekî mînakek Grafana bikar tîne

Hûn dixwazin çi bistînin?

Grafana - amûrek hêzdar ji bo çareserkirina pirsgirêkên analîtîk an şopandina pirsgirêkên her pergalê. Di veavakirina xwe ya bingehîn de, ev makîneyek virtual e ku bi serverek webê Grafana re, û hem jî databasek (ClickHouse, InfluxDB, hwd.) bi databasek ku dê li ser bingehê analîtîk be.

Piştî destpêkirina makîneyek virtual bi serverek webê re, hûn dikarin biçin mêvandarê wê û UI-ya xweşik bistînin, databasan wekî çavkaniyên ji bo xebata bêtir destnîşan bikin, dashboard û grafîkan biafirînin.

Dabeşkirina karûbarên belavkirî li Yandex.Cloud wekî mînakek Grafana bikar tîne

Guhertoya bingehîn yek kêmasiyek girîng heye - ew qet ne xelet-tolerans e. Ango, tevahiya fonksiyona serîlêdanê bi zindîbûna yek makîneya virtual ve girêdayî ye. Ger ew red bike an jî 10 kes di heman demê de UI vekin, wê hingê dê pirsgirêk derkevin.

Ew dikarin bi hêsanî werin çareser kirin: hûn tenê hewce ne ku ... gelek makîneyên virtual yên wekhev bi serverek webê re bicîh bikin û wan bixin binê balansek L3. Lê li vir her tişt ne zelal e. Grafana mîhengên bikarhêner (rêyên databasan, dashboard, grafîk, hwd.) rasterast li ser dîska makîneya xweya virtual hilîne. Bi vî rengî, heke em di UI-yê de hin mîhengan biguhezînin, dê ev guhertin tenê li ser makîneya virtual ya ku balansek ji me re şandiye were xuyang kirin. Ev ê ji bo serîlêdana me bibe sedema mîhengên nehevgirtî, di destpêkirin û karanîna de dibe sedema pirsgirêkan.

Li vir databasek din dê were rizgariyê, mînakî, MySQL an hevwateya wê. Em ji Grafana re dibêjin ku divê ew mîhengên bikarhêner di vê databasa "vedan" de hilîne. Dûv re, bes e ku meriv li ser her makîneyê carekê riya vê databasê diyar bike, û hemî mîhengên bikarhêner ên din li ser yek ji makîneyên virtual biguhezîne; ew ê li yên din dirêj bikin.

Li vir diyagramek binesaziya serîlêdana dawîn heye:

Dabeşkirina karûbarên belavkirî li Yandex.Cloud wekî mînakek Grafana bikar tîne

Werin em fêrî hilgirtina bi destên xwe bibin

MySQL û ClickHouse

Berî ku serîlêdanek wusa bi tikandina bişkokekê were bicîh kirin, pêdivî bû ku meriv fêr bibe ka meriv çawa her yek ji pêkhateyên wê bi rê ve dibe û wan bi hevûdu re entegre dike.

Li vir Yandex.Cloud dê ji me re bibe alîkar, ku balansên L3, ClickHouse û MySQL wekî karûbarên birêvebir peyda dike. Bikarhêner tenê pêdivî ye ku pîvanan diyar bike û li bendê bimîne heya ku platform her tiştî bixe rêza xebatê.

Min qeyd kir, ewr û hesabek dravdanê çêkir. Piştî wê, ez çûm ewr û komên MySQL û ClickHouse bi mîhengên hindiktirîn saz kirin. Ez li bendê bûm ku ew çalak bibin.

Dabeşkirina karûbarên belavkirî li Yandex.Cloud wekî mînakek Grafana bikar tîneDabeşkirina karûbarên belavkirî li Yandex.Cloud wekî mînakek Grafana bikar tîne

Her weha hûn hewce ne ku ji bîr mekin ku di her komê de databasek biafirînin û gihîştina wê bi karanîna têketinek û şîfreyek mîheng bikin. Ez ê li vir neçim hûrguliyan - her tişt di navbeynê de pir eşkere ye.

Hûrguliya ne diyar ev bû ku van databasan gelek mêvandar hene, ku tolerasyona xeletiya wan piştrast dikin. Lêbelê, Grafana ji bo her databasa ku pê re dixebite yek mêvandar hewce dike. xwendina dirêj belgekirin Ewran ez birrim biryarekê. Derdikeve ku hostayê cureyê c-<cluster_id>.rw.mdb.yandexcloud.net bi nasnama têkildar re ji hosteya sereke ya çalak a heyî ya komê re nexşe kirin. Ya ku em ê bidin Grafana ev e.

web server

Niha ew li ser servera webê ye. Ka em bi Linux-ê makîneyek virtual ya birêkûpêk rakin û bi destan Grafana li ser wê mîheng bikin.

Dabeşkirina karûbarên belavkirî li Yandex.Cloud wekî mînakek Grafana bikar tîne

Dabeşkirina karûbarên belavkirî li Yandex.Cloud wekî mînakek Grafana bikar tîne

Ka em bi ssh ve girêbidin û pakêtên pêwîst saz bikin.

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 

Piştî wê, em Grafana di bin systemctl-ê de bimeşînin û pêvekê saz bikin ku bi ClickHouse re bixebitin (erê, ew di pakêta bingehîn de nayê peyda kirin).

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

Ew e, piştî ku bi fermanek hêsan

sudo service grafana-server start

em ê servera malperê dest pê bikin. Naha hûn dikarin navnîşana IP-ya derveyî ya makîneya virtual di gerokê de têkevin, porta 3000 diyar bikin û UI-ya xweşik a Grafana bibînin.
Dabeşkirina karûbarên belavkirî li Yandex.Cloud wekî mînakek Grafana bikar tîne

Lê lez nekin, berî ku Grafana saz bikin, divê hûn ji bîr mekin ku rêça MySQL jê re vebêjin da ku mîhengan li wir hilînin.

Tevahiya veavakirina web servera Grafana di pelê de ye /etc/grafana/grafana.ini. Rêza pêwîst wiha xuya dike:

;url =

Me mêvandar li koma MySQL danî. Di heman pelê de têketin û şîfreya ji bo gihîştina Grafana di wêneya jorîn de heye, ku ji hêla xwerû ve her du jî wekhev in admin.

Hûn dikarin fermanên sed bikar bînin:

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

Wext e ku hûn servera malperê ji nû ve bidin destpêkirin!

sudo service grafana-server restart

Naha di Grafana UI de em ê ClickHouse wekî DataSource diyar bikin.

Min karî bi mîhengên jêrîn vesazkirinek xebatê bi dest bixim:

Dabeşkirina karûbarên belavkirî li Yandex.Cloud wekî mînakek Grafana bikar tîne

Min wekî URL diyar kir https://c-<cluster_id>.rw.mdb.yandexcloud.net:8443

Gişt! Me makîneyek virtual ya xebatê heye ku bi serverek webê ve girêdayî CH û MySQL ye. Hûn dikarin berê danûstendinê li ClickHouse barkirin û dashboardan ava bikin. Lê me hê negihiştiye armanca xwe û binesaziyeke tam pêk neaniye.

pakkeran

Yandex.Cloud destûrê dide te ku hûn wêneyek dîskê ya makîneyek virtual ya heyî biafirînin, û li ser bingeha wê - her hejmarek makîneyên ku bi hevûdu re wekhev in. Ya ku em ê bikar bînin ev e. Ji bo ku wêneyê bi hêsanî berhev bikin, amûrê bigirin pakkeran ji HashiCorp. Ew pelek json bi rêwerzên ji bo komkirina wêneyê wekî têketinê digire.

Dosyaya meya json dê ji du blokan pêk were: avaker û dabînker. Bloka yekem pîvanên wêneyê bixwe wekî hebûnek diyar dike, û bloka duyemîn talîmatên dagirtina wê bi naveroka pêwîst vedibêje.

Avahîner

{
"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"
    }
  ],
...
}

Di vê şablonê de, hûn hewce ne ku nasnameya beşa di ewrê de ku hûn dixwazin wêneyê biafirînin, û her weha rêça pelê bi bişkojkên ji hesabê karûbarê ku berê di vê beşê de hatî çêkirin destnîşan bikin. Hûn dikarin li ser çêkirina hesabên karûbar û mifteyên di forma pelê de di beşa têkildar de bêtir bixwînin belgekirin.

Ev veavakirin dibêje ku wêneya dîskê dê li ser bingeha platformê were çêkirin ubuntu-1804-lts, di beşa bikarhênerê ya guncan de di malbata wêneyê de tê danîn GRAFANA bin navê grafana-{{timestamp}}.

Pêşkêşker

Naha beşa balkêştir a veavakirinê tê. Ew ê rêza kiryarên ku dê hewce bike ku li ser makîneya virtual berî ku rewşa wê di nav wêneyek dîskê de bicemidîne rave bike.

{
...,
"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"
        ]
        }
  ]
}

Li vir hemî çalakî li 3 qonaxan têne dabeş kirin. Di qonaxa yekem de, skrîptek hêsan tê darve kirin ku pelrêçek alîkar diafirîne.

amade-ctg.sh:

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

Di qonaxa paşîn de, em skrîptek di vê pelrêça de cîh dikin, ku dê piştî destpêkirina makîneya virtual tavilê were destpêkirin. Ev skrîpt dê guhêrbarên bikarhêner ên ku hewce ne ku bêne tomar kirin di mîhenga Grafana de bihêle û servera malperê ji nû ve bide destpêkirin.

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

Piştî vê yekê 3 tişt mane ku bikin:
1) pakêtan saz bikin
2) Grafana di bin systemctl de bimeşînin û pêveka ClickHouse saz bikin
3) skrîpta setup.sh tavilê piştî vekirina makîneya virtual tavilê têxe rêza destpêkirinê.

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;

Naha ya ku dimîne ev e ku hûn Packer bimeşînin û wêneya derketinê ya ku di beşa diyarkirî de hatî danîn bistînin. Dema ku hûn makîneyek virtual diafirînin, hûn dikarin wê wekî dîskek boot hilbijêrin û piştî destpêkirinê hûn ê serverek web-a Grafana ya amade bistînin.

Dabeşkirina karûbarên belavkirî li Yandex.Cloud wekî mînakek Grafana bikar tîne
Dabeşkirina karûbarên belavkirî li Yandex.Cloud wekî mînakek Grafana bikar tîne

Koma mînak û hevseng

Gava ku me wêneyek dîskê hebe ku destûrê dide me ku em gelek pêşkêşkerên malperê yên Grafana yên wekhev biafirînin, em dikarin komek nimûne biafirînin. Li ser platforma Yandex.Cloud, ev têgeh ji yekîtiya makîneyên virtual ku xwedî heman taybetmendiyên xwe ne, vedibêje. Dema ku komek nimûne diafirîne, prototîpa hemî makîneyên di vê komê de têne mîheng kirin, û dûv re taybetmendiyên komê bixwe (mînak, herî kêm û herî zêde hejmara makîneyên çalak) têne mîheng kirin. Ger jimareya heyî van pîvanan pêk neyne, wê hingê koma mînak bixwe dê makîneyên nehewce derxîne an di wêneya xwe de yên nû biafirîne.

Wekî beşek ji peywira xwe, em ê komek mînakek pêşkêşkerên malperê biafirînin ku dê ji wêneya dîskê ya berê hatî afirandin were çêkirin.

Dabeşkirina karûbarên belavkirî li Yandex.Cloud wekî mînakek Grafana bikar tîne

Dabeşkirina karûbarên belavkirî li Yandex.Cloud wekî mînakek Grafana bikar tîne

Ya ku bi rastî balkêş e sazkirina koma mînaka paşîn e. Koma armancê di entegrasyonê de bi Load Balancer re dê ji we re bibe alîkar ku hûn bi tikandina çend bişkokan balansek L3 li ser makîneyên virtual yên vê komê mîheng bikin.

Dabeşkirina karûbarên belavkirî li Yandex.Cloud wekî mînakek Grafana bikar tîne

Dema ku balansek saz kir, min du xalên girîng bicîh anîn:

  1. Min kir ku balansek seyrûsefera bikarhêner li porta 80-ê qebûl bike û wê berbi porta 3000-a makîneyên virtual, tam cihê ku Grafana dijî.
  2. Min kontrolkirina zindîbûna makîneyan bi pingkirina wan li porta 3000 saz kir.

Dabeşkirina karûbarên belavkirî li Yandex.Cloud wekî mînakek Grafana bikar tîne

kurteya Mini

Di dawiyê de, me karî binesaziya serîlêdanê ya xwestî bi destan bicîh bikin, û naha me karûbarek Grafana ya pir berxwedêr heye. Hûn tenê hewce ne ku navnîşana IP-ya balanserê wekî xala têketina serîlêdanê û mêvandarê koma ClickHouse zanibin da ku hûn databasê tê de bar bikin.

Ew ê wekî serfiraziyek xuya bike? Erê, serketin. Lê dîsa jî tiştek min tevlihev dike. Tevahiya pêvajoya li jor gelek gavên destan hewce dike û bi tevahî ne berbelav e; heke gengaz be ez dixwazim wê bixweber bikim. Ev e ya ku dê beşa paşîn jê re were veqetandin.

Yekbûna Terraform

Em ê dîsa amûrek ji HashiCorp bi navê bikar bînin Terraform. Ew ê ji we re bibe alîkar ku hûn tevahiya binesaziya serîlêdanê bi tikandina bişkojekê, li ser bingeha çend guhêrbarên ku ji hêla bikarhêner ve hatine derbas kirin, bicîh bikin. Ka em reçeteyekê binivîsin ku dikare di beşên cûda yên bikarhênerên cihê de gelek caran were meşandin.

Hemî xebata bi Terraform re bi nivîsandina pelek vesazkirinê ve tê (*.tf) û çêkirina binesaziyê li ser wê.

Guhêrbar

Di destpêka pelê de, em ê guhêrbarên ku diyar dikin ku dê binesaziya pêşerojê li ku û çawa were bicîh kirin vehewînin.

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>"
}

Tevahiya pêvajoya bicîhkirina serîlêdanê dê ji bo avakirina wêneyek dîskê û danîna van guherbaran were xwarê. Bila ez rave bikim ka ew ji çi berpirsiyar in:

oauth_token - nîşanek ji bo gihîştina ewr. Dikare ji aliyê link.
cloud_id - Nasnameya cloudê ku em ê sepanê li ku derê bicîh bikin
peldanka_id - Nasnameya beşa ku em ê serîlêdanê li ku derê bicîh bikin
service_account_id - Nasnameya hesabê karûbarê di beşa têkildar a ewr de.
image_id - Nasnameya wêneya dîskê ya ku bi karanîna Packer ve hatî wergirtin
navê bikarhêner и şîfre - Navê bikarhêner û şîfreya ku hûn bigihîjin hem databases û hem jî servera malperê Grafana
dbname - Navê databasê di nav komên CH û MySQL de
public_key_path - riya pelê bi mifteya xweya ssh ya gelemperî, ku hûn dikarin di bin navê xwe de girêbidin bikar bînin ubuntu ji bo makîneyên virtual bi pêşkêşkerên webê

Sazkirina pêşkêşkar

Naha hûn hewce ne ku pêşkêşvanê Terraform - di doza me de, Yandex-ê mîheng bikin:

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

Hûn ê bala xwe bidin ku li vir em guhêrbarên ku li jor hatine destnîşan kirin bikar tînin.

Tor û kom

Naha em ê torgilokek biafirînin ku tê de hêmanên binesaziya me dê bi hev re têkilî daynin, sê subnet (yek li her deverê) û komikên CH û MySQL bilind bikin.


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

Wekî ku hûn dikarin bibînin, her yek ji her du koman ji ber ku di sê deverên berdestbûnê de cih digirin bi xeletî-tolerans têne afirandin.

Pêşkêşkerên Webê

Wusa dixuye ku em dikarin bi heman ruhî berdewam bikin, lê ez ketim tengasiyê. Berî vê yekê, min pêşî komek MySQL rakir û tenê piştî wê, bi nasnama wê, min wêneyek dîskê bi veavakirina pêdivî berhev kir, li wir min mêvandarê komê diyar kir. Lê naha em berî destpêkirina Terraform nasnama komê nizanin, di nav de di dema çêkirina wêneyê de. Ji ber vê yekê, ez neçar bûm ku serî li tiştên jêrîn bidim fen.

Bi karanîna karûbarê metadata Amazon-ê, em ê hin parametreyan ji makîneya virtual re derbas bikin, ku ew ê qebûl bike û pêvajoyê bike. Em hewce ne ku makîneyê piştî destpêkirinê biçe metadata li pişt mêvandarê koma MySQL û navê bikarhêner-şîfreya ku bikarhêner di pelê Terraform de destnîşan kiriye. Ka em naveroka pelê hinekî biguherînin setup.sh, ya ku dema ku makîneya virtual vekirî ye dimeşe.

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

Koma mînak û hevseng

Piştî ku wêneyek dîskek nû ji nû ve ava kir, em dikarin di dawiyê de pelê xwe ji bo Terraform zêde bikin.

Ka em destnîşan bikin ku em dixwazin wêneyek dîskek heyî bikar bînin:

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

Naha em grûbek mînakek çêbikin:

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"
  }
}

Hêja ye ku em bala xwe bidin ka me ew çawa derbasî metadata kir cluster_uri, username и password. Vana ye ku makîneya virtual dê di destpêkê de derxe û têxe mîhenga Grafana.

Ew bi balanserê ve girêdayî ye.

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

Piçek şekir

Tenê hindik maye. Piştî ku binesaziyê hate bicîh kirin, hûn ê neçar bibin ku biçin Grafana UI û bi destan komika CH (nasnameya ku hîn jî pêdivî ye ku were bidestxistin) wekî Çavkaniyek Daneyê zêde bikin. Lê Terraform nasnameya komê dizane. Werin em wî bispêrin ku meselê bi cî bîne.

Werin em pêşkêşkerek nû lê zêde bikin - Grafana, û navnîşana IP-ya balanserê wekî mêvandar bidin wê. Hemî guheztinên ku Terraform li ser makîneya ku balansa wê diyar dike çêdike dê di MySQL de, û ji ber vê yekê li ser hemî makîneyên din mezin bibin.

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"
}

Werin em porê xwe bişon

Ka em navnîşana IP-ya hevseng û mêvandarê koma ClickHouse nîşan bidin

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"
}

Hûn dikarin birevin

Gişt! Pelê veavakirina me amade ye û em dikarin, bi danîna guherbaran, ji Terraformê re bibêjin ku her tiştê ku me li jor behs kir bilind bike. Tevahiya pêvajoyê min nêzî 15 hûrdem girt.
Di dawiyê de hûn dikarin peyamek xweş bibînin:

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

Û di ewr de, hêmanên binesaziya bilindkirî dê xuya bibin:

Dabeşkirina karûbarên belavkirî li Yandex.Cloud wekî mînakek Grafana bikar tîne

Bila encama encam bikin

Naha, Grafana wekî mînak bikar bînin, her yek ji we dikare serîlêdanên bi mîmariya ewr a berbelav li ser platforma Yandex.Cloud bicîh bike. Amûrên alîkar ên HashiCorp ên mîna Packer û Terraform dikarin bi vê yekê ji we re bibin alîkar. Ez hêvî dikim ku kesek vê gotarê kêrhatî bibîne :)

PS Li jêr ez ê girêdanek bi depoyê ve girêbidim ku hûn dikarin ji bo Packer û Terraform reçeteyên amadekirî bibînin, perçeyên ku min di vê gotarê de pêşkêş kirin.

depo

Source: www.habr.com

Add a comment