แนะนำให้รู้จักกับ MRTG ซึ่งเป็นเครื่องมือใช้ในการดูสถิติย้อนหลังสำหรับชาว network/system admin โดยการทำงานนั้นทุก ๆ 5 นาที (ค่าเริ่มต้นที่มักนิยมใช้) script MRTG จะใช้ SNMP protocol เก็บข้อมูลจากอุปกรณ์ network  หรือ server ต่าง ๆ มาเก็บไว้ใน database ของ MRTG

ข้อมูลสำหรับเริ่มต้นนั้นเป็นข้อมูลพวก transfer rate (bytes/sec) ของ router แต่จะแก้ให้ MRTG เก็บค่าด้วย protocol อื่นก็รองรับด้วย สถิติเปรียบเทียบการวิ่งผ่านของข้อมูล Daily, Weekly, Monthly, Yearly เป็นรูปกราฟที่เข้าใจได้ง่าย การใช้ MRTG นั้นต้องการใช้ crontab ด้วยเพื่อเป็นตัวในการ update data ของแต่ละช่วงเวลา

เมื่อพบว่า graph ของ mrtg ในช่วงเวลาหนึ่ง เสีย หรือ poll ข้อมูลไม่ได้/ไม่ถูกต้องขึ้นมา
เราต้องการจะแก้ค่ากราฟดังกล่าว ให้เป็นปกติ ต้องมีขั้นตอนและทำอย่างไร เรามาดูกัน ?

native log (mrtg-2 logfile) หรือ RRDtool

ไปดู database ของ mrtg ที่ใช้เก็บ log ก่อนว่าเป็นแบบใด rrd หรือ native log (mrtg-2 logfile)

  • วิธีดูแบบง่าย ๆ ก็ไป ls ดู — ว่าเป็นไฟล์นามสกุลอะไร .rrd หรือ .log
  • หรือหากตอนแรกมีไฟล์นามสกุล .log แล้วเพิ่งมา update ใช้ rrdtool ทีหลัง
    กรณีนี้อาจมีไฟล์ทั้ง 2 นามสกุล ก็อาจไปดู mrtg config file ว่ามี
    – LogFormat: rrdtool
    – หรือ PathAdd: /usr/local/rrdtool/bin/ หรือไม่ ?

กรณีเป็น RRDtool

ไม่สามารถแก้ไขไฟล์ได้ตรง ๆ ต้องทำประมาณนี้

  1. ใช้ rrdtool dump เพื่อ export RRD file เป็น XML file
  2. เปิด XML file เพื่อแก้ไขข้อมูลช่วงเวลาที่มีปัญหา ในรูปแบบ format เดิม
  3. ทำการแปลงกลับเป็น RRD file ผ่าน rrdtool restore

** อย่าลืมปิด crontab หรือ บรรทัดคำสั่งที่ใช้รัน mrtg เฉพาะกราฟนี้ด้วย / หากปิดไม่ได้ ก็อาจต้องแก้ไขข้อมูลล่วงหน้าเผื่อไว้ด้วย **

กรณีเป็น native log

ก็เป็น text file ธรรมดา พบว่าใน directory จะมีด้วยกัน 2 ไฟล์คือ .log และ .old  (เกิดจากการ rename .log เป็น .old หลังจาก script rateup ทำงาน) ที่เราสนใจคือ .log เท่านั้น เรามาดูรายละเอียดแต่ละ column ของไฟล์ .log กัน

mrtg-2 logfile format ประกอบด้วย 2 ส่วนคือ

บรรทัดแรก

  • เก็บข้อมูล traffic counters ที่การรันล่าสุด
  • ประกอบด้วย 3 columns
    • 1st – unix timestamp (ค่า seconds ที่นับตั้งแต่วันเวลา 1/1/1970 GMT เที่ยงคืน) ที่ mrtg รันล่าสุด ไม่จำเป็นต้องหาร 300 ลงตัว กรณีตั้ง crontab ไว้ 5 นาที คือ มันเป็นค่าเวลาที่รัน scripts ของ mrtg confile ไฟล์นี้เสร็จ
    • 2nd – incoming bytes counter
    • 3rd – outgoing bytes counter

ส่วนที่เหลือ (บรรทัดที่ 2 เป็นต้นไป)

  • เก็บข้อมูลข้อมูล traffics rate (avg และ max in/out transfer rate)  ตามช่วงเวลาทุก ๆ 5 นาที (ค่า default)
  • ประกอบด้วย 5 columns ดังนี้
    • 1st – unix timestamp (ค่า seconds ที่นับตั้งแต่วันเวลา 1/1/1970 GMT เที่ยงคืน) ตามรอบเวลาที่ตั้งรันไว้ โดยค่าผลต่าง timestamp ห่างกัน 300 คือ 300 secs นั้นเอง
    • 2nd – average incoming transfer rate (bytes per second) ตั้งแต่การวัดครั้งก่อน
    • 3rd – average outgoing transfer rate (bytes per second) ตั้งแต่การวัดครั้งก่อน
    • 4th – maximum incoming transfer rate (bytes per second) ในรอบนั้น ๆ
    • 5th – maximum outgoing transfer rate (bytes per second)

โดยปกติ MRTG เก็บข้อมูลดิบย้อนหลังพวก 5 นาทีแค่ 2 วัน จากนั้นข้อมูลย้อนหลัง 5 นาทีดังกล่าวจะถูกแทนที่ด้วยข้อมูลใหม่
จากนั้น MRTG เก็บข้อมูลแบบรายครึ่งชั่วโมงอีกด้วย เฉลี่ยแบบนี้เก็บแค่วันละ 48 ตัวเลข และเก็บยาวได้ทั้งสัปดาห์
จากนั้นเป็นเก็บราย 2 ชั่วโมงและ 1 วัน คราวนี้เก็บข้อมูลกันได้เป็นเดือนเป็นปี แต่ข้อมูลก็จะหยาบลงเรื่อยๆ แต่ก็ไม่ใช่ประเด็น เพราะเวลาทำกราฟระยะยาวเพื่อดู trend ดูปัญหาเชิงโครงสร้าง ไม่จำเป็นต้องใช้ข้อมูลที่ละเอียดเก็บถี่ๆ ขึ้น

การจัดเก็บสถิติของ MRTG (database)

MRTG สามารถจัดเก็บได้ 5 รูปแบบดังนี้
** เป็นการจัดเก็บสถิติของ mrtg2-logfile (native log) ส่วนกรณีที่ database เป็น rrdtool ไม่แน่ใจว่าจัดเก็บเหมือนกันหรือไม่ ? ขอเจาะรายละเอียดอีกที ทีหลังละกัน **

  • ข้อมูลเวลาจริง (Real Time) – เก็บข้อมูลและรายงานผลทุกๆ 5 นาที
  • ข้อมูลสถิติรายวัน (Daily) – แสดงข้อมูลใหม่เสมอทุกครั้งที่ได้รับข้อมูลเวลาจริง ก็คือพวก 5 นาทีด้านบนอันเดียวกัน
  • ข้อมูลสถิติรายสัปดาห์ (Weekly) – แสดงข้อมูลทุกๆ 30 นาที
  • ข้อมูลสถิติรายเดือน (Monthly) – แสดงข้อมูลทุกๆ 2 ชั่วโมง
  • ข้อมูลสถิติรายปี (Yearly) – แสดงข้อมูลทุกๆ 24 ชั่วโมง

นั้นคือไฟล์ที่เก็บข้อมูลพวกนี้ ก็จะมีบรรทัดที่ timestamp ต่างกัน 5 นาที, ต่างกัน 30 นาที, ต่างกัน 2 ชม. และ ต่างกัน 1 วัน

ด้านล่าง output ที่เกิดจากการรัน php script สำหรับหาบรรทัดที่มีค่าผลต่างของ timestamp ระหว่างบรรทัด แตกต่างจาก ผลต่างของ timestamp ระหว่างบรรทัดก่อนหน้า ของ .log วันที่ 2014-10-01
ยกตัวอย่างเช่น ผลต่างบรรทัดที่ 1,2 เป็น 300 | ผลต่างบรรทัดที่ 2,3 เป็น 1800 -> ก็จะแสดงข้อมูล timestamp บรรทัดที่ 2,3 ออกมา

อธิบายเพิ่มเติมตามนี้

  • เราข้ามรอยต่อผลต่าง timestamp 300 ไปเลย เพราะ  บรรทัดที่ 2 ใน .log file จนถึงบรรทัดก่อน timestamp  1412002800 (2014-09-29 22:00:00) ผลต่างระหว่างบรรทัดจะเป็น 300 คือ 5 นาที  ซึ่งบรรทัดเหล่านี้จะเป็น database สำหรับ Daily Graph **อย่าลืมบรรทัดแรก คือพวก traffic counters**
  • บรรทัดที่มี timestamp (1st column)  = 1412001000 หรือ วัน-เวลา 2014-09-29 21:30:00  ต่างกับ บรรทัดด้านบน 1412002800 หรือ วัน-เวลา 2014-09-29 22:00:00 = 1800 วินาที นี่คือจุดรอยต่อผลต่าง 5 นาที และ 30 นาที ดังนั้นตามจุดรอยต่อบรรทัดที่แสดงใน output ทำให้ทราบว่า บรรทัด timestamp ตั้งแต่ 1410919200 (2014-09-29 22:00:00) ย้อนหลังถึง 1410922800 (2014-09-17 10:00:00) ผลต่าง timestamp = 30 นาที จะเป็น database สำหรับ Weekly Graph
  • บรรทัด timestamp ตั้งแต่ 1410919200 (2014-09-29 22:00:00) ย้อนหลังถึง 1406592000 (2014-07-29 07:00:00) ผลต่าง timestamp = 2 ชม. จะเป็น database สำหรับ Monthly Graph
    ** ข้ามรอยต่อที่เป็น 3600 ไป เพราะว่าค่าผลต่าง ณ. รอยต่อ ต้องเป็น 300,1800,7200, 86400 **
  • บรรทัด timestamp ตั้งแต่ 1406592000 (2014-07-29 07:00:00) ย้อนหลังไป ผลต่าง timestamp = 1 วัน จะเป็น database สำหรับ Yearly Graph

โดย code php อ่านไฟล์ .log ของวันที่ 2014-10-01 ประมาณนี้

วิธีทำกราฟ mrtg รายวัน (Daily) สำหรับดูย้อนหลัง

Graph Daily MRTG interface Gi0

กรณีที่เราต้องการเก็บกราฟ mrtg รายวัน(Daily) ไว้ดูย้อนหลัง มีขั้นตอนไม่เยอะดังนี้

  1. สร้าง directory ที่เก็บ history mrtg files รายวัน โดยอาจเป็นอยู่ใน folder เดียวกับชื่อลูกค้าเลย
    เช่น ลูกค้าชื่อ xyz ก็สร้าง directory: /var/www/html/mrtg/customer/xyz/history/2014/11/01 เป็นต้น
  2. เขียน shell script copy files ไปไว้ใน directory ตามข้อ 1 ซึ่งมีการสร้าง directory ย่อยตามวันที่ไปเรื่อย ๆ
  3. หากมีการสร้าง link file ใน directory ต้นทาง ก่อนที่จะ copy มา ให้ลอง check ผ่าน ls -l แล้วดู attributes เป็น  lrwxrwxrwx หรือไม่ ?
    หากใช่ ต้องดูว่าทำการสร้าง link แบบ full path ไว้หรือไม่ ? หากใช่ต้องแก้ให้เป็น relative path เพราะ directory ปัจจุบันที่เป็น history/ปี/เดือน/วัน แล้ว
  4. จากนั้นทดลองเข้าผ่าน web browser ตาม path ใหม่ที่สร้างขึ้น ซึ่งส่วนใหญ่เข้าได้อยู่แล้ว เพราะว่าต้องมีการ settings ให้ mrtg เดิมเข้าได้ก่อนหน้านี้แล้ว
  5. กรณีต้องการให้มี security ขึ้นถาม user/pass เช่น popup basic authentication ก่อนเข้าไปดูกราฟ ก็ทำผ่าน .htaccess ของ apache หรือหากถนัด programming ก็จัดตามสะดวกเลย

ตัวอย่าง shell script copy files

การแก้ไขข้อมูล .log เพื่อให้กราฟ mrtg แสดงผลถูกต้อง

จากโครงสร้างข้อมูลข้างต้น เนื่องจากทางผู้ดูแลทราบดีว่า ช่วงเวลาไหนที่ข้อมูลขาดหายไป สาเหตุอาจเกิดจาก

  • เนื่องจากอุปกรณ์มีปัญหาก็ดี
  • ลิงค์มีปัญหาก็ดี
  • รวมถึง script/crontab หรือ hardware เครื่องที่ติดตั้ง mrtg เองมีปัญหาพอดี

และหากมีความจำเป็นต้องซ่อมกราฟ เพื่อให้กราฟดูราบเรียบ เป็นปกติเหมือนเดิม เรามาดูกันว่าต้องทำอย่างไรกันบ้าง ?

  1. ต้องมีเครื่องใหม่ 1 เครื่อง อาจเป็น vmware P2V มาก็ได้ เพราะว่าจำเป็นต้องแก้ไข system clock ให้ย้อนเวลาไปเท่ากับ timestamp ของแถวแรก แล้วทำการ generate graph ใหม่
  2. ไล่ดู .log file โดยถอดจาก timestamp เป็นวัน-เวลาที่อ่านง่ายขึ้น แล้วดูว่าบรรทัดไหน ที่มีค่าเป็นศูนย์ 4 ตัว <timestamp> 0 0 0 0
  3. ทำการแก้ไข .log file ผ่าน text editor ทั่วไป อาจ download มาแก้ไขที่เครื่อง pc/notebook แล้ว upload ขึ้นทีหลัง
  4. กรณีข้อมูลหายไม่กี่ชม. ก็แก้ไขไฟล์ .log ของบรรทัด database สำหรับ daily คือ 5 นาที และ weekly graph คือ 30 นาที ก็เพียงพอแล้ว
    แต่หากเราปล่อยเวลาผ่านไปหลายวัน แล้วค่อยมาแก้ อาจต้องทำข้อมูลดังกล่าวหลายวันใน history directory อาจต้องไปแก้ข้อมูลของส่วน monthly ที่เก็บ 2 ชม. ด้วย
  5. ทำการแก้ไข WorkDir ในไฟล์ mrtg.cfg ให้เป็น path อื่นก่อน เพื่อป้องกันการทับไฟล์เดิม
  6. ทำการ regen graph ใหม่
  7. ตรวจดูรูปไฟล์ .png ว่าแก้ไขเป็นตามที่เราต้องการแล้ว จากนั้นนำไฟล์ .log, .png, .html, .cfg ต่าง ๆ ไปทับของเดิม
  8. ทดลองเรียกดูผ่าน browser

ไปก่อนครับ …

แก้กราฟ mrtg อย่างไร