Monitor การทำงาน MySQL ด้วย Prometheus และ Grafana
นอกจากการทำให้ Application รันได้แล้ว อีกเรื่องที่สำคัญไม่แพ้กันคือการวางระบบ Monitoring ที่ดี วันนี้เราจะมาแนะนำวิธีการ Monitor การทำงานของ MySQL ผ่านการสร้าง Dashboard บน Grafana กัน
โครงสร้างการทำงาน
การทำงานนั้นง่ายมาก ๆ คือ เรามี MySQL Database ของเราอยู่ จากนั้นเราจะใช้ Data Exporter สำหรับเอาพวก Statistics ออกมาโดยการใช้ mysqld-exporter จากนั้นเราจะเอามาต่อกับ Time Series Database อย่าง Prometheus เพื่อให้เราสามารถเข้าถึงข้อมูลย้อนหลังได้ และสุดท้าย เราจะใช้ Grafana ในการ Visualise ข้อมูลที่ได้จาก Prometheus กัน โดยทั้งหมดเราจะใช้งานผ่าน Docker ทั้งหมด ไม่มีการติดตั้งอะไรลงไปในเครื่องเด้อ
การติดตั้ง mysqld-exporter
CREATE USER 'exporter'@'%' IDENTIFIED BY 'password' WITH MAX_USER_CONNECTIONS 3;
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'%';
เนื่องจาก Exporter มันจำเป็นต้องเข้าถึง MySQL Database ทำให้เราจำเป็นที่จะต้องสร้าง Account เพื่อให้ Exporter เข้าถึงได้ก่อน โดยให้เราเปลี่ยนตรง Password ด้วยเด้อ เดี๋ยวจะเป็นเหยื่อกัน
[client]
user = exporter
password = <mysql_password>
host = mysql
เราจะต้องบอก Exporter ว่า Database ของเรามี Credential อะไร โดยเราจะบอกมันผ่านไฟล์ที่ชื่อว่า config.my-cnf ให้เราสร้างและเก็บมันเอาไว้ใน Folder ที่สร้างมาเพื่อเก็บข้อมูลของ Exporter เลยก็ได้
docker run -p 9104:9104 --name mysql_exporter -v <path_to_config.my-cnf>:/cfg/config.my-cnf prom/mysqld-exporter:main --config.my-cnf=/cfg/config.my-cnf
จากนั้น เราก็จะสร้าง Container สำหรับ Exporter ผ่าน Script ด้านบนของเราได้เลย
เมื่อเราเข้าไปที่ IP Address ของเครื่องที่เรารัน Exporter Container ด้วย Port 9104 เราจะได้หน้าจอแบบด้านบน แปลว่า เรียบร้อยละ
ติดตั้ง Promethus
มาถึงขั้นตอนของการติดตั้ง Promethus สำหรับเป็น Time Series Database เพื่อ Scrape Parameter และเก็บค่าต่าง ๆ ลงภายใน Database แต่ก่อนที่เราจะติดตั้ง เราจะต้องเขียน Config File ให้เราตั้งช่ือเป็น promethus.yml
global:
scrape_interval: 15s # By default, scrape targets every 15 seconds.
# Attach these labels to any time series or alerts when communicating with
# external systems (federation, remote storage, Alertmanager).
external_labels:
monitor: 'codelab-monitor'
# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: 'prometheus'
# Override the global default and scrape targets from this job every 5 seconds.
scrape_interval: 5s
static_configs:
- targets: ['localhost:9090']
- job_name: 'mysql'
params:
auth_module: [client]
scrape_interval: 5s
static_configs:
- targets: ['<mysql_ip>:3306']
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: <exporter_ip>:9104
ภายใน Config File จะเป็นการบอก Promethus ว่า มันจะต้องไปดึง (Scrape) ข้อมูลลงมาจากที่ไหนบ้าง ด้านบนเราดึงมาจาก Default Config แต่ให้เราดูด้านล่างตรง job_name อันนี้แหละคือส่วนที่เราบอกให้มันเก็บ Parameter ออกมา โดยเราจะต้องแก้อยู่ 2 จุดคือ ที่อยู่ของ MySQL Database ของเรา โดยพื้นฐาน Port จะเป็น 3306 แต่ถ้าใครใช้ Port ที่ต่างออกไป ก็สามารถเปลี่ยนเป็น Port ที่ใช้งานได้เลย และสุดท้าย บรรทัดล่างสุด ให้เราใส่ IP Address ของเครื่องที่รัน mysql-exporter ที่เราพึ่งติดตั้งไปในขั้นตอนก่อนหน้านี้
docker run -p 9090:9090 --name prometheus -v <path_to_prometheus.yml>:/etc/prometheus/prometheus.yml prom/prometheus
เรามารัน Promethus ขึ้นมากันผ่าน Docker โดยเราจะต้อง Mount prometheus.yml เข้าไปใน Container ด้วยดังนั้น เราจะต้องแก้ตรงที่เราบอกไว้ให้เป็นที่อยู่ของไฟล์ให้ถูกต้อง
เราสามารถเช็คได้ว่า Prometheus สามารถ Scrape ข้อมูลได้อย่างถูกต้องหรือไม่โดยการเข้าไปที่ <IP ของเครื่องที่รัน Prometheus>:9090/targets มันจะแสดงหน้าของ Targets ที่มันจะเข้าไป Scrape ข้อมูลเข้ามาเก็บ โดยให้เราดูที่ Target ที่เราใส่เข้าไป ถ้า State ขึ้นเป็น Up สีเขียว ก็เป็นอันเรียบร้อยแล้ว
ติดตั้ง Grafana
docker run -d --name=grafana -p 3000:3000 grafana/grafana
การรัน Grafana ขึ้นมาไม่ยากเลย เราสามารถใช้ Command ด้านบนนี้รันได้เลย หลังจาก Container ถูกสร้างมาแล้ว เราอาจจะต้องรอสักพัก เพื่อให้ Grafana มัน Migrate Database ต่าง ๆ สำหรับการเริ่มต้น
หลังจาก Grafana ขึ้นเรียบร้อยแล้ว ให้เราเข้าไปที่ IP Address เครื่องที่รัน Grafana ด้วย Port 3000 มันควรจะขึ้นหน้า Login ของ Grafana ขึ้นมา โดยครั้งแรก Default Username/Password จะเป็น admin ทั้งคู่ เมื่อเราเข้าไปแล้ว มันจะให้เราเปลี่ยน Admin Password ใหม่
หลังจากเข้ามาใน Grafana ได้แล้ว เราจะต้องบอกมันอีกว่า เราจะดึงข้อมูลมาแสดงผลจากไหนให้เราเข้าไปที่ Add data source แล้วเลือก Prometheus ในช่อง Promethus Server URL ให้เราใส่ IP Address ของ Prometheus พร้อมกับ Port 9090 เข้าไป
จากนั้นเลื่อนลงไปด้านล่างกด Save & Test ถ้ามันบอกว่า "Successfully queried the Prometheus API" แปลว่ามันเชื่อมต่อได้เรียบร้อยแล้ว แต่ถ้าไม่ ให้เราไปดูว่า Server URL เราใส่ถูกหรือไม่
เมื่อเราได้ Data Source เรียบร้อยแล้ว เราจะสร้าง Dashboard เพื่อแสดงผลข้อมูลกัน เข้าไปที่ Dashboard แล้วกด Import Dashboard แล้วใส่เลข 14067 แล้วกด Import เข้ามา เราจะได้หน้า Dashboard สวย ๆ พร้อมใช้งานเลย