Жишээ болгон Grafana-г ашиглан Yandex.Cloud дээр түгээсэн үйлчилгээг байршуулах

Сайн уу! Курсын ажлынхаа хүрээнд би дотоодын үүлэн платформын чадавхийг судалсан Yandex.Cloud. Энэхүү платформ нь практик асуудлыг шийдвэрлэх янз бүрийн үйлчилгээг санал болгодог. Гэсэн хэдий ч заримдаа та эдгээр үйлчилгээн дээр суурилсан нэлээд өргөн дэд бүтэцтэй өөрийн үүлэн программыг тохируулах хэрэгтэй болдог. Энэ нийтлэлд би ийм програмыг ашиглах туршлагаа хуваалцахыг хүсч байна.

Жишээ болгон Grafana-г ашиглан Yandex.Cloud дээр түгээсэн үйлчилгээг байршуулах

Та юу хүлээж авахыг хүсч байна вэ?

Графана — аливаа системийн аналитик асуудал эсвэл хяналтын асуудлыг шийдвэрлэх хүчирхэг хэрэгсэл. Үндсэн тохиргооны хувьд энэ нь Grafana вэб сервертэй виртуал машин, мөн өгөгдлийн сан (ClickHouse, InfluxDB гэх мэт) бөгөөд үүнд дүн шинжилгээ хийх өгөгдлийн багц юм.

Вэб сервертэй виртуал машин ажиллуулсны дараа та түүний хост руу очиж үзэсгэлэнтэй UI авах, мэдээллийн санг цаашдын ажлын эх сурвалж болгон зааж өгөх, хяналтын самбар, график үүсгэх боломжтой.

Жишээ болгон Grafana-г ашиглан Yandex.Cloud дээр түгээсэн үйлчилгээг байршуулах

Үндсэн хувилбар нь нэг чухал сул талтай - энэ нь алдааг огт тэсвэрлэдэггүй. Өөрөөр хэлбэл, програмын бүх функц нь нэг виртуал машины амьдрах чадвараас хамаарна. Хэрэв энэ нь татгалзвал эсвэл 10 хүн UI-г нэгэн зэрэг нээвэл асуудал үүснэ.

Тэдгээрийг энгийнээр шийдэж болно: та зүгээр л ... вэб сервертэй ижил төстэй олон виртуал машинуудыг байрлуулж, L3 тэнцвэржүүлэгчийн доор байрлуулах хэрэгтэй. Гэхдээ энд бүх зүйл тийм ч тодорхой биш байна. Grafana нь хэрэглэгчийн тохиргоог (өгөгдлийн сангийн зам, хяналтын самбар, график гэх мэт) виртуал машиныхаа дискэн дээр шууд хадгалдаг. Тиймээс, хэрэв бид UI-ийн зарим тохиргоог өөрчлөх юм бол эдгээр өөрчлөлтүүд зөвхөн тэнцвэржүүлэгчийн бидэнд илгээсэн виртуал машин дээр тусгагдах болно. Энэ нь манай аппликейшнд нийцэхгүй тохиргоонд хүргэж, эхлүүлэх, ашиглахад асуудал үүсгэх болно.

Энд өөр мэдээллийн сан аврах ажилд ирнэ, жишээлбэл, MySQL эсвэл түүнтэй адилтгах. Бид Графана-д хэрэглэгчийн тохиргоог энэ "нөөц" мэдээллийн санд хадгалах ёстой гэж хэлдэг. Дараа нь энэ мэдээллийн санд хүрэх замыг машин бүр дээр нэг удаа зааж өгөхөд хангалттай бөгөөд бусад бүх хэрэглэгчийн тохиргоог виртуал машинуудын аль нэг дээр засварлах болно; тэдгээр нь бусад руу шилжих болно.

Энд эцсийн хэрэглээний дэд бүтцийн диаграмм байна:

Жишээ болгон Grafana-г ашиглан Yandex.Cloud дээр түгээсэн үйлчилгээг байршуулах

Гараараа өргөж сурцгаая

MySQL болон ClickHouse

Ийм програмыг нэг товчлуур дээр дарж байрлуулахын өмнө түүний бүрэлдэхүүн хэсэг бүрийг хэрхэн зохицуулж, бие биетэйгээ нэгтгэж сурах шаардлагатай байв.

Энд Yandex.Cloud бидэнд туслах болно, энэ нь L3 тэнцвэржүүлэгч, ClickHouse болон MySQL-г удирддаг үйлчилгээ болгон өгдөг. Хэрэглэгч зөвхөн параметрүүдийг зааж өгөх хэрэгтэй бөгөөд платформ бүх зүйлийг хэвийн байдалд оруулах хүртэл хүлээх хэрэгтэй.

Би бүртгүүлж, үүл болон төлбөрийн данс үүсгэсэн. Үүний дараа би үүлэн дээр очиж MySQL болон ClickHouse кластеруудыг хамгийн бага тохиргоотойгоор тохируулсан. Би тэднийг идэвхтэй болох хүртэл хүлээсэн.

Жишээ болгон Grafana-г ашиглан Yandex.Cloud дээр түгээсэн үйлчилгээг байршуулахЖишээ болгон Grafana-г ашиглан Yandex.Cloud дээр түгээсэн үйлчилгээг байршуулах

Та мөн кластер бүрт өгөгдлийн сан үүсгэж, нэвтрэх, нууц үг ашиглан нэвтрэх тохиргоогоо хийхээ санах хэрэгтэй. Би энд дэлгэрэнгүй ярихгүй - интерфейс дээр бүх зүйл тодорхой харагдаж байна.

Тодорхой бус нарийн зүйл бол эдгээр мэдээллийн сан нь алдааг тэсвэрлэх чадварыг баталгаажуулдаг олон хосттой байдаг. Гэсэн хэдий ч, Grafana нь ажилладаг мэдээллийн сан бүрдээ яг нэг хост шаарддаг. Удаан унших баримт бичиг Үүл намайг нэг шийдвэрт хүргэв. Энэ нь тухайн зүйлийн эзэн болох нь харагдаж байна c-<cluster_id>.rw.mdb.yandexcloud.net харгалзах ID-тай кластерын одоогийн идэвхтэй мастер хост руу зурагдсан. Үүнийг бид Графанад өгөх болно.

вэб сервер

Одоо вэб сервер дээр байна. Линукс бүхий ердийн виртуал машиныг суулгаж, Grafana-г гараар тохируулцгаая.

Жишээ болгон Grafana-г ашиглан Yandex.Cloud дээр түгээсэн үйлчилгээг байршуулах

Жишээ болгон Grafana-г ашиглан Yandex.Cloud дээр түгээсэн үйлчилгээг байршуулах

ssh-ээр холбогдож шаардлагатай багцуудаа суулгацгаая.

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 

Үүний дараа Grafana-г systemctl доор ажиллуулаад ClickHouse-тэй ажиллах залгаасыг суулгая (тиймээ, энэ нь үндсэн багцад байхгүй).

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

Ингээд л, үүний дараа энгийн тушаалаар

sudo service grafana-server start

Бид вэб серверийг эхлүүлэх болно. Одоо та виртуал машины гадаад IP хаягийг хөтөч дээр оруулж, 3000 портыг зааж өгч, үзэсгэлэнтэй Grafana UI-г харах боломжтой.
Жишээ болгон Grafana-г ашиглан Yandex.Cloud дээр түгээсэн үйлчилгээг байршуулах

Гэхдээ яарах хэрэггүй, та Grafana-г тохируулахаасаа өмнө тохиргоогоо хадгалахын тулд MySQL рүү нэвтрэх замыг зааж өгөх хэрэгтэй.

Графана вэб серверийн бүх тохиргоо файлд байна /etc/grafana/grafana.ini. Шаардлагатай мөр дараах байдлаар харагдаж байна.

;url =

Бид хостыг MySQL кластерт тохируулсан. Дээрх зурган дээрх Графана руу нэвтрэх нэвтрэх болон нууц үг ижил файлд агуулагдаж байгаа бөгөөд анхдагч байдлаар хоёулаа тэнцүү байна admin.

Та 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

Вэб серверийг дахин эхлүүлэх цаг боллоо!

sudo service grafana-server restart

Одоо Grafana UI дээр бид ClickHouse-г DataSource болгон зааж өгөх болно.

Би дараах тохиргоонуудын тусламжтайгаар ажлын тохиргоонд хүрч чадсан:

Жишээ болгон Grafana-г ашиглан Yandex.Cloud дээр түгээсэн үйлчилгээг байршуулах

Би URL гэж заасан https://c-<cluster_id>.rw.mdb.yandexcloud.net:8443

Бүгд! Бидэнд CH болон MySQL-д холбогдсон вэб сервер бүхий нэг виртуал машин ажиллаж байна. Та аль хэдийн өгөгдлийн багцыг ClickHouse-д байршуулж, хяналтын самбар үүсгэх боломжтой. Гэвч бид зорилгодоо хүрч чадаагүй, дэд бүтцээ бүрэн суулгаагүй байна.

Пакер

Yandex.Cloud нь одоо байгаа виртуал машины дискний дүрсийг үүсгэх боломжийг олгодог бөгөөд үүний үндсэн дээр бие биетэйгээ ижил тооны машинууд байдаг. Үүнийг бид яг ашиглах болно. Зургийг эвтэйхэн угсрахын тулд багажийг аваарай Пакер HashiCorp-аас. Энэ нь зургийг угсрах заавар бүхий json файлыг оролт болгон авдаг.

Манай json файл нь бүтээгч болон хангагч гэсэн хоёр блокоос бүрдэнэ. Эхний блок нь тухайн зургийн параметрүүдийг бие даасан байдлаар тайлбарладаг бөгөөд хоёр дахь блок нь шаардлагатай контентоор дүүргэх зааврыг тайлбарладаг.

барилгачид

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

Энэ загварт та зураг үүсгэхийг хүсч буй үүлэн доторх хэсгийн таниулбар, мөн энэ хэсэгт өмнө нь үүсгэсэн үйлчилгээний дансны түлхүүр бүхий файл руу очих замыг тохируулах хэрэгтэй. Үйлчилгээний данс, түлхүүрүүдийг файл хэлбэрээр үүсгэх талаар та холбогдох хэсгээс уншиж болно баримт бичиг.

Энэхүү тохиргоо нь дискний дүрсийг платформ дээр үндэслэн бүтээх болно гэж хэлдэг ubuntu-1804-lts, зургийн бүлэгт тохирох хэрэглэгчийн хэсэгт байрлуулсан GRAFANA нэрээр grafana-{{timestamp}}.

Зохицуулагчид

Одоо тохиргооны илүү сонирхолтой хэсэг ирлээ. Энэ нь виртуал машин дээр түүний төлөвийг дискний дүрс болгон хөлдөөхөөс өмнө хийх шаардлагатай үйлдлүүдийн дарааллыг тайлбарлах болно.

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

Энд бүх үйлдлүүд 3 үе шатанд хуваагдана. Эхний шатанд туслах лавлах үүсгэх энгийн скриптийг гүйцэтгэдэг.

Preparat-ctg.sh:

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

Дараагийн шатанд бид энэ директорт скрипт байрлуулдаг бөгөөд энэ нь виртуал машиныг ажиллуулсны дараа шууд эхлүүлэх шаардлагатай болно. Энэ скрипт нь Grafana тохиргоонд бүртгүүлэх шаардлагатай хэрэглэгчийн хувьсагчдыг оруулж, вэб серверийг дахин эхлүүлэх болно.

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

Үүний дараа хийх 3 зүйл үлдлээ.
1) багцуудыг суулгах
2) systemctl доор Grafana-г ажиллуулаад ClickHouse залгаасыг суулгана уу
3) виртуал машиныг асаасан даруйд setup.sh скриптийг эхлүүлэх дараалалд оруулна.

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;

Одоо зөвхөн Packer-ийг ажиллуулж, заасан хэсэгт байрлуулсан гаралтын зургийг авах л үлдлээ. Виртуал машин үүсгэх үед та үүнийг ачаалах диск болгон сонгох боломжтой бөгөөд ажиллуулсны дараа та бэлэн Grafana вэб сервер хүлээн авах болно.

Жишээ болгон Grafana-г ашиглан Yandex.Cloud дээр түгээсэн үйлчилгээг байршуулах
Жишээ болгон Grafana-г ашиглан Yandex.Cloud дээр түгээсэн үйлчилгээг байршуулах

Жишээ бүлэг ба тэнцвэржүүлэгч

Бид олон ижил Grafana вэб серверүүдийг үүсгэх боломжийг олгодог дискний дүрстэй болмогц бид жишээний бүлгийг үүсгэж болно. Yandex.Cloud платформ дээр энэ нэр томъёо нь ижил шинж чанартай виртуал машинуудын нэгдлийг хэлдэг. Жишээ бүлэг үүсгэх үед энэ бүлгийн бүх машинуудын прототипийг тохируулж, дараа нь тухайн бүлгийн шинж чанарыг (жишээлбэл, идэвхтэй машинуудын хамгийн бага ба хамгийн их тоо) тохируулдаг. Хэрэв одоогийн дугаар нь эдгээр шалгуурыг хангаагүй бол жишээний бүлэг өөрөө шаардлагагүй машинуудыг устгах эсвэл өөрийн дүр төрхөөр шинээр үүсгэх болно.

Даалгаврынхаа нэг хэсэг болгон бид өмнө нь үүсгэсэн дискний зургаас үүсгэгдэх вэб серверүүдийн бүлгийг үүсгэх болно.

Жишээ болгон Grafana-г ашиглан Yandex.Cloud дээр түгээсэн үйлчилгээг байршуулах

Жишээ болгон Grafana-г ашиглан Yandex.Cloud дээр түгээсэн үйлчилгээг байршуулах

Хамгийн гайхалтай нь хамгийн сүүлчийн бүлгийн тохиргоо юм. Ачаалал тэнцвэржүүлэгчтэй нэгтгэсэн зорилтот бүлэг нь хэд хэдэн товчлуур дээр дарж энэ бүлгийн виртуал машинууд дээр L3 тэнцвэржүүлэгчийг тохируулахад тусална.

Жишээ болгон Grafana-г ашиглан Yandex.Cloud дээр түгээсэн үйлчилгээг байршуулах

Тэнцвэржүүлэгчийг тохируулахдаа би хоёр чухал зүйлийг хэрэгжүүлсэн.

  1. Би тэнцвэржүүлэгчийг 80-р порт дээрх хэрэглэгчийн урсгалыг хүлээн зөвшөөрч, Графанагийн амьдардаг виртуал машинуудын 3000-р порт руу чиглүүлэв.
  2. Би машинуудын амьдрах чадварыг шалгахын тулд 3000 порт руу залгах замаар тохируулсан.

Жишээ болгон Grafana-г ашиглан Yandex.Cloud дээр түгээсэн үйлчилгээг байршуулах

Бяцхан хураангуй

Эцэст нь бид хүссэн хэрэглээний дэд бүтцийг гараар байрлуулж чадсан бөгөөд одоо бид өндөр тэсвэртэй Grafana үйлчилгээтэй боллоо. Та өгөгдлийн багцыг ачаалахын тулд програм руу нэвтрэх цэг болон ClickHouse кластерын хост болох тэнцвэржүүлэгчийн IP хаягийг л мэдэх хэрэгтэй.

Энэ нь ялалт юм шиг санагдаж байна уу? Тийм ээ, ялалт. Гэхдээ нэг зүйл намайг төөрөгдүүлсээр байна. Дээрх бүх үйл явц нь маш олон гарын авлагын алхмуудыг шаарддаг бөгөөд огт өргөжүүлэх боломжгүй; боломжтой бол би үүнийг автоматжуулахыг хүсч байна. Энэ бол дараагийн хэсгийг зориулах болно.

Терраформын нэгдэл

Бид HashiCorp-ийн нэртэй хэрэгслийг дахин ашиглах болно Терраформ. Энэ нь хэрэглэгчийн дамжуулсан хэд хэдэн хувьсагч дээр тулгуурлан нэг товчлуур дээр дарснаар програмын бүх дэд бүтцийг байрлуулахад тусална. Янз бүрийн хэрэглэгчдийн өөр өөр хэсэгт олон удаа ажиллуулж болох жор бичье.

Terraform-тай хийсэн бүх ажил нь тохиргооны файл бичихэд хүргэдэг (*.tf) түүн дээр тулгуурлан дэд бүтцийг бий болгох.

Хувьсагчид

Файлын хамгийн эхэнд бид ирээдүйн дэд бүтцийг хаана, хэрхэн байрлуулахыг тодорхойлох хувьсагчдыг оруулах болно.

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

Програмыг байршуулах бүх үйл явц нь дискний дүрсийг бүтээх, эдгээр хувьсагчдыг тохируулах хүртэл явагдана. Тэд юу хариуцаж байгааг тайлбарлая:

oauth_token — үүлд нэвтрэх токен. -аар авч болно холбоос.
cloud_id - програмыг байрлуулах үүл танигч
хавтас_id - програмыг байрлуулах хэсгийн танигч
үйлчилгээний_бүртгэлийн_id — үүлний харгалзах хэсэгт үйлчилгээний дансны таниулбар.
зургийн_id — Пакер ашиглан олж авсан дискний дүрсний танигч
хэрэглэгчийн нэр и нууц үг — өгөгдлийн сан болон Графана вэб серверийн аль алинд нь нэвтрэх хэрэглэгчийн нэр, нууц үг
dbname — CH болон MySQL кластер доторх өгөгдлийн сангийн нэр
нийтийн_түлхүүр_зам — нэрээр холбогдохын тулд ашиглаж болох нийтийн ssh түлхүүрээр файл руу очих зам ubuntu вэб сервер бүхий виртуал машинууд руу

Үйлчилгээ үзүүлэгчийн тохиргоо

Одоо та Terraform үйлчилгээ үзүүлэгчийг тохируулах хэрэгтэй - манай тохиолдолд Yandex:

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

Энд бид дээр тодорхойлсон хувьсагчдыг ашиглаж байгааг та анзаарах болно.

Сүлжээ ба кластерууд

Одоо бид дэд бүтцийнхээ элементүүд, гурван дэд сүлжээ (бүс бүрт нэг) холбогдох сүлжээг үүсгэж, CH болон 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
  }
}

Таны харж байгаагаар хоёр кластер тус бүрийг гурван боломжит бүсэд байрлуулснаар гэмтэлд тэсвэртэй байдаг.

Вэб серверүүд

Бид ижил сэтгэлээр үргэлжлүүлж болох юм шиг санагдаж байсан ч надад хэцүү байсан. Үүнээс өмнө би эхлээд MySQL кластер босгосон бөгөөд үүний дараа л ID-г нь мэдсэнийхээ дараа шаардлагатай тохиргоотой дискний дүрсийг цуглуулж, кластерт хостыг зааж өгсөн. Гэхдээ одоо бид Terraform-ийг эхлүүлэхийн өмнө, тэр дундаа зураг бүтээх үед кластер ID-г мэдэхгүй байна. Тиймээс би дараахь зүйлийг хийх шаардлагатай болсон заль мэх.

Амазоны мета өгөгдлийн үйлчилгээг ашигласнаар бид зарим параметрүүдийг виртуал машин руу дамжуулж, түүнийг хүлээн авч, боловсруулах болно. MySQL кластерын хост болон хэрэглэгчийн нэр-нууц үгийн ард байгаа мета өгөгдөл рүү шилжихийн тулд бидэнд машиныг эхлүүлсний дараа хэрэглэгчийн Terraform файлд заасан байх шаардлагатай. Файлын агуулгыг бага зэрэг өөрчилье setup.sh, энэ нь виртуал машин асаалттай үед ажилладаг.

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 group ба тэнцвэржүүлэгч

Шинэ дискний дүрсийг сэргээсний дараа бид Terraform-д зориулж файлаа нэмж болно.

Бид одоо байгаа дискний дүрсийг ашиглахыг хүсч байгаагаа илэрхийлье:

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

Одоо жишээний бүлгийг үүсгэцгээе:

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

Бид үүнийг мета өгөгдөлд хэрхэн шилжүүлсэнийг анхаарах нь зүйтэй cluster_uri, username и password. Эдгээр нь виртуал машиныг эхлүүлэх үед гаргаж аваад Grafana тохиргоонд оруулах болно.

Энэ нь тэнцвэржүүлэгчээс хамаарна.

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

Бага зэрэг элсэн чихэр

Жаахан л үлдлээ. Дэд бүтцийг байрлуулсны дараа та Grafana UI руу орж, CH кластерийг (ID-г нь авах шаардлагатай) өгөгдлийн эх үүсвэр болгон гараар нэмэх шаардлагатай болно. Гэхдээ Terraform нь кластер ID-г мэддэг. Асуудлыг үр дүнд хүргэхийг түүнд даатгая.

Шинэ үйлчилгээ үзүүлэгч - Графана нэмж, түүнд тэнцвэржүүлэгчийн IP хаягийг хостоор өгье. Terraform-ийн тэнцвэржүүлэгчийн тодорхойлсон машин дээр хийсэн бүх өөрчлөлтүүд MySQL, улмаар бусад бүх машинууд дээр өсөх болно.

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

Үсээ самнацгаая

Тэнцвэржүүлэгчийн IP хаяг болон 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"
}

Гүйж чадна

Бүгд! Бидний тохиргооны файл бэлэн болсон бөгөөд бид хувьсагчдыг тохируулснаар Terraform-д дээр дурдсан бүх зүйлийг нэмэгдүүлэхийг хэлж чадна. Бүх процесс надад 15 минут зарцуулсан.
Төгсгөлд нь та сайхан мессежийг харж болно:

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

Мөн үүлэн дээр босгосон дэд бүтцийн элементүүд харагдах болно:

Жишээ болгон Grafana-г ашиглан Yandex.Cloud дээр түгээсэн үйлчилгээг байршуулах

Үр дүнг нэгтгэн үзье

Одоо Grafana-г жишээ болгон ашигласнаар та бүгд өргөн цар хүрээтэй үүлэн архитектур бүхий програмуудыг Yandex.Cloud платформ дээр байрлуулж болно. Пакер, Терраформ зэрэг HashiCorp-ийн ашигтай хэрэгслүүд танд үүнийг хийхэд тусална. Энэ нийтлэлийг хэн нэгэнд хэрэгтэй гэж найдаж байна :)

Жич Доор би энэ нийтлэлд өгсөн Пакер ба Терраформд зориулсан бэлэн жорыг олох боломжтой репозиторын холбоосыг хавсаргана.

хадгалах газар

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх