แนะนำให้รู้จักกับ 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
ไม่สามารถแก้ไขไฟล์ได้ตรง ๆ ต้องทำประมาณนี้
- ใช้ rrdtool dump เพื่อ export RRD file เป็น XML file
- เปิด XML file เพื่อแก้ไขข้อมูลช่วงเวลาที่มีปัญหา ในรูปแบบ format เดิม
- ทำการแปลงกลับเป็น 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 ออกมา
1 2 3 4 5 6 7 8 9 |
output of diff.php -- Find the lines that be the start point of difference timestamp 2014-10-01 23:55:00 (1412182500) - 2014-10-02 00:00:00 (1412182800) -> 300 2014-09-29 21:30:00 (1412001000) - 2014-09-29 22:00:00 (1412002800) -> 1800 2014-09-17 09:00:00 (1410919200) - 2014-09-17 10:00:00 (1410922800) -> 3600 2014-09-17 07:00:00 (1410912000) - 2014-09-17 09:00:00 (1410919200) -> 7200 2014-07-28 07:00:00 (1406505600) - 2014-07-29 07:00:00 (1406592000) -> 86400 |
อธิบายเพิ่มเติมตามนี้
- เราข้ามรอยต่อผลต่าง 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 ประมาณนี้
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# diff.php $t2 = 0; $ff = file('history/2014/10/01/Gi0.log'); foreach($ff as $f) { $arr = explode(" ", $f); $t1 = trim($arr[0]); $diff = $t2 - $t1; if ( ! isset($o_diff) ) $o_diff=$diff; if ( $diff <> $o_diff ) { echo date('Y-m-d H:i:s',$t1) . " ($t1) - " . date('Y-m-d H:i:s',$t2) . " ($t2) -> $diff \n"; } $o_diff = $diff; $t2 = $t1; } |
วิธีทำกราฟ mrtg รายวัน (Daily) สำหรับดูย้อนหลัง
กรณีที่เราต้องการเก็บกราฟ mrtg รายวัน(Daily) ไว้ดูย้อนหลัง มีขั้นตอนไม่เยอะดังนี้
- สร้าง directory ที่เก็บ history mrtg files รายวัน โดยอาจเป็นอยู่ใน folder เดียวกับชื่อลูกค้าเลย
เช่น ลูกค้าชื่อ xyz ก็สร้าง directory: /var/www/html/mrtg/customer/xyz/history/2014/11/01 เป็นต้น - เขียน shell script copy files ไปไว้ใน directory ตามข้อ 1 ซึ่งมีการสร้าง directory ย่อยตามวันที่ไปเรื่อย ๆ
- หากมีการสร้าง link file ใน directory ต้นทาง ก่อนที่จะ copy มา ให้ลอง check ผ่าน ls -l แล้วดู attributes เป็น lrwxrwxrwx หรือไม่ ?
หากใช่ ต้องดูว่าทำการสร้าง link แบบ full path ไว้หรือไม่ ? หากใช่ต้องแก้ให้เป็น relative path เพราะ directory ปัจจุบันที่เป็น history/ปี/เดือน/วัน แล้ว - จากนั้นทดลองเข้าผ่าน web browser ตาม path ใหม่ที่สร้างขึ้น ซึ่งส่วนใหญ่เข้าได้อยู่แล้ว เพราะว่าต้องมีการ settings ให้ mrtg เดิมเข้าได้ก่อนหน้านี้แล้ว
- กรณีต้องการให้มี security ขึ้นถาม user/pass เช่น popup basic authentication ก่อนเข้าไปดูกราฟ ก็ทำผ่าน .htaccess ของ apache หรือหากถนัด programming ก็จัดตามสะดวกเลย
ตัวอย่าง shell script copy files
1 2 3 4 5 6 7 8 9 |
#!/bin/bash for dd in $(ls -1d /var/www/html/mrtg/customer/*/) do daily_directory="$dd"history/$(date +%Y)/$(date +%m)/$(date +%d) mkdir -p $daily_directory cp -rf $dd $daily_directory done |
การแก้ไขข้อมูล .log เพื่อให้กราฟ mrtg แสดงผลถูกต้อง
จากโครงสร้างข้อมูลข้างต้น เนื่องจากทางผู้ดูแลทราบดีว่า ช่วงเวลาไหนที่ข้อมูลขาดหายไป สาเหตุอาจเกิดจาก
- เนื่องจากอุปกรณ์มีปัญหาก็ดี
- ลิงค์มีปัญหาก็ดี
- รวมถึง script/crontab หรือ hardware เครื่องที่ติดตั้ง mrtg เองมีปัญหาพอดี
และหากมีความจำเป็นต้องซ่อมกราฟ เพื่อให้กราฟดูราบเรียบ เป็นปกติเหมือนเดิม เรามาดูกันว่าต้องทำอย่างไรกันบ้าง ?
- ต้องมีเครื่องใหม่ 1 เครื่อง อาจเป็น vmware P2V มาก็ได้ เพราะว่าจำเป็นต้องแก้ไข system clock ให้ย้อนเวลาไปเท่ากับ timestamp ของแถวแรก แล้วทำการ generate graph ใหม่
- ไล่ดู .log file โดยถอดจาก timestamp เป็นวัน-เวลาที่อ่านง่ายขึ้น แล้วดูว่าบรรทัดไหน ที่มีค่าเป็นศูนย์ 4 ตัว <timestamp> 0 0 0 0
- ทำการแก้ไข .log file ผ่าน text editor ทั่วไป อาจ download มาแก้ไขที่เครื่อง pc/notebook แล้ว upload ขึ้นทีหลัง
- กรณีข้อมูลหายไม่กี่ชม. ก็แก้ไขไฟล์ .log ของบรรทัด database สำหรับ daily คือ 5 นาที และ weekly graph คือ 30 นาที ก็เพียงพอแล้ว
แต่หากเราปล่อยเวลาผ่านไปหลายวัน แล้วค่อยมาแก้ อาจต้องทำข้อมูลดังกล่าวหลายวันใน history directory อาจต้องไปแก้ข้อมูลของส่วน monthly ที่เก็บ 2 ชม. ด้วย - ทำการแก้ไข WorkDir ในไฟล์ mrtg.cfg ให้เป็น path อื่นก่อน เพื่อป้องกันการทับไฟล์เดิม
123456789101112#!/bin/bashcd /var/www/html/mrtg/customer/xyz/history/2014/10for dd in 01dostr="\/var\/www\/html\/mrtg\/customer\/xyz"str_replace="\/var\/www\/html\/mrtg\/customer\/xyz\/history\/2014\/10\/$dd"sed "s/$str/$str_replace/g;" -i $dd/cfg/mrtg.cfgdone - ทำการ regen graph ใหม่
12345678910111213141516171819202122232425#!/bin/bash# regexp for numericregexp_num='^[0-9]+$'# variablescust_dir="xyz"for dd in 01dologfile="/var/www/html/mrtg/customer/xyz/history/2014/10/$dd/{cust_dir}.log"run_timestamp=$(head -1 $logfile | cut -d' ' -f1)run_timestamp=$( expr $run_timestamp + 0 )if ! [[ $run_timestamp =~ $regexp_num ]] ; thenexit 1fi# set system clock by timestampdate +%s -s @$run_timestampmrtg_file="/var/www/html/mrtg/customer/xyz/history/2014/10/$dd/cfg/mrtg.cfg"env LANG=C /usr/local/mrtg-2/bin/mrtg $mrtg_filedone - ตรวจดูรูปไฟล์ .png ว่าแก้ไขเป็นตามที่เราต้องการแล้ว จากนั้นนำไฟล์ .log, .png, .html, .cfg ต่าง ๆ ไปทับของเดิม
- ทดลองเรียกดูผ่าน browser
ไปก่อนครับ …