Defnyddio gwasanaethau dosbarthedig yn Yandex.Cloud gan ddefnyddio Grafana fel enghraifft

Helo pawb! Fel rhan o fy ngwaith cwrs, roeddwn yn ymchwilio i bosibiliadau platfform cwmwl domestig mor Yandex.Cloud. Mae'r platfform yn cynnig gwasanaethau amrywiol ar gyfer datrys problemau ymarferol. Fodd bynnag, weithiau mae angen ffurfweddu'ch cymhwysiad cwmwl gyda seilwaith eithaf helaeth yn seiliedig ar y gwasanaethau hyn. Yn yr erthygl hon, rwyf am rannu'r profiad o ddefnyddio cais o'r fath.

Defnyddio gwasanaethau dosbarthedig yn Yandex.Cloud gan ddefnyddio Grafana fel enghraifft

Beth ydych chi eisiau ei dderbyn?

Grafana - offeryn pwerus ar gyfer datrys problemau dadansoddol neu fonitro problemau unrhyw systemau. Yn ei ffurfweddiad sylfaenol, mae hwn yn beiriant rhithwir gyda gweinydd gwe Grafana, yn ogystal â chronfa ddata (ClickHouse, InfluxDB, ac ati) gyda set ddata a fydd yn cael ei ddefnyddio i adeiladu dadansoddeg.

Ar ôl cychwyn peiriant rhithwir gyda gweinydd gwe, gallwch fynd at ei westeiwr a chael UI hardd, nodi cronfeydd data fel ffynonellau ar gyfer gwaith pellach, creu dangosfyrddau a graffiau.

Defnyddio gwasanaethau dosbarthedig yn Yandex.Cloud gan ddefnyddio Grafana fel enghraifft

Mae gan y fersiwn sylfaenol un anfantais sylweddol - nid yw'n goddef bai o gwbl. Hynny yw, mae perfformiad cyfan y cais yn dibynnu ar hyfywedd un peiriant rhithwir. Os bydd hi'n gwrthod neu os bydd 10 o bobl yn agor yr UI ar yr un pryd, yna bydd problemau'n codi.

Maent yn cael eu datrys yn syml: does ond angen i chi ddefnyddio llawer o beiriannau rhithwir union yr un fath â gweinydd gwe a'u gosod o dan gydbwysedd L3. Ond nid yw popeth mor glir yma. Mae Grafana yn storio gosodiadau defnyddwyr (llwybrau i gronfeydd data, dangosfyrddau, graffeg, ac ati) yn uniongyrchol ar ddisg ei beiriant rhithwir. Felly, os byddwch chi'n newid rhai gosodiadau yn yr UI, yna bydd y newidiadau hyn yn cael eu harddangos ar y peiriant rhithwir lle anfonodd y balans atom ni yn unig. Bydd hyn yn arwain at osodiadau anghyson ar gyfer ein cais, problemau gyda lansio a defnyddio.

Yma bydd cronfa ddata arall yn dod i'r adwy, er enghraifft, MySQL neu'r hyn sy'n cyfateb iddo. Rydyn ni'n dweud wrth Grafana y dylai hi storio gosodiadau defnyddwyr yn y gronfa ddata "sbâr" hon. Ar ôl hynny, bydd yn ddigon i nodi'r llwybr i'r gronfa ddata hon ar bob peiriant unwaith, a golygu'r holl leoliadau defnyddiwr eraill ar unrhyw un o'r peiriannau rhithwir, byddant yn tyfu ar y gweddill.

Dyma ddiagram o seilwaith y cais terfynol:

Defnyddio gwasanaethau dosbarthedig yn Yandex.Cloud gan ddefnyddio Grafana fel enghraifft

Dysgwch sut i godi gyda'ch dwylo

MySQL a ClickHouse

Cyn defnyddio cymhwysiad o'r fath gyda chlicio botwm, roedd angen dysgu sut i godi pob un o'i gydrannau â dolenni a'u hintegreiddio â'i gilydd.

Bydd Yandex.Cloud yn ein helpu ni yma, sy'n darparu balanswyr L3, ClickHouse a MySQL fel gwasanaethau a reolir. Nid oes ond angen i'r defnyddiwr nodi'r paramedrau ac aros nes bod y platfform yn dod â phopeth i gyflwr gweithio.

Fe wnes i gofrestru, creu cwmwl a chyfrif bilio i mi fy hun. Ar ôl hynny, es i mewn i'r cwmwl a chodi clystyrau MySQL a ClickHouse gyda gosodiadau lleiaf posibl. Arhoswch nes iddynt ddod yn actif.

Defnyddio gwasanaethau dosbarthedig yn Yandex.Cloud gan ddefnyddio Grafana fel enghraifftDefnyddio gwasanaethau dosbarthedig yn Yandex.Cloud gan ddefnyddio Grafana fel enghraifft

Mae angen i chi hefyd gofio creu cronfa ddata ym mhob clwstwr a ffurfweddu mynediad iddi trwy fewngofnodi a chyfrinair. Nid af i fanylion yma - mae popeth yn eithaf amlwg yn y rhyngwyneb.

Y manylion anamlwg oedd bod gan y cronfeydd data hyn lawer o westeion sy'n darparu eu goddefgarwch o ddiffygion. Fodd bynnag, mae Grafana yn gofyn am un gwesteiwr yn union ar gyfer pob cronfa ddata y mae'n gweithio gyda hi. Darlleniad hir dogfennaeth Arweiniodd y cymylau fi at benderfyniad. Mae'n troi allan bod llu o'r ffurflen c-<cluster_id>.rw.mdb.yandexcloud.net Mapiau i'r prif westeiwr clwstwr gweithredol cyfredol gyda'r ID cyfatebol. Dyna a roddwn i Grafana.

Gweinydd gwe

Nawr mae i fyny i'r gweinydd gwe. Gadewch i ni godi peiriant rhithwir rheolaidd gyda Linux a sefydlu Grafana arno gyda'n dwylo ni.

Defnyddio gwasanaethau dosbarthedig yn Yandex.Cloud gan ddefnyddio Grafana fel enghraifft

Defnyddio gwasanaethau dosbarthedig yn Yandex.Cloud gan ddefnyddio Grafana fel enghraifft

Gadewch i ni gysylltu trwy ssh a gosod y pecynnau angenrheidiol.

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 

Ar ôl hynny, byddwn yn cychwyn Grafana o dan systemctl ac yn gosod yr ategyn ar gyfer gweithio gyda ClickHouse (ie, nid yw'n cael ei gyflenwi yn y pecyn sylfaenol).

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

Popeth ar ôl hynny gyda gorchymyn syml

sudo service grafana-server start

byddwn yn cychwyn y gweinydd gwe. Nawr bydd yn bosibl gyrru yn y cyfeiriad IP allanol y peiriant rhithwir yn y porwr, nodi porthladd 3000 a gweld y grafana UI hardd.
Defnyddio gwasanaethau dosbarthedig yn Yandex.Cloud gan ddefnyddio Grafana fel enghraifft

Ond peidiwch â rhuthro, cyn sefydlu Grafana, rhaid i chi beidio ag anghofio nodi'r llwybr i MySQL er mwyn iddo storio'r gosodiadau yno.

Mae cyfluniad cyfan gweinydd gwe Grafana yn y ffeil /etc/grafana/grafana.ini. Mae'r llinell ofynnol yn edrych fel hyn:

;url =

Rydyn ni'n datgelu'r gwesteiwr i'r clwstwr MySQL. Mae'r un ffeil yn cynnwys y mewngofnodi a'r cyfrinair ar gyfer cyrchu Grafana yn y llun uchod, sydd ill dau yn gyfartal yn ddiofyn admin.

Gallwch ddefnyddio gorchmynion 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

Mae'n bryd ailgychwyn y gweinydd gwe!

sudo service grafana-server restart

Nawr yn y Grafana UI, byddwn yn nodi ClickHouse fel y Ffynhonnell Data.

Llwyddais i gyflawni cyfluniad gweithio gyda'r gosodiadau canlynol:

Defnyddio gwasanaethau dosbarthedig yn Yandex.Cloud gan ddefnyddio Grafana fel enghraifft

Rwyf wedi rhoi fel URL https://c-<cluster_id>.rw.mdb.yandexcloud.net:8443

I gyd! Mae gennym un peiriant rhithwir sy'n gweithio gyda gweinydd gwe wedi'i gysylltu â CH a MySQL. Gallwch eisoes uwchlwytho'r set ddata i ClickHouse ac adeiladu dangosfyrddau. Fodd bynnag, nid ydym wedi cyrraedd ein nod eto ac nid ydym wedi defnyddio seilwaith llawn.

Packer

Mae Yandex.Cloud yn caniatáu ichi greu delwedd ddisg o beiriant rhithwir sy'n bodoli eisoes, ac yn seiliedig arno, gallwch greu cymaint o beiriannau union yr un fath ag y dymunwch. Dyma'n union beth fyddwn ni'n ei ddefnyddio. I gydosod y ddelwedd yn gyfleus, cymerwch yr offeryn Packer gan HashiCorp. Mae'n cymryd ffeil json fel mewnbwn gyda chyfarwyddiadau ar gyfer adeiladu'r ddelwedd.

Bydd ein ffeil json yn cynnwys dau floc: adeiladwyr a darparwyr. Mae'r bloc cyntaf yn disgrifio paramedrau'r ddelwedd ei hun fel endid, ac mae'r ail yn disgrifio'r cyfarwyddiadau ar gyfer ei llenwi â'r cynnwys angenrheidiol.

adeiladwyr

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

Yn y templed hwn, mae angen i chi osod dynodwr yr adran yn y cwmwl lle rydych chi am greu delwedd, yn ogystal â'r llwybr i'r ffeil gyda'r allweddi o'r cyfrif gwasanaeth a grëwyd yn flaenorol yn yr adran hon. Gallwch ddarllen mwy am greu cyfrifon gwasanaeth ac allweddi ar ffurf ffeil yn yr adran gyfatebol. dogfennaeth.

Mae'r cyfluniad hwn yn dweud y bydd delwedd y ddisg yn cael ei hadeiladu yn seiliedig ar y platfform ubuntu-1804-lts, wedi'i osod yn yr adran defnyddiwr priodol yn y teulu delwedd GRAFANA dan yr enw grafana-{{timestamp}}.

Darpariaethwyr

Nawr am ran fwy diddorol y cyfluniad. Bydd yn disgrifio'r dilyniant o gamau gweithredu y bydd angen eu perfformio ar beiriant rhithwir cyn rhewi ei gyflwr i ddelwedd disg.

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

Yma, rhennir yr holl gamau gweithredu yn 3 cham. Yn y cam cyntaf, gweithredir sgript syml sy'n creu cyfeiriadur ategol.

paratoi-ctg.sh:

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

Yn y cam nesaf, rydyn ni'n gosod sgript yn y cyfeiriadur hwn, y bydd angen ei redeg yn syth ar ôl cychwyn y peiriant rhithwir. Bydd y sgript hon yn rhoi'r newidynnau defnyddiwr i'w gosod yng nghyfluniad Grafana ac yn ailgychwyn y gweinydd gwe.

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

Ar ôl hynny, mae 3 pheth i'w gwneud:
1) gosod pecynnau
2) cychwyn Grafana o dan systemctl a gosod yr ategyn ClickHouse
3) rhowch y sgript setup.sh yn y ciw i redeg yn syth ar ôl troi ar y peiriant rhithwir.

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

rhedeg-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;

Nawr mae'n aros i redeg Packer a chael y ddelwedd allbwn wedi'i gosod yn y rhaniad penodedig. Wrth greu peiriant rhithwir, gallwch ei ddewis fel disg cychwyn ac, ar ôl dechrau, cael gweinydd gwe Grafana parod.

Defnyddio gwasanaethau dosbarthedig yn Yandex.Cloud gan ddefnyddio Grafana fel enghraifft
Defnyddio gwasanaethau dosbarthedig yn Yandex.Cloud gan ddefnyddio Grafana fel enghraifft

Grŵp enghraifft a chydbwysedd

Unwaith y bydd delwedd ddisg sy'n eich galluogi i greu llawer o weinyddion gwe Grafana union yr un fath, gallwn greu grŵp enghreifftiau. Ar blatfform Yandex.Cloud, mae'r term hwn yn cyfeirio at undeb peiriannau rhithwir sydd â'r un nodweddion. Wrth greu grŵp enghraifft, mae prototeip yr holl beiriannau yn y grŵp hwn yn cael ei ffurfweddu, ac yna nodweddion y grŵp ei hun (er enghraifft, y nifer lleiaf ac uchaf o beiriannau gweithredol). Os nad yw'r rhif presennol yn bodloni'r maen prawf hwn, yna bydd y grŵp enghreifftiau ei hun yn cael gwared ar beiriannau diangen neu'n creu rhai newydd yn y ddelwedd a'r tebygrwydd.

Fel rhan o'n tasg, byddwn yn creu grŵp enghreifftiol o weinyddion gwe a fydd yn cael eu silio o'r ddelwedd ddisg a grëwyd yn flaenorol.

Defnyddio gwasanaethau dosbarthedig yn Yandex.Cloud gan ddefnyddio Grafana fel enghraifft

Defnyddio gwasanaethau dosbarthedig yn Yandex.Cloud gan ddefnyddio Grafana fel enghraifft

Mae'r gosodiad grŵp enghraifft olaf yn wirioneddol nodedig. Bydd y grŵp targed mewn integreiddio â Load Balancer yn eich helpu i sefydlu cydbwysedd L3 ar ben peiriannau rhithwir y grŵp hwn trwy wasgu cwpl o fotymau.

Defnyddio gwasanaethau dosbarthedig yn Yandex.Cloud gan ddefnyddio Grafana fel enghraifft

Wrth sefydlu'r balancer, rhoddais ddau bwynt pwysig ar waith:

  1. Fe'i gwnes fel bod y balancer yn derbyn traffig defnyddwyr ar borthladd 80, a'i ailgyfeirio i borthladd 3000 o beiriannau rhithwir, yn union lle mae Grafana yn byw.
  2. Sefydlu gwiriadau iechyd peiriannau trwy eu pingio ar borthladd 3000.

Defnyddio gwasanaethau dosbarthedig yn Yandex.Cloud gan ddefnyddio Grafana fel enghraifft

mini-gyfanswm

Yn olaf, roeddem yn gallu defnyddio'r seilwaith cymwysiadau dymunol â llaw, ac yn awr mae gennym wasanaeth Grafana hynod wydn. Nid oes ond angen gwybod cyfeiriad IP y cydbwyseddwr fel y pwynt mynediad i'r cais a gwesteiwr y clwstwr ClickHouse er mwyn llwytho'r set ddata i mewn iddo.

Byddai'n ymddangos yn fuddugoliaeth? Ie, buddugoliaeth. Ond mae rhywbeth yn fy mhoeni o hyd. Mae'r broses gyfan uchod yn gofyn am lawer o gamau gweithredu â llaw ac nid yw'n graddio o gwbl, rwyf am ei awtomeiddio os yn bosibl. Dyma fydd ffocws yr adran nesaf.

Integreiddio gyda Terraform

Unwaith eto byddwn yn defnyddio teclyn o HashiCorp o'r enw Terraform. Bydd yn helpu i ddefnyddio'r seilwaith cymhwysiad cyfan trwy glicio botwm, yn seiliedig ar ychydig o newidynnau a basiwyd gan y defnyddiwr. Gadewch i ni ysgrifennu rysáit y gellir ei rhedeg sawl gwaith mewn gwahanol adrannau o wahanol ddefnyddwyr.

Mae'r holl waith gyda Terraform yn dibynnu ar ysgrifennu ffeil ffurfweddu (*.tf) a chreu seilwaith yn seiliedig arno.

Newidynnau

Ar ddechrau'r ffeil, byddwn yn dileu'r newidynnau sy'n pennu ble a sut y bydd y seilwaith yn y dyfodol yn cael ei ddefnyddio.

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

Bydd y broses gyfan o ddefnyddio cais yn dibynnu ar adeiladu delwedd disg a gosod y newidynnau hyn. Gadewch imi egluro beth maen nhw'n gyfrifol amdano:

oauth_tocyn — tocyn mynediad i'r cwmwl. Gellir ei gael gan cyswllt.
cwmwl_id - dynodwr y cwmwl lle byddwn yn defnyddio'r cymhwysiad
ffolder_id — dynodwr yr adran lle byddwn yn defnyddio'r cais
gwasanaeth_cyfrif_id — dynodwr y cyfrif gwasanaeth yn adran gyfatebol y cwmwl.
delwedd_id - dynodwr y ddelwedd ddisg a gafwyd gan ddefnyddio Packer
enw defnyddiwr и cyfrinair - enw defnyddiwr a chyfrinair i gael mynediad i'r ddwy gronfa ddata a gweinydd gwe Grafana
dbenw - enw cronfa ddata y tu mewn i glystyrau CH a MySQL
llwybr_allwedd_cyhoeddus - y llwybr i'r ffeil gyda'ch allwedd ssh cyhoeddus, y gallwch chi gysylltu â hi o dan yr enw ubuntu i beiriannau rhithwir gyda gweinyddwyr gwe

Gosodiad darparwr

Nawr mae angen i chi ffurfweddu'r darparwr Terraform - yn ein hachos ni, Yandex:

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

Gallwch weld ein bod ni'n defnyddio'r newidynnau a ddiffinnir uchod yma.

Rhwydwaith a chlystyrau

Nawr, gadewch i ni greu rhwydwaith lle bydd elfennau o'n seilwaith yn cyfathrebu, tri is-rwydwaith (un ym mhob rhanbarth) ac yn codi'r clystyrau CH a 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
  }
}

Fel y gallwch weld, mae pob un o'r ddau glwstwr wedi'i adeiladu i fod yn weddol oddefgar o ddiffygion trwy gael eu gosod mewn tri Pharth Argaeledd.

Gweinyddwyr gwe

Mae'n ymddangos y gallwch chi barhau yn yr un ysbryd, ond rhedais i anhawster. Cyn hynny, codais y clwstwr MySQL yn gyntaf a dim ond ar ôl hynny, gan wybod ei ID, casglais ddelwedd ddisg gyda'r cyfluniad a ddymunir, lle nodais y gwesteiwr i'r clwstwr. Ond nawr nid ydym yn gwybod ID y clwstwr cyn lansio Terraform, gan gynnwys ar adeg adeiladu'r ddelwedd. Felly roedd yn rhaid i mi droi at y canlynol tric.

Gan ddefnyddio'r gwasanaeth metadata o Amazon, byddwn yn trosglwyddo rhai paramedrau i'r peiriant rhithwir, y bydd yn ei dderbyn a'i brosesu. Mae angen i'r peiriant fynd i'r metadata ar gyfer gwesteiwr MySQL y clwstwr ac ar gyfer yr enw defnyddiwr-cyfrinair a nododd y defnyddiwr yn y ffeil Terraform ar ôl cychwyn. Newidiwch gynnwys y ffeil ychydig setup.sh, sy'n rhedeg pan fydd y peiriant rhithwir yn cael ei droi ymlaen.

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

Inance group a balancer

Ar ôl ailadeiladu'r ddelwedd ddisg newydd, gallwn o'r diwedd ychwanegu ein ffeil ar gyfer Terraform.

Rydym yn nodi ein bod am ddefnyddio delwedd disg sy'n bodoli eisoes:

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

Nawr, gadewch i ni greu grŵp enghraifft:

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

Mae'n werth talu sylw i sut y gwnaethom drosglwyddo i'r metadata cluster_uri, username и password. Eu peiriant rhithwir fydd yn ei gael wrth gychwyn a'i roi yn y ffurfwedd Grafana.

Mae'n ymwneud â'r 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
      }
    }
  }
}

Ychydig o siwgr

Ychydig iawn oedd ar ôl. Ar ôl i'r seilwaith gael ei ddefnyddio, bydd yn rhaid i chi fynd i UI Grafana ac ychwanegu'r clwstwr CH â llaw (y mae angen i chi ei gael o hyd) fel Ffynhonnell Data. Ond mae Terraform yn gwybod ID y clwstwr. Gadewch i ni ei gael i orffen y swydd.

Gadewch i ni ychwanegu darparwr newydd - Grafana, a llithro'r IP balancer fel gwesteiwr. Bydd yr holl newidiadau y mae Terraform yn eu gwneud ar y peiriant lle mae ei gydbwysydd yn penderfynu yn tyfu yn MySQL, ac felly ar bob peiriant arall.

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

Gadewch i ni cribo

Arddangos cydbwyseddwr IP a gwesteiwr clwstwr 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"
}

Gall redeg

I gyd! Mae ein ffeil ffurfweddu yn barod a gallwn, trwy osod newidynnau, ddweud wrth Terraform i godi popeth a ddisgrifiwyd gennym uchod. Cymerodd y broses gyfan tua 15 munud i mi.
Ar y diwedd, gallwch weld neges hyfryd:

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

Ac yn y cwmwl, bydd elfennau o'r seilwaith uwch yn weladwy:

Defnyddio gwasanaethau dosbarthedig yn Yandex.Cloud gan ddefnyddio Grafana fel enghraifft

Crynhoi

Nawr, gan ddefnyddio enghraifft Grafana, gall pob un ohonoch ddefnyddio cymwysiadau gyda phensaernïaeth cwmwl gwasgaredig ar blatfform Yandex.Cloud. Gall offer defnyddiol gan HashiCorp fel Packer a Terraform eich helpu gyda hyn. Rwy'n gobeithio y bydd yr erthygl hon yn ddefnyddiol i rywun 🙂

PS Isod byddaf yn atodi dolen i'r ystorfa, lle gallwch ddod o hyd i ryseitiau parod ar gyfer Packer a Terraform, darnau y cyfeiriais atynt yn yr erthygl hon.

ystorfa

Ffynhonnell: hab.com

Ychwanegu sylw