開發與維運

Uptime-Elastic Stack 實戰手冊

作者:張天

現在互聯網架構隨著用戶的增加,而越來越複雜,可能要有成千上萬個不同的組件和不同的實例,對這些組件可用性的監控是提供高可用服務的關鍵之一,Elastic 為此推出了 Uptime App。

Elasticsearch 使用 Heartbeat 進行組件的監控。

Heartbeat 也就是我們通常所說的心跳,通過 Hearteat 我們可以判斷一個網絡組件,當前是否存活,是否可以對外正常提供服務。

Heartbeat 是一個輕量級的數據收集器。它用來幫我們進行 Uptime 的健康監控。它可以定期通過 HTTP、TCP 或 ICMP 等方式驗證組件是否處於運行狀態,然後將收集到的狀態和信息上報給 Elasticsearch。

而 Kibana 中的 Uptime app 則為我們提供了查看可用性數據的儀表板,以監控服務器或服務的正常運行,並提供了報警功能支持。

Elasticsearch 使用 Heartbeat 來進行 Uptime 的監控的架構可以表述如下:

Uptime 監控示意圖

下面,我們將依次講解 Uptime App 的安裝,Heartbeat 的配置和各類監控組件的配置。

安裝 Uptime App

如果我們打開我們的 Kibana 並點擊 Uptime 應用,那麼第一次打開的時候,我們可以看到,如下的界面。

點擊 Install Heartbeat,就會跳轉到配置 Uptime Monitors 的文檔界面,你可以按照這個界面上的步驟進行 Heartbeat 的安裝,配置,啟動和測試 Kibana 是否接收到 Heartbeat 上傳的數據。

Heartbeat 在不同平臺有多種安裝方式,比如說 macOS、DEB、RPM 和 Windows 等,我們這裡介紹最為常用的 Docker 安裝方式,其後續部署和啟動步驟則大同小異,讀者可以自行根據需要進行實踐。

需要注意的是,安裝的 Heartbeat 必須和 Elasticsearch 或 Kibana 版本相同,所以我們這裡選取 heartbeat:7.10.0 版本的鏡像。

docker pull docker.elastic.co/beats/heartbeat:7.10.0

接著,我們可以使用如下命令啟動 Heartbeat 容器。

docker run -d   --name=heartbeat   --user=heartbeat   
--volume="/tmp/heartbeat.docker.yml:/usr/share/heartbeat/heartbeat.yml:ro"   
docker.elastic.co/beats/heartbeat:7.10.0   --strict.perms=false

這裡使用了 docker 的 --volume 參數,掛載了宿主機文件系統路徑下的 heartbeat.docker.yml 文件到容器的對應路徑下,這是在為 Heartbeat 提供配置文件。具體配置文件內容後續繼續講解,我們這裡先演示完整個 Uptime 安裝流程。

啟動 Heartbeat 容器後,通過 docker ps 和 docker exec 命令可以進入到相應的容器內部。

docker ps
docker exec -it 5b3785357c26(要替換為自己ps命令輸出的CONTAINER ID) bash

然後,通過 ls 命令,我們可以看到 Heartbeat 的整體文件結構。

bash-4.2$ ls
LICENSE.txt  NOTICE.txt  README.md  data  fields.yml  heartbeat  
heartbeat.reference.yml  heartbeat.yml  kibana  logs  monitors.d

在目錄中,有一個叫做 heartbeat.yml 的配置文件,這個文件就是上邊通過 --volume 參數掛載進來的。同時在 monitor.d 目錄中,有一些不同監控器配置的配置文件案例可供大家參考,heartbeat.reference.yaml 中則是最全的配置案例。

接著,我們要使用如下命令來啟動 Heartbeat,讓它開始收集數據並向配置文件中指定的 Elasticsearch 中上報數據。

./heartbeat setup
./heartbeat -e

查看上述命令的輸出日誌沒有什麼異常後,可以再次來到 Uptime Monitors 界面,點擊其 Check data 按鈕檢查是否接收到了數據,如果接受到了數據,則可以點擊 Uptime App 按鈕,前往 Uptime App 界面查看詳細數據。

運行過一段時間的 Uptime App 界面如下圖所示。

我們可以看到界面分為兩大部分,上半部分是統計區,通過餅圖和柱狀圖展示了當前監控器 Monitor 的狀態和過去一段時間中 Monitor 的狀態。而下半部分是具體的 Monitor 列表,一共有兩個 Monitors,分別是監聽 taobao 網和 aliyun 網站,目前兩個都是 Up 狀態。

配置 Heartbeat

上邊講解了安裝 Heartbeat 和 Uptime 的整體流程,本小節詳細解決一下 Heartbeat 的配置,也就是 heartbeat.yml 文件的配置。

heartbeat.yml 文件一般有兩部分組成:

  • 監控器配置 heartbeat.monitors,配置要監控的目標和監控的方式;
  • 輸出配置 output.elasticsearch,配置數據上報的 Elasticsearch 的地址,用戶名和密碼。

比如說,上一小節我們啟動 docker 時指定的 heartbeat.yaml 文件如下所示:

heartbeat.monitors:
- type: http # 使用http方式監控,還可以使用 TCP 和 ICMP
  schedule: '@every 5s' # 每 5s 抓取一次
  urls: # 需要監控的 url 地址
    - https://cn.aliyun.com/
    - https://www.taobao.com/

output.elasticsearch:
  hosts: '${ELASTICSEARCH_HOSTS:http://es-cn-n6w24fib900797tgz.public.elasticsearch.aliyuncs.com:9200}'
  username: '${ELASTICSEARCH_USERNAME:111}'
  password: '${ELASTICSEARCH_PASSWORD:111}'

為了使 Heartbeat 知道要檢查的服務,它需要一個 URL 列表。

heartbeat.yaml 中的 heartbeat.monitors 中指定了此配置。 如上的 heartbeat.yaml 配置文件,對 cn.aliyun.com 和 www.taobao.com 兩個網址每隔 5s 進行一次 HTTP 檢查。

除了 HTTP 監視器,Heartbeat 還可以進行 TCP 和 ICMP 類型的檢查。

heartbeat.monitors:
- type: icmp
  schedule: '@every 5s'
  hosts:
    - http://cn.aliyun.com/
    - http://www.taobao.com/
- type: tcp
  schedule: '@every 5s'
  hosts:
    - 127.0.0.1:8080

此外,它還支持定義不同的檢查語句,例如,使用 HTTP 監視器,可以檢查響應代碼(code)、正文(body)和標頭(header)。 使用 TCP 監視器,能定義端口檢查和字符串檢查。

heartbeat.monitors:
- type: http
  schedule: '@every 5s'
  urls:
    - https://cn.aliyun.com/
  # request details:
  check.request:
       method: GET
  check.response:
       body: "aliyun"  

如上的配置, Heartbeat 會每 5s 使用 GET 調用一次 https://cn.aliyun.com/ ,並在其 Response 的 Body 中尋找字符串 aliyun。如果沒有找到這個字符串,則本次檢查未通過。

其他更加詳細的配置,你可以參考 heartbeat.reference.yml 文件。

Leave a Reply

Your email address will not be published. Required fields are marked *