天天看點

日志服務消費延遲問題排查常見的日志消費延遲有以下三個原因:消費延遲監控相關

日志服務中提供了 消費組

能夠以流的方式擷取日志,使用消費組擷取日志的優點在于,使用者無需關心日志服務的實作細節和消費者之間的負載均衡、failover等,隻需要專注于業務邏輯即可。

一個消費組由多個消費者構成,這多個消費者共同消費一個Logstore中的資料,消費者之間不會重複消費資料。因為每個Shard隻會配置設定到一個消費者,一個消費者可以同時消費多個Shard(當消費者數量超過Shard數量時,多餘消費者就會被擱置)。消費者是消費組的基本構成單元,實際承擔消費任務,同一個消費組下面的消費者名稱必須不同。

常見的日志消費延遲有以下三個原因:

  1. 消費速度跟不上日志寫入的速度
  2. 從曆史資料開始消費,短暫的消費延遲
  3. 儲存 checkpoint 頻率較低,在控制台檢視時誤認為是消費延遲

在下圖所示的消費組狀态中檢視到某個Shard或整體消費進度與目前時間相差較多時可以根據該文檔進行排查。

圖中最近消費資料時間是指消費組擷取到的 logGroup 中日志寫入日志服務的時間,消費組也是根據日志中的時間調用 UpdateConsumerGroupCheckpoint 接口進行修改的,是以調用的頻率低,也會造成消費延遲的錯覺。

日志服務消費延遲問題排查常見的日志消費延遲有以下三個原因:消費延遲監控相關

消費、寫入速度需要開通

服務日志

之後檢視自動生成的 logstore: internal-operation_log 

消費流量查詢:

Method: pulldata | SELECT sum(NetOutFlow)/1024.0/1024.0 AS NetOutFlowMB, time_series(__time__, '1m', '%H:%i:%s', '0') as time GROUP BY time ORDER BY time           

寫入流量查詢:

Method: PostLogstoreLogs | SELECT sum(NetInflow)/1024.0/1024.0 AS NetInFlowMB, time_series(__time__, '1m', '%H:%i:%s', '0') as time GROUP BY time ORDER BY time           

比較上面兩個SQL流量大小。

1) 首先需要排查process調用裡面是否存在阻塞(比如寫入到資料庫的操作是否較慢等),有可能阻塞了消費程序。

檢查消費流量是否達到上限:

Method: pulldata | SELECT Shard, count(1) as count, sum(NetOutFlow)/1024.0/1024.0 AS NetOutFlowMB, time_series(__time__, '1m', '%H:%i:%s', '0') as time GROUP BY time, Shard ORDER BY time           

2) 當消費組比較多、且資料量較大時也會出現消費速度跟不上寫入速度的情況,單個Shard每秒消費流量超過或接近10兆時,需要

手動分裂Shard

,shard讀寫能力參考

文檔

3) 資料量過大,機器少時,處理負載過重(網絡、cpu或記憶體上都會有瓶頸導緻消費速度慢)

4) java 程序 GC 重新開機導緻重複消費且延遲。

消費曆史資料,短暫的延遲

建立消費組開始消費資料時,可以傳遞消費開始位置。

如果設定的beginCursor,會從最早的資料開始消費,儲存的checkpoint 就是曆史資料寫入的時間點;這時可以參考上面SQL查詢消費、寫入的速度,如果消費速度遠高于寫入速度,之後是會追上最新資料的。

儲存checkpoint的頻率較低

通過下面SQL在 internal-operation_log 中查詢儲存消費位點的頻率。

Method: ConsumerGroupUpdateCheckPoint | SELECT time_series(__time__, '1m', '%H:%i:%s', '0') as time, COUNT(*) as count, Shard GROUP BY time, Shard ORDER BY time           

消費組代碼中預設的儲存頻率是30秒一次,不過可以根據需求進行修改。儲存 checkpoint 使用的時間是消費到資料FastLogGroup中的 tags 系統字段中 receive_time 字段,消費過程中可以列印該字段檢視消費位置;該字段是消費到的最新位置。

消費延遲監控

首先,需要開啟

。消費延遲相關的資訊在重要日志中,如果需要檢視消費或寫入速度,還需要開啟詳細日志。服務日志開啟之後自動會建立消費組監控儀表盤,如下圖: 

日志服務消費延遲問題排查常見的日志消費延遲有以下三個原因:消費延遲監控相關

可以使用上面的圖表設定告警,由于預設的圖表中字段别名使用了中文,告警條件中不能直接使用,需要将中文字段改為英文,然後在告警條件中使用。該日志内容是兩分鐘更新一次的,是以查詢範圍、告警條件等都需要大于120秒。

日志服務消費延遲問題排查常見的日志消費延遲有以下三個原因:消費延遲監控相關
日志服務消費延遲問題排查常見的日志消費延遲有以下三個原因:消費延遲監控相關

取消中文别名,然後修改Y軸字段、點選預覽,最後點确定就可以了。告警條件設定為 MaxBehindLatest > 1800 ,即延遲超過半小時觸發告警,查詢區間和間隔都設定為 1小時。

日志服務消費延遲問題排查常見的日志消費延遲有以下三個原因:消費延遲監控相關

相關

最新 checkpoint 儲存位置檢視: 

https://sls.console.aliyun.com/lognext/project/${替換projectName}/logstore/${替換L ogstoreName}/consumergroup/${替換消費組名稱}/consumergroupList