這兩天出現乙個小事故,是logstash讀取檔案資訊輸出到kafka,因為topic沒有建立,而導致所有的topic都沒有資料。先將配置檔案列出來。
input
}filter "]
} add_tag => ["result"]
tag_on_failure =>
} grok
add_tag => ["phone"]
tag_on_failure =>
} if "result" in [tags]
} mutate
}output
kafka
} }else if "phone" in [tags]
}}
由於對集群進行遷移,在新的kafka集群中漏建立了乙個名為xsec_anticheat_phone_notfound的topic,因為缺乏監控原因,最初並沒有發現變更配置後有問題。過了幾個小時才發現,所有業務的日誌資料全部都沒有消費到,於是一步步去查根源。發現logstash的日誌裡有大量的這樣的記錄:
[2019-09-29t09:22:27,472][warn ][org.apache.kafka.clients.networkclient] [producer clientid=producer-48] error while fetching metadata with correlation id 1204417 :
[2019-09-29t09:22:27,583][warn ][logstash.outputs.kafka ] kafkaproducer.send() failed: org.apache.kafka.common.errors.timeoutexception: failed to update metadata after 60000 ms.
[2019-09-29t09:22:27,583][warn ][logstash.outputs.kafka ] kafkaproducer.send() failed: org.apache.kafka.common.errors.timeoutexception: failed to update metadata after 60000 ms.
從日誌上看,是因為xsec_anticheat_phone_notfound的topic沒有建立造成的,出錯後會sleep 60s,這出現我第乙個疑問:為什麼乙個topic的出錯,會造成所有的topic資料都無法寫入?我看過logstash的配置,裡面的併發應是安裝環境的cpu核數,但從這現象上,我卻懷疑logstash是單執行緒的。
第二個疑問:logstash出錯後,是否一直等待到訊息傳送成功為止?從日誌看出錯後,logstash進入sleep狀態,但是甦醒過來後,是重新去嘗試傳送出錯的資料,還是跳過當前訊息,如果是跳過當前訊息,那下一條訊息是沒問題的,應是可以傳送成功,那不應該所有資料都不會寫入kafka對應的topic中。
發現topic沒有建立的問題後,我立刻建立topic,建立topic後,資料立刻恢復正常了,但是有個現象很奇怪的,接到的資料只是當前時間的,前面幾個小時都沒有了。第三個疑問:在配置中,start_position => "end"是設定是讀取檔案的最後,但沒有任務重啟操作,從出錯的狀態轉為正常的狀態,資料竟然從end的位置開始生產訊息,如果每時每刻都從end去消費資料,那麼如果資料量較大量是否會有訊息漏掉?但從我觀察來看,正常情況下資料並不會漏。
這三個疑問還停留在這裡,資料恢復了,後面有空再研究這幾個問題,有清楚原理的大牛麻煩回答下。
關於素數的求解
質數 prime number 又稱素數,有無限個。乙個大於1的自然數,除了1和它本身外,不能被其他自然數整除,換句話說就是該數除了1和它本身以外不再有其他的 因數。求解整數n之前的所有素數及總數 include stdio.h include math.h int main if c sqrt i...
關於眾數的求解
眾數演算法 a 問題 在乙個由元素組成的表中,出現次數最多的元素稱為眾數。試寫乙個尋找眾數的演算法,並分析其計算複雜性。眾數演算法 a 問題 在乙個由元素組成的表中,出現次數最多的元素稱為眾數。試寫乙個尋找眾數的演算法,並分析其計算複雜性。b 分析 對於這個問題,比較容易的是使用排序的演算法,對元素...
關於Logstash中grok外掛程式的正規表示式例子
近期需要對nginx產生的日誌進行採集,問了下度娘,業內最著名的解決方案非elk elasticsearch,logstash,kibana 莫屬。logstash負責採集日誌,elasticsearch負責儲存 索引日誌,kibana則負責通過web形式展現日誌。今天,我要說的是logstash,...