日志分析系統(tǒng)Loki使用指南
與其他日志系統(tǒng)相比, Loki 的使用方式是有一定差異性的,需要用不同的思維方式。本文分享一下這些差異以及我們應(yīng)該如何使用
作為 Loki 用戶或操作人員,我們目標(biāo)應(yīng)該是使用盡可能少的標(biāo)簽來(lái)存儲(chǔ)日志。
更少的標(biāo)簽則意味著更小的索引,從而能帶來(lái)更好的性能。
以上這些話聽(tīng)起來(lái)可能覺(jué)得有問(wèn)題。因?yàn)樵谖覀円酝ぷ髦斜热缡褂?elk、數(shù)據(jù)庫(kù)的經(jīng)驗(yàn)告訴我們,如果想讓它更快,需要對(duì)其建立索引。而Loki 是以完全相反的方式構(gòu)建和優(yōu)化的, Loki 的設(shè)計(jì)目標(biāo)是保持較低的運(yùn)營(yíng)成本和復(fù)雜性,這是通過(guò)保持非常小的索引并利用商用硬件性能和并行化查詢來(lái)實(shí)現(xiàn)的。
因此,作為 Loki 的用戶或操作員,在添加標(biāo)簽之前我一定要三思而后行。
如何查詢給定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
我們可能會(huì)想,應(yīng)該提取traceID作為標(biāo)簽,然后可以這樣查詢:
{cluster="ops-cluster-1",namespace="loki-dev", traceID=”2612c3ff044b7d02”}
但不建議這么做,這種方式會(huì)導(dǎo)致Loki 查詢效率很低,因?yàn)樗闹稻褪莻€(gè)無(wú)界的,每次請(qǐng)求都會(huì)產(chǎn)生新的traceID,這種情況屬于典型無(wú)界的動(dòng)態(tài)標(biāo)簽值,在Loki里面用Cardinality來(lái)表示,Cardinality值越高,Loki的查詢效率越低。如果想在日志中查找高基數(shù)數(shù)據(jù),請(qǐng)使用如下過(guò)濾表達(dá)式:
{cluster="ops-cluster-1",namespace="loki-dev"} |= “traceID=2612c3ff044b7d02”
提取的內(nèi)容基數(shù)低,能否提取到標(biāo)簽中?
比如日志級(jí)別,只有幾個(gè)固定值
{cluster="ops-cluster-1",namespace="loki-dev", level=”debug”}
這里也要注意!因?yàn)闃?biāo)簽對(duì)索引和存儲(chǔ)具有倍增效應(yīng),剛開(kāi)始的一個(gè)日志流,如果使用日志級(jí)別標(biāo)簽后,現(xiàn)在已變成4個(gè)日志流,所以在我們添加標(biāo)簽時(shí)要考慮這些,以下是一個(gè)示意圖
圖片
盡量使用靜態(tài)標(biāo)簽
靜態(tài)標(biāo)簽開(kāi)銷更小,在發(fā)送到Loki之前,就會(huì)獲取相關(guān) lablel,在k8s 中通過(guò) helm 部署,默認(rèn)采集以下靜態(tài)標(biāo)簽
- 應(yīng)用名:__meta_kubernetes_pod_label_app
- 命名空間:__meta_kubernetes_namespace
- 節(jié)點(diǎn)名稱:__meta_kubernetes_pod_node_name
- pod名稱:__meta_kubernetes_pod_name
- 容器名稱:__meta_kubernetes_pod_container_name
圖片
使用并行化來(lái)提高Loki 性能
使用大量數(shù)值的標(biāo)簽是不好的,那么我們?nèi)绾尾樵內(nèi)罩??如果沒(méi)有日志沒(méi)有索引,查詢能快嗎?
在我們使用ELK 或者其他日志系統(tǒng)時(shí),我們會(huì)創(chuàng)建大量的索引來(lái)提高查詢速度,但是在 loki 中我們需要忘記這些東西
因?yàn)閘oki 是通過(guò)并行化的方式來(lái)提交查詢速度的。
圖片
Loki 的超能力是將查詢分解成小塊,并將其并行調(diào)度,這樣就可以在小時(shí)間內(nèi)查詢大量的日志數(shù)據(jù),最后在進(jìn)行匯總返回
總結(jié)
Loki 利用水平擴(kuò)展和查詢時(shí)間來(lái)查詢我們的數(shù)據(jù)。這與使用多索引的解決方案一樣快嗎?可能不是!但它運(yùn)行和部署要容易很多,而且還省資源。
Grafana Lab 的 Loki 部分集群的數(shù)據(jù),在過(guò)去 7 天內(nèi),它攝入了 14TB 的數(shù)據(jù)。該時(shí)間段對(duì)應(yīng)的索引使用量約為500MB;14TB 日志的索引可以放入樹莓派的內(nèi)存中。
這就是為什么Loki專注于保持標(biāo)簽集較小的原因。也許標(biāo)簽只能將搜索范圍縮小到 100GB 的日志數(shù)據(jù) —但是運(yùn)行 20 個(gè)查詢器(可以以 30GB/s 的速度并行搜索 100GB 數(shù)據(jù))比維護(hù)一個(gè) 14TB 索引要便宜得多,尤其是當(dāng)我們使用不了幾次的時(shí)候。
因此,更少的標(biāo)簽 = 更好的性能。