ELK学习10_ELK系列--实时日志分析系统ELK 部署与运行中的问题汇总
前記:
去年測試了ELK,今年測試了Storm,最終因為Storm需要過多開發介入而放棄,選擇了ELK。感謝互聯網上各路大神,目前總算是正常運行了。
logstash+elasticsearch+kibana的搭建參考:http://wsgzao.github.io/post/elk/。由于搭建過程比較簡單就不贅述,主要分享幾個坑。
?
正文:
1、日志如何獲取
?無論是storm方案還是elk,都涉及這個關鍵問題。為減少和運維、開發的交叉,盡可能獨立、快速,加之當時發現了justniffer這個“神器”,遂決定采用交換機流量鏡像的方式。
?但是在經歷了申請機器、增加網卡之后,痛苦的發現存在掉包問題。一旦流量超過30--40M狂掉包,就別提TCP流還原了。justniffer是調用修改過的libnids,而libnids調用libpacap。因此轉向libpcap優化。
?看了很多國內外的論文和研究文檔,使用pf-ring會有大幅改善掉包情況。在同事協助下經歷了N次的源碼調試后,無奈的發現:即使啟用了pf-ring,掉包情況依然。可能是網卡太差了。。。
?詢問了青藤云安全的大牛,他們的包捕獲與流還原技術不賣-?-|
?由于涉及justniffer、libpacap、pf_ring的版本對應問題、網卡驅動和源碼調試,上述過程耗時其實非常長,最終的結果讓人心碎,自己能力不夠啊
?無奈放棄流量鏡像,轉而采用在應用服務器上安裝客戶端的做法。如果有童鞋有好的方案,希望能分享,謝謝!
2、缺乏訪問權限控制
由于kibana默認沒有設置訪問權限控制,因此,直接訪問url即可訪問。同時elasticsearch也缺乏權限控制,提交相關請求即可查看索引、模板,刪除索引。 所以需要設置權限保護,分2個層面:
1)阻止未授權的用戶對ELK平臺的訪問
2)為用戶設置的index訪問權限
?詳情參考:http://eligao.com/shield-on-elasticsearch/
3、無法搜索特殊字符
由于混雜了kibana、elasticsearch、lunece,導致這個問題比較復雜。谷歌之可以發現,很多內容都是提到:在kibana中搜索時,搜索特殊符號需要使用轉義符號轉義。但是問題是方法無效!!!
?
幸得搜索同事指導,加上自己學習,基本搞清楚情況:
1)Kibana的搜索完全是傳遞給Elasticsearch處理的,因此問題出在Elasticsearch;
2)在創建索引的時候,Elasticsearch默認的索引模板使用了默認的分析器(analyzer)standard對logstash提交的數據進行分析。,而standard默認的分詞器(tokenizer)是會剔除特殊字符。也就是說,特殊字符在建立索引的過程中就被剔除了,因此即使使用轉義符號也無法搜索特殊字符;相關概念解釋見文末說明。
?
解決方法:
1)定制分析器
官方文檔參考:https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-custom-analyzer.html。
借助Elasticsearch提供的nGram分詞器,定制了一個單字符分析器。
官網的做法是通過API提交。我偷個懶,直接修改了Elasticsearch的配置文件elasticsearch.yml,在最后增加:
index:analysis:tokenizer:my_ngram_tokenizer:type: nGrammin_gram : 1max_gram : 1token_chars : []analyzer:special_analyzer:type: customfilter: [lowercase]tokenizer: my_ngram_tokenizer?
修改后,需要重啟Elasticsearch
?
2)修改默認模板
(不推薦新增索引模板,使用非logstash開頭的索引模板會導致raw字段丟失。如果已經遇到這個問題,參考https://bbrauns1.wordpress.com/2015/06/04/missing-raw-fields-in-logstashkibana-after-new-index-creation/)
注意,通過http://localhost:9200/_template/logstash?pretty獲取的索引模板和我們需要改的索引模板稍有不同,去掉??"logstash"?:?{及倒數第二個}保存成logstash.json
修改上面獲得的模板,主要是修改dynamic_templates部分,默認的模板是將所有string類型字段內容進行分析和索引,使用的是默認的standard分析器。同時對raw字段不分詞(如cookie.raw等,是logstash自動生成的)
參考官方文檔:https://www.elastic.co/guide/en/elasticsearch/guide/current/custom-dynamic-mapping.html
"mappings" : {"_default_" : {"dynamic_templates" : [ {"string_fields" : {"mapping" : {"index" : "analyzed","omit_norms" : true,"type" : "string","fields" : {"raw" : {"index" : "not_analyzed","ignore_above" : 256,"type" : "string"}}},"match" : "*","match_mapping_type" : "string"}}?
?因此,我們需要增加指定特定字段,比如:
{"request" : {"mapping" : {"index" : "analyzed","analyzer" : "special_analyzer","type" : "string","fields" : {"raw" : {"index" : "not_analyzed","ignore_above" : 256,"type" : "string"}}},"match" : "request","match_mapping_type" : "string"}},?
代表我們對request字段內容使用special_analyzer進行分析,同時保留對raw不分析。如果缺少二次映射,則無法獲取raw字段,則會對visualize造成影響。
如果不需要對相關字段進行是分詞,則如此配置:
?
{"cookie" : {"mapping" : {"index" : "not_analyzed","type" : "string","fields" : {"raw" : {"index" : "not_analyzed","ignore_above" : 256,"type" : "string"}}},"match" : "cookie","match_mapping_type" : "string"}},?
3)提交索引模板:
cd?/path/to/logstash.json
curl?-u?user?-XPUT?localhost:9200/_template/logstash?-d?@logstash.json
成功后,會返回:{"acknowledged":true}
?
4)刪除索引,索引模板
查看現有的所有索引:http://localhost:9200/_cat/indices?v?
刪除所有索引:curl?-u?user?-XDELETE?localhost:9200/index
通過kibana的設置功能,刪除之前建立的index?pattern
?
5)重新添加index?pattern
注:配合kibana的搜索語法,使用雙引號""搜索完全匹配,即可解決搜索特殊字符的問題。如果不帶雙引號,則會搜索字符串中的每個字符。
4、logstash無法啟動,提示bind?address?
?原因:
?1)配置目錄下存在多個配置文件,而logstash會加載所有conf格式的文件
?解決方案:刪除不必要的文件,保留一個conf文件即可
?
2)進程未結束
?解決方案:kill?-9?pid?強制結束進程,再啟動服務即可
5、字段無法解析?_grokparsefailure?
?kibana無法解析出相應的字段
?原因:正則存在問題或者日志不符合正則格式
?解決方案:在http://grokdebug.herokuapp.com/上調試正則,同時確保日志中不存在多余空格等異常
?
還有一種常見原因:空格、空格、空格,重要的事情說三遍!
?
6、日志量大,磁盤緊張
日志量增加非常快,磁盤空間不夠用怎么辦?可以通過刪除較早的索引來緩解
因此,logstash的配置文件中最好早設置索引帶有時間后綴:如logstash-%{+YYYY.MM.dd}"
?
說明:
分析器相關概念:全文搜索引擎會用某種算法對要建索引的文檔進行分析,?從文檔中提取出若干Token(詞元),?這些算法稱為Tokenizer(分詞器),?這些Token會被進一步處理,?比如轉成小寫等,?這些處理算法被稱為Token?Filter(詞元處理器),?被處理后的結果被稱為Term(詞),?文檔中包含了幾個這樣的Term被稱為Frequency(詞頻)。?引擎會建立Term和原文檔的Inverted?Index(倒排索引),?這樣就能根據Term很快到找到源文檔了。?文本被Tokenizer處理前可能要做一些預處理,?比如去掉里面的HTML標記,?這些處理的算法被稱為Character?Filter(字符過濾器),?這整個的分析算法被稱為Analyzer(分析器)。?
詳情請參考:http://www.cnblogs.com/buzzlight/p/elasticsearch_analysis.html
?
7、Kibana4 dashboard無法保存拖動的visualization位置
原因:
程序bug,json部分未能及時保存拖動的情況
解決方法:
手動在設置中,手動編輯dashboard的json,調整排序
參考:https://github.com/elastic/kibana/issues/3328
8、Courier Fetch: shards failed
原因:
查詢線程隊列不夠,導致
解決方法:
編輯elasticsearch.yml,添加threadpool.search.queue_size: 10000
重啟elasticsearch即可解決
參考:http://stackoverflow.com/questions/30053967/courier-fetch-shards-failed
9、kibana瓦片圖(Tile map)無法使用國內地圖
原因:
kibana自帶的是地圖是openstreetmap,http://www.openstreetmap.org。需要更換成國內地圖。
解決方法:
更換為高德地圖。修改index.js中的:
https://otile{s}-s.mqcdn.com/tiles/1.0.0/map/{z}/{x}/{y}.jpeg為
http://webrd0{s}.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=7&x={x}&y={y}&z={z}說明:網上搜索到內容為style=8,內容空白,經過自己測試,確認style=7可用
原文來自:
http://www.cnblogs.com/phoenix--/p/4935778.html
和
http://www.cnblogs.com/phoenix--/p/5000165.html
來源:http://blog.csdn.net/wang_zhenwei/article/details/50372000
總結
以上是生活随笔為你收集整理的ELK学习10_ELK系列--实时日志分析系统ELK 部署与运行中的问题汇总的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ELK学习9_ELK数据流传输过程_问题
- 下一篇: 谈谈高并发系统的限流