ELK Tips 主要介紹一些 ELK 使用過程當中的小技巧,內容主要來源爲 Elastic 中文社區。html
pipeline.workers
:設置啓動多少個線程執行 fliter 和 output;當 input 的內容出現堆積而 CPU 使用率還比較充足時,能夠考慮增長該參數的大小;pipeline.batch.size
:設置單個工做線程在執行過濾器和輸出以前收集的最大事件數,較大的批量大小一般更高效,但會增長內存開銷。輸出插件會將每一個批處理做爲一個輸出單元。;例如,ES 輸出會爲收到的每一個批次發出批量請求;調整 pipeline.batch.size
可調整發送到 ES 的批量請求(Bulk)的大小;pipeline.batch.delay
:設置 Logstash 管道的延遲時間, 管道批處理延遲是 Logstash 在當前管道工做線程中接收事件後等待新消息的最長時間(以毫秒爲單位);簡單來講,當 pipeline.batch.size
不知足時,會等待 pipeline.batch.delay
設置的時間,超時後便開始執行 filter 和 output 操做。filter {
ruby {
code => "event.set('kpi', ((event.get('a') + event.get('b'))/(event.get('c')+event.get('d'))).round(2))"
}
}
複製代碼
if ![updateTime]
複製代碼
date {
match => ["logtime", "yyyy-MM-dd HH:mm:ss.SSS","yyyy-MM-dd HH:mm:ss,SSS"]
target => "logtime_utc"
}
複製代碼
一般狀況下咱們會使用 from 和 size 的方式實現查詢結果的翻頁,可是當達到深度分頁時,成本變得太高(堆內存佔用和時間耗費與 from+size 的大小成正比),所以 ES 設置了限制(index.max_result_window
),默認值爲 10000,防止用戶進行過於深刻的翻頁。node
推薦使用 Scroll api 進行高效深度滾動,但滾動上下文代價很高,所以不要將 Scroll 用於實時用戶請求。search_after 參數經過提供實時遊標來解決深度滾動的問題,其主要思路是使用上一頁的結果來幫助檢索下一頁。git
GET twitter/_search
{
"size": 10,
"query": {
"match" : {
"title" : "elasticsearch"
}
},
"search_after": [1463538857, "654323"],
"sort": [
{"date": "asc"},
{"tie_breaker_id": "asc"}
]
}
複製代碼
ES2.X 默認是以 TF/IDF 算法計算文檔類似度,從 ES5.X 開始,BM25 做爲默認的類似度計算算法。github
PUT /index
{
"settings" : {
"index" : {
"similarity" : {
"my_similarity" : {
"type" : "DFR",
"basic_model" : "g",
"after_effect" : "l",
"normalization" : "h2",
"normalization.h2.c" : "3.0"
}
}
}
}
}
PUT /index/_mapping/_doc
{
"properties" : {
"title" : { "type" : "text", "similarity" : "my_similarity" }
}
}
複製代碼
得分計算腳本:算法
double tf = Math.sqrt(doc.freq);
double idf = Math.log((field.docCount+1.0)/(term.docFreq+1.0)) + 1.0;
double norm = 1/Math.sqrt(doc.length);
return query.boost * tf * idf * norm;
複製代碼
index_options
設置爲 docs
;"norms": { "enabled": false }
;報錯信息:編程
[WARN ][r.suppressed ] path: /, params: {}
org.elasticsearch.common.breaker.CircuitBreakingException: [parent] Data too large, data for [<http_request>] would be [1454565650/1.3gb], which is larger than the limit of [1454427340/1.3gb], usages [request=0/0b, fielddata=568/568b, in_flight_requests=0/0b, accounting=1454565082/1.3gb]
複製代碼
jvm 堆內存不夠當前查詢加載數據因此會報 data too large, 請求被熔斷,indices.breaker.request.limit
默認爲 jvm heap 的 60%,所以能夠經過調整 ES 的 Heap Size 來解決該問題。api
核心功能:緩存
當某個節點短期離開集羣時,通常是不會影響總體系統運行的,能夠經過下面的請求延遲索引分片的再分配。性能優化
PUT _all/_settings
{
"settings": {
"index.unassigned.node_left.delayed_timeout": "5m"
}
}
複製代碼
默認是 1 秒可見,若是你的需求必定要寫完就可見,那在寫的時候增長 refresh 參數,強制刷新便可,但強烈建議不這麼幹,由於這樣會把整個集羣拖垮。
當 Terms Query 須要指定不少 terms 的時候,若是手動設置仍是至關麻煩的,能夠經過 terms-lookup 的方式從另一個索引加載須要匹配的 terms。
PUT /users/_doc/2
{
"followers" : ["1", "3"]
}
PUT /tweets/_doc/1
{
"user" : "1"
}
GET /tweets/_search
{
"query" : {
"terms" : {
"user" : {
"index" : "users",
"type" : "_doc",
"id" : "2",
"path" : "followers"
}
}
}
}
-----------等效下面的語句--------------
PUT /users/_doc/2
{
"followers" : [
{
"id" : "1"
},
{
"id" : "2"
}
]
}
複製代碼
報錯信息:
doesn't match any of the locations specified by path.repo because this setting is empty 複製代碼
結局方案,修改 ES 的配置文件:
# 在 elasticsearch.yml 中添加下面配置來設置備份倉庫路徑
path.repo: ["/home/test/backup/zty_logstash"]
複製代碼
Filter cache 被重命名爲 Node Query Cache,也就是說 Query cache 等同於 Filter cache;Query Cache 採用了 LRU 的緩存方式(當緩存滿的時候,淘汰舊的不用的緩存數據),Query Cache 只緩存被用於 filter 上下文的內容。
Lucene 底層沒有這個大小的限制,20-40GB 的這個區間範圍自己就比較大,經驗值有時候就是拍腦殼,不必定都好使。
Elasticsearch 默認是 Dynamic Mapping,新字段會自動猜想數據類型,並自動 merge 到以前的 Mapping,你能夠在 Mapping 裏面能夠配置字段是否支持動態加入,設置參數dynamic便可:true,默認,表示支持動態加入新字段;false,表示忽略該字段的後續索引等操做,可是索引仍是成功的;strict支持不支持未知字段,直接拋錯。
ES 作快照和使用 ES-Hadoop 導數據是徹底的兩種不一樣的方式,使用 ES-Hadoopp 後期導入的成本可能也不小。
source_only
模式,導出的快照要小不少,不過恢復的時候要進行重建,速度慢。segment 的大小,和 indexing buffer 有關,有三種方式會生成 segment:
Any Code,Code Any!
掃碼關注『AnyCode』,編程路上,一塊兒前行。