日志分析系統Loki使用指南
與其他日志系統相比, Loki 的使用方式是有一定差異性的,需要用不同的思維方式。本文分享一下這些差異以及我們應該如何使用
作為 Loki 用戶或操作人員,我們目標應該是使用盡可能少的標簽來存儲日志。
更少的標簽則意味著更小的索引,從而能帶來更好的性能。
以上這些話聽起來可能覺得有問題。因為在我們以往工作中比如使用 elk、數據庫的經驗告訴我們,如果想讓它更快,需要對其建立索引。而Loki 是以完全相反的方式構建和優化的, Loki 的設計目標是保持較低的運營成本和復雜性,這是通過保持非常小的索引并利用商用硬件性能和并行化查詢來實現的。
因此,作為 Loki 的用戶或操作員,在添加標簽之前我一定要三思而后行。
如何查詢給定traceID 的所有日志?
ts=2020-08-25T16:55:42.986960888Z caller=spanlogger.go:53 org_id=29 traceID=2612c3ff044b7d02 method=Store.lookupIdsByMetricNameMatcher level=debug matcher="pod=\"loki-canary-25f2k\"" queries=16
我們可能會想,應該提取traceID作為標簽,然后可以這樣查詢:
{cluster="ops-cluster-1",namespace="loki-dev", traceID=”2612c3ff044b7d02”}
但不建議這么做,這種方式會導致Loki 查詢效率很低,因為它的值就是個無界的,每次請求都會產生新的traceID,這種情況屬于典型無界的動態標簽值,在Loki里面用Cardinality來表示,Cardinality值越高,Loki的查詢效率越低。如果想在日志中查找高基數數據,請使用如下過濾表達式:
{cluster="ops-cluster-1",namespace="loki-dev"} |= “traceID=2612c3ff044b7d02”
提取的內容基數低,能否提取到標簽中?
比如日志級別,只有幾個固定值
{cluster="ops-cluster-1",namespace="loki-dev", level=”debug”}
這里也要注意!因為標簽對索引和存儲具有倍增效應,剛開始的一個日志流,如果使用日志級別標簽后,現在已變成4個日志流,所以在我們添加標簽時要考慮這些,以下是一個示意圖
圖片
盡量使用靜態標簽
靜態標簽開銷更小,在發送到Loki之前,就會獲取相關 lablel,在k8s 中通過 helm 部署,默認采集以下靜態標簽
- 應用名:__meta_kubernetes_pod_label_app
- 命名空間:__meta_kubernetes_namespace
- 節點名稱:__meta_kubernetes_pod_node_name
- pod名稱:__meta_kubernetes_pod_name
- 容器名稱:__meta_kubernetes_pod_container_name
圖片
使用并行化來提高Loki 性能
使用大量數值的標簽是不好的,那么我們如何查詢日志?如果沒有日志沒有索引,查詢能快嗎?
在我們使用ELK 或者其他日志系統時,我們會創建大量的索引來提高查詢速度,但是在 loki 中我們需要忘記這些東西
因為loki 是通過并行化的方式來提交查詢速度的。
圖片
Loki 的超能力是將查詢分解成小塊,并將其并行調度,這樣就可以在小時間內查詢大量的日志數據,最后在進行匯總返回
總結
Loki 利用水平擴展和查詢時間來查詢我們的數據。這與使用多索引的解決方案一樣快嗎?可能不是!但它運行和部署要容易很多,而且還省資源。
Grafana Lab 的 Loki 部分集群的數據,在過去 7 天內,它攝入了 14TB 的數據。該時間段對應的索引使用量約為500MB;14TB 日志的索引可以放入樹莓派的內存中。
這就是為什么Loki專注于保持標簽集較小的原因。也許標簽只能將搜索范圍縮小到 100GB 的日志數據 —但是運行 20 個查詢器(可以以 30GB/s 的速度并行搜索 100GB 數據)比維護一個 14TB 索引要便宜得多,尤其是當我們使用不了幾次的時候。
因此,更少的標簽 = 更好的性能。