ããã«ã¡ã¯ãã¿ããªïŒ ææ¥ã®äžç°ãšããŠã次ã®ãããªåœå
ã®ã¯ã©ãŠã ãã©ãããã©ãŒã ã®æ©èœã調æ»ããŸããã
äœãåãåãããã§ããïŒ
Web ãµãŒããŒã§ä»®æ³ãã·ã³ãèµ·åããåŸããã®ãã¹ãã«ã¢ã¯ã»ã¹ããŠçŸãã UI ãååŸãããããªãäœæ¥ã®ãœãŒã¹ãšããŠããŒã¿ããŒã¹ãæå®ããããã·ã¥ããŒããã°ã©ããäœæã§ããŸãã
åºæ¬ããŒãžã§ã³ã«ã¯é倧ãªæ¬ ç¹ã 10 ã€ãããŸããããã¯ããã©ãŒã«ã ãã¬ã©ã³ãããŸã£ãããªããšããããšã§ãã ã€ãŸããã¢ããªã±ãŒã·ã§ã³ã®æ©èœå šäœã¯ãXNUMX ã€ã®ä»®æ³ãã·ã³ã®å®è¡å¯èœæ§ã«äŸåããŸãã æåŠãããããXNUMX 人ãåæã« UI ãéããããããšãåé¡ãçºçããŸãã
ãããã¯ç°¡åã«è§£æ±ºã§ããŸããWeb ãµãŒããŒã䜿çšããŠå€æ°ã®åäžã®ä»®æ³ãã·ã³ããããã€ããL3 ãã©ã³ãµãŒã®äžã«é 眮ããã ãã§ãã ããããããã§ã¯ãã¹ãŠãããã»ã©æ確ã§ã¯ãããŸããã Grafana ã¯ããŠãŒã¶ãŒèšå® (ããŒã¿ããŒã¹ãããã·ã¥ããŒããã°ã©ããªã©ãžã®ãã¹) ãä»®æ³ãã·ã³ã®ãã£ã¹ã¯ã«çŽæ¥ä¿åããŸãã ãããã£ãŠãUI ã§äžéšã®èšå®ãå€æŽããå Žåããããã®å€æŽã¯ãã©ã³ãµãŒãéä¿¡ããä»®æ³ãã·ã³ã«ã®ã¿åæ ãããŸãã ããã«ãããã¢ããªã±ãŒã·ã§ã³ã®èšå®ã«äžè²«æ§ããªããªããèµ·åã䜿çšã«åé¡ãçºçããŸãã
ããã§ã¯ãå¥ã®ããŒã¿ããŒã¹ (ããšãã°ãMySQL ãŸãã¯åçã®ããŒã¿ããŒã¹) ã圹ã«ç«ã¡ãŸãã Grafana ã«ããŠãŒã¶ãŒèšå®ããã®ãäºåãããŒã¿ããŒã¹ã«ä¿åããããã«æ瀺ããŸãã ãã®åŸãåãã·ã³ã§ãã®ããŒã¿ããŒã¹ãžã®ãã¹ã XNUMX åæå®ããããããã®ä»®æ³ãã·ã³ã§ä»ã®ãã¹ãŠã®ãŠãŒã¶ãŒèšå®ãç·šéããã ãã§ååã§ããããããã®èšå®ã¯ä»ã®ä»®æ³ãã·ã³ã«ãæ¡åŒµãããŸãã
æçµçãªã¢ããªã±ãŒã·ã§ã³ ã€ã³ãã©ã¹ãã©ã¯ãã£ã®å³ã¯æ¬¡ã®ãšããã§ãã
æã§æã¡äžããç·Žç¿ãããŸããã
MySQL ãš ClickHouse
ãã¿ã³ãã¯ãªãã¯ããã ãã§ãã®ãããªã¢ããªã±ãŒã·ã§ã³ãå±éããåã«ããã®åã³ã³ããŒãã³ããåŠçããããããçžäºã«çµ±åããæ¹æ³ãåŠã¶å¿ èŠããããŸããã
ããã§ã¯ãL3 ãã©ã³ãµãŒãClickHouseãMySQL ããããŒãžã ãµãŒãã¹ãšããŠæäŸãã Yandex.Cloud ã圹ã«ç«ã¡ãŸãã ãŠãŒã¶ãŒã¯ãã©ã¡ãŒã¿ãæå®ããã ãã§ããã©ãããã©ãŒã ããã¹ãŠãæ£åžžã«åäœããããŸã§åŸ ã€ã ãã§ãã
ç»é²ããã¯ã©ãŠããšæ¯æãã¢ã«ãŠã³ããäœæããŸããã ãã®åŸãã¯ã©ãŠãã«ç§»åããæå°éã®èšå®ã§ MySQL ãš ClickHouse ã¯ã©ã¹ã¿ãŒãã»ããã¢ããããŸããã ç§ã¯åœŒãã掻åçã«ãªããŸã§åŸ ã¡ãŸããã
ãŸããåã¯ã©ã¹ã¿ãŒã«ããŒã¿ããŒã¹ãäœæãããã°ã€ã³ãšãã¹ã¯ãŒãã䜿çšããŠããŒã¿ããŒã¹ãžã®ã¢ã¯ã»ã¹ãæ§æããããšãå¿ããªãã§ãã ããã ããã§ã¯è©³çŽ°ã«ã¯è§ŠããŸããããã€ã³ã¿ãŒãã§ã€ã¹ã§ã¯ãã¹ãŠãäžç®çç¶ã§ãã
æããã§ã¯ãªã詳现ã¯ããããã®ããŒã¿ããŒã¹ã«ã¯å€ãã®ãã¹ãããããèé害æ§ã確ä¿ãããŠãããšããããšã§ããã ãã ããGrafana ã§ã¯ãæäœããããŒã¿ããŒã¹ããšã« XNUMX ã€ã®ãã¹ããå¿
èŠã§ãã é·ãèªæž c-<cluster_id>.rw.mdb.yandexcloud.net
察å¿ãã ID ãæã€ã¯ã©ã¹ã¿ãŒã®çŸåšã¢ã¯ãã£ããªãã¹ã¿ãŒ ãã¹ãã«ãããã³ã°ãããŸãã ããã Grafana ã«æäŸããããã®ã§ãã
ãŠã§ããµãŒããŒ
ããšã¯ Web ãµãŒããŒæ¬¡ç¬¬ã§ãã Linux ã䜿çšããŠéåžžã®ä»®æ³ãã·ã³ãèµ·åãããã®äžã§ Grafana ãæåã§æ§æããŠã¿ãŸãããã
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
ãã®åŸãsystemctl 㧠Grafana ãå®è¡ããClickHouse ãšé£æºããããã®ãã©ã°ã€ã³ãã€ã³ã¹ããŒã«ããŸããã (ã¯ããåºæ¬ããã±ãŒãžã«ã¯å«ãŸããŠããŸãã)ã
sudo systemctl start grafana-server
sudo systemctl enable grafana-server
sudo grafana-cli plugins install vertamedia-clickhouse-datasource
ããã ãã§ãããã®åŸã¯ç°¡åãªã³ãã³ãã§
sudo service grafana-server start
WebãµãŒããŒãèµ·åããŠã¿ãŸãã ããã§ããã©ãŠã¶ã«ä»®æ³ãã·ã³ã®å€éš IP ã¢ãã¬ã¹ãå
¥åããããŒã 3000 ãæå®ãããšãçŸãã Grafana UI ã衚瀺ãããŸãã
ãã ããæ ãŠãªãã§ãã ãããGrafana ãã»ããã¢ããããåã«ãèšå®ãä¿åããããã« MySQL ãžã®ãã¹ãå¿ããã«äŒããå¿ èŠããããŸãã
Grafana Web ãµãŒããŒã®æ§æå
šäœã¯ãã¡ã€ã«å
ã«ãããŸãã /etc/grafana/grafana.ini
ã å¿
èŠãªè¡ã¯æ¬¡ã®ããã«ãªããŸãã
;url =
ãã¹ãã MySQL ã¯ã©ã¹ã¿ãŒã«èšå®ããŸãã åããã¡ã€ã«ã«ã¯ãäžã®å³ã® Grafana ã«ã¢ã¯ã»ã¹ããããã®ãã°ã€ã³ãšãã¹ã¯ãŒããå«ãŸããŠããŸããããã©ã«ãã§ã¯äž¡æ¹ãšãåãã§ãã 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
Web ãµãŒããŒãåèµ·åããŸãã
sudo service grafana-server restart
次ã«ãGrafana UI ã§ãClickHouse ã DataSource ãšããŠæå®ããŸãã
次ã®èšå®ã§åäœããæ§æãå®çŸã§ããŸããã
URLãšããŠæå®ããŸãã https://c-<cluster_id>.rw.mdb.yandexcloud.net:8443
å šãŠïŒ CH ãš MySQL ã«æ¥ç¶ããã Web ãµãŒããŒãåãã XNUMX å°ã®ä»®æ³ãã·ã³ã皌åããŠããŸãã ãã§ã«ããŒã¿ã»ããã ClickHouse ã«ã¢ããããŒãããŠãããã·ã¥ããŒããæ§ç¯ã§ããŸãã ããããç§ãã¡ã¯ãŸã ç®æšãéæããŠããããæ¬æ Œçãªã€ã³ãã©ã¹ãã©ã¯ãã£ãå°å ¥ããŠããŸããã
ããã«ãŒ
Yandex.Cloud ã䜿çšãããšãæ¢åã®ä»®æ³ãã·ã³ã®ãã£ã¹ã¯ ã€ã¡ãŒãžãäœæã§ããããã«åºã¥ããŠãäºãã«åäžã®ãã·ã³ãä»»æã®æ°ã ãäœæã§ããŸãã ããã¯ãŸãã«ç§ãã¡ã䜿çšãããã®ã§ãã ç»åãç°¡åã«çµã¿ç«ãŠãã«ã¯ã次ã®ããŒã«ã䜿çšããŸãã
json ãã¡ã€ã«ã¯ããã«ããŒãšããããžã§ããŒã® XNUMX ã€ã®ãããã¯ã§æ§æãããŸãã æåã®ãããã¯ã¯å®äœãšããŠã®ç»åèªäœã®ãã©ã¡ãŒã¿ãèšè¿°ããXNUMX çªç®ã®ãããã¯ã¯ç»åââã«å¿ èŠãªã³ã³ãã³ããåã蟌ãããã®åœä»€ãèšè¿°ããŸãã
ãã«ããŒ
{
"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 æ§æã«ç»é²ããå¿ èŠããããŠãŒã¶ãŒå€æ°ãé 眮ããWeb ãµãŒããŒãåèµ·åããŸãã
ã»ããã¢ãã.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 ã¹ã¯ãªãããèµ·åãã¥ãŒã«å
¥ããŸãã
ã€ã³ã¹ããŒã«ããã±ãŒãž.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
ã°ã©ãã¡ãã»ããã¢ãã.sh:
#!/bin/bash
sudo systemctl start grafana-server
sudo systemctl enable grafana-server
sudo grafana-cli plugins install vertamedia-clickhouse-datasource
åèµ·åæã«ã»ããã¢ãããå®è¡.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 Web ãµãŒããŒãåãåããŸãã
ã€ã³ã¹ã¿ã³ã¹ã°ã«ãŒããšãã©ã³ãµãŒ
å€æ°ã®åäžã® Grafana Web ãµãŒããŒãäœæã§ãããã£ã¹ã¯ ã€ã¡ãŒãžãååŸããããã€ã³ã¹ã¿ã³ã¹ ã°ã«ãŒããäœæã§ããŸãã Yandex.Cloud ãã©ãããã©ãŒã ã§ã¯ããã®çšèªã¯åãç¹æ§ãæã€ä»®æ³ãã·ã³ã®çµåãæããŸãã ã€ã³ã¹ã¿ã³ã¹ ã°ã«ãŒããäœæãããšãã¯ããã®ã°ã«ãŒãå ã®ãã¹ãŠã®ãã·ã³ã®ãããã¿ã€ããæ§æããã次ã«ã°ã«ãŒãèªäœã®ç¹æ§ (ã¢ã¯ãã£ããªãã·ã³ã®æå°æ°ãšæ倧æ°ãªã©) ãæ§æãããŸãã çŸåšã®æ°ããããã®åºæºãæºãããªãå Žåãã€ã³ã¹ã¿ã³ã¹ ã°ã«ãŒãèªäœãäžèŠãªãã·ã³ãåé€ããããç¬èªã®ã€ã¡ãŒãžå ã«æ°ãããã·ã³ãäœæããŸãã
ã¿ã¹ã¯ã®äžç°ãšããŠã以åã«äœæãããã£ã¹ã¯ ã€ã¡ãŒãžããçæããã Web ãµãŒããŒã®ã€ã³ã¹ã¿ã³ã¹ ã°ã«ãŒããäœæããŸãã
æ¬åœã«æ³šç®ã«å€ããã®ã¯ãæåŸã®ã€ã³ã¹ã¿ã³ã¹ ã°ã«ãŒãã®ã»ããã¢ããã§ãã ããŒã ãã©ã³ãµãŒãšçµ±åãããã¿ãŒã²ãã ã°ã«ãŒãã䜿çšãããšãããã€ãã®ãã¿ã³ãã¯ãªãã¯ããããšã§ããã®ã°ã«ãŒãã®ä»®æ³ãã·ã³äžã« L3 ãã©ã³ãµãŒãæ§æã§ããŸãã
ãã©ã³ãµãŒãã»ããã¢ãããããšãã«ã次㮠XNUMX ã€ã®éèŠãªãã€ã³ããå®è£ ããŸããã
- ãã©ã³ãµãŒãããŒã 80 ã§ãŠãŒã¶ãŒ ãã©ãã£ãã¯ãåãå ¥ãããããä»®æ³ãã·ã³ã®ããŒã 3000 (ãŸãã« Grafana ãååšããå Žæ) ã«ãªãã€ã¬ã¯ãããããã«ããŸããã
- ããŒã 3000 ã« ping ãéä¿¡ããŠãã·ã³ã®å®è¡å¯èœæ§ããã§ãã¯ããããã«èšå®ããŸããã
ãããµããªãŒ
æåŸã«ãå¿ èŠãªã¢ããªã±ãŒã·ã§ã³ ã€ã³ãã©ã¹ãã©ã¯ãã£ãæåã§ãããã€ããããšãã§ãã埩å åã®é«ã Grafana ãµãŒãã¹ãå®æããŸããã ã¢ããªã±ãŒã·ã§ã³ãžã®ãšã³ã㪠ãã€ã³ããšããŠã®ãã©ã³ãµãŒã® IP ã¢ãã¬ã¹ãšãããŒã¿ã»ãããããŒãããããã« ClickHouse ã¯ã©ã¹ã¿ãŒã®ãã¹ãã®ã¿ãç¥ãå¿ èŠããããŸãã
ããã¯åå©ã®ããã«èŠããã§ããããïŒ ã¯ããåå©ã§ãã ãããããŸã äœããç§ãæ··ä¹±ãããŸãã äžèšã®ããã»ã¹å šäœã«ã¯å€ãã®æåæé ãå¿ èŠã§ããããŸã£ããæ¡åŒµæ§ããããŸãããå¯èœã§ããã°èªååããããšèããŠããŸãã ããã«ã€ããŠã¯æ¬¡ã®ã»ã¯ã·ã§ã³ã§èª¬æããŸãã
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 â ã¯ã©ãŠãã«ã¢ã¯ã»ã¹ããããã®ããŒã¯ã³ã ã§å
¥æã§ããŸã
ã¯ã©ãŠãID â ã¢ããªã±ãŒã·ã§ã³ããããã€ããã¯ã©ãŠãèå¥å
ãã©ã«ãID â ã¢ããªã±ãŒã·ã§ã³ããããã€ããã»ã¯ã·ã§ã³èå¥å
ãµãŒãã¹ã¢ã«ãŠã³ãID â ã¯ã©ãŠãã®å¯Ÿå¿ããã»ã¯ã·ã§ã³ã®ãµãŒãã¹ ã¢ã«ãŠã³ãèå¥åã
ç»åID â Packerã䜿çšããŠååŸãããã£ã¹ã¯ã€ã¡ãŒãžã®èå¥å
ãŠãŒã¶å О password â ããŒã¿ããŒã¹ãš Grafana Web ãµãŒããŒã®äž¡æ¹ã«ã¢ã¯ã»ã¹ããããã®ãŠãŒã¶ãŒåãšãã¹ã¯ãŒã
ããŒã¿ããŒã¹å â CH ããã³ MySQL ã¯ã©ã¹ã¿ãŒå
ã®ããŒã¿ããŒã¹å
å
¬ééµãã¹ â å
¬é ssh ããŒãå«ããã¡ã€ã«ãžã®ãã¹ããã®ååã§æ¥ç¶ããããã«äœ¿çšã§ããŸãã ubuntu
Web ãµãŒããŒãåããä»®æ³ãã·ã³ãž
ãããã€ããŒã®ã»ããã¢ãã
次ã«ãTerraform ãããã€ã㌠(ãã®å Žå㯠Yandex) ãæ§æããå¿ èŠããããŸãã
provider "yandex" {
token = var.oauth_token
cloud_id = var.cloud_id
folder_id = var.folder_id
zone = "ru-central1-a"
}
ããã§ã¯äžã§å®çŸ©ããå€æ°ã䜿çšããŠããããšãããããŸãã
ãããã¯ãŒã¯ãšã¯ã©ã¹ã¿ãŒ
次ã«ãã€ã³ãã©ã¹ãã©ã¯ãã£ã®èŠçŽ ãéä¿¡ãããããã¯ãŒã¯ãXNUMX ã€ã®ãµãããã (åãªãŒãžã§ã³ã« XNUMX ã€) ãäœæãã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
}
}
ã芧ã®ãšãããXNUMX ã€ã®ã¯ã©ã¹ã¿ãŒã¯ãããã XNUMX ã€ã®ã¢ãã€ã©ããªã㣠ãŸãŒã³ã«é 眮ãããããšã§ãéåžžã«èé害æ§ãé«ãäœæãããŠããŸãã
WebãµãŒããŒ
åã粟ç¥ã§ç¶ããŠãããããªæ°ãããŸããããå°é£ã«ééããŸããã ãã®åã«ãæåã« MySQL ã¯ã©ã¹ã¿ãŒãèµ·åãããã® ID ãç¥ã£ãŠãããå¿
èŠãªæ§æã®ãã£ã¹ã¯ ã€ã¡ãŒãžãåéããã¯ã©ã¹ã¿ãŒã«ãã¹ããæå®ããŸããã ããããã€ã¡ãŒãžã®æ§ç¯æãå«ããTerraform ãèµ·åããåã«ã¯ã¯ã©ã¹ã¿ãŒ ID ãããããŸããã ãããã£ãŠã次ã®ããšã«é Œããªããã°ãªããŸããã§ãã
Amazon ã®ã¡ã¿ããŒã¿ ãµãŒãã¹ã䜿çšããŠãããã€ãã®ãã©ã¡ãŒã¿ãä»®æ³ãã·ã³ã«æž¡ããä»®æ³ãã·ã³ããããåãå
¥ããŠåŠçããŸãã ãã·ã³ã¯ãèµ·ååŸã« MySQL ã¯ã©ã¹ã¿ãŒ ãã¹ãã®èåŸã«ããã¡ã¿ããŒã¿ãšããŠãŒã¶ãŒã Terraform ãã¡ã€ã«ã§æå®ãããŠãŒã¶ãŒåãšãã¹ã¯ãŒãã«ç§»åããå¿
èŠããããŸãã ãã¡ã€ã«ã®å
容ãå°ãå€æŽããŠã¿ãŸããã setup.sh
ãä»®æ³ãã·ã³ããªã³ã«ãªã£ãŠãããšãã«å®è¡ãããŸãã
ã»ããã¢ãã.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
ã€ã³ã¹ã¿ã³ã¹ã°ã«ãŒããšãã©ã³ãµãŒ
æ°ãããã£ã¹ã¯ ã€ã¡ãŒãžãåæ§ç¯ããããæçµçã« 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 ãç¥ã£ãŠããŸãã ãã®åé¡ã解決ããã®ã¯åœŒã«ä»»ããŸãããã
æ°ãããããã€ã㌠Grafana ãè¿œå ãã圌女ã«ãã©ã³ãµãŒã® 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 ãã©ãããã©ãŒã äžã«åºå€§ãªã¯ã©ãŠã ã¢ãŒããã¯ãã£ãåããã¢ããªã±ãŒã·ã§ã³ããããã€ã§ããŸãã Packer ã Terraform ãªã©ã® HashiCorp ã®äŸ¿å©ãªããŒã«ãããã«åœ¹ç«ã¡ãŸãã 誰ãããã®èšäºã圹ç«ã€ããšãé¡ã£ãŠããŸã:)
PS 以äžã«ããã®èšäºã§æäŸããäžéšã§ãã Packer ãš Terraform ã®æ¢è£œã®ã¬ã·ããèŠã€ããããšãã§ãããªããžããªãžã®ãªã³ã¯ãæ·»ä»ããŸãã
åºæïŒ habr.com