Tommy 碎碎念

Tommy Wu's blog

« 上一篇 | 下一篇 »

避免 cacti 有時在重開機後, 把網卡資料張冠李戴
post by tommy @ 25 十月, 2006 22:26
用了 cacti 有一陣子了, 不過最近老是碰到在重開機之後, cacti 在抓取伺服器上網卡的流量時, 時常發生把某兩張網卡的流量互相交換. 找了很久一直找不到原因. 之前的解決方法都是試著把一張網卡關了, 重開機後, 抓正確之後再把網卡打開. 不過有時有效, 有時沒有效. 可能要重開機好幾次才能解決. 或者重新在 cacti 中把這兩張網卡的流量抓取移除, 然後再重新加入也可以. 不過... 舊的資料就會不存在了.

今天在重開機後又發生了同樣的問題. 想說這樣子下去不是辦法, 就看了一下 cacti 的程式是怎麼處理的.

在我的機器上同, 是每隔 5 分鐘執行一次 poller.php, 然後在 poller.php 中會執行 cmd.php 來抓資料並產生圖形檔. 看了一下 cmd.php, 似乎是讀取 poller_item 這一個表格的內容, 來看要抓取那些資料. 所以我看了一下 cacti 資料庫裡頭 poller_item 這一個表格的內容. 發現如果是透過 snmp 抓資料的話, 在 arg1 這個欄位會存放要抓取的資料的 OID 值. 不過... 我記得我在 cacti 中是使用 ifDesc 來指定要讀取那一張網卡的資料, 並不是使用 OID 值. 那... 這個 OID 值是怎麼來的呢? 而這個 poller_item 會更新嗎?

試著改一下 poller_item 裡頭的某筆資料, 在隔了 5 分鐘之後, 並不會被改回去, 所以... 看起來 poller.php 執行時, 並不會去改變這個表格的內容, 單純只是讀取資料出來. 而之前試過, 在把資料刪除重建之後, 會抓到正確的網卡資料, 所以... 看起來, 這個表格的內容, 可能要新增一筆 data source 時才會更動. 不過, 我記得我有修改 data source 的資料, 一樣不會改變 OID 的值, 也就是說... cacti 似乎在修改 data source 時, 忘了改這個地方了.

不過... 先確定 OID 與實際網卡是否真的沒有對應好. 使用 snmpwalk 看了一下那個 OID 是屬於那一個網卡的, 果然... 兩張網卡的 OID 並不一樣. 難怪會抓錯資料. 不過... 新增或重建時, 抓到 OID 又是正確的, 而每次發生問題時, 都是重新關機才會有問題. 所以... 看來, 在我的機器上同, 同一張網卡的 OID, 每次開機可能會改變. (猜測是 udev 所引起的, 因為 udev 在載入網卡的順序上頭, 似乎是隨機沒有固定的, 所以... 有時會先載入這張卡, 但有時會先載入另一張, 自然網卡的名稱會不同, 而 OID 也不同了. 雖然我會使用 ifrename 指令來把網卡改成我希望的名稱, 不過 OID 並不會被改回去, 所以.... 就發生了這個問題了)

找了一下 cacti 裡頭的程式, 發現有個 rebuild_poller_cache.php 的程式, 似乎是用來把 poller_item 的內容清除再重建的程式, 所以試著跑了一次... 果然, poller_item 裡頭的 OID, 會變成目前正確的對應了. 所以... 看起來, 我只要每次重新開機後, 執行一次這個程式, 就應該可以解決我的問題了.  所以把下頭這行, 放到 /etc/cron.d/cacti 中:

@reboot www-data /usr/bin/php -Cq /usr/share/cacti/site/rebuild_poller_cache.php

這樣子, 就可以在每次開機後, 先執行一次這個指令, 把 poller_item 的內容依目前的環境重新建立一次. 希望從此之後, 不要再發生這類張冠李戴的問題了.

今天重開機後, 發現還是一樣... 再看一下程式,  應該是執行 poller_reindex_hosts.php 才對. 這個程式需要一個 id 來看要重設那些資料, 如果你不知道是那個 id, 可以用 -id=All 來全部重設. 不過... 建議到資料庫看一下本機的 hostid 是多少, 或者進 cacti 的管理網頁, 在 Device 那個功能中, 移到該主機上頭, 會出現的 url 中的 id 是多少. 以我的機器來說, 本身這台機器的 id 是 1. 先在 /usr/share/cacti/site 中建立一個 script, poller_reindex_hosts.sh:

#!/bin/sh

cd /usr/share/cacti/site
/usr/bin/php -Cq poller_reindex_hosts.php -id=1 -d
 

加上可執行的屬性, 然後在 /etc/cron.d/cacti 中加上:

@reboot www-data /usr/share/cacti/site/poller_reindex_hosts.sh 

這樣子, 就可以在每次開機後, 先執行一次這個指令, 把 poller_item 的內容依目前的環境重新建立一次. 希望從此之後, 不要再發生這類張冠李戴的問題了.

Del.icio.us Furl HEMiDEMi Technorati MyShare
迴響
暱稱:
標題:
個人網頁:
電子郵件:
迴響

  

Bad Behavior 已經阻擋了 128 個過去 7 天試圖闖關的垃圾迴響與引用。
Power by LifeType. Template design by JamesHuang. Valid XHTML and CSS