Kev xa tawm cov kev pabcuam xa tawm hauv Yandex.Cloud siv Grafana ua piv txwv

Nyob zoo sawv daws! Raws li ib feem ntawm kuv cov chav kawm ua haujlwm, Kuv tshawb fawb lub peev xwm ntawm xws li huab cua hauv tsev xws li Yandex.Cloud. Lub platform muaj ntau yam kev pabcuam rau kev daws teebmeem. Txawm li cas los xij, qee zaum koj yuav tsum teeb tsa koj tus kheej daim ntawv thov huab nrog cov txheej txheem dav dav raws li cov kev pabcuam no. Hauv tsab xov xwm no kuv xav qhia kuv qhov kev paub dhau los hauv kev siv cov ntawv thov no.

Kev xa tawm cov kev pabcuam xa tawm hauv Yandex.Cloud siv Grafana ua piv txwv

Koj xav tau dab tsi?

ua grafana - lub cuab yeej muaj zog rau kev daws teeb meem kev tshuaj ntsuam xyuas lossis saib xyuas cov teeb meem ntawm txhua lub tshuab. Hauv nws qhov kev teeb tsa yooj yim, qhov no yog lub tshuab virtual nrog Grafana web server, nrog rau cov ntaub ntawv (ClickHouse, InfluxDB, thiab lwm yam) nrog cov ntaub ntawv uas yuav ua raws li kev soj ntsuam.

Tom qab tso lub tshuab virtual nrog lub vev xaib server, koj tuaj yeem mus rau nws tus tswv tsev thiab tau txais UI zoo nkauj, qhia cov ntaub ntawv raws li qhov chaw rau kev ua haujlwm ntxiv, tsim dashboards thiab graphs.

Kev xa tawm cov kev pabcuam xa tawm hauv Yandex.Cloud siv Grafana ua piv txwv

Qhov yooj yim version muaj ib tug tseem ceeb drawback - nws tsis yog txhaum-tolerant tag nrho. Ntawd yog, tag nrho cov haujlwm ntawm daim ntawv thov nyob ntawm qhov muaj peev xwm ntawm ib lub tshuab virtual. Yog tias nws tsis kam lossis 10 tus neeg qhib UI tib lub sijhawm, ces teeb meem yuav tshwm sim.

Lawv tuaj yeem daws tau yooj yim: koj tsuas yog xav tau ... xa ntau lub tshuab virtual zoo tib yam nrog lub vev xaib server thiab muab tso rau hauv L3 balancer. Tab sis tsis yog txhua yam yog qhov tseeb ntawm no. Grafana khaws cov neeg siv kev teeb tsa (txoj kev mus rau databases, dashboards, graphs, thiab lwm yam) ncaj qha rau ntawm disk ntawm nws lub tshuab virtual. Yog li, yog tias peb hloov qee qhov chaw hauv UI, cov kev hloov no yuav cuam tshuam tsuas yog ntawm lub tshuab virtual uas tus ntsuas xa tuaj rau peb. Qhov no yuav ua rau muaj kev tsis sib haum xeeb rau peb daim ntawv thov, ua rau muaj teeb meem nrog kev tso tawm thiab siv.

Ntawm no lwm cov ntaub ntawv yuav los cawm, piv txwv li, MySQL lossis nws qhov sib npaug. Peb qhia Grafana tias nws yuav tsum khaws cov neeg siv cov chaw nyob rau hauv cov ntaub ntawv "sparre" no. Tom qab ntawd, nws yuav txaus los qhia txog txoj hauv kev rau cov ntaub ntawv no ib zaug ntawm txhua lub tshuab, thiab kho tag nrho lwm cov neeg siv kev teeb tsa ntawm ib qho ntawm cov tshuab virtual; lawv yuav txuas mus rau lwm tus.

Ntawm no yog ib daim duab ntawm qhov kawg daim ntawv thov infrastructure:

Kev xa tawm cov kev pabcuam xa tawm hauv Yandex.Cloud siv Grafana ua piv txwv

Cia peb kawm nqa nrog peb txhais tes

MySQL thiab ClickHouse

Ua ntej xa daim ntawv thov no nrog nias ntawm lub pob, nws yuav tsum tau kawm yuav ua li cas los tswj txhua yam ntawm nws cov khoom thiab sib xyaw ua ke.

Ntawm no Yandex.Cloud yuav pab peb, uas muab L3 balancers, ClickHouse thiab MySQL raws li kev tswj hwm kev pabcuam. Tus neeg siv tsuas yog yuav tsum tau qhia cov kev txwv thiab tos kom txog thaum lub platform coj txhua yam mus rau hauv kev ua haujlwm.

Kuv sau npe, tsim huab thiab them nyiaj. Tom qab ntawd, kuv tau mus rau huab thiab teeb tsa MySQL thiab ClickHouse pawg nrog cov chaw tsawg. Kuv tos kom txog thaum lawv ua haujlwm.

Kev xa tawm cov kev pabcuam xa tawm hauv Yandex.Cloud siv Grafana ua piv txwvKev xa tawm cov kev pabcuam xa tawm hauv Yandex.Cloud siv Grafana ua piv txwv

Koj kuj yuav tsum nco ntsoov tsim cov ntaub ntawv hauv txhua pawg thiab teeb tsa kev nkag mus rau nws siv tus ID nkag mus thiab lo lus zais. Kuv yuav tsis mus rau hauv cov ntsiab lus ntawm no - txhua yam yog pom tseeb hauv qhov interface.

Cov ntsiab lus tsis meej yog tias cov ntaub ntawv no muaj ntau tus tswv, uas ua kom lawv qhov kev zam txim txhaum cai. Txawm li cas los xij, Grafana xav kom muaj ib tus tswv tsev rau txhua qhov database nws ua haujlwm nrog. Kev nyeem ntawv ntev cov ntaub ntawv Cov huab coj kuv mus rau qhov kev txiav txim. Nws hloov tawm hais tias tus tswv ntawm hom c-<cluster_id>.rw.mdb.yandexcloud.net mapped rau tus tswv tsev tam sim no nquag ntawm pawg nrog tus ID sib raug. Nov yog qhov peb yuav muab rau Grafana.

Web server

Tam sim no nws yog nyob ntawm lub web server. Cia peb tsa lub tshuab virtual tsis tu ncua nrog Linux thiab manually teeb tsa Grafana rau nws.

Kev xa tawm cov kev pabcuam xa tawm hauv Yandex.Cloud siv Grafana ua piv txwv

Kev xa tawm cov kev pabcuam xa tawm hauv Yandex.Cloud siv Grafana ua piv txwv

Cia peb txuas ntawm ssh thiab nruab cov pob tsim nyog.

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 

Tom qab ntawd, cia peb khiav Grafana hauv qab systemctl thiab nruab lub plugin rau kev ua haujlwm nrog ClickHouse (yog, nws tsis tau muab rau hauv cov pob yooj yim).

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

Qhov ntawd yog nws, tom qab ntawd nrog cov lus txib yooj yim

sudo service grafana-server start

peb yuav pib lub web server. Tam sim no koj tuaj yeem nkag mus rau sab nraud IP chaw nyob ntawm lub tshuab virtual hauv qhov browser, qhia qhov chaw nres nkoj 3000 thiab pom qhov zoo nkauj Grafana UI.
Kev xa tawm cov kev pabcuam xa tawm hauv Yandex.Cloud siv Grafana ua piv txwv

Tab sis tsis txhob maj, ua ntej teeb tsa Grafana, koj yuav tsum nco ntsoov qhia nws txoj hauv kev rau MySQL txhawm rau khaws cov chaw nyob ntawd.

Tag nrho kev teeb tsa ntawm Grafana web server yog nyob rau hauv cov ntaub ntawv /etc/grafana/grafana.ini. Cov kab xav tau zoo li no:

;url =

Peb teeb tsa tus tswv tsev rau MySQL pawg. Tib cov ntaub ntawv muaj tus ID nkag mus thiab lo lus zais rau kev nkag mus rau Grafana hauv daim duab saum toj no, uas yog vim li cas ob qho tib si sib npaug admin.

Koj tuaj yeem siv sed commands:

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

Nws yog lub sijhawm los rov pib lub web server!

sudo service grafana-server restart

Tam sim no hauv Grafana UI peb yuav qhia ClickHouse ua DataSource.

Kuv tuaj yeem ua tiav qhov kev teeb tsa ua haujlwm nrog cov teeb tsa hauv qab no:

Kev xa tawm cov kev pabcuam xa tawm hauv Yandex.Cloud siv Grafana ua piv txwv

Kuv teev raws li qhov URL https://c-<cluster_id>.rw.mdb.yandexcloud.net:8443

Txhua tus! Peb muaj ib lub tshuab ua haujlwm virtual nrog lub web server txuas nrog CH thiab MySQL. Koj tuaj yeem xa cov ntaub ntawv rau ClickHouse thiab tsim dashboards. Txawm li cas los xij, peb tseem tsis tau ua tiav peb lub hom phiaj thiab tseem tsis tau siv cov txheej txheem tag nrho.

Pob Ntawv

Yandex.Cloud tso cai rau koj los tsim cov duab disk ntawm lub tshuab virtual uas twb muaj lawm, thiab ntawm nws lub hauv paus - txhua lub tshuab zoo tib yam rau ib leeg. Qhov no yog qhov peb yuav siv. Txhawm rau kom yooj yim sib sau cov duab, nqa lub cuab yeej Pob Ntawv los ntawm HashiCorp. Nws yuav siv sij hawm raws li cov ntaub ntawv json nrog cov lus qhia rau kev sib sau cov duab.

Peb cov ntaub ntawv json yuav muaj ob lub blocks: builders thiab provisioners. Thawj qhov thaiv tau piav qhia txog qhov tsis zoo ntawm daim duab nws tus kheej yog ib qho chaw, thiab lub block thib ob piav qhia cov lus qhia rau kev sau nws nrog cov ntsiab lus tsim nyog.

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

Hauv cov qauv no, koj yuav tsum teeb tsa tus cim ntawm ntu hauv huab uas koj xav tsim cov duab, nrog rau txoj hauv kev mus rau cov ntaub ntawv nrog cov yuam sij los ntawm kev pabcuam tus account yav dhau los tsim hauv ntu no. Koj tuaj yeem nyeem ntxiv txog kev tsim cov nyiaj pabcuam thiab cov yuam sij hauv daim ntawv ntawm cov ntaub ntawv nyob rau hauv seem cov ntaub ntawv.

Qhov kev teeb tsa no hais tias daim duab disk yuav tsim raws li lub platform ubuntu-1804-lts, muab tso rau hauv cov neeg siv khoom tsim nyog hauv tsev neeg cov duab GRAFANA nyob rau hauv lub npe grafana-{{timestamp}}.

Cov kev npaj

Tam sim no los txog qhov nthuav ntau dua ntawm kev teeb tsa. Nws yuav piav qhia txog kev ua ntu zus uas yuav tsum tau ua ntawm lub tshuab virtual ua ntej khov nws lub xeev rau hauv daim duab disk.

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

Ntawm no txhua qhov kev ua tau muab faib ua 3 theem. Nyob rau thawj theem, ib tsab ntawv yooj yim raug tua uas tsim ib phau ntawv pabcuam.

npaj-ctg.sh:

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

Nyob rau theem tom ntej, peb tso ib tsab ntawv rau hauv phau ntawv teev npe no, uas yuav tsum tau pib tam sim tom qab pib lub tshuab virtual. Tsab ntawv no yuav muab cov neeg siv hloov pauv uas yuav tsum tau sau npe hauv Grafana config thiab rov pib lub web server.

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

Tom qab ntawd, muaj 3 yam uas yuav tsum tau ua:
1) nruab pob
2) khiav Grafana nyob rau hauv systemctl thiab nruab ClickHouse plugin
3) muab cov ntawv setup.sh tso rau hauv cov kab pib tam sim tom qab tig lub tshuab virtual.

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;

Tam sim no txhua yam uas tseem tshuav yog khiav Packer thiab tau txais cov duab tso zis tso rau hauv ntu ntu. Thaum tsim lub tshuab virtual, koj tuaj yeem xaiv nws ua lub khau raj disk thiab tom qab tso tawm koj yuav tau txais qhov npaj ua Grafana web server.

Kev xa tawm cov kev pabcuam xa tawm hauv Yandex.Cloud siv Grafana ua piv txwv
Kev xa tawm cov kev pabcuam xa tawm hauv Yandex.Cloud siv Grafana ua piv txwv

Piv txwv pab pawg thiab balancer

Thaum peb muaj daim duab disk uas tso cai rau peb los tsim ntau yam zoo tib yam Grafana web servers, peb tuaj yeem tsim ib pawg piv txwv. Ntawm Yandex.Cloud platform, lo lus no hais txog kev sib koom ua ke ntawm cov tshuab virtual uas muaj cov yam ntxwv zoo ib yam. Thaum tsim ib pab pawg, cov qauv ntawm tag nrho cov tshuab hauv pab pawg no tau teeb tsa, thiab tom qab ntawd cov yam ntxwv ntawm pab pawg nws tus kheej (piv txwv li, qhov tsawg kawg nkaus thiab ntau tshaj ntawm cov tshuab ua haujlwm). Yog tias tus lej tam sim no tsis ua raws li cov qauv no, ces pawg piv txwv nws tus kheej yuav tshem tawm cov tshuab tsis tsim nyog lossis tsim cov tshiab hauv nws tus kheej daim duab.

Raws li ib feem ntawm peb txoj haujlwm, peb yuav tsim ib pawg piv txwv ntawm cov web servers uas yuav raug tsim los ntawm cov duab disk uas tau tsim yav dhau los.

Kev xa tawm cov kev pabcuam xa tawm hauv Yandex.Cloud siv Grafana ua piv txwv

Kev xa tawm cov kev pabcuam xa tawm hauv Yandex.Cloud siv Grafana ua piv txwv

Dab tsi yog qhov zoo kawg nkaus yog qhov kawg piv txwv pab pawg teeb tsa. Lub hom phiaj pab pawg hauv kev koom ua ke nrog Load Balancer yuav pab koj teeb tsa L3 balancer rau saum cov tshuab virtual ntawm pab pawg no los ntawm nias ob peb lub khawm.

Kev xa tawm cov kev pabcuam xa tawm hauv Yandex.Cloud siv Grafana ua piv txwv

Thaum teeb tsa lub ntsuas ntsuas, kuv tau siv ob lub ntsiab lus tseem ceeb:

  1. Kuv ua tus balancer txais neeg siv tsheb khiav ntawm chaw nres nkoj 80 thiab redirect nws mus rau qhov chaw nres nkoj 3000 ntawm lub virtual machines, raws nraim qhov Grafana nyob.
  2. Kuv teeb tsa kev tshuaj xyuas qhov muaj peev xwm ntawm cov tshuab los ntawm pinging lawv mus rau chaw nres nkoj 3000.

Kev xa tawm cov kev pabcuam xa tawm hauv Yandex.Cloud siv Grafana ua piv txwv

Cov ntsiab lus me me

Thaum kawg, peb muaj peev xwm siv tau manually xa cov ntawv thov infrastructure, thiab tam sim no peb muaj cov kev pab cuam Grafana zoo heev. Koj tsuas yog yuav tsum paub tus IP chaw nyob ntawm tus balancer raws li qhov nkag mus rau daim ntawv thov thiab tus tswv tsev ntawm ClickHouse pawg txhawm rau txhawm rau thauj cov ntaub ntawv rau hauv nws.

Nws yuav zoo li yeej? Yog lawm, yeej. Tab sis qee yam tseem ua rau kuv tsis meej pem. Tag nrho cov txheej txheem saum toj no yuav tsum muaj ntau cov kauj ruam ntawm phau ntawv thiab tsis tuaj yeem ua kom tiav; Kuv xav ua kom nws siv tau yog tias ua tau. Qhov no yog qhov seem tom ntej yuav mob siab rau.

Terraform kev koom ua ke

Peb yuav rov siv lub cuab yeej los ntawm HashiCorp hu ua Terraform. Nws yuav pab koj xa tag nrho daim ntawv thov kev tsim kho nrog kev nias ntawm lub pob, raws li ntau qhov kev hloov pauv dhau los ntawm tus neeg siv. Cia peb sau ib daim ntawv qhia uas tuaj yeem khiav ntau zaus hauv ntau ntu ntawm cov neeg siv sib txawv.

Txhua txoj haujlwm nrog Terraform los sau cov ntaub ntawv teeb tsa (*.tf) thiab tsim cov infrastructure raws li nws.

Hloov pauv

Thaum pib ntawm cov ntaub ntawv, peb yuav suav nrog cov kev hloov pauv uas txiav txim siab qhov twg thiab yuav ua li cas cov txheej txheem yav tom ntej yuav raug xa mus.

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

Tag nrho cov txheej txheem kev xa mus rau daim ntawv thov yuav nqis los tsim cov duab disk thiab teeb tsa cov kev hloov pauv no. Cia kuv piav qhia lawv lub luag haujlwm rau dab tsi:

oauth_token - lub cim rau kev nkag mus rau huab. Yuav tau los ntawm txuas.
cloud_id - huab identifier qhov twg peb yuav xa daim ntawv thov
folder_id - tus cim ntu uas peb yuav xa daim ntawv thov
service_account_id - tus lej nyiaj pabcuam kev pabcuam hauv ntu sib txuas ntawm huab.
duab_id - tus cim ntawm daim duab disk tau siv Packer
username ΠΈ lo lus zais - username thiab password kom nkag mus rau ob lub databases thiab Grafana web server
db npe - lub npe database hauv CH thiab MySQL pawg
public_key_path - txoj hauv kev rau cov ntaub ntawv nrog koj tus yuam sij ssh pej xeem, uas koj tuaj yeem siv los txuas hauv qab lub npe ubuntu rau cov tshuab virtual nrog web servers

Kev teeb tsa tus kws kho mob

Tam sim no koj yuav tsum teeb tsa Terraform tus muab kev pabcuam - hauv peb rooj plaub, Yandex:

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

Koj yuav pom tias ntawm no peb tab tom siv cov kev hloov pauv uas tau teev tseg saum toj no.

Network thiab pawg

Tam sim no peb yuav tsim ib lub network uas cov ntsiab lus ntawm peb cov infrastructure yuav sib txuas lus, peb subnets (ib qho hauv txhua cheeb tsam) thiab tsa CH thiab MySQL pawg.


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

Raws li koj tuaj yeem pom, txhua qhov ntawm ob pawg tau tsim muaj kev ua txhaum loj heev los ntawm kev nyob hauv peb thaj chaw muaj.

Web servers

Nws yuav zoo li tias peb muaj peev xwm txuas ntxiv mus rau tib lub siab, tab sis kuv tau khiav mus rau qhov nyuaj. Ua ntej no, kuv thawj zaug tsa ib pawg MySQL thiab tsuas yog tom qab ntawd, paub txog nws tus ID, kuv tau sau ib daim duab disk nrog rau qhov yuav tsum tau teeb tsa, qhov twg kuv teev tus tswv tsev rau pawg. Tab sis tam sim no peb tsis paub pawg ID ua ntej tso Terraform, suav nrog thaum lub sijhawm tsim cov duab. Yog li ntawd, kuv yuav tsum tau ua raws li cov hauv qab no dag.

Siv Amazon cov kev pabcuam metadata, peb yuav dhau qee qhov kev txwv rau lub tshuab virtual, uas nws yuav lees txais thiab ua tiav. Peb xav tau lub tshuab mus rau cov metadata qab MySQL pawg tswv tsev thiab username-password, uas tus neeg siv tau teev tseg hauv Terraform cov ntaub ntawv, tom qab pib. Cia peb hloov cov ntsiab lus ntawm cov ntaub ntawv me ntsis setup.sh, uas khiav thaum lub tshuab virtual qhib.

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

Intance pab pawg thiab balancer

Thaum rov tsim kho cov duab disk tshiab, peb tuaj yeem thaum kawg ntxiv peb cov ntaub ntawv rau Terraform.

Cia peb qhia tias peb xav siv cov duab disk uas twb muaj lawm:

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

Tam sim no cia peb tsim ib pawg piv txwv:

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

Nws tsim nyog ua tib zoo saib seb peb kis nws mus rau hauv cov metadata li cas cluster_uri, username ΠΈ password. Nws yog cov no tias lub tshuab virtual yuav tawm ntawm qhov pib thiab muab tso rau hauv Grafana config.

Nws yog nyob ntawm tus balancer.

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

Ib me ntsis qab zib

Tsuas tshuav me ntsis xwb. Tom qab cov txheej txheem raug xa mus, koj yuav tau mus rau Grafana UI thiab manually ntxiv CH pawg (tus ID uas tseem yuav tsum tau txais) ua Cov Ntaub Ntawv. Tab sis Terraform paub cov pawg ID. Cia peb tso siab rau nws coj qhov teeb meem mus rau fruition.

Cia peb ntxiv ib tus neeg muab kev pabcuam tshiab - Grafana, thiab muab nws tus lej IP chaw nyob ua tus tswv tsev. Txhua qhov kev hloov pauv uas Terraform ua rau ntawm lub tshuab uas nws qhov ntsuas ntsuas ntsuas yuav loj hlob hauv MySQL, thiab yog li ntawm tag nrho lwm lub tshuab.

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

Wb comb peb cov plaub hau

Cia peb tso saib qhov sib npaug IP chaw nyob thiab tus tswv tsev ntawm ClickHouse pawg

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

Koj khiav tau

Txhua tus! Peb cov ntaub ntawv teeb tsa tau npaj txhij thiab peb tuaj yeem, los ntawm kev teeb tsa qhov hloov pauv, qhia Terraform kom tsa txhua yam uas peb tau piav qhia saum toj no. Tag nrho cov txheej txheem coj kuv txog 15 feeb.
Thaum kawg koj tuaj yeem pom cov lus zoo nkauj:

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

Thiab nyob rau hauv huab, cov ntsiab lus ntawm cov tsa cov txheej txheem yuav pom:

Kev xa tawm cov kev pabcuam xa tawm hauv Yandex.Cloud siv Grafana ua piv txwv

Cia li muab cov ntsiab lus los sib piv

Tam sim no, siv Grafana ua piv txwv, txhua tus ntawm koj tuaj yeem xa cov ntawv thov nrog cov huab dav dav dav dav ntawm Yandex.Cloud platform. Cov cuab yeej pab tau los ntawm HashiCorp zoo li Packer thiab Terraform tuaj yeem pab koj nrog qhov no. Kuv vam tias ib tug neeg pom cov kab lus no muaj txiaj ntsig :)

PS Hauv qab no kuv yuav xa ib qhov txuas mus rau qhov chaw cia khoom uas koj tuaj yeem nrhiav cov zaub mov npaj npaj rau Packer thiab Terraform, cov khoom uas kuv tau muab rau hauv tsab xov xwm no.

chaw cia khoom

Tau qhov twg los: www.hab.com

Ntxiv ib saib