Website logo

Robert Chang

技術部落格

Elasticsearch - Elastic Stack 全家桶

Elasticsearch 的全家桶

除了 Elasticsearch 搜尋引擎的本體之外,作為一個上市公司 Elastic 當然不是只靠一個搜尋引擎來打天下。

Elastic Stack 是一個由 Elasticsearch、Kibana、Logstash、Beats 等組成的一個全家桶,這個全家桶可以讓你在搜尋引擎之外,還能夠有更多的功能。

但這些服務都是環繞 Elasticsearch 所打造,就讓我花一些時間來介紹這些服務,以及這些服務可以為 Elasticsearch 帶來什麼樣的功能。

Kibana

Kibana 是 Kiwi + Banana

你可以把 Kibana 當作 Elasticsearch 的 Dashboard,在這個網頁的應用程式中,可以基於 Elasticsearch 建立各種視覺化的圖表,像是圓餅圖、折線圖等等。

例如,可以把網站訪客的流量畫到世界地圖上,並且即時顯示流量 ( 像是 GA4 那樣的效果 )。

也可以依照瀏覽器的種類來歸納網站流量,了解哪些瀏覽器是網站主要受眾所使用的。

Kibana 也提供介面來管理 Elasticsearch 的身份驗證以及授權等等。

簡單來說,可以把 Kibana 當作 Elasticsearch 數據的可視化介面,所有的資料都是基於 Elasticsearch 展開,而這個網頁所做的事情就是使用 REST API 來發送查詢而已。

好處是什麼?大家都知道建立一個 Dashboard 不是一件簡單的事情,Kibana 提供簡單的操作介面,讓我們不需要重複造輪子,實現這些功能其實很辛苦。

甚至不使用 Elasticsearch 的搜尋功能在應用程式,單純讓它搭配 Kibana 做一個監測或是分析的平台,也是很常見的例子!

Logstash

Logstash 原先主要是用於處理應用程式的 Log 並把它送到 Elasticsearch 而聞名。

當然這還是目前的主要使用案例,但 Logstash 已經變成一個更通用的工具,可以想像成它是一個資料處理的通道。

Logstash 本身把接受到的資料視作 事件,而這些事件是由我們自己選擇以及定義。

它可以是 Log, 訂單, 聊天的訊息等等,而這些事件會被 Logstash 處理後並送到一個或多個地方。

一些例子,像是 Elasticsearch, Kafka, HTTP Endpoint 都可以作為目的地發送。

而一個 Logstash 的通道主要包括三個階段,輸入、過濾、輸出

而每一個階段都可以裝上所謂的 『 插件 』,什麼意思呢?

輸入端有輸入的插件:Input plugins

過濾端有過濾的插件:Filter plugins

輸出端有輸出的插件:Output plugins

簡單來說就是,這世界上有太多種的資料格式,CSV, XML, JSON 等族繁不及備載,那該怎麼辦呢?自己寫 Parser 嗎?太累了,一天工時就 8 個小時,不要折磨自己了。

使用這些插件就能夠快速地幫我們:

接受特定格式的資料 > 過濾特定格式的資料 > 輸出特定格式的資料

如下圖所示:

screen shot

我們可以感受一下,下方這是原始的 web server log:

127.0.0.1 - robert [31/Aug/2023:01:16:00 +0800] "GET /services" 200 12345

Logstash 會將這些資料切成局部的區塊,像是這樣

127.0.0.1 | - | robert | [31/Aug/2023:01:16:00 +0800] | GET | /services | 200 | 12345

接著再輸出端轉成 JSON 格式傳送到 Elasticsearch:

{
  "ip_address": "127.0.0.1",
  "user": "robert",
  "http_verb": "GET",
  "request_path": "/services",
  "http_status": 200,
  ...
}

這樣你應該對於 Logstash 在做些什麼有了一些概念了。

X-Pack

這個名字聽起來很酷的東西,可以想像成 Elastic 公司出的超級插件包。

提供了以下幾個大功能:

  1. Security

包含一些驗證以及權限配置的功能,這是很常見的功能。舉例來說,Sales 不需要修改資料的權限,只需要給 read-only 即可。

  1. Monitoring

可以監控包含我們前面提過的服務 Elasticsearch, Kibana, Logstash 等等的 CPU 或是記憶體用量。

  1. Alerting

設置警示,我們可以替任何服務設定任何的警示條件,例如當 Kibana 的 CPU 用量高於 90% 寄送 Email 或是 Slack 的訊息通知。

  1. Reporting

替視覺化的 Kibana 產生 PDF 或是 CSV 等等的文件方便報告或是瀏覽,像 Alert 一樣可以設定條件,每週或是每兩週產生一次特定的報告,發送到指定的地點,還可以加上公司的 Logo 看起來更專業。

  1. Machine Learning

我們有在前一篇文章中提到搭配 Elastic 全家桶可以做到機器學習的提前警示功能,這就是 X-Pack 所提供的。

如下圖所示,它可以透過過往的流量來學習,找到不尋常的地方提前用 Email 或是 Slack 警示:

screen shot

甚至還可以進行預測分析,猜測到什麼時候的流量會上升,以便我們可以更方便的提前擴展服務。

  1. Graph

分析資料的關聯性,可以替我們的資料進行分析,找到之間的關聯性。

舉例來說,你喜歡聽 Metallica,那你可能也會喜歡聽 AC/DC。

Metallica 美國重金屬樂團,就是不聽的人會覺得很吵的那種

AC/DC 澳洲搖滾樂團

但這和熱門程度是不一樣的,Beatles 是一個很紅的樂團,但他和 Metallica 或 AC/DC 之間的關聯性並沒有那麼高 ( 因為曲風的關係 )

Graph 所做的事情就是分析出那些真正相關的資料,而且它也提供 API 讓你可以在應用程式之中進行使用,像是基於用戶的購買歷史推薦相關的產品,而不是熱門的產品。

  1. Elasticsearch SQL

這個簡單來說就是讓你可以寫 RDBMS 的 SQL,它會幫你轉換成 Elasticsearch 的查詢語法,並且返回結果;喔對了,它還有提供翻譯的 API,可以幫你翻譯回傳的內容。

Beats

Beat 可以想像成是在 Logstash 的前一個關卡,負責搜集資料;你可能會有疑問,剛剛不是說 Logstash 就有輸入的插件,代表 Logstash 也可以接受不同種類的資料才對。

是的,沒有錯,但這兩者之間佔用的效能差別很大,Logstash 可以做得事情更多,像是過濾、輸出等等;某些情況下用 Logstash 去搜集資料有點殺雞焉用牛刀的味道。

所以 Beat 更像是在 Logstash 前面的小幫手,幫忙搜集各種資料在送給 Logstash 處理。

Beat 有各種不同的款式,像是 Filebeat 就是專門搜集 Web server log, database log 等等,也有像是 Metricbeat 專門來搜集系統的 CPU 以及記憶體用量。

總而言之,就是一個更輕便更簡單的資料搜集器,降低 Logstash 搜集資料的負擔。

結語

整個 Elastic 全家桶是非常龐大的,可以說是一個非常完整的生態圈。

我們可以想像整體的執行順序是:

Rawlog -> Filebeat -> Logstash ( filter ) -> Elasticsearch <- Kibana ( read )

這樣有比較有概念了嗎?

上一篇文章Elasticsearch - 這是什麼?用在哪?

下一篇文章Elasticsearch - 各環境基本安裝指南