Hi omnes! Cum partem cursus laboris mei perscrutatus sum facultates tam domesticae nubis suggestus ut
Quid vis accipere?
Cum virtualem machinam cum telae server deducito, ad exercitum eius ire potes et pulchra UI, databases specificare ut fontes ulterioris operis, ashboardas et graphas crea.
Versio fundamentalis unum incommodum significantem habet - non est omnino culpa-patiens. Hoc est, tota applicationis functionis a viability unius virtualis machinae dependet. Si noluerit vel 10 homines UI simul aperiant, tunc orientur problemata.
Simpliciter solvi possunt: ββtantum opus est ut... multas identicas virtuales machinas explicas cum instrumento interretiali et sub librario L3 pones. Sed non omnia hic tam clara sunt. Grafana reponit occasus usoris (viae databases, dashboards, graphs, etc.) directe in disco machinae suae virtualis. Si ergo aliquos ordines in UI mutemus, hae mutationes nonnisi in virtualis machinae qua librator nos misit. Hoc erit inconveniens occasus pro applicatione nostra, causando difficultates cum launch et usu.
Hic alius database succurrit, exempli gratia, MySQL vel aequipollens. Grafanam dicimus quod occasus usorum in hac datorum "parce" reponere debet. Postea satis erit iter huic datorum semel in unaquaque machina denominare, et omnes alios usores in quibusvis machinis virtualis emendare, ad alios se extendent.
Hic schema est finalis applicationis infrastructure:
Discamus manibus levare
MySQL et ClickHouse
Priusquam eiusmodi applicationem cum pressione globuli explicas, discere oportuit singulas partes eius tractare et eas inter se integrare.
Hic Yandex.Cloud nos adiuvabit, qui L3 librarios, ClickHouse et MySQL operas administratas praebet. Usoris tantum ambitum specificare oportet et expectare donec suggestus omnia in ordinem laboris adferat.
Descripsi, nubem creavi et rationem reddidi. Post hoc, ivi ad nubem, et erexi MySQL et ligaturas ClickHouse cum minimis occasus. Expectabam donec essent activae.
Etiam meminisse debes creare database in unoquoque botro et accessum ad illud configurare utens rationis et tesserae. Non ingrediar hic singula - omnia satis perspicua sunt in instrumento.
Non-obspicuum est quod hae databases multas hostias habeant, quae tolerantiam culpae suae praestant. Nihilominus, Grafana unumquemvis exercitum pro singulis datorum datorum opus est. Long Lectio c-<cluster_id>.rw.mdb.yandexcloud.net
provisa ad hodiernum dominum exercitum activum botri cum ID respondente. Hoc est quod Grafana dabimus.
web server
Nunc ad interretialem server usque est. Machinam virtualem iustam advocemus cum Linux et manually Grafana in ea configurat.
Coniungamus per ssh et install fasciculos necessarios.
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
Post hoc, Grafana sub systemctl curramus et niteremur plugin operandi cum ClickHouse (sic, non suppletur in sarcina fundamentali).
sudo systemctl start grafana-server
sudo systemctl enable grafana-server
sudo grafana-cli plugins install vertamedia-clickhouse-datasource
Id, postea simplici imperio
sudo service grafana-server start
web server incipiemus. Nunc potes externam IP inscriptionem machinae virtualis in navigatro inire, portum 3000 denota et pulchrum Grafana UI videre.
Sed non ruis, antequam Grafana constituas, meminisse debes ei viam MySQL indicare ut occasus ibi condias.
Tota figura Grafanae servientis telae in tabella /etc/grafana/grafana.ini
. Linea inquisita sic similis est:
;url =
Hospes ad MySQL botrum posuimus. Idem fasciculus login et clavem continet pro accessu Grafana in tabula supra, quae per defaltam ambo pares sunt admin
.
Etiam sed mauris justo,
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
Tempus est ut sileo telam server!
sudo service grafana-server restart
Nunc in Grafana UI declarabimus ClickHouse pro DataSource.
Configurationem operariam cum sequentibus fundis assequi potui:
Ego certa ut URL https://c-<cluster_id>.rw.mdb.yandexcloud.net:8443
Omnis! Operantem machinam virtualem habemus cum servo interretiali cum CH et MySQL connexo. Iam potes fasciculos dataset ad ClickHouse et aedificare dashboards. Sed propositum nondum percepimus nec infrastructuram plenam discursimus.
Packer
Yandex.Cloud permittit te creare disco imaginem machinae virtualis existentis, et ex eius fundamento - quotcumque machinarum inter se identificarum. Hoc istuc ipsum utemur. Ad imaginem convenienter convenire, instrumentum sume
Fasciculus noster json ex duobus caudices constabit: structores et provisiones. Primus clausus parametros ipsius imaginis ut ens describit, secundus clausus mandata describit ut eam contento necessario impleat.
Γ¦dificantes,
{
"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"
}
],
...
}
In hoc template, necesse est identificatorem sectionis in nube ponere, ubi vis imaginem creare, ac viam ad tabella cum clavibus ex ratione servitii in hac sectione antea creata. Plura legere potes de rationibus et clavibus in modum fasciculi in sectione respondente creando
Configuratio haec dicit imaginem orbis aedificari in tribunali ubuntu-1804-lts
in sectione usoris propriae imaginis familiae positae GRAFANA
sub nomine grafana-{{timestamp}}
.
Provisores
Nunc venit magis interesting pars configurationis. Ordinem actionum describet quae in machina virtuali perficienda erunt antequam statum suum congelaverit in imaginem disci.
{
...,
"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"
]
}
]
}
Hic omnes actiones in 3 gradus distinguuntur. In primo gradu, simplex scriptum efficitur quod directorium auxiliarium creat.
para-ctg.sh;
#!/bin/bash
sudo mkdir -p /opt/grafana
sudo chown -R ubuntu:ubuntu /opt/grafana
Proximo gradu in hoc indice scriptum ponimus, quod statim post virtualem machinam inceptis deduci debebit. Hoc scriptum ponet variabiles usores quae in Grafana config scribendae sunt et in calculonis servi sileo.
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
Post haec sunt 3 quae restant;
I) install packages
2) Grafana currere sub systemctl ac installare in plugin ClickHouse
3) setup.sh scriptum pone in queue launch statim postquam conversus in apparatus virtualis.
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;
Nunc reliquum est ut Packer currendum sit et imaginem outputam in sectione determinato positam obtine. Cum virtualem machinam creando, eum ut orbis tabernus eligere potes et post launch in Grafana interretialem ministrum praeparatum recipies.
Instantia coetus et staterar
Cum imaginem orbis habemus quae multos identicos in Grafana interretiali servientes creare sinit, coetus instantiam creare possumus. In suggestu Yandex.Cloud, hoc vocabulum ad unionem machinarum virtualium refert quae easdem notas habent. Cum creando instantia coetus, exemplar omnium machinarum in hoc circulo configuratur, ac deinde notae ipsius coetus (exempli gratia, numerus minimus et maximus machinis activae). Si numerus currens non occurret his indiciis, ipsa instantia coetus necessarias machinas removebit vel novas in imagine sua creabit.
Pro parte muneris nostri creabimus instantia coetus interretialium qui ex imagini orbis antea creato generabitur.
Quod vere mirabile est, coetus novissimus instantia habeat. Circulus target in integratione cum Load Balancero adiuvabit te ad L3 libratorem configurare super virtualis machinis huius coetus strepitando a duobus globulis.
Cum libratorem constituo, duo puncta momenti complevi:
- Librarium usoris mercaturam in portum 80 accipere feci et eam redigere ad 3000 machinarum virtualium, ubi Grafana vivit prorsus.
- Machinarum viability inhibito pingendo ad mille portum constitui.
Mini summary
Denique manually applicandi infrastructuram desideratam explicandam potuimus, et nunc grafana opera valde consi- demus. Tantum debes scire IP inscriptionem libratoris sicut punctum aculei applicationis et exercitui botri strepita ut in eo dataset oneres.
Videtur quod victoria? Etiam, victoria. Sed adhuc aliquid me confundit. Totus processus supra multum gressus manuales requirit et omnino scalabilis non est: vellem automate si fieri potest. Hoc est quod in sequenti sectione deuotum erit.
Terraform integratio
Nos iterum utimur instrumento ab HashiCorp vocato
Totum opus cum Terraform descendit ad limam configurandam scribendam.*.tf
) et creatio infrastructurae in ea fundatae.
variables
In ipso initio tabellae variabiles differentias comprehendemus quae ubi et quomodo futura infrastructura explicabuntur.
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>"
}
Tota applicationis processus instruere descendet ad imaginem orbis aedificandam et has variabiles ponens. Dicam quid sint;
oauth_token - signum accessu nubis. Potest obtineri
cloud_id - nubes identifier ubi applicationis explicabimus
folder_id - section identifier ubi applicationis explicabimus
service_account_id β ministerium rationis identifier in sectione nubis respondens.
image_id - identifier orbis imaginem nactus per Packer
More ΠΈ Password - username et password ut accessum tam databases quam Grafana interretiali server
dbname - database nomen intra CH et MySQL clusters
public_key_path - iter ad tabella cum clavis ssh publicis tuis, quibus sub nomine coniungere potes ubuntu
ad virtualis machinis per telam servers
Provisor setup
Nunc debes configurare provisorem Terraformem - in nostro casu, Yandex:
provider "yandex" {
token = var.oauth_token
cloud_id = var.cloud_id
folder_id = var.folder_id
zone = "ru-central1-a"
}
Animadvertes hic variabilibus supra definitis utimur.
Network et clusters
Nunc reticulum creabimus in quo elementa infrastructurae nostrae communicabunt, tres subnetes (unum in unaquaque regione) et ligaturas CH et MySQL excitabimus.
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
}
}
Ut videre potes, singulae duae ligaturae satis patienter creantur, cum in tribus zonis disponibilitate sitae.
Web servers
Videtur quod eodem spiritu possemus permanere, sed in difficultatem cucurri. Ante hoc primum MySQL botrum sustuli et postea demum, id cognoscens, imaginem disci cum figura certa collegi, ubi exercitum ad botrum designavi. Sed nunc nescimus botrum ID ante Terraformam deducendo, incluso tempore imaginis aedificationis. Ideo oportuit me ad sequentia confugere
Usura metadata Amazonii opera, aliquos parametros ad machinam virtualem transeamus, quae acceptura est et processum. Machina opus est ut ad metadatam post MySQL botrum exercitum et usoris tesseram accedas, quod usor in lima Terraform designatus, postquam incepit. Lets contenta tabella leviter mutare setup.sh
quae currit cum virtualis apparatus volvitur.
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 coetus et librari
Nova imagine disci reaedificata, tandem fasciculum nostrum Terraformi addere possumus.
Indicamus nos volentes uti imagine orbis existentis;
data "yandex_compute_image" "grafana_image" {
image_id = var.image_id
}
Nunc faciamus exemplum coetus:
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"
}
}
Operae pretium est quomodo eam in metadata transeamus cluster_uri
, username
ΠΈ password
. Haec sunt machinae virtualis in satus tolle et in Grafana config.
Est ad librator.
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
}
}
}
}
A saccharo
Reliquum est parum. Postquam infrastructura explicatur, ad Grafanam UI ire debebis et manually CH botrum (id cuius adhuc obtinendum est) ut Data Source adde. Sed Terraform nouit botrum ID. Committimus eum ut rem fruendam afferamus.
Adiciamus novum provisorem - Grafana, et date illi inscriptionem IP libratoris hospitis. Omnes mutationes quas Terraform facit in machina ubi librarius determinat, in MySQL crescet, et ideo in omnibus aliis machinis.
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"
}
Sit scriptor pectine comas
Ostendamus libratorem IP inscriptionem et exercitum de botro 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"
}
Potes currere
Omnis! Scapus nostri configurationis est paratus et possumus, variabilium statuendo, Terraformi nuntiare omnia, quae supra descripsimus, erigere. Totum processum XV minuta me suscepit.
In fine videre potes pulcherrimum nuntium:
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
Et in nube, elementa infrastructura elevata videbuntur;
Summatim
Nunc, Grafana utens exemplo, quilibet vestrum applicationes explicare potest cum architectura nubis discurrentis in Yandex.Cloud suggestum. Instrumenta utilia ab HashiCorp sicut Packer et Terraformi hoc te adiuvare possunt. Spero aliquis invenit hunc articulum utile :)
PS Infra nexum repositorio apponam ubi receptacula parata invenire potes pro Packer et Terraforma, quorum fragmenta in hoc articulo paravi.
Source: www.habr.com