第23講:Namenode、Datanode、Nodemanager 等服務狀態監控策略
高俊峰(南非螞蟻)
Centreon 介紹與安裝
Centreon 是一款功能強大的分布式 IT 監控系統,通過第三方組件可以實現對網絡、操作系統和應用程序的監控:
-
首先,它是開源的,你可以免費使用它;
-
其次,它的底層采用 centreon-engine(類似 Nagios 的引擎)作為監控軟件,同時通過 cbd 模塊將監控到的數據定時寫入數據庫中,而 Centreon 實時從數據庫讀取該數據並通過 Web 界面展現監控數據;
-
最后,Centreon 就是 Nagios 的一個管理配置工具,通過 Centreon 提供的 Web 配置界面,可以輕松完成各種煩瑣的監控配置。
Centreon 的安裝非常簡單,有 ISO 鏡像安裝、VM 虛擬機安裝、源碼編譯安裝和 yum 源安裝四種方式。其中,源碼編譯安裝較復雜,出錯概率也較高,我比較推薦采用 ISO 鏡像安裝方式或者虛擬機鏡像方式進行安裝。
你可以從 Centreon 官網下載到需要的版本,如下圖所示:

我下載的是 VirtualBox Virtual Machine,其實就是一個打包好的虛擬機。下載后,將文件導入 VirtualBox 虛擬機,然后直接啟動系統即可完成安裝,非常簡單。登錄系統,默認的用戶名是 root,密碼為 centreon。
虛擬機啟動完成后,直接訪問虛擬機的 IP 地址,即可打開 Centreon 登錄界面,默認情況下 Centreon Web 登錄的用戶名為 admin,密碼為 centreon。
Centreon 配置與使用
配置 Centreon 並不復雜,所有操作都能在 Web 管理界面完成,如果對 Nagios 的配置過程比較了解,那么配置 Centreon 就變得非常簡單。
下面先來熟悉一下 Centreon 中配置文件之間的關系。
在 Centreon 的配置過程中涉及幾個定義:主機、主機組、主機模板,服務、服務組、服務模板、聯系人、聯系人組、監控時間和監控命令等。從這些定義可以看出,Centreon 的各個配置文件之間是互相關聯,彼此引用的關系。
成功配置一台 Centreon 監控系統,必須要弄清楚每個配置文件之間依賴與被依賴的關系,其中,最重要的有四點:
-
要定義監控哪些主機、主機組、服務和服務組;
-
要定義這個監控需通過什么命令實現;
-
要定義監控的時間段;
-
定義主機或服務出現問題時要通知的聯系人和聯系人組。
1. 配置主機模板
登錄 Centreon Web,在左側導航中,選擇 Configuration → Hosts →Templates,然后編輯 generic — active — host — custom 模板,如下圖所示:

主機模板,是對主機默認屬性或通用屬性的設置。 只有主機引用了這個模板,那么此模板的設置值就繼承到主機里面了。一些基礎的主機監控,比如主機檢查屬性、報警通知屬性、自定義宏屬性等都可以在主機模板中進行設置,當然也可以在定義主機監控的時候設置這些屬性。
主機模板的一個最大特點是繼承性,如果一個主機引用了這個模板,那么此主機模板下的所有監控屬性都被自動繼承過來了。
例如,要對 1000 台主機做 ping 連通性檢查,首先可以創建一個 check_ping 命令,然后將這個命令引用到主機模板中,最后在創建主機的時候,這 1000 台主機都引用這個主機模板即可。
引用主機模板的好處是,如果監控屬性發生了變化,只需修改主機模板的配置即可,而無須一個主機一個主機地修改,方便快捷。
有時候可能會發現一個監控屬性既在主機模板中設置了,也在主機定義中設置了,此時就有一個優先級的問題,在這種情況下,監控屬性的生效值以主機中的設置為准。
點擊下圖中的“Notification”標簽,用來設置告警通知屬性模板,如下圖所示:

告警通知屬性主要對是否啟用告警、告警聯系人、告警周期、告警類型等進行設置,上圖已經很清楚地描述了每個選項的含義,這里不再多說。
2. 添加主機監控
選擇 Configuration → Hosts → Hosts,點擊 Add 按鈕添加一個主機,如下圖所示:

首先添加一個 172.16.213.31 主機,此主機無須設置更多的屬性,只需要引用模板即可,模板就選擇之前我們創建的“generic-active-host-custom”。這樣,此主機的所有屬性就配置完成了,因為更多的主機屬性都通過指定的主機模板繼承進去了。
要添加更多的主機,方法與上面完全相同。下面依次添加多台主機,如下圖所示:

在這個界面上,有很多操作屬性,可以用於對主機進行復制、刪除、修改、啟用和禁用等,由此可見,通過 Centreon 管理主機非常方便、簡單。
3. 監控引擎管理
在完成主機和主機組添加后,這些主機信息並不會馬上生效,還需要將這些信息生成 Centreon 配置文件進行保存,然后重新啟動監控引擎,這就是 Centreon 的監控引擎管理功能。在任何配置添加或修改完成后,都需要重啟監控引擎才能使這些配置生效。
選擇 Configuration → Pollers → Pollers,如下圖所示:

在此圖中選擇“Export configuration”,如下圖所示:

上圖主要用於將創建好的配置導出,首先選擇 pollers 為 central,然后勾選左邊所有動作,最后選擇執行方式,可選的有兩個,即 Restart 和 Reload。
-
Restart 用於重新啟動監控引擎服務,比如新增加了一台主機,就可以使用 Restart 這個動作。
-
Reload 是重新加載配置,比如修改了某個主機的配置參數,使用 Reload 重新加載即可。
4. 添加服務
在完成主機添加后,下面開始添加需要監控的服務。
(1)修改服務模板
這里的服務模板與之前介紹的主機模板類似,它們具有相同的作用,選擇 Configuration→Services→Templates,找到“generic-active-service”這個自帶的模板,如下圖所示:

此界面中主要用來設置服務模板的一些屬性值,點擊上圖中的“Notification”選項,可以用來設置通知屬性,如下圖所示:

在此界面中,對每個選項的含義都做了詳細的描述,這里不再多說。generic-active-service 服務模板中設置的屬性值都是通用的或公用的,主要用於在創建服務的時候進行引用。
(2)創建監控命令
選擇 Configuration→Commands→Checks,點擊 add 創建一個命令,如下圖所示:

這里創建了一個“ganglia_collect”命令,此命令用來收集 Ganglia 上面的監控指標,可以看到,此命令最終應用的監控命令是 check_ganglia_metric.py,這個腳本我們在上個課時中介紹過。
(3)添加監控服務
添加監控服務的方法與添加主機基本一樣,選擇 Configuration→Services→Services by host,點擊 Add 按鈕添加一個服務。這里添加了一個“check_hadoop_block”的服務,在“Service Template”中引用了服務模板 generic-active-service,如下圖所示:

在添加監控服務過程中,只要引用了之前創建好的基礎服務模板,那么大部分的屬性基本都不用配置了,因為已經在服務模板配置過了。
這里重點關注“check_hadoop_block”服務中引用的命令 ganglia_collect 中三個參數的配置,分別是監控指標、警告閾值和故障閾值。其中,監控項 dfs.FSNamesystem.CorruptBlocks 表示已損壞的 block 數量。這樣一個監控服務就添加完成了,如下圖所示:

在上圖的服務監控列表中,可以對每個服務進行復制、刪除、啟用、禁用等操作,這些功能對以后的監控系統運維是非常重要的。
5. 監控報警配置
監控報警配置是 Centreon 中一個非常重要的組成部分,在前面介紹了主機和服務的添加,並且在主機和服務中都引用了各自的模板。而我們在模板中已經開啟了報警通知功能,下面就重點講下主機和服務的報警通知功能。
(1)開啟主機報警通知
開啟主機報警通知功能有兩種方法。
第一種方法是在定義主機時進行開啟,選擇 Configuration→Hosts→Hosts,編輯已經創建好的主機 172.16.213.31,這里重點看通知(Notification)選項,如下圖所示:

在默認情況下,通知選項處於“Default”狀態,該狀態表示一個繼承關系,這里選擇“monitoring_server”作為通知聯系人,monitoring_server 就是 admin 用戶的全名,“選擇Supervisor”作為聯系人組。這里可以根據監控需要任意添加。
接着還可以選擇通知間隔、通知周期、通知類型、是否延時發送通知等選項。對於比較重要的主機可以選擇短一點的通知時間間隔,可以選擇通知周期為 7×24,另外還可以選擇工作日(Workhours)、非工作日(Nonworkhours)兩個選項,可以選擇通知類型為宕機(Down)、不可到達(Unreachable)、恢復(Recovery)等。最后一個選項是設定第一次發送通知的延時時間,如果設置為 0,則表示主機故障后立刻發送通知。
第二種方法是配置主機模板中的設置。在前面介紹的主機添加過程中,都引用了主機模板,而在主機模板配置中也可以開啟報警通知功能,開啟方法很簡單。
那就是編輯主機模板,找到通知選項,設置方法與上圖完全一樣,當開啟了通知功能后,對應的這個主機就繼承了模板的設置,自動開啟了主機通知功能。
(2)報警方式和聯系人配置
在開啟了主機和服務的報警通知功能后,還需要設置報警方式和報警聯系人。Centreon 支持多種報警方式,可以選擇郵件報警、短信報警、微信報警、釘釘報警等方式,而郵件報警是默認方式,可以無須添加插件直接使用。
選擇 Configuration→Users→Contacts/Users,然后編輯 admin 用戶,如下圖所示:

上圖總共分成了兩個部分,第一部分是用戶設置,每個選項的含義在圖中都進行了標注;第二部分是通知告警,主要是配置報警通知命令,這里重點關注一下主機通知和服務通知命令。如果是郵件報警,在主機通知命令中,可以選擇 host—notify—by—email,而在服務通知命令中可以選擇 service—notify—by—email。關於這兩個命令,要根據實際情況進行修改,修改方法很簡單:選擇 Configuration→Commands→Notifications 選項,編輯對應的命令即可。
這里推薦一個利用命令行發郵件的工具“sendEmail”,這個命令行發郵件的工具功能非常強大,使用也非常簡單,強烈推薦。
點擊這里下載 sendEmail,解壓即可使用。可以將解壓出來的 sendEmail 可執行文件復制到 /usr/local/bin 下,直接運行 sendEmail 就會顯示詳細的用法,這里介紹幾個重要的使用參數。
-
-f,表示發送者的郵箱。
-
-t,表示接收者的郵箱。
-
-s,表示 SMTP 服務器的域名或者 IP 地址。
-
-u,表示郵件的主題。
-
-xu,表示 SMTP 驗證的用戶名。
-
-xp,表示 SMTP 驗證的密碼。
-
-m,表示郵件的內容。
下面是一個定義好的 host - notify - by-email 命令的內容:
/usr/bin/printf "%b" "*Centreon Monitor Notification For HOST*\n\nNotification Type: $NOTIFICATIONTYPE$\n\nHost: $HOSTALIAS$\nAddress: $HOSTADDRESS$\nState: $HOSTSTATE$\n\nDate/Time: $LONGDATETIME$\n\nAdditional Info:\n\n$HOSTOUTPUT$" | /usr/local/bin/sendEmail -f www@163.com -t $CONTACTEMAIL$ -s smtp.163.com -u "** HOST $NOTIFICATIONTYPE$ alert - $HOSTNAME$ is $HOSTSTATE$ **" -xu www@163.com -xp 'zzzzzz' -o tls=no
在 Configuration→Commands→Notifications 中,編輯“host-notify-by-email”內容如下圖所示:

下面是一個定義好的 service-notify-by-email 命令的內容:
/usr/bin/printf "%b" "*Centreon Monitor Notification For Service*\n\nNotification Type: $NOTIFICATIONTYPE$\n\nService: $SERVICEDESC$\nHost: $HOSTALIAS$\nAddress: $HOSTADDRESS$\nState: $SERVICESTATE$\n\nDate/Time: $LONGDATETIME$\n\nAdditional Info:\n\n$SERVICEOUTPUT$" | /usr/local/bin/sendEmail -f www@163.com -t $CONTACTEMAIL$ -s smtp.163.com -u "** $NOTIFICATIONTYPE$ alert - $HOSTALIAS$/$SERVICEDESC$ is $SERVICESTATE$ **" -xu www@163.com -xp 'xxxxxx' -o tls=no
在 Configuration→Commands→Notifications 中,編輯“service-notify-by-email”內容如下圖所示:

告警通知配置完畢后,重啟 Centreon 監控引擎,以使告警配置生效,到這里為止,關於 Centreon 郵件報警方式的配置已介紹完畢。
通過 Centreon 實現對 Hadoop 的監控
上個課時我介紹了 Ganglia 的使用,以及如何從 Ganglia 監控指標中獲取監控數據。下面我將介紹通過監控系統來實現對 Ganglia 監控數據的告警配置。
Centreon 對 Hadoop 的監控,主要是通過編寫腳本的形式去訪問 HDFS 的 50070 端口,以及 yarn 的 8080 端口,來實現對 NameNode、Datanode 以及 Resourcemanager 和 Nodemanager 的監控。
這里假定 Hadoop 集群中主 Namenode 的 IP 為 172.16.213.31,備 Namenode 的 IP 為172.16.213.41,Resourcemanager 節點的 IP 為 172.16.213.41,這些 IP 會在下面的配置中用到。
下面我會分享幾個監控 Hadoop 的腳本,以及如何將腳本集成到 Centreon 中進行故障告警和通知。
1. 監控 Namenode 運行狀態
首先,在監控服務器的 Centreon Web 界面選擇 Configuration→Commands→Checks,然后點擊 Add 按鈕新建一個 Command,如下圖所示。

在創建 check_hadoop_namenodestate 命令過程中,需要使用一個 perl 腳本 check_hadoop_namenode_state.pl(本課時所有腳本都可點擊這里下載,將下載下來的文件和目錄都放到 Centreon 服務器的 /usr/lib/nagios/plugins 目錄下),此腳本其中的“-H”表示主機地址,后面的參數 $ARG1$ 表示 namenode 的狀態,有兩種狀態,即 active 和 standby。此腳本用來檢測高可用 Namenode 的主、備是否發生切換,如果主、備發生切換,則意味着 Namenode 可能出現問題,所以要做好主備的狀態監控。
接着,開始添加 check_hanamenode_active 服務,如下圖所示:

注意,這里添加的服務對應的主機是 172.16.213.31,此主機是 Namenode 的主節點,因此它的狀態應該是 active,注意此服務在檢查命令配置項中,添加剛剛配置好的那個命令即可。
然后,繼續添加第二個服務 check_hanamenode_standby,此服務用來檢查 Namenode 備機運行狀態,如下圖所示:

配置完畢后,對 Namenode 主、備運行狀態已經配置完成。對 Namenode 監控,還需要及時了解 HDFS 數據塊狀態(是否丟失塊、出現壞塊、未復制的塊等),這個功能需要通過另一個腳本實現,該腳本為 check_hadoop_replication.pl。
要使用這個腳本,仍然是先創建一個監控命令,在 Centreon Web 界面選擇 Configuration→Commands→Checks,然后點擊 Add 按鈕新建一個 Command,如下圖所示。

在這個界面,我們調用了剛上傳到服務器上的那個腳本,此腳本中 -H 是指定 Namenode 服務器的 IP,-P 是指定 Namenode 的 Web 端口,默認是 50070,-w 是 HDFS 數據塊故障狀態的警告值,-c 是 HDFS 數據塊故障狀態的故障值。
接着,開始創建服務,這里創建了一個 check_hadoop_namenode_replicatedblocks 服務,如下圖所示:

此服務中,連接了兩個主機,也就是對這兩個主機的 HDFS 數據塊狀態進行定期監控和檢查。
2. 監控 Datanode 運行狀態
對 Datanode 的監控主要監控節點服務是否宕機,如果發現 Datanode 服務宕機,那么需要馬上處理,所以對 Datanode 的監控至關重要。要監控 Datanode,需借助一個腳本 check_hadoop_datanodes.pl,此腳本已包含在上面那個下載地址中。
接着,在 Centreon Web 界面選擇 Configuration→Commands→Checks,然后點擊 Add 按鈕新建一個 Command,如下圖所示。

這里創建了一個命令 check_hadoop_deaddatanode,然后將上面腳本引用進來即可,參數含義不再介紹。
命令創建完成,接着,開始創建監控服務,這里我創建的服務名稱是 check_hadoop_datanode_dead,將此服務連接到 172.16.213.31 主機上,如下圖所示:

注意,在上圖中,ARG1 代表警告閾值,ARG2 代表故障閾值,這個可根據實際情況進行修改。配置完畢后,對 Datanode 的監控就添加完成了。
3. 監控 resourcemanager、nodemanager 狀態
對於 Hadoop 的分布式計算,必須監控的服務有兩個,即 resourcemanager 和 nodemanager。這里首先介紹如何監控 resourcemanager 服務,對該服務的監控,主要是監控 resourcemanager 對 JVM 內存資源的使用狀態,當 JVM 使用資源過大時,需要考慮計算資源是否充足,是否存在異常任務等。
因此這里我主要監控 resourcemanager 的 JVM 使用狀態,要監控 resourcemanager 的 JVM 內存資源狀態,需借助一個腳本 check_hadoop_yarn_resource_manager_heap.pl,此腳本已包含在上面那個下載地址中。
接着,在 Centreon Web 界面選擇 Configuration→Commands→Checks,然后點擊 Add 按鈕新建一個 Command,如下圖所示:

在上圖中,通過創建一個命令將 check_hadoop_yarn_resource_manager_heap.pl 腳本引用進來了,其中 -t 參數表示超時時間。
然后,開始創建監控 resourcemanager 的 JVM 內存狀態的服務,這里我創建的服務名稱是 check_yarn_resourcemanager_heap,將此服務連接到 172.16.213.41 主機上,如下圖所示:
-
ARG1 參數代表的含義是超時時間,單位是秒;
-
ARG2 參數代表的含義是警告閾值,這個值是百分比;
-
ARG3 參數代表的含義是故障閾值,對應的值也是百分比。

最后,再來看看如何監控 Nodemanager,在實際運行中,也會出現各種問題,比如 Nodemanager 所在的節點可能出現磁盤只讀,此時該節點就會自動進入黑名單,或者出現內存溢出,Nodemanager 服務就會自動退出。針對這些情況,運維需要及時發現、及時處理,所以對 Nodemanager 的監控至關重要,同樣,需要借助一個腳本 check_hadoop_yarn_node_managers.pl,此腳本已包含在上面那個下載地址中。
然后,在 Centreon Web 界面選擇 Configuration→Commands→Checks,點擊 Add 新建一個 Command,如下圖所示。

命令創建完畢后,接下來開始創建服務,引入此命令,這里創建一個 check_yarn_lostnodemanager 服務,如下圖所示:

注意,check_hadoop_yarn_node_managers.pl 腳本的實現是對 Nodemanager 的監控,借助了 Yarn 的 8080 端口,因此,這里監控連接主機是 172.16.213.41,而 ARG1、ARG2 和 ARG3 的含義依次是超時時間、警告閾值和故障閾值。
總結
本課時主要講解了監控系統 Centreon 的使用,以及如何在 Centreon 上監控 Hadoop 的 NameNode、Datanode、resourcemanager 及 nodemanager 服務,通過 Ganglia 獲取 Hadoop 集群數據,然后結合 Centreon,就可以實現將監控指標進行實時告警,Ganglia+Centreon 的組合是大數據運維監控環境下最常用的開源監控方案。
