مثال کے طور پر Grafana کا استعمال کرتے ہوئے Yandex.Cloud میں تقسیم شدہ خدمات کی تعیناتی۔

سب کو سلام! اپنے کورس ورک کے حصے کے طور پر، میں نے اس طرح کے گھریلو کلاؤڈ پلیٹ فارم کی صلاحیتوں پر تحقیق کی۔ Yandex.Cloud. یہ پلیٹ فارم عملی مسائل کو حل کرنے کے لیے مختلف خدمات پیش کرتا ہے۔ تاہم، بعض اوقات آپ کو ان خدمات کی بنیاد پر کافی وسیع انفراسٹرکچر کے ساتھ اپنی کلاؤڈ ایپلیکیشن ترتیب دینے کی ضرورت ہوتی ہے۔ اس مضمون میں میں اس طرح کی ایپلی کیشن کی تعیناتی میں اپنا تجربہ بتانا چاہتا ہوں۔

مثال کے طور پر Grafana کا استعمال کرتے ہوئے Yandex.Cloud میں تقسیم شدہ خدمات کی تعیناتی۔

آپ کیا وصول کرنا چاہتے ہیں؟

گرافانا - کسی بھی نظام کے تجزیاتی مسائل یا نگرانی کے مسائل کو حل کرنے کے لیے ایک طاقتور ٹول۔ اس کی بنیادی ترتیب میں، یہ گرافانا ویب سرور کے ساتھ ایک ورچوئل مشین ہے، نیز ڈیٹا بیس کے ساتھ ایک ڈیٹا بیس (ClickHouse، InfluxDB، وغیرہ) ہے جس پر تجزیات کی بنیاد رکھی جائے گی۔

ویب سرور کے ساتھ ایک ورچوئل مشین لانچ کرنے کے بعد، آپ اس کے میزبان کے پاس جا کر ایک خوبصورت UI حاصل کر سکتے ہیں، مزید کام کے لیے ڈیٹا بیس کو ذرائع کے طور پر بتا سکتے ہیں، ڈیش بورڈز اور گراف بنا سکتے ہیں۔

مثال کے طور پر Grafana کا استعمال کرتے ہوئے Yandex.Cloud میں تقسیم شدہ خدمات کی تعیناتی۔

بنیادی ورژن میں ایک اہم خرابی ہے - یہ غلطی کو برداشت کرنے والا نہیں ہے۔ یعنی، ایپلی کیشن کی پوری فعالیت کا انحصار ایک ورچوئل مشین کے قابل عمل ہونے پر ہے۔ اگر یہ انکار کرتا ہے یا 10 لوگ بیک وقت UI کھولتے ہیں، تو مسائل پیدا ہوں گے۔

انہیں آسانی سے حل کیا جا سکتا ہے: آپ کو بس... ایک ویب سرور کے ساتھ بہت سی ایک جیسی ورچوئل مشینوں کو تعینات کرنے کی ضرورت ہے اور انہیں L3 بیلنسر کے نیچے رکھنا ہے۔ لیکن یہاں سب کچھ اتنا واضح نہیں ہے۔ گرافانا اپنی ورچوئل مشین کی ڈسک پر براہ راست صارف کی ترتیبات (ڈیٹا بیس، ڈیش بورڈز، گراف وغیرہ کے راستے) اسٹور کرتا ہے۔ اس طرح، اگر ہم UI میں کچھ ترتیبات کو تبدیل کرتے ہیں، تو یہ تبدیلیاں صرف اس ورچوئل مشین پر ظاہر ہوں گی جہاں بیلنسر نے ہمیں بھیجا تھا۔ یہ ہماری ایپلیکیشن کے لیے متضاد ترتیبات کا باعث بنے گا، جس سے لانچ اور استعمال میں مسائل پیدا ہوں گے۔

یہاں ایک اور ڈیٹا بیس بچائے گا، مثال کے طور پر، MySQL یا اس کے مساوی۔ ہم گرافانا کو کہتے ہیں کہ وہ صارف کی ترتیبات کو اس "فالج" ڈیٹا بیس میں محفوظ کرے۔ اس کے بعد، ہر مشین پر ایک بار اس ڈیٹا بیس کا راستہ بتانا کافی ہوگا، اور کسی بھی ورچوئل مشین پر دیگر تمام صارف کی ترتیبات میں ترمیم کریں؛ وہ دوسروں تک پھیل جائیں گے۔

یہاں حتمی ایپلیکیشن انفراسٹرکچر کا خاکہ ہے:

مثال کے طور پر Grafana کا استعمال کرتے ہوئے Yandex.Cloud میں تقسیم شدہ خدمات کی تعیناتی۔

آئیے اپنے ہاتھوں سے اٹھانا سیکھیں۔

MySQL اور ClickHouse

ایک بٹن کے کلک کے ساتھ ایسی ایپلی کیشن کو تعینات کرنے سے پہلے، یہ سیکھنا ضروری تھا کہ اس کے ہر اجزاء کو کیسے ہینڈل کیا جائے اور انہیں ایک دوسرے کے ساتھ مربوط کیا جائے۔

یہاں Yandex.Cloud ہماری مدد کرے گا، جو L3 بیلنسرز، ClickHouse اور MySQL کو بطور منظم خدمات فراہم کرتا ہے۔ صارف کو صرف پیرامیٹرز کی وضاحت کرنے اور پلیٹ فارم ہر چیز کو ورکنگ آرڈر میں لانے تک انتظار کرنے کی ضرورت ہے۔

میں نے رجسٹر کیا، ایک کلاؤڈ اور ایک ادائیگی اکاؤنٹ بنایا۔ اس کے بعد، میں کلاؤڈ پر گیا اور MySQL اور ClickHouse کلسٹرز کو کم سے کم سیٹنگز کے ساتھ سیٹ اپ کیا۔ میں ان کے فعال ہونے تک انتظار کرتا رہا۔

مثال کے طور پر Grafana کا استعمال کرتے ہوئے Yandex.Cloud میں تقسیم شدہ خدمات کی تعیناتی۔مثال کے طور پر Grafana کا استعمال کرتے ہوئے Yandex.Cloud میں تقسیم شدہ خدمات کی تعیناتی۔

آپ کو ہر کلسٹر میں ڈیٹا بیس بنانا اور لاگ ان اور پاس ورڈ کا استعمال کرتے ہوئے اس تک رسائی کو ترتیب دینا بھی یاد رکھنا ہوگا۔ میں یہاں تفصیلات میں نہیں جاؤں گا - انٹرفیس میں سب کچھ بالکل واضح ہے۔

غیر واضح تفصیل یہ تھی کہ ان ڈیٹا بیس میں بہت سے میزبان ہیں، جو ان کی غلطی کو برداشت کرنے کو یقینی بناتے ہیں۔ تاہم، گرافانا کو ہر اس ڈیٹا بیس کے لیے بالکل ایک میزبان کی ضرورت ہوتی ہے جس کے ساتھ وہ کام کرتا ہے۔ طویل پڑھنا دستاویزات بادل مجھے ایک فیصلے پر لے آئے۔ یہ پرجاتیوں کے میزبان باہر کر دیتا ہے c-<cluster_id>.rw.mdb.yandexcloud.net متعلقہ ID کے ساتھ کلسٹر کے موجودہ ایکٹو ماسٹر ہوسٹ کے ساتھ میپ کیا گیا۔ یہ وہی ہے جو ہم گرافانا کو دیں گے۔

ویب سرور

اب یہ ویب سرور پر منحصر ہے۔ آئیے لینکس کے ساتھ ایک باقاعدہ ورچوئل مشین بنائیں اور اس پر گرافانا کو دستی طور پر ترتیب دیں۔

مثال کے طور پر 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 

اس کے بعد، گرافانا کو سسٹم سی ٹی ایل کے تحت چلائیں اور کلک ہاؤس کے ساتھ کام کرنے کے لیے پلگ ان انسٹال کریں (جی ہاں، یہ بنیادی پیکیج میں فراہم نہیں کیا گیا ہے)۔

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 کی وضاحت کر سکتے ہیں اور خوبصورت گرافانا UI دیکھ سکتے ہیں۔
مثال کے طور پر Grafana کا استعمال کرتے ہوئے Yandex.Cloud میں تقسیم شدہ خدمات کی تعیناتی۔

لیکن جلدی نہ کریں، گرافانا کو ترتیب دینے سے پہلے، آپ کو وہاں کی ترتیبات کو ذخیرہ کرنے کے لیے اسے 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 کو ڈیٹا سورس کے طور پر بیان کریں گے۔

میں مندرجہ ذیل ترتیبات کے ساتھ ورکنگ کنفیگریشن حاصل کرنے کے قابل تھا۔

مثال کے طور پر 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 مراحل میں تقسیم کیا گیا ہے۔ پہلے مرحلے پر، ایک سادہ اسکرپٹ پر عملدرآمد کیا جاتا ہے جو ایک معاون ڈائریکٹری بناتا ہے۔

تیاری-ctg.sh:

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

اگلے مرحلے پر، ہم اس ڈائرکٹری میں ایک اسکرپٹ رکھتے ہیں، جسے ورچوئل مشین شروع کرنے کے فوراً بعد لانچ کرنے کی ضرورت ہوگی۔ یہ اسکرپٹ صارف کے متغیرات کو ڈالے گا جن کو Grafana config میں رجسٹر کرنے اور ویب سرور کو دوبارہ شروع کرنے کی ضرورت ہے۔

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) سسٹم سی ٹی ایل کے تحت گرافانا چلائیں اور کلک ہاؤس پلگ ان انسٹال کریں۔
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;

اب صرف پیکر کو چلانا اور آؤٹ پٹ امیج کو مخصوص حصے میں رکھنا باقی ہے۔ ورچوئل مشین بناتے وقت، آپ اسے بوٹ ڈسک کے طور پر منتخب کر سکتے ہیں اور لانچ ہونے کے بعد آپ کو ایک ریڈی میڈ گرافانا ویب سرور ملے گا۔

مثال کے طور پر Grafana کا استعمال کرتے ہوئے Yandex.Cloud میں تقسیم شدہ خدمات کی تعیناتی۔
مثال کے طور پر Grafana کا استعمال کرتے ہوئے Yandex.Cloud میں تقسیم شدہ خدمات کی تعیناتی۔

مثال گروپ اور بیلنسر

ایک بار جب ہمارے پاس ایک ڈسک امیج ہو جائے جو ہمیں بہت سے ایک جیسے گرافانا ویب سرور بنانے کی اجازت دیتی ہے، تو ہم ایک مثال گروپ بنا سکتے ہیں۔ Yandex.Cloud پلیٹ فارم پر، اس اصطلاح سے مراد ورچوئل مشینوں کا اتحاد ہے جن میں ایک جیسی خصوصیات ہیں۔ ایک مثال گروپ بناتے وقت، اس گروپ میں تمام مشینوں کا پروٹو ٹائپ ترتیب دیا جاتا ہے، اور پھر خود گروپ کی خصوصیات (مثال کے طور پر، فعال مشینوں کی کم از کم اور زیادہ سے زیادہ تعداد)۔ اگر موجودہ نمبر ان معیارات پر پورا نہیں اترتا ہے، تو مثال گروپ خود غیر ضروری مشینوں کو ہٹا دے گا یا اپنی تصویر میں نئی ​​مشینیں بنائے گا۔

اپنے کام کے حصے کے طور پر، ہم ویب سرورز کا ایک مثالی گروپ بنائیں گے جو پہلے سے بنائی گئی ڈسک امیج سے تیار کیا جائے گا۔

مثال کے طور پر Grafana کا استعمال کرتے ہوئے Yandex.Cloud میں تقسیم شدہ خدمات کی تعیناتی۔

مثال کے طور پر Grafana کا استعمال کرتے ہوئے Yandex.Cloud میں تقسیم شدہ خدمات کی تعیناتی۔

جو واقعی قابل ذکر ہے وہ آخری مثال گروپ سیٹ اپ ہے۔ لوڈ بیلنسر کے ساتھ انضمام میں ٹارگٹ گروپ آپ کو چند بٹنوں پر کلک کرکے اس گروپ کی ورچوئل مشینوں کے اوپر ایک L3 بیلنس کنفیگر کرنے میں مدد کرے گا۔

مثال کے طور پر Grafana کا استعمال کرتے ہوئے Yandex.Cloud میں تقسیم شدہ خدمات کی تعیناتی۔

بیلنسر کو ترتیب دیتے وقت، میں نے دو اہم نکات کو نافذ کیا:

  1. میں نے بیلنسر کو پورٹ 80 پر صارف ٹریفک کو قبول کرنے پر مجبور کیا اور اسے ورچوئل مشینوں کے پورٹ 3000 پر ری ڈائریکٹ کیا، بالکل جہاں گرافانا رہتا ہے۔
  2. میں نے مشینوں کو پورٹ 3000 پر پنگ کرکے ان کی عملداری کی جانچ پڑتال کی ہے۔

مثال کے طور پر Grafana کا استعمال کرتے ہوئے Yandex.Cloud میں تقسیم شدہ خدمات کی تعیناتی۔

چھوٹا خلاصہ

آخر کار، ہم مطلوبہ ایپلیکیشن انفراسٹرکچر کو دستی طور پر تعینات کرنے میں کامیاب ہو گئے، اور اب ہمارے پاس ایک انتہائی لچکدار گرافانا سروس ہے۔ آپ کو صرف بیلنسر کا آئی پی ایڈریس جاننے کی ضرورت ہے کیونکہ اس میں ڈیٹاسیٹ لوڈ کرنے کے لیے ایپلیکیشن کے اندراج پوائنٹ اور کلک ہاؤس کلسٹر کے میزبان۔

یہ ایک فتح کی طرح لگتا ہے؟ جی ہاں، فتح. لیکن کچھ اب بھی مجھے الجھا رہا ہے۔ مندرجہ بالا پورے عمل میں بہت سارے دستی اقدامات کی ضرورت ہوتی ہے اور یہ بالکل بھی قابل توسیع نہیں ہے؛ اگر ممکن ہو تو میں اسے خودکار کرنا چاہوں گا۔ اگلا حصہ اسی کے لیے وقف کیا جائے گا۔

ٹیرافارم انضمام

ہم دوبارہ 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 - کلاؤڈ شناخت کنندہ جہاں ہم ایپلیکیشن کو تعینات کریں گے۔
فولڈر_آئی ڈی - سیکشن شناخت کنندہ جہاں ہم درخواست کو تعینات کریں گے۔
service_account_id - کلاؤڈ کے متعلقہ حصے میں سروس اکاؤنٹ کا شناخت کنندہ۔
image_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 فائل میں بیان کیا ہے۔ آئیے فائل کے مواد کو تھوڑا سا تبدیل کرتے ہیں۔ 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

انٹینس گروپ اور بیلنسر

ایک نئی ڈسک امیج کو دوبارہ بنانے کے بعد، ہم آخر کار ٹیرافارم کے لیے اپنی فائل شامل کر سکتے ہیں۔

آئیے اس بات کی نشاندہی کریں کہ ہم ایک موجودہ ڈسک امیج استعمال کرنا چاہتے ہیں:

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. یہ وہی ہے جو ورچوئل مشین اسٹارٹ اپ پر نکالے گی اور گرافانا کنفیگریشن میں ڈالے گی۔

یہ توازن کرنے والے پر منحصر ہے۔

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 ابھی بھی حاصل کرنے کی ضرورت ہے) بطور ڈیٹا سورس۔ لیکن ٹیرافارم کلسٹر آئی ڈی کو جانتا ہے۔ آئیے اسے اس معاملے کو انجام تک پہنچانے کی ذمہ داری سونپ دیں۔

آئیے ایک نیا فراہم کنندہ شامل کریں - گرافانا، اور اسے میزبان کے طور پر بیلنسر کا 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"
}

آئیے اپنے بالوں میں کنگھی کریں۔

آئیے بیلنسر آئی پی ایڈریس اور کلک ہاؤس کلسٹر کے میزبان کو ظاہر کرتے ہیں۔

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 میں تقسیم شدہ خدمات کی تعیناتی۔

خلاصہ:

اب، مثال کے طور پر گرافانا کا استعمال کرتے ہوئے، آپ میں سے ہر ایک Yandex.Cloud پلیٹ فارم پر وسیع و عریض کلاؤڈ فن تعمیر کے ساتھ ایپلی کیشنز کو تعینات کر سکتا ہے۔ HashiCorp کے مددگار ٹولز جیسے Packer اور Terraform اس میں آپ کی مدد کر سکتے ہیں۔ مجھے امید ہے کہ کسی کو یہ مضمون مفید لگے گا :)

PS ذیل میں میں ریپوزٹری کا ایک لنک منسلک کروں گا جہاں آپ پیکر اور ٹیرافارم کے لیے تیار شدہ ترکیبیں تلاش کر سکتے ہیں، جن کے ٹکڑے میں نے اس مضمون میں فراہم کیے ہیں۔

ذخیرہ

ماخذ: www.habr.com

نیا تبصرہ شامل کریں