Elasticsearch 線上實戰問題及解決方案探討

大資料技術前線發表於2023-11-27

來源:銘毅天下Elasticsearch

1、reindex相關問題

1.1 問題描述

我有 1tb 的一個大索引若干,要遷移到另外一個新叢集去,有沒有好辦法?reindex好像會中斷......

reindex 是不是就算設定了頻率也會莫名的中斷,而且沒地方查到錯誤?1000多萬的資料,大概80G  用reindex有時候都會莫名的斷。

有時候是全的,有時候不全。

Elasticsearch 線上實戰問題及解決方案探討

1.2 問題認知

對於大型索引的遷移問題,遷移 1TB 大小的索引,尤其是在保持服務不中斷的情況下,是一項挑戰。

Reindex 操作本質上是 Elasticsearch 提供的高階複製,它會從源索引讀取文件並寫入目標索引。對於大型索引,這可能成為一個瓶頸,因為它需要大量的IO和網路頻寬。

反饋和問到最多的問題就是:Reindex 支不支援斷點續傳?

其實,Reindex確實不提供原生的斷點續傳功能。如果過程中斷,則需要重新開始或者手動管理已經完成的部分。

1.3 解決方案

1.3.1 資料規模和資料量不大,推薦使用 reindex。

注意事項如下:

  • 1、叢集足夠健康。確保叢集健康狀況良好,沒有過載或者資源爭奪情況。

  • 2、用好 slice,提高並行效能。

使用_reindex API時,透過設定 scroll 和 batch_size 引數來管理記憶體使用和單批次的文件數量。使用 slice 功能來並行化reindex任務。

  • 3、避免中斷策略

在Elasticsearch配置中調整連線和超時設定,例如

reindex.remote.connect_timeout
reindex.remote.read_timeout
  • 4、自己維護校驗機制。

遷移完成後,使用校驗和或者文件計數來確認資料完整性。

之前實戰專案中,可以定時指令碼統計一下寫入新索引的資料量,以校驗源和目的端資料的一致性。

1.3.2 資料規模和資料量巨大,推薦使用快照或者 logstash 等工具。

  • 1、快照和恢復機制 建立一個源索引的快照,並將其恢復到新叢集。這通常比 reindex 操作更加可靠。

  • 2、logstash 同步 支援兩種類似斷點續傳機制,一是:基於自增ID同步,另一是:基於自增時間同步。

  • 3、canal 同步 如果源頭是 MySQL、Oracle 等關係型資料庫,推薦使用阿里開源的 canal 工具同步。

2、 如何記錄es的所有請求日誌?

2.1 問題認知

這是經常被問到的問題,預設情況下 Elasticsearch 輸出核心是 error 日誌,以方便我們窺探叢集哪裡出了問題。

但,有些業務場景,需要全量日誌,包含但不限於檢索日誌細節等。

這時候,預設機制便不再生效。

2.2 問題解決

開啟 slowlog,便可以檢視全量日誌。

PUT packets-2022-12-14/_settings
{
"index.indexing.slowlog.threshold.index.debug""0s",
"index.search.slowlog.threshold.fetch.debug""0s",
"index.search.slowlog.threshold.query.debug""0s"
}

更多推薦:Elasticsearch 日誌能否把全部請求列印出來?

3、指令碼的使用問題

3.1 問題描述

我想請問下我用kibana中的無痛指令碼編寫建立新的欄位時想要建立一個list資料表,輸入下面這段程式碼,但是平臺卻顯示無法識別new ArrayList是什麼原因呢?

List(String)mylist= new ArrayList<>()

3.2 問題認知

Elasticsearch painless 指令碼功能的確非常強大,但非必要不要使用。原因在於後期的效能問題。

3.3 問題解決

  • 1、首先,寫入的時候充分建模。

能前置寫入的時候處理的話,儘量前置處理。藉助寫入語言:Java、Python 等處理完畢後再寫入。

  • 2、其次,寫入前藉助 Ingest pipeline 預處理。

Ingest pipeline 是寫入前預處理的鋒利的“瑞士軍刀”,功能也非常強大,5.X版本就已經推出,可以大膽的用起來。

Elasticsearch 線上實戰問題及解決方案探討

寫入的時候處理,可能會寫入變慢,總比:檢索響應慢更容易讓客戶接受。

與之並駕齊驅的還可以藉助 :logstash filter 環節實現預處理過濾功能。

  • 3、再次,檢索的時候使用:runtime_field 動態欄位實現。

這是迫不得已的下策,需要結合場景選用。

此方案也比自己寫指令碼來得更為實際。

4、叢集相關問題

4.1 問題描述

請問大佬,叢集擴容,新加入的節點需要把原叢集機器中的data目錄複製到新加入的節點中嗎?還是新節點直接空data目錄加入即可?再就是,linux和windows 的 ES可以互相加入彼此的叢集中嗎?謝謝

4.2 問題認知

凡是涉及到直接複製data目錄的多半都是官方不推薦的冒險方案,非特殊情況都不建議這麼做。

4.3 解決方案

其一:瞭解副本的原理、路由機制原理,可以知道,新寫入的資料會根據路由落到某個節點的某個分片,然後,複製到其他的副本分片中去。這樣手動遷移data的必要性和可能性都不存在了。

其二:當然可以,windows 和 linux 本就是平臺的不同,但都可以作為節點的宿主機。Elasticsearch 本來就是 java 開發的,支援跨平臺。

5、自定義詞典問題

5.1 問題描述

中文分詞欄位,如何實現不同欄位使用不同的自定義詞典?

5.2 問題認知

這是一種小眾業務場景問題。

一般我們們企業級應用更多的是一類業務敲定一個分詞器,往往在分詞器的細粒度等問題做文章。比如:如何動態擴充套件詞庫?如何豐富已有詞庫?

5.3 解決方案

如果非要不同欄位不同字典,其實最直接方案,可以匯入多個分詞外掛。

比如:引入 IK 分詞外掛同時引入結巴分詞外掛。這樣就可以很好得解決。

但,我驗證了一下,僅 IK 擴充套件支援兩套分詞詞典,貌似不改變原始碼不具備可行性。

推薦一個支援多詞庫的原始碼修改過的 IK 解決方案。

“改造前,所有索引使用一個詞庫,沒辦法針對不同索引新增不同詞庫, 改造後,詞庫的載入由索引中自定義的analyzer配置時,設定的詞庫而決定 從而實現了,不同業務的索引使用不同的詞庫。”

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70027827/viewspace-2997336/,如需轉載,請註明出處,否則將追究法律責任。

相關文章