Grafana Loki 架構詳解,比 ES 成本低很多

SRETalk發表於2024-08-01

在本指南中,我們將詳細瞭解Grafana Loki架構及其元件。

在公司的分散式環境中,儲存和管理來自各種系統資源的日誌是一項具有挑戰性的任務。為了簡化這項任務,引入了一個稱為日誌聚合的概念,它從各種系統資源中收集、儲存、管理日誌。有各種各樣的日誌聚合工具,其中一個工具是 Grafana Loki,透過本文我們一起探索一下 Loki。

什麼是 Grafana Loki?

Grafana Loki 是一個開源的日誌收集系統,其功能是收集、儲存和查詢日誌。Grafana Loki 壓縮日誌並將日誌儲存在塊中,並將它們儲存在檔案系統或 AWS S3 等後端儲存中。

塊是一個壓縮檔案,其中包含基於日誌卷的日誌條目,因此當塊大小達到其大小限制時,它會將日誌儲存在另一個塊中。每當儲存一個塊時,它都會為每個塊建立一個索引。索引不包含日誌的內容,它只包含時間戳、塊的標籤和塊的位置。

日誌的預設保留期限為24小時,最短期限為1小時,最長可延長至30天。Loki 橫向擴充套件並具有其查詢語言 LogQL。

Grafana Loki 架構

下圖顯示了 Grafana Loki 的架構以及它如何收集日誌的工作流程。

loki-component-2-1

  • 現在,讓我們看看 Grafana Loki Logging 是如何工作的。該圖顯示了 Grafana Loki 如何收集、儲存、查詢和視覺化日誌。
  • 在 Grafana Loki 中,agent 負責從檔案、容器、pod、應用程式和系統日誌中收集日誌。
  • Loki 使用日誌收集代理(agent)來收集日誌,如果您在 Kubernetes 中使用 Loki,代理將作為守護程式集(Daemonset)部署,因為我們需要來自叢集每個可用節點的日誌。
  • Promtail 是該架構中使用的代理(agent),Promtail 收集日誌,然後過濾和壓縮日誌以節省儲存空間。
  • 壓縮日誌後,它會為日誌提供一個標籤並將其傳送給 Loki。
  • 從 Promtail 接收到日誌之後,Loki 將每個日誌儲存為一個塊,該塊將日誌訊息收集在一個檔案中,以節省儲存空間和有效檢索。
  • 它還為塊提供標籤和時間戳。每當儲存塊時,它都會為每個塊建立一個索引,其中包含塊的時間戳、標籤和位置。
  • Loki 使用 LogQL 查詢語言查詢日誌,LogQL 允許我們根據我們選擇的標籤和值過濾、聚合和分析日誌。
  • 透過將 Loki 新增到 Grafana,您可以視覺化查詢的日誌或使用 LogCLI 從 CLI 查詢日誌。

Grafana Loki 元件

Grafana 包含很多元件,promtail, distributor, ingester, querier, ruler, query frontend, Grafana,讓我們看一下這些元件。

Promtail

Promtail 是充當 Loki 的日誌代理(agent)的重要元件。它的功能是從系統中收集每個日誌,標記它,然後將其傳送給 Loki。Loki 從本地日誌檔案和系統日誌中收集日誌。

您必須在要收集日誌的每個系統中安裝 Promtail,同樣,如果您在 Kubernetes 上使用 Loki,則必須在每個節點中部署 Promtail 作為守護程序集(Daemonset)。

Distributor

Distributor 是一個無狀態元件,負責處理和驗證從日誌代理(如 Promtail)接收的日誌,並將日誌分發到 ingester。

當 Distributor 收到日誌時,它首先驗證日誌是否符合配置,例如有效標籤、不是較舊的時間戳以及日誌是否太長。

驗證完成後,Distributor 會根據一致性雜湊將日誌分發到每個 ingester,以確保平均分配給每個可用的 ingester。

Ingester

Ingester 負責在其檔案系統上儲存和索引從 Distributor 收到的日誌,並定期將日誌傳輸到永續性儲存(長期儲存),如 S3。

Ingester 根據配置設定保留策略(自動日誌刪除時間)。

它使用時間序列資料庫以一定的結構格式儲存日誌,這簡化了高效查詢和日誌過期的過程。

Ruler

Ruler 是 Loki 的監控和告警元件,其作用是記錄指標並根據收到的日誌資料觸發告警。它不是直接衡量指標,而是將日誌資料轉換為指標。

Ruler 監控日誌並在檢測到任何問題時發出通知,並透過電子郵件或 Slack 傳送通知。

Querier

顧名思義,Querier 負責使用 LogQL 查詢語言從儲存和 ingester 中查詢日誌。它根據使用者查詢(如時間戳、標籤等)過濾和聚合日誌。

查詢器快取之前的查詢,以防止一次又一次地查詢相同的日誌,它只查詢一次具有相同時間戳、標籤和日誌訊息的日誌。

Query Frontend

Query Frontend 是一個與使用者互動的無狀態元件,它負責處理查詢請求、執行查詢以及透過 Grafana 儀表板視覺化日誌。

Query Frontend 將大型查詢拆分為多個較小的查詢,並同時執行所有查詢,這可以防止大型查詢在單個查詢中導致記憶體問題,並有助於加快執行速度。

Grafana

Grafana 是一個開源工具,可幫助查詢、視覺化和監控日誌。我們可以將 Loki 與 Grafana 整合,並在儀表板、圖表等方式視覺化日誌資料。

Grafana 使用查詢語言 LogQL 與 Grafana 整合,我們也可以在 Grafana 中編寫 LogQL 查詢來過濾和查詢日誌。

Log Storage

Loki 儲存日誌資料,提高查詢和接收日誌的效率。它將日誌資料壓縮成塊,根據時間進行組織,併為其提供標籤和時間戳。然後,它以鍵值對格式為每個塊建立一個索引,其中塊時間戳和標籤等。

例如,將塊的索引視為一本書的索引。

Chunks 和 Index 可以儲存在各種後端物件儲存或檔案系統中。

一旦儲存了塊,它就會為資料建立一個保留期,並根據保留期自動刪除。

如果您使用檔案系統作為儲存,則塊和索引的預設儲存路徑是 /var/lib/loki/chunks/var/lib/loki/index

如何在 Loki 中儲存塊和索引的示例

例如,假設您正在使用一個 Web 伺服器,該伺服器生成一個包含時間戳、HTTP 請求方法、URL 和響應程式碼的日誌。

每組日誌條目將被儲存為多個塊,如下面的 JSON 格式:

{
  "timestamp": "2023-11-20T1:02:33.456Z",
  "labels": {
    "method": "GET",
    "url": "/products",
    "status": 200
  },
  "entry": "Request received for /products, responded with 200 OK"
}

塊檔名將採用此格式:

2023-11-20T1-00-00.000Z-2023-11-20T1-15-00.000Z.chunk

顧名思義,該塊包含 2023 年 11 月 20 日凌晨 1 點至凌晨 1:15 的日誌。

chunk 建立之後,會為每個 chunk 建立一個 index,index 會儲存 chunk 的時間戳、標籤和位置。如下所示:

{
  "2023-11-20T1:02:33.456Z": {
    "chunk": "2023-11-20T1-00-00.000Z-2023-11-20T1-15-00.000Z.chunk",
    "labels": {
      "method": "GET",
      "url": "/products",
      "status": 200
    }
  }
}

如上面示例索引檔案所示,它只儲存塊檔名、時間戳和標籤,不會儲存日誌訊息。

Grafana Loki 的特點

可擴充套件性

Loki 可以根據日誌的數量進行擴充套件,如果日誌量比較大,水平擴充套件 ingester 模組即可,因此您不必擔心過多的日誌流量會減慢該過程。

它將日誌分佈在多個攝取器(ingester)之間,以防止在節點故障期間由於流量過大而丟失資料,並且還將日誌重定向到健康的攝取器節點,以防止停機和資料丟失。

效率

由於 Loki 將日誌條目壓縮並儲存為塊,因此即使對於大資料,它也增加了儲存空間並減少了檢索日誌所花費的時間。在索引的幫助下,Loki 可以根據時間戳和標籤輕鬆定位查詢到的日誌。

多租戶

Loki 可以同時收集和分析來自各種來源(如 pod、容器、應用程式等)的日誌,因此我們不必為不同的資源配置單獨的日誌代理。

儘管它從各種來源收集日誌,但它會根據來源單獨儲存日誌,例如容器和應用程式的單獨儲存檔案。

日誌輪轉

Loki 在儲存塊時為塊分配了保留策略,它會根據保留期自動刪除舊日誌,這有助於節省儲存空間。

如果您不想刪除舊日誌,也可以將日誌儲存在長期物件儲存中,例如 AWS S3 和其他物件儲存。

Grafana Loki 和 EFK Stack 之間的區別

現在,讓我們看看是什麼讓 Grafana Loki 與 EFK Stack 不同。Grafana Loki 和 EFK Stack 之間的區別如下:

Grafana LokiEFK Stack
Loki 收集日誌、儲存日誌,使用 Grafana 視覺化日誌 EFK Stack 使用 Elasticsearch 來收集和儲存日誌,使用 Logstash 來解析和處理日誌,使用 Kibana 來視覺化日誌
Loki 壓縮日誌並將它們儲存為塊 EFK Stack 將每個日誌條目儲存在 Elasticsearch 的 JSON 檔案中
Loki 以其效率和可擴充套件性而聞名 EKS以其適應各種環境的能力而聞名
水平縮放 垂直縮放
Loki 使用分散式架構 EFK Stack 使用客戶端-伺服器架構
資源使用率低 資源使用率高
使用 Grafana 視覺化日誌 使用 Kibana 視覺化日誌

譯者注:感覺作者這個比較有失偏頗,各位讀者兼聽則明哈

總結

總的來說,Grafana Loki 是一個強大的開源工具,用於收集、儲存、查詢和視覺化日誌。

它具有可擴充套件性、日誌壓縮、多租戶支援和自動日誌輪換等功能,可實現有效的監控和故障排除。

我相信這個部落格可以讓您更好地瞭解 Grafana Loki 及其功能。

英文原文:https://devopscube.com/grafana-loki-architecture/
中文譯文:https://flashcat.cloud/blog/grafana-loki-architecture/
譯者:巴輝特

本部落格出自快貓星雲的小夥伴們,快貓星雲是一家專注在監控/可觀測性領域的初創公司,其團隊是開源專案 Open-Falcon、Nightingale 的創始團隊。如果您想要採購監控/可觀測性相關的產品方案,歡迎 聯絡我們做產品技術交流

相關文章