ElasticSearch 如何配置Uptime 監(jiān)控組件可用性
點(diǎn)擊上方"程序員歷小冰",選擇“置頂或者星標(biāo)”
你的關(guān)注意義重大!
本文收錄至《Elastic Stack 實(shí)戰(zhàn)手冊》,歡迎和我一起解鎖開發(fā)者共創(chuàng)書籍,系統(tǒng)學(xué)習(xí) Elasticsearch,地址詳見文末。

現(xiàn)在互聯(lián)網(wǎng)架構(gòu)隨著用戶的增加,而越來越復(fù)雜,可能要有成千上萬個(gè)不同的組件和不同的實(shí)例,對這些組件可用性的監(jiān)控是提供高可用服務(wù)的關(guān)鍵之一,Elastic 為此推出了 Uptime App。
Elasticsearch 使用 Heartbeat 進(jìn)行組件的監(jiān)控。
Heartbeat 也就是我們通常所說的心跳,通過 Hearteat 我們可以判斷一個(gè)網(wǎng)絡(luò)組件,當(dāng)前是否存活,是否可以對外正常提供服務(wù)。
Heartbeat 是一個(gè)輕量級的數(shù)據(jù)收集器。它用來幫我們進(jìn)行 Uptime 的健康監(jiān)控。它可以定期通過 HTTP、TCP 或 ICMP 等方式驗(yàn)證組件是否處于運(yùn)行狀態(tài),然后將收集到的狀態(tài)和信息上報(bào)給 Elasticsearch。
而 Kibana 中的 Uptime app 則為我們提供了查看可用性數(shù)據(jù)的儀表板,以監(jiān)控服務(wù)器或服務(wù)的正常運(yùn)行,并提供了報(bào)警功能支持。
Elasticsearch 使用 Heartbeat 來進(jìn)行 Uptime 的監(jiān)控的架構(gòu)可以表述如下:

下面,我們將依次講解 Uptime App 的安裝,Heartbeat 的配置和各類監(jiān)控組件的配置。
安裝 Uptime App
如果我們打開我們的 Kibana 并點(diǎn)擊 Uptime 應(yīng)用,那么第一次打開的時(shí)候,我們可以看到,如下的界面。

點(diǎn)擊 Install Heartbeat,就會跳轉(zhuǎn)到配置 Uptime Monitors 的文檔界面,你可以按照這個(gè)界面上的步驟進(jìn)行 Heartbeat 的安裝,配置,啟動和測試 Kibana 是否接收到 Heartbeat 上傳的數(shù)據(jù)。

Heartbeat 在不同平臺有多種安裝方式,比如說 macOS、DEB、RPM 和 Windows 等,我們這里介紹最為常用的 Docker 安裝方式,其后續(xù)部署和啟動步驟則大同小異,讀者可以自行根據(jù)需要進(jìn)行實(shí)踐。
需要注意的是,安裝的 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 參數(shù),掛載了宿主機(jī)文件系統(tǒng)路徑下的 heartbeat.docker.yml 文件到容器的對應(yīng)路徑下,這是在為 Heartbeat 提供配置文件。具體配置文件內(nèi)容后續(xù)繼續(xù)講解,我們這里先演示完整個(gè) Uptime 安裝流程。
啟動 Heartbeat 容器后,通過 docker ps 和 docker exec 命令可以進(jìn)入到相應(yīng)的容器內(nèi)部。
docker ps
docker exec -it 5b3785357c26(要替換為自己ps命令輸出的CONTAINER ID) bash
然后,通過 ls 命令,我們可以看到 Heartbeat 的整體文件結(jié)構(gòu)。
bash-4.2$ ls
LICENSE.txt NOTICE.txt README.md data fields.yml heartbeat
heartbeat.reference.yml heartbeat.yml kibana logs monitors.d
在目錄中,有一個(gè)叫做 heartbeat.yml 的配置文件,這個(gè)文件就是上邊通過 --volume 參數(shù)掛載進(jìn)來的。同時(shí)在 monitor.d 目錄中,有一些不同監(jiān)控器配置的配置文件案例可供大家參考,heartbeat.reference.yaml 中則是最全的配置案例。
接著,我們要使用如下命令來啟動 Heartbeat,讓它開始收集數(shù)據(jù)并向配置文件中指定的 Elasticsearch 中上報(bào)數(shù)據(jù)。
./heartbeat setup
./heartbeat -e
查看上述命令的輸出日志沒有什么異常后,可以再次來到 Uptime Monitors 界面,點(diǎn)擊其 Check data 按鈕檢查是否接收到了數(shù)據(jù),如果接受到了數(shù)據(jù),則可以點(diǎn)擊 Uptime App 按鈕,前往 Uptime App 界面查看詳細(xì)數(shù)據(jù)。

運(yùn)行過一段時(shí)間的 Uptime App 界面如下圖所示。

我們可以看到界面分為兩大部分,上半部分是統(tǒng)計(jì)區(qū),通過餅圖和柱狀圖展示了當(dāng)前監(jiān)控器 Monitor 的狀態(tài)和過去一段時(shí)間中 Monitor 的狀態(tài)。而下半部分是具體的 Monitor 列表,一共有兩個(gè) Monitors,分別是監(jiān)聽 taobao 網(wǎng)和 aliyun 網(wǎng)站,目前兩個(gè)都是 Up 狀態(tài)。
配置 Heartbeat
上邊講解了安裝 Heartbeat 和 Uptime 的整體流程,本小節(jié)詳細(xì)解決一下 Heartbeat 的配置,也就是 heartbeat.yml 文件的配置。
heartbeat.yml 文件一般有兩部分組成:
?監(jiān)控器配置 heartbeat.monitors,配置要監(jiān)控的目標(biāo)和監(jiān)控的方式;?輸出配置 output.elasticsearch,配置數(shù)據(jù)上報(bào)的 Elasticsearch 的地址,用戶名和密碼。
比如說,上一小節(jié)我們啟動 docker 時(shí)指定的 heartbeat.yaml 文件如下所示:
heartbeat.monitors:
- type: http # 使用http方式監(jiān)控,還可以使用 TCP 和 ICMP
schedule: '@every 5s' # 每 5s 抓取一次
urls: # 需要監(jiān)控的 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 知道要檢查的服務(wù),它需要一個(gè) URL 列表。
heartbeat.yaml 中的 heartbeat.monitors 中指定了此配置。如上的 heartbeat.yaml 配置文件,對 cn.aliyun.com 和 www.taobao.com 兩個(gè)網(wǎng)址每隔 5s 進(jìn)行一次 HTTP 檢查。
除了 HTTP 監(jiān)視器,Heartbeat 還可以進(jìn)行 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 監(jiān)視器,可以檢查響應(yīng)代碼(code)、正文(body)和標(biāo)頭(header)。使用 TCP 監(jiān)視器,能定義端口檢查和字符串檢查。
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 調(diào)用一次 https://cn.aliyun.com/ ,并在其 Response 的 Body 中尋找字符串 aliyun。如果沒有找到這個(gè)字符串,則本次檢查未通過。
其他更加詳細(xì)的配置,你可以參考 heartbeat.reference.yml 文件。
阿里云 Elastic Stack 實(shí)戰(zhàn)手冊 https://developer.aliyun.com/topic/elasticstack/playbook
-關(guān)注我
