ป้ายกำกับ: จํากัด

การตั้งค่าระบบแจ้งเตือนและระบบเฝ้าระวัง (Alert Notification via Email/Line/Telegram, SNMP, Resource Monitor)การตั้งค่าระบบแจ้งเตือนและระบบเฝ้าระวัง (Alert Notification via Email/Line/Telegram, SNMP, Resource Monitor)

ในโลกของระบบฐานข้อมูลที่มีความสำคัญสูง (Mission-Critical Database) เช่น PostgreSQL การปล่อยให้ระบบทำงานโดยไม่มีการเฝ้าระวังสถานะแบบเรียลไทม์ถือเป็นความเสี่ยงที่ยอมรับไม่ได้ ความล้มเหลวของบริการเพียงเล็กน้อย ไม่ว่าจะเป็นการใช้ทรัพยากรเกินขีดจำกัด หรือการเกิด Slow Query ก็สามารถส่งผลกระทบต่อประสบการณ์ของผู้ใช้งานทั้งหมดได้ ดังนั้น การสร้างกลไกการเฝ้าระวัง (Monitoring) และการแจ้งเตือน (Alerting) ที่แม่นยำจึงเป็นหัวใจสำคัญของการรักษาความต่อเนื่องทางธุรกิจ (Business Continuity) และเป็นรากฐานของ DevOps ที่แข็งแกร่ง

หลักการเฝ้าระวัง PostgreSQL อย่างมืออาชีพ

ระบบเฝ้าระวังที่สมบูรณ์แบบสำหรับ PostgreSQL ไม่ได้จำกัดอยู่แค่การตรวจสอบ CPU หรือ RAM เท่านั้น แต่ต้องเจาะลึกถึงเมตริกภายในของตัวฐานข้อมูลเองด้วย ในฐานะ Senior Architect เราต้องพิจารณา 3 องค์ประกอบหลัก:

  1. Resource Monitoring: การตรวจสอบทรัพยากรภายนอก เช่น พื้นที่ดิสก์ (Disk Space) ที่เหลือน้อย หรือการเชื่อมต่อที่มากเกินไป (Connection Pool Exhaustion)
  2. Performance Monitoring: การติดตามประสิทธิภาพภายใน เช่น จำนวน Query ที่ทำงานช้า (Slow Queries), อัตราการเปลี่ยนแปลงของข้อมูล (Write/Read Throughput), และการใช้ Transaction ID ที่สูงเกินไป
  3. Alerting Mechanism: การกำหนดเกณฑ์ (Threshold) และการส่งสัญญาณเตือนไปยังช่องทางที่เหมาะสม เช่น Webhook (สำหรับ Line/Telegram) หรือระบบ Ticketing

การสร้างระบบแจ้งเตือนด้วย PostgreSQL Function

แทนที่จะพึ่งพาเครื่องมือภายนอกเพียงอย่างเดียว เราสามารถใช้คุณสมบัติของ PostgreSQL เช่น pg_stat_activity และการสร้าง Stored Procedure (Function) เพื่อตรวจสอบเกณฑ์วิกฤตภายในตัวฐานข้อมูลเองได้ จากนั้นให้ Function นี้เขียนสถานะการแจ้งเตือนไปยังตารางเฉพาะ (Alert Queue Table) ซึ่งจะถูกดึงข้อมูลโดย Cron Job หรือ External Worker (เช่น Python script) เพื่อส่งการแจ้งเตือนจริงออกไป

SQL

-- 1. สร้างตารางสำหรับเก็บสถานะแจ้งเตือน (Alert Queue) 
CREATE TABLE alert_queue (
    alert_id SERIAL PRIMARY KEY,
    metric_name VARCHAR(100) NOT NULL,
    alert_level VARCHAR(20) NOT NULL, -- CRITICAL, WARNING
    alert_message TEXT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- 2. ตัวอย่าง Function ตรวจสอบการเชื่อมต่อเกินขีดจำกัด (Connection Pool)
CREATE OR REPLACE FUNCTION check_connection_limit() RETURNS VOID AS $$
DECLARE
    current_connections INT;
    max_connections_threshold INT := 50; -- กำหนดเกณฑ์วิกฤต
BEGIN
    SELECT count(*) INTO current_connections FROM pg_stat_activity;

    IF current_connections > max_connections_threshold THEN
        -- หากเกินเกณฑ์ ให้บันทึกสถานะแจ้งเตือน
        INSERT INTO alert_queue (metric_name, alert_level, alert_message) 
        VALUES ('Connection Limit', 'CRITICAL', 'Active connections (' || current_connections || ') exceed threshold of ' || max_connections_threshold);
    END IF;
END; 
$$ LANGUAGE plpgsql;

-- 3. การเรียกใช้งาน (Run the check)
SELECT check_connection_limit();

การเชื่อมต่อ Alert ไปยังช่องทางภายนอก (Webhook Integration)

เมื่อข้อมูลถูกบันทึกใน alert_queue แล้ว ขั้นตอนต่อไปคือการให้ระบบภายนอก (เช่น AWS Lambda, Grafana Alerting, หรือ Cron Job ที่รัน Python) เข้ามาอ่านข้อมูลนี้และดำเนินการส่งการแจ้งเตือนจริงออกไป (เช่น การเรียก Webhook ไปยัง Line Notify หรือการส่งอีเมลผ่าน SMTP) การแยกส่วนนี้ทำให้ PostgreSQL ยังคงเป็นแหล่งข้อมูลสถานะที่เชื่อถือได้ โดยไม่จำเป็นต้องจัดการกับความซับซ้อนของโปรโตคอลการแจ้งเตือนภายนอก

บทสรุป: สถาปัตยกรรมที่ยืดหยุ่น

การเฝ้าระวัง PostgreSQL ที่มีประสิทธิภาพสูงต้องอาศัยสถาปัตยกรรมที่แบ่งแยกหน้าที่อย่างชัดเจน โดยให้ PostgreSQL ทำหน้าที่เป็นผู้ตรวจจับสถานะ (Detection Layer) และบันทึกหลักฐาน (Logging/Queueing) ส่วนระบบภายนอก (External Worker) ทำหน้าที่เป็นผู้ส่งสัญญาณ (Notification Layer) การทำเช่นนี้จะช่วยให้ระบบมีความยืดหยุ่นสูง สามารถปรับเปลี่ยนช่องทางการแจ้งเตือน (จาก Email เป็น Line หรือ Telegram) ได้โดยไม่กระทบต่อความเสถียรของฐานข้อมูลหลัก