TrueWatch

เวิร์กชอป TrueWatch: ติดตาม MySQL ด้วย TrueWatch แบบครบวงจร (ทีละขั้นตอน)

27 ส.ค. 2568By Admin

เอกสารอ้างอิง: รายละเอียดการเชื่อมต่อ MySQL ฉบับเต็มและคำอธิบายฟิลด์อยู่ใน TrueWatch MySQL Integration Docs

สิ่งที่คุณจะทำได้

เมื่อทำตามคู่มือทีละขั้นตอนนี้ คุณจะสามารถ:

  • ติดตั้งและกำหนดค่า TrueWatch DataKit เพื่อเชื่อมต่อกับ MySQL
  • สร้างผู้ใช้สำหรับการมอนิเตอร์ที่ปลอดภัยด้วยสิทธิ์น้อยที่สุด
  • เปิดใช้งานและเก็บ general/slow query log ของ MySQL (ไม่บังคับ)
  • สร้างแดชบอร์ดมอนิเตอร์ MySQL ที่ใช้งานได้จริงใน TrueWatch

เหมาะสำหรับ: วิศวกรแบ็กเอนด์ SRE และ DBA ที่ต้องการมอนิเตอร์ MySQL ระดับองค์กรได้อย่างรวดเร็ว


สิ่งที่ต้องมีก่อนเริ่ม

  • อินสแตนซ์ MySQL 5.7+ / 8.0+ ที่เข้าถึงได้ (ใช้ RDS บนคลาวด์ได้เช่นกัน)
  • แนะนำ: MySQL 8.0 เพื่อให้ครอบคลุม performance_schema อย่างสมบูรณ์
  • สิทธิ์ในการสร้างผู้ใช้และกำหนดสิทธิ์
  • สามารถติดตั้ง TrueWatch DataKit ได้ (Docker หรือติดตั้งบนโฮสต์)

ภาพรวมสถาปัตยกรรม

MySQL  ← (monitoring user, performance_schema)
  ↑
DataKit (container or host) → ships Metrics / Logs / Slow Queries to TrueWatch

ต้องการเทเลเมทรีระดับ eBPF/โฮสต์ใช่ไหม แนะนำให้ติดตั้งบนโฮสต์ หากมอนิเตอร์เฉพาะฐานข้อมูล ใช้คอนเทนเนอร์ได้


ขั้นตอนที่ 1: ตรวจสอบและเปิดใช้งาน performance_schema

เมตริกฐานข้อมูลจำนวนมากมาจาก performance_schema ของ MySQL ตรวจสอบว่าเปิดใช้งานอยู่หรือไม่:

SHOW VARIABLES LIKE 'performance_schema';

หากพบ Value = OFF ให้เปิดใช้งานตามสภาพแวดล้อมของคุณ:

  • ใน my.cnf:
[mysqld]
performance_schema=ON

รีสตาร์ต MySQL แล้วตรวจสอบว่าเป็น ON

บริการแบบมีผู้ดูแล (เช่น Aliyun RDS) อาจจำกัดบาง measurement (เช่น mysql_user_status) หาก performance_schema ถูกปิดหรือถูกจำกัด ดูคำถามที่พบบ่อยและวิธีแก้ไขอย่างเป็นทางการได้ใน TrueWatch MySQL Integration Docs


ขั้นตอนที่ 2: สร้างผู้ใช้มอนิเตอร์ด้วยสิทธิ์น้อยที่สุด

เพื่อความปลอดภัยและการสังเกตการณ์ ให้สร้างผู้ใช้แบบอ่านอย่างเดียวโดยเฉพาะ (ปรับชื่อผู้ใช้/รหัสผ่านได้ตามต้องการ):

CREATE USER 'datakit'@'%' IDENTIFIED WITH caching_sha2_password BY 'datakit_password';
GRANT PROCESS ON *.* TO 'datakit'@'%';
GRANT SELECT ON *.* TO 'datakit'@'%';
GRANT SELECT ON performance_schema.* TO 'datakit'@'%';
GRANT SELECT ON mysql.user TO 'datakit'@'%';
GRANT REPLICATION CLIENT ON *.* TO 'datakit'@'%';
FLUSH PRIVILEGES;

เหตุผลที่สิทธิ์เหล่านี้สำคัญ:

  • PROCESS: ตรวจดูคิวรีและการเชื่อมต่อที่กำลังทำงาน
  • SELECT (รวมถึง performance_schema): อ่านข้อมูลประสิทธิภาพและสถิติ
  • REPLICATION CLIENT: อ่านสถานะการทำ replication (หากมี)

ขั้นตอนที่ 3: ติดตั้งและเริ่มต้น DataKit (เลือกอย่างใดอย่างหนึ่ง)

ติดตั้ง DataKit เป็นคอนเทนเนอร์หรือบนโฮสต์ (คำสั่งที่ปรับให้ง่ายขึ้นจากคู่มืออย่างเป็นทางการ):

3A. Docker (เริ่มต้นอย่างรวดเร็ว)

datakit-install-docker.png

#1) ใน TrueWatch Console → DataKit → Docker เลือก DataWay ของคุณ แล้วคัดลอกคำสั่ง/โทเค็นที่สร้างขึ้น #2) บนโฮสต์เป้าหมาย รันคำสั่ง:

docker run -d --name datakit \
  --hostname "$(hostname)" \
  -p 9529:9529 \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v $(pwd)/conf.d:/usr/local/datakit/conf.d \
  -e ENV_DATAWAY="https://<your-openway-host>?token=<your_token>" \
  -e ENV_HTTP_LISTEN="0.0.0.0:9529" \
  pubrepo.truewatch.com/truewatch/datakit:1.80.1

#3) วางไฟล์ mysql.conf จากขั้นตอนถัดไปไว้ในไดเรกทอรี conf.d/ ที่เมานต์ไว้ (แนะนำ conf.d/db/) DataKit จะโหลดให้อัตโนมัติ

ดูตัวแปรสภาพแวดล้อมเพิ่มเติมและตัวเลือกขั้นสูง (พร็อกซี ข้อจำกัดทรัพยากร การบันทึกล็อก ฯลฯ) ได้ในเอกสารอย่างเป็นทางการ: DataKit Installation Docs

3B. ติดตั้งบนโฮสต์ (แนะนำสำหรับเมตริก eBPF/โฮสต์)

datakit-install-host.png

#1) ใน TrueWatch Console → DataKit → Linux เลือก DataWay แล้วคัดลอกคำสั่งที่มีโทเค็น

#2) บนโฮสต์เป้าหมาย รันคำสั่ง (ติดตั้งและเริ่มต้น DataKit):

DK_DATAWAY="https://<your-openway-host>?token=<your_token>" bash -c "$(curl -L https://static.truewatch.com/datakit/install.sh)"

#3) วาง mysql.conf ไว้ใน conf.d/db/ ของ DataKit แล้วรีสตาร์ตบริการ:

sudo systemctl restart datakit

สำหรับตัวเลือกเพิ่มเติม เช่น DK_INSTALL_ONLY พร็อกซี และการอัปเกรด โปรดดูเอกสารอย่างเป็นทางการ: DataKit Installation Docs


ขั้นตอนที่ 4: กำหนดค่า DataKit MySQL input (inputs.mysql)

สร้างหรือแก้ไข mysql.conf ในไดเรกทอรี conf.d/db ของ DataKit:

[[inputs.mysql]]
  host = "db"              # or your MySQL address (FQDN/IP)
  user = "datakit"         # monitoring user
  pass = "datakit_password"
  port = 3306
  interval = "10s"
  innodb = true             # collect key InnoDB metrics
  dbm = true                # enable Database Monitoring (query analysis)
  election = true           # single leader collects when multiple DataKits exist

ความหมายของฟิลด์และเคล็ดลับการปรับแต่ง: ดู TrueWatch MySQL Integration Docs

รีสตาร์ต (หรือรีโหลดแบบฮอต) DataKit แล้วเมตริกจะเริ่มส่งเข้ามา


ขั้นตอนที่ 5 (ไม่บังคับ): เก็บ general/slow query log ของ MySQL

TrueWatch สามารถนำเข้า general และ slow query log ของ MySQL เพื่อระบุ SQL ที่มีความหน่วงสูงได้อย่างแม่นยำ

5A. เปิดใช้งาน slow query log (MySQL)

SET GLOBAL slow_query_log = 'ON';
SET GLOBAL log_queries_not_using_indexes = 'ON';  -- optional: flag queries without indexes
-- Recommended tuning (persist via my.cnf):
SET GLOBAL long_query_time = 1;                   -- seconds threshold for slow query

หากต้องการให้คงค่าไว้ ให้เพิ่มลงใน my.cnf (ตัวอย่าง):

[mysqld]
slow_query_log=ON
long_query_time=1
log_queries_not_using_indexes=ON
log_output=FILE
slow_query_log_file=/var/log/mysql/slow.log

5B. การเก็บล็อกด้วย DataKit (มักใช้กับการติดตั้งบนโฮสต์)

เพิ่มต่อท้ายใน conf.d/mysql.conf (หรือสร้างส่วนใหม่):

[inputs.mysql.log]
  files = ["/var/log/mysql/*.log"]  # adjust to your absolute paths

สำหรับการแมปฟิลด์ล็อกโดยละเอียด (ปกติ/slow) ดู TrueWatch MySQL Integration Docs


ขั้นตอนที่ 6: ตรวจสอบการนำเข้าข้อมูล

#1) ตรวจสอบหน้าสถานะของ DataKit (พอร์ตเริ่มต้น 9529) เพื่อยืนยันว่า input ทำงานปกติ #2) ใน TrueWatch Explorer ค้นหา measurement เช่น mysql, mysql_replication_log #3) มองหาฟิลด์ เช่น connections, query_time, lock_time, rows_examined, rows_sent

หากไม่พบบาง measurement (เช่น mysql_user_status) ให้ตรวจสอบว่าเปิดใช้งาน performance_schema แล้ว หรือตรวจสอบข้อจำกัดของ RDS ดูคำถามที่พบบ่อยได้ใน TrueWatch MySQL Integration Docs


ขั้นตอนที่ 7: สร้างแดชบอร์ด MySQL ที่ใช้งานได้จริง

A. ใช้แดชบอร์ดเทมเพลต (แนะนำ)

#1) ไปที่ Scenes ทางซ้าย → Dashboards ด้านบน → คลิก Create

create-dashboard.png

#2) ภายใต้ System Views ค้นหา mysql แล้วเลือก Mysql Monitor View (หรือเทมเพลต MySQL เฉพาะของผู้ให้บริการคลาวด์)

mysql-template-dashboard.png

#3) เทมเพลตมีแผนภูมิที่ใช้บ่อยสำหรับการเชื่อมต่อ ความหน่วงของคิวรี InnoDB และ replication ปรับแต่งได้ตามต้องการ

แหล่งที่มาของเทมเพลตและข้อมูลอ้างอิงฟิลด์: TrueWatch MySQL Integration Docs

B. สร้างวิดเจ็ตเอง (ยืดหยุ่น)

ตัวอย่างแดชบอร์ด

mysql-view-1.png

mysql-view-2.png

ตัวอย่างการกำหนดค่าวิดเจ็ต (QPS / TPS)

  • QPS: ใช้เมตริก mysql กับ Questions แล้วใช้ non_negative_derivative เพื่อให้ได้จำนวนคิวรีต่อวินาที

QPS.png

  • TPS: ใช้นิพจน์ A+B เพื่อรวม Handler_commit และ Handler_rollback โดยแต่ละตัวใช้ non_negative_derivative เพื่อให้ได้จำนวนทรานแซกชันต่อวินาที

TPS.png

ด้านล่างคือวิดเจ็ตที่ผ่านการใช้งานจริงสำหรับความต้องการมอนิเตอร์ฐานข้อมูลทั่วไป เพิ่มลงในแดชบอร์ด TrueWatch โดยใช้คิวรีแบบ Simple/Expression/DQL ตามความเหมาะสม

ตัวอย่างฟิลด์อ้างอิง measurement เช่น mysql และ mysql_replication_log โปรดตรวจสอบว่ามีฟิลด์ดังกล่าวใน Explorer ของคุณ

A. ภาพรวม

  • อนุกรมเวลา (Connections)

    • แหล่งข้อมูล: mysql.connections
    • มิติ: server (host:port)
    • วัตถุประสงค์: ติดตามความพร้อมกันและช่วงที่พุ่งสูง
  • ค่าเดี่ยว/แนวโน้ม (เวลาคิวรี p95)

    • แหล่งข้อมูล: mysql.query_time
    • การรวมค่า: p95 ในช่วง 5 นาที
    • วัตถุประสงค์: ดูความหน่วงส่วนท้ายได้ในพริบตา
  • ค่าเดี่ยว/แนวโน้ม (เวลารอ lock)

    • แหล่งข้อมูล: mysql.lock_time
    • การรวมค่า: ค่าเฉลี่ยในช่วง 5 นาที (หรือ p95)
    • วัตถุประสงค์: ตรวจจับการแย่งชิง lock และการบล็อก
  • ค่าเดี่ยว (สโลว์เคียวรีต่อนาที)

    • แหล่งข้อมูล: slow query log (inputs.mysql.log)
    • วิธีการ: นับเหตุการณ์ที่มี db_slow_statement
    • วัตถุประสงค์: จับการเพิ่มขึ้นอย่างฉับพลันของสโลว์เคียวรี

B. InnoDB และปริมาณงาน

  • อนุกรมเวลา (Rows Examined / Rows Sent)

    • แหล่งข้อมูล: mysql.rows_examined, mysql.rows_sent
    • การรวมค่า: ผลรวมหรืออัตรา
    • วัตถุประสงค์: เข้าใจปริมาณการอ่านเทียบกับแถวที่ส่งกลับ เพื่อประเมินประสิทธิภาพ
  • ตาราง (ตาราง/อินเด็กซ์ที่ถูกใช้งานหนักสูงสุด)

    • แหล่งข้อมูล: mysql.index_name, mysql.object_name, mysql.object_schema
    • การรวมค่า: จัดกลุ่มตาม query_signature หรือ object_name แสดงค่าเฉลี่ย query_time และจำนวน
    • วัตถุประสงค์: ค้นหาตาราง/อินเด็กซ์ที่ถูกใช้งานหนักและการดำเนินการที่ช้า

C. คิวรีที่มีปัญหา Top-N (ล็อก/เหตุการณ์)

  • ตาราง (สโลว์เคียวรีสูงสุดตามระยะเวลาเฉลี่ย)

    • แหล่งข้อมูล: slow query log หรือเหตุการณ์ mysql
    • คอลัมน์: query_signature, sql_text (หรือ message ที่ทำให้เป็นมาตรฐานแล้ว)
    • เมตริก: avg(query_time), count()
  • ตาราง (เหตุการณ์รอสูงสุด)

    • แหล่งข้อมูล: mysql.wait_event, event_name
    • เมตริก: sum(event_timer_wait)

D. Replication (หากมี)

  • ค่าเดี่ยว/ตาราง (สรุป Master / Executed GTID Set)
    • แหล่งข้อมูล: mysql_replication_log.Executed_Gtid_Set, Master_Host, Master_Port
    • วัตถุประสงค์: ยืนยันความสัมพันธ์ของ master และความคืบหน้าของ GTID

เคล็ดลับ: หากมี ให้เพิ่ม Seconds_Behind_Master เป็นค่าเดี่ยว/อนุกรมเวลาเพื่อดูความหน่วงของ replication


แนวปฏิบัติที่ดีและความปลอดภัย

  • ใช้ผู้ใช้มอนิเตอร์เฉพาะที่มีสิทธิ์น้อยที่สุด แยกจากบัญชีของแอปพลิเคชัน
  • ความถี่ในการเก็บข้อมูลที่สูงขึ้น (เช่น interval = "10s") ใช้ได้ในสภาพแวดล้อม staging แต่ควรปรับให้เหมาะกับต้นทุน/ประสิทธิภาพของ prod
  • ปรับ long_query_time และ log_queries_not_using_indexes เพื่อสร้างสมดุลระหว่างสัญญาณรบกวนกับสัญญาณที่มีประโยชน์
  • ในคอนเทนเนอร์ ควรใช้ stdout/log-driver แทนการเมานต์ไฟล์ เพื่อหลีกเลี่ยงการเปิดเผยพาธที่ละเอียดอ่อน
  • เก็บข้อมูลรับรองไว้ใน secrets/ตัวแปรสภาพแวดล้อม แทนการบันทึกลงไฟล์

คำถามที่พบบ่อยและการแก้ไขปัญหา

ถาม: ฉันไม่เห็น measurement mysql_user_status

ตอบ: ตรวจสอบให้แน่ใจว่า performance_schema เป็น ON:

SHOW VARIABLES LIKE 'performance_schema';

หากเป็น OFF ให้เปิดใช้งานตามผู้ให้บริการฐานข้อมูล/RDS ของคุณ RDS บางผลิตภัณฑ์มีข้อจำกัดในเรื่องนี้ ดู TrueWatch MySQL Integration Docs

ถาม: DataKit ทำงานอยู่แต่ไม่มีข้อมูลเข้ามา

  • ตรวจสอบรายละเอียดการเชื่อมต่อใน mysql.conf (host/user/pass/port)
  • ตรวจสอบให้แน่ใจว่า security group/ไฟร์วอลล์อนุญาตให้ DataKit เข้าถึง MySQL ได้
  • ตรวจสอบหน้าสถานะ/ล็อกของ DataKit เพื่อหาข้อผิดพลาดด้านการเชื่อมต่อหรือสิทธิ์

ถาม: สโลว์เคียวรีไม่ปรากฏ

  • ยืนยันว่าเปิดใช้งาน slow_query_log แล้ว
  • หากเก็บไฟล์จากคอนเทนเนอร์ ตรวจสอบให้แน่ใจว่าพาธแบบสัมบูรณ์สามารถอ่านได้ (การใช้ stdout/sidecar มักง่ายกว่า)
  • ใน Explorer ค้นหาดัชนีล็อกด้วยเครื่องหมาย (เช่น [MYSQL_QUERY]) หรือฟิลด์ของ slow log

เอกสารอ้างอิง

  • เอกสารการเชื่อมต่ออย่างเป็นทางการและคำอธิบายฟิลด์: TrueWatch MySQL Integration Docs
  • เส้นทางการเชื่อมต่อและเหตุผลของเรา (ผู้ใช้มอนิเตอร์ DataKit inputs sidecar): demo-project/INTEGRATION_GUIDE.md

เมื่อทำตามขั้นตอนเหล่านี้ คุณได้เชื่อมต่อ MySQL กับ TrueWatch และสร้างแดชบอร์ดที่นำไปใช้งานได้จริงแล้ว ขั้นต่อไปให้เพิ่มการแจ้งเตือน (Monitors) รายงานตามกำหนดเวลา และการวิเคราะห์ความสัมพันธ์ข้ามบริการ เพื่อให้ได้การสังเกตการณ์ฐานข้อมูลแบบครบวงจรที่พร้อมใช้งานจริงในระดับโปรดักชัน

Get in touch background

ก้าวไปไกลกว่าการสังเกตการณ์กับ TrueWatch วันนี้