ELK 使用小技巧(第 4 期)

ELK Tips 主要介紹一些 ELK 使用過程當中的小技巧,內容主要來源爲 Elastic 中文社區。html

1、Logstash

一、Logstash 性能調優主要參數

  • 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 操做。

二、使用 Ruby Filter 根據現有字段計算一個新字段

filter {
    ruby {
           code => "event.set('kpi', ((event.get('a') + event.get('b'))/(event.get('c')+event.get('d'))).round(2))"
     }
}
複製代碼

三、logstash filter 如何判斷字段是夠爲空或者 null

if ![updateTime]
複製代碼

四、Date Filter 設置多種日期格式

date {
  match => ["logtime", "yyyy-MM-dd HH:mm:ss.SSS","yyyy-MM-dd HH:mm:ss,SSS"]
  target => "logtime_utc"
}
複製代碼

2、Elasticsearch

一、高效翻頁 Search After

一般狀況下咱們會使用 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"}
    ]
}
複製代碼

二、ES 文檔類似度 BM25 參數設置

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" }
  }
}
複製代碼

三、ES2.X 得分計算

得分計算腳本:算法

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 }

四、CircuitBreakingException: [parent] Data too large

報錯信息:編程

[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

五、ES 免費的自動化運維工具推薦

六、elasticsearch-hanlp 分詞插件包

核心功能:緩存

  • 內置多種分詞模式,適合不一樣場景;
  • 內置詞典,無需額外配置便可使用;
  • 支持外置詞典,用戶可自定義分詞算法,基於詞典或是模型;
  • 支持分詞器級別的自定義詞典,便於用於多租戶場景;
  • 支持遠程詞典熱更新(待開發);
  • 拼音過濾器、繁簡體過濾器(待開發);
  • 基於詞語或單字的 ngram 切分分詞(待開發)。

github.com/AnyListen/e…ruby

七、節點重啓時延遲索引分片重分配

當某個節點短期離開集羣時,通常是不會影響總體系統運行的,能夠經過下面的請求延遲索引分片的再分配。性能優化

PUT _all/_settings
{
  "settings": {
    "index.unassigned.node_left.delayed_timeout": "5m"
  }
}
複製代碼

八、ES 數據修改後,查詢仍是未修改前的數據

默認是 1 秒可見,若是你的需求必定要寫完就可見,那在寫的時候增長 refresh 參數,強制刷新便可,但強烈建議不這麼幹,由於這樣會把整個集羣拖垮。

九、Terms Query 從另外一個索引獲取 terms

當 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"
   }
 ]
}
複製代碼

十、ES 備份路徑設置

報錯信息:

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"]
複製代碼

十一、Query cache 和 Filter cache 的區別

Filter cache 被重命名爲 Node Query Cache,也就是說 Query cache 等同於 Filter cache;Query Cache 採用了 LRU 的緩存方式(當緩存滿的時候,淘汰舊的不用的緩存數據),Query Cache 只緩存被用於 filter 上下文的內容。

十二、Shard 大小須要考慮的因素有哪些?

Lucene 底層沒有這個大小的限制,20-40GB 的這個區間範圍自己就比較大,經驗值有時候就是拍腦殼,不必定都好使。

  • Elasticsearch 對數據的隔離和遷移是以分片爲單位進行的,分片太大,會加大遷移成本;
  • 一個分片就是一個 Lucene 的庫,一個 Lucene 目錄裏面包含不少 Segment,每一個 Segment 有文檔數的上限,Segment 內部的文檔 ID 目前使用的是 Java 的整型,也就是 2 的 31 次方,因此可以表示的總的文檔數爲 Integer.MAX_VALUE - 128 = 2^31 - 128 = 2147483647 - 1 = 2,147,483,519,也就是21.4億條;
  • 一樣,若是你不 force merge 成一個 Segment,單個 shard 的文檔數能超過這個數;
  • 單個 Lucene 越大,索引會越大,查詢的操做成本天然要越高,IO 壓力越大,天然會影響查詢體驗;
  • 具體一個分片多少數據合適,仍是須要結合實際的業務數據和實際的查詢來進行測試以進行評估。

1三、ES 索引更新時經過 mapping 限制指定字段更新

Elasticsearch 默認是 Dynamic Mapping,新字段會自動猜想數據類型,並自動 merge 到以前的 Mapping,你能夠在 Mapping 裏面能夠配置字段是否支持動態加入,設置參數dynamic便可:true,默認,表示支持動態加入新字段;false,表示忽略該字段的後續索引等操做,可是索引仍是成功的;strict支持不支持未知字段,直接拋錯。

1四、ES 數據快照到 HDFS

ES 作快照和使用 ES-Hadoop 導數據是徹底的兩種不一樣的方式,使用 ES-Hadoopp 後期導入的成本可能也不小。

  • 若是要恢復快,固然是作快照和還原的方式最快,速度徹底取決於網絡和磁盤的速度;
  • 若是爲了節省磁盤,快照的時候,能夠選 6.5 最新支持的 source_only 模式,導出的快照要小不少,不過恢復的時候要進行重建,速度慢。

1五、segment.memory 簡介

segment 的大小,和 indexing buffer 有關,有三種方式會生成 segment:

  • 一種是 indexing buffer 寫滿了會生成 segment 文件,默認是堆內存的10%,是節點共享的;
  • 一種是 index buffer 有文檔,可是還沒滿,可是 refresh 時間到了,這個時候就會把 buffer 裏面的生成 segment 文件;
  • 還有最後一種就是 es 自動的會將小的 segment 文件按期合併產生新的 segment 文件。

3、社區文章精選


Any Code,Code Any!

掃碼關注『AnyCode』,編程路上,一塊兒前行。

相關文章
相關標籤/搜索