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

ان کان پوء، اچو ته Grafana کي systemctl جي تحت هلون ۽ ڪلڪ هاؤس سان ڪم ڪرڻ لاء پلگ ان انسٽال ڪريو (ها، اهو بنيادي پيڪيج ۾ فراهم نه ڪيو ويو آهي).

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 ۾ ورهايل خدمتن جي ترتيب

پر جلدي نه ڪريو، گرافانا قائم ڪرڻ کان پهريان، توهان کي ياد رکڻ گهرجي ته اهو 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 ۾ اسان ڪلڪ ڪيو ھوس کي ڊيٽا سورس طور بيان ڪنداسين.

مان هيٺ ڏنل سيٽنگن سان ڪم ڪندڙ تشڪيل حاصل ڪرڻ جي قابل ٿي ويو:

مثال طور Grafana استعمال ڪندي Yandex.Cloud ۾ ورهايل خدمتن جي ترتيب

مون URL جي طور تي بيان ڪيو https://c-<cluster_id>.rw.mdb.yandexcloud.net:8443

سڀ! اسان وٽ ھڪڙي ڪم ڪندڙ ورچوئل مشين آھي ھڪڙي ويب سرور سان ڳنڍيل آھي CH ۽ MySQL سان. توھان اڳ ۾ ئي ڊيٽا سيٽ اپ لوڊ ڪري سگھو ٿا ClickHouse ۽ ٺاھيو ڊيش بورڊ. تنهن هوندي، اسان اڃا تائين اسان جو مقصد حاصل نه ڪيو آهي ۽ هڪ مڪمل انفراسٽرڪچر مقرر نه ڪيو آهي.

پيڪر

Yandex.Cloud توهان کي هڪ موجوده مجازي مشين جي هڪ ڊسڪ تصوير ٺاهڻ جي اجازت ڏئي ٿي، ۽ ان جي بنياد تي - ڪنهن به مشين جو تعداد هڪ ٻئي سان هڪجهڙائي. اھو اھو آھي جيڪو اسان استعمال ڪنداسين. تصوير کي آساني سان گڏ ڪرڻ لاء، اوزار وٺو پيڪر HashiCorp کان. اهو تصوير کي گڏ ڪرڻ جي هدايتن سان گڏ هڪ json فائل ان پٽ طور وٺندو آهي.

اسان جي json فائل ٻن بلاڪن تي مشتمل هوندي: تعمير ڪندڙ ۽ روزي ڏيندڙ. پهريون بلاڪ تصوير جي پيٽرولن کي بيان ڪري ٿو پاڻ کي هڪ ادارو طور، ۽ ٻيو بلاڪ ان کي ضروري مواد سان ڀرڻ لاء هدايتون بيان ڪري ٿو.

Builders

{
"builders": [
    {
      "type": "yandex",
      "endpoint": "{{user `endpoint`}}",
      "folder_id": "<folder_id>",
      "subnet_id": "{{user `subnet_id`}}",
      "zone": "{{user `zone`}}",
      "labels": {},
      "use_ipv4_nat": true,
      "use_internal_ip": false,
      "service_account_key_file": "<service_account_key_file>",
      "image_name": "grafana-{{timestamp}}",
      "image_family": "grafana",
      "image_labels": {},
      "image_description": "GRAFANA",
      "source_image_family": "ubuntu-1804-lts",
      "disk_size_gb": 3,
      "disk_type": "network-hdd",
      "ssh_username": "ubuntu"
    }
  ],
...
}

هن ٽيمپليٽ ۾، توهان کي ڪلائوڊ ۾ سيڪشن جي سڃاڻپ ڪندڙ کي سيٽ ڪرڻ جي ضرورت آهي جتي توهان تصوير ٺاهڻ چاهيو ٿا، انهي سان گڏ هن حصي ۾ اڳ ۾ ٺاهيل سروس اڪائونٽ مان چيڪن سان فائل ڏانهن رستو. توھان وڌيڪ پڙھي سگھوٿا سروس اڪائونٽس ۽ ڪيز ٺاهڻ بابت ھڪڙي فائل جي صورت ۾ لاڳاپيل سيڪشن ۾ دستاويز.

هي تشڪيل چوي ٿو ته ڊسڪ تصوير پليٽ فارم جي بنياد تي ٺاهي ويندي 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

ايندڙ اسٽيج تي، اسان هن ڊاريڪٽري ۾ هڪ اسڪرپٽ رکون ٿا، جنهن کي ورچوئل مشين شروع ڪرڻ کان پوءِ فوري طور تي لانچ ڪرڻ جي ضرورت پوندي. هي اسڪرپٽ صارف جي متغيرن کي رکندو جنهن کي گرافانا ترتيب ۾ رجسٽر ٿيڻ جي ضرورت آهي ۽ ويب سرور کي ٻيهر شروع ڪرڻ جي ضرورت آهي.

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;

ھاڻي اھو باقي رھيو آھي Packer کي ھلائڻ ۽ ٻاھر ڏنل تصوير کي مخصوص حصي ۾ رکيل آھي. جڏهن هڪ ورچوئل مشين ٺاهيندي، توهان ان کي بوٽ ڊسڪ جي طور تي چونڊي سگهو ٿا ۽ لانچ ڪرڻ کان پوءِ توهان هڪ تيار ڪيل گرافانا ويب سرور حاصل ڪندا.

مثال طور 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 ۾ ورهايل خدمتن جي ترتيب

ننڍو خلاصو

آخرڪار، اسان دستي طور تي گهربل ايپليڪيشن انفراسٽرڪچر کي ترتيب ڏيڻ جي قابل هئا، ۽ هاڻي اسان وٽ هڪ انتهائي لچڪدار گرافانا سروس آهي. توهان کي صرف بيلنسر جي IP پتي کي ڄاڻڻ جي ضرورت آهي ايپليڪيشن جي داخلا پوائنٽ جي طور تي ۽ ڪلڪ هاؤس ڪلستر جي ميزبان کي ان ۾ ڊيٽا سيٽ لوڊ ڪرڻ لاء.

اهو هڪ فتح وانگر لڳي ها؟ ها، فتح. پر ڪجهه اڃا تائين مون کي پريشان ڪري ٿو. مٿي ڏنل سموري عمل کي تمام گھڻا دستي قدمن جي ضرورت آھي ۽ بلڪل به اسڪيل نه آھي؛ جيڪڏھن ممڪن ھو ته مان ان کي خودڪار ڪرڻ چاھيندس. اھو اھو آھي جيڪو ايندڙ سيڪشن کي وقف ڪيو ويندو.

Terraform انضمام

اسان ٻيهر استعمال ڪنداسين 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 - سيڪشن جي سڃاڻپ ڪندڙ جتي اسان ايپليڪيشن کي ترتيب ڏينداسين
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 کي شروع ڪرڻ کان اڳ ڪلستر جي سڃاڻپ نه ٿا ڄاڻون، بشمول تصوير تعمير ڪرڻ وقت. تنهن ڪري، مون کي هيٺ ڏنل ڏانهن رجوع ڪرڻو پيو چال.

Amazon جي ميٽا ڊيٽا سروس کي استعمال ڪندي، اسان ڪجھ پيرا ميٽرز کي ورچوئل مشين ڏانهن منتقل ڪنداسين، جيڪو اهو قبول ڪندو ۽ پروسيس ڪندو. اسان کي مشين جي ضرورت آھي ميٽا ڊيٽا ڏانھن وڃڻ لاءِ 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 گروپ ۽ بيلنس

نئين ڊسڪ تصوير کي ٻيهر تعمير ڪرڻ، اسان آخرڪار اسان جي فائل کي شامل ڪري سگھون ٿا 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. اهو ئي آهي ته مجازي مشين شروع ٿيندي ۽ گرافانا ترتيب ۾ رکي ويندي.

اهو بيلنسر تائين آهي.

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 پتو ۽ ميزبان ڪلڪ هائوس ڪلستر

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 کان مددگار اوزار جهڙوڪ Packer ۽ Terraform توھان جي مدد ڪري سگھن ٿا. مون کي اميد آهي ته ڪو ماڻهو هن مضمون کي مفيد ملندو :)

پي ايس هيٺ آئون مخزن جي هڪ لنڪ ڳنڍيندس جتي توهان ڳولي سگهو ٿا تيار ڪيل تيار ڪيل ترڪيبون Packer ۽ Terraform لاءِ، جن جا ٽڪرا مون هن آرٽيڪل ۾ مهيا ڪيا آهن.

مخزن

جو ذريعو: www.habr.com

تبصرو شامل ڪريو