1. 程式人生 > >監控系統Nagios系列(三) 執行時

監控系統Nagios系列(三) 執行時

1. 編譯安裝
Nagios安裝需要從原始碼編譯,Nagios本身對外部依賴很小(apache2, PHP, GD, GCC)。具體的安裝,Nagios官方文件有step by step的介紹,本人使用的ubuntu,如果你也使用的是ubuntu,那麼參考這裡如何安裝。
官方的文件安裝的是3.2.3版本,且安裝了外掛,這片文章裡面,安裝的是4.0版本,且沒有外掛。不安裝外掛是為了更好理解。
不安裝外掛很簡單,就是不安裝xxx_plugin的包就可以。
PS:沒有特別說明,後續出現的Nagios都是指Nagios Core。

2. 執行時全景圖

Nagios Core 是不包含任何監控實現的,所有的監控實現都是由Plugin提供的,Nagios Core 只負責定義物件,執行外掛,獲取結果,通知狀態變化。
上圖是 Nagios Core + 各種Plugin 的全景圖。

  • Objects
    被監控的物件,可以是通用伺服器,路由器,交換機等。與這些物件互動,都是通過外掛完成的,因此通過增加新的外掛很容易擴充套件新的監控物件。圖裡面提到的Active ChecksPassive Checks稍後會介紹。
  • Status
    監控資料的展示。包含狀態通知,效能資料展示。狀態通知也是由外掛實現的,因此開發者可以定義任何形式的通知,簡訊,郵件,微信,都可以。
  • Nagios
    圖中的Nagios 表示 Nagios Core ,Plugins 表示各種外掛, Performance Data 是外掛輸出的效能資料。 N2RRD 是一個外掛,可以將效能資料儲存到 RRD 資料庫中。 RRD 的全稱是 Round Robin Database ,是專門設計儲存與時間相關的監控資料。RRD 有一個開源實現 
    rrdtool
     ,rrdtool 提供了操縱監控資料的介面,並提供將監控資料以圖表輸出的能力,關於 rrdtool 後面我們會單獨介紹。
  • Active Checks & Passive Checks
    Nagios 定義了兩種檢查的型別。Active Checks 是表示由 Nagios 程序執行後獲取到結果的檢查;Passive Checks 表示由外部系統檢查獲取到結果後,將結果傳送給 Nagios 處理。之所以需要 Passive Checks 是因為一些資料的獲取,並不是每次主動執行獲得的,典型的如 SNMP Trap,這種介面,是被動接收的,所以外掛需要提供一個常駐程序負責接收 SNMP Trap,然後將資料傳送給 Nagios 處理。

3. 目錄結構
Nagios 預設安裝在 /usr/local/nagios 目錄下,下面是 Nagios 根目錄下的目錄:
drwxrwxr-x 2 nagios nagios 4096 1月 19 20:33 bin
drwxrwxr-x 3 nagios nagios 4096 1月 19 20:37 etc
drwxrwxr-x 2 nagios nagios 4096 1月 19 20:33 libexec
drwxrwxr-x 2 nagios nagios 4096 1月 19 20:33 sbin
drwxrwxr-x 10 nagios nagios 4096 1月 19 20:33 share
drwxrwxr-x 5 nagios nagios 4096 1月 19 22:11 var

  • bin
    可執行檔案目錄。包含:nagios, nagiostats 。nagios 是主檔案,啟動 nagios 就是這個可執行檔案。
  • etc
    所有的配置檔案目錄。包含全域性配置檔案,物件配置檔案等。
  • libexec
    外掛存放目錄。每個外掛就是一個或多個可執行檔案。外掛並不要求一定存放在此目錄,外掛可以存放在任何目錄。libexec 只是約定的外掛存放目錄。
  • sbin
    CGI 可執行檔案,處理Web展示相關邏輯。
  • share
    Web檔案,包括 HTML ,PHP 等。
  • var
    執行時動態檔案或臨時檔案目錄。存放 PID 檔案,log 檔案等。

etc 目錄結構:
-rw-rw-r-- 1 nagios nagios 12015 1月 19 20:33 cgi.cfg
-rw-r--r-- 1 root root 50 1月 19 20:37 htpasswd.users
-rw-rw-r-- 1 nagios nagios 44475 1月 19 20:33 nagios.cfg
drwxrwxr-x 2 nagios nagios 4096 1月 19 20:33 objects
-rw-rw---- 1 nagios nagios 1312 1月 19 20:33 resource.cfg

  • cgi.cfg
    Web相關的配置。
  • htpasswd.users
    Web登入使用者名稱和密碼。
  • nagios.cfg
    Nagios主配置檔案。
  • objects
    物件檔案目錄。
  • resource.cfg
    使用者自定義巨集 (macro) 儲存在此檔案。

var 目錄結構:
drwxrwxr-x 2 nagios nagios 4096 1月 19 20:33 archives
-rw-r--r-- 1 nagios nagios 6 1月 19 20:45 nagios.lock
-rw-r--r-- 1 nagios nagios 8842 1月 19 21:45 nagios.log
-rw-r--r-- 1 nagios nagios 12660 1月 19 20:45 objects.cache
-rw------- 1 nagios nagios 13474 1月 19 21:45 retention.dat
drwxrwsr-x 2 nagios nagcmd 4096 1月 19 20:46 rw
drwxr-xr-x 3 root root 4096 1月 19 20:33 spool
-rw-rw-r-- 1 nagios nagios 13910 1月 19 22:33 status.dat

  • archives
    日誌 log 歸檔目錄。
  • nagios.lock
    防止多個程序同時啟動的鎖檔案。
  • nagios.log
    日誌檔案。
  • objects.cache
    物件快取檔案。 Nagios 可以將物件快取到此檔案,加快訪問速度。
  • retention.dat
    Nagios執行過程中dump出來的檔案。 Nagios 可以將執行過程中記憶體中有用的資訊dump到檔案,持久化。下次啟動時候,會讀取這個檔案,繼續上次未完成的工作。
  • rw
    外部程式吐資料給 Nagios 存放在此目錄。還有在Web頁面上使用者可以指定執行的命令,也存放在此目錄。
  • spool
    Nagios 執行檢查時候,會將外掛的輸出儲存到檔案,預設在此目錄。
  • status.dat
    物件狀態資訊。Nagios會定時將物件狀態資訊儲存到此檔案。Web程式讀取此檔案內容,展示到頁面。

4. 執行緒
Nagios 只有一個主執行緒,不要驚訝。 Nagios實際上是使用多程序替代了多執行緒,下面會講解程序模型。
Nagios 不使用多執行緒,推測有兩個原因:

  • 技術限制
    Nagios 在90年代就有了,是C程式碼實現的。那時候還沒有多執行緒,從執行緒的名字LWP(Light Weigth Process)也可以看到,執行緒實際上是輕量級程序。
  • 健壯性
    Nagios 監控物件狀態,都是通過執行外掛得到返回結果,因此 Nagios 會執行數量巨大的外部命令,外部命令可能執行過程僵死,如果使用執行緒,那麼 Nagios 程序就會存在一些執行緒被掛住無法繼續工作,會影響 Nagios 程序的資源消耗,會影響其他外掛的執行。通過程序隔離可以減少 Nagios 程序不工作的概率。

Nagios的主執行緒,是一個自給自足的模型,套用生產者-消費者模型,主執行緒即是生產者又是消費者。主執行緒迴圈檢查事件佇列,發現有到期的事件,則根據事件型別,處理該事件。如果是執行外掛檢查狀態的事件,那麼主執行緒會拼裝命令,交給子程序執行。
很簡單!!!

5. 程序
Nagios 有一個主程序(Nagios Daemon),還有一些 Worker 程序,Worker 程序負責執行由 Nagios Daemon 程序傳遞過來的命令。
Worker 的數量可以配置,預設四個,可以在 nagios.cfg 檔案中更改此值:

nagios 10474 1 0 20:45 ? 00:00:01 ./nagios -d /usr/local/nagios/etc/nagios.cfg
nagios 10475 10474 0 20:45 ? 00:00:00 /usr/local/nagios/bin/nagios --worker /usr/local/nagios/var/rw/nagios.qh
nagios 10476 10474 0 20:45 ? 00:00:00 /usr/local/nagios/bin/nagios --worker /usr/local/nagios/var/rw/nagios.qh
nagios 10477 10474 0 20:45 ? 00:00:00 /usr/local/nagios/bin/nagios --worker /usr/local/nagios/var/rw/nagios.qh
nagios 10478 10474 0 20:45 ? 00:00:00 /usr/local/nagios/bin/nagios --worker /usr/local/nagios/var/rw/nagios.qh
nagios 10481 10474 0 20:46 ? 00:00:00 ./nagios -d /usr/local/nagios/etc/nagios.cfg

Nagios 主程序與 Worker 程序之間通過Linux 的檔案socket通訊,這個檔案就是 上面看到的 nagios.qh 檔案。