ElasticSearch的REST APIs 之 索引的狀態管理

基於ES7.7 官方文檔

內容包括:

  • 清空緩存 ( Clear cache )
  • 更新索引以讓新文檔可以被搜索 ( Refresh )
  • 將內存緩衝區中的文檔寫入磁盤 ( Flush )
  • 同步Flush ( Synced flush ) 7.6版本被棄用
  • 強制合併 ( Force merge )

ES中refreshflush的區別: 參考官方博客 https://blog.csdn.net/UbuntuTouch/article/details/103641544

1. 清空緩存 (Clear cache API)

清空一個或多個索引的緩存。官方文檔

POST /<index>/_cache/clear

路徑參數

<index>

  (可選, string) 支持多個逗號連接的多個索引名稱或者通配符表達式。

請求參數

allow_no_indices

  (可選, bool) 默認true。如果設置爲true, 則當全部使用通配符*_all只檢索不存在(missing)或者已關閉(closed)的索引(或索引別名)時,會拋出錯誤。

expand_wildcards

  (可選, string) 通配符查詢時的範圍限制。支持多個條件以逗號分割。默認open

  • all: 匹配open和closed的索引, 包括隱藏的.
  • open: 默認, 表示只查詢開放中的索引
  • closed: 只匹配closed的索引
  • hidden: 隱藏的(hidden)索引, 必須和open/closed聯合使用.
  • none: 不接受通配符.

fielddata

  (可選, bool) 如果爲true, 則清空字段的緩存。與參數fields一起使用,僅清空指定字段的緩存。

fields

  (可選, string) 支持多個字段名的逗號拼接。與參數fielddata一起使用,僅清空指定字段的緩存。默認是所有字段。

不支持對象和字段別名

index

  (可選, string) 支持多個索引名稱的逗號拼接。

ignore_unavailable

  (可選, bool) 如果爲true,則 返回數據中不會包含missing或closed的索引。默認false,查詢時只要有一個索引不存在,就會返回404並拋出錯誤信息。

query

  (可選, bool) 如果爲true,清空查詢緩存(query cache)。

request

  (可選, bool) 如果爲true,清空請求緩存(request cache)。

幾個栗子

1、清空指定類型的緩存 (Clear a specific cache)

默認情況下,這個/_cache/clear API會清空所有緩存。如果只想清空指定的緩存, 可以把下面的幾個參數設置爲true

  • fielddata
  • query
  • request
# 僅清空字段的緩存
POST /<index>/_cache/clear?fielddata=true

# 僅清空查詢緩存
POST /<index>/_cache/clear?query=true

# 僅清空請求緩存
POST /<index>/_cache/clear?request=true

2、清空指定字段的緩存

使用參數fields來指定要清空的字段,支持多個字段的逗號連接

# 僅清空字段 field1 和 field2 的緩存
POST /<index>/_cache/clear?fields=field1,field2

3、清空多個索引的緩存

#清空索引 index1 和 index2 的所有緩存
POST /index1,index2/_cache/clear

4、清空所有索引的緩存

POST /_cache/clear

# 下面兩個不常用
POST /_all/_cache/clear
POST /*/_cache/clear

2. 更新索引以讓新文檔可以被搜索 ( Refresh API )

刷新一個或多個索引,以使新的文檔可以被搜索。官方文檔

# 刷新指定的索引
POST|GET /<index>/_refresh

# 刷新當前集羣中的所有索引
POST|GET /_refresh

使用這個api可以顯式的對一個或多個索引執行刷新(refresh)操作,使得自上次refresh操作以來的對該索引的所有操作(文檔更新等)可以被搜索到。

默認情況下,ES以1秒爲週期刷新索引,但僅針對在過去30秒內收到一個或多個搜索請求的索引。可以通過修改配置index.refresh_interval來改變這個默認配置。

刷新是資源密集型的操作。 爲了確保良好的集羣性能,建議等待Elasticsearch的週期性刷新,而不是在可能的情況下執行顯式刷新。
如果您的應用程序工作流操作了文檔(比如新增/修改文檔),然後(立即)搜索該索引,我們建議在使用index API的查詢參數中使用refresh=wait_for來確保請求會先等待一個索引定期refresh的時間, 等索引刷新完畢, 再執行搜索。

路徑參數

<index>

  (可選, string) 支持索引名稱的英文逗號分割的列表或通配符表達式。如果要刷新當前集羣的所有索引, 可以使用_all*或直接忽略這個參數。

查詢參數

allow_no_indices

  (可選, bool) 默認true。如果設置爲true, 則當全部使用通配符*_all只檢索不存在(missing)或者已關閉(closed)的索引(或索引別名)時,會拋出錯誤。

expand_wildcards

  (可選, string) 通配符查詢時的範圍限制。支持多個條件以逗號分割。默認open

  • all: 匹配open和closed的索引, 包括隱藏的.
  • open: 默認, 表示只查詢開放中的索引
  • closed: 只匹配closed的索引
  • hidden: 隱藏的(hidden)索引, 必須和open/closed聯合使用.
  • none: 不接受通配符.

ignore_unavailable

  (可選, bool) 如果爲true,則 返回數據中不會包含missing或closed的索引。默認false,查詢時只要有一個索引不存在,就會返回404並拋出錯誤信息。

栗子

1. 刷新多個索引

# 刷新指定的幾個索引
POST /index1,index2,index3/_refresh

# 刷新指定前綴的索引
POST /index*/_refresh

2. 刷新當前集羣的所有索引

POST /_refresh

# 下面兩個不常用
POST /_all/_refresh
POST /*/_refresh

3. 將內存緩衝區中的文檔寫入磁盤 ( Flush API )

對一個或多個索引執行Flush操作。 官方文檔

POST|GET /<index>/_flush
POST|GET /_flush

索引的flush操作,是確保當前只存儲在事務日誌(transaction log / translog)中的任何數據被永久存儲在Lucene索引中的過程。 當重新啓動時,ES將所有未刷新(unflushed)的操作從事務日誌中重放到Lucene索引中,使其恢復到重啓之前的狀態。Flush 會定期觸發,也可以在 Translog 達到特定大小時觸發,這些設置可以防止 Lucene頻繁提交(就是flush)帶來的不必要的開銷。

這些機制與mysql很像

一旦每個操作被flush,它就會永久存儲在Lucene索引中。 這可能意味着不需要在事務日誌中維護它的額外副本,除非出於其他原因保留它。 事務日誌由多個文件組成,稱爲版本(generations),一旦不再需要任何版本文件,ES將刪除它們,釋放磁盤空間。

也可以使用 flush API 在一個或多個索引上觸發flush操作,儘管用戶很少需要直接調用這個API。 如果在索引一些文檔之後調用flush API,返回成功狀態則表明ES已經刷新(flush)了在調用該api之前所有被索引的文檔。

路徑參數

<index>

  (可選, string) 支持索引名稱的英文逗號分割的列表或通配符表達式。如果要flush所有索引, 可以忽略這個參數或者使用_all*

查詢參數

allow_no_indices

  (可選, bool) 默認true。如果設置爲true, 則當全部使用通配符*_all只檢索不存在(missing)或者已關閉(closed)的索引(或索引別名)時,會拋出錯誤。

expand_wildcards

  (可選, string) 通配符查詢時的範圍限制。支持多個條件以逗號分割。默認open

  • all: 匹配open和closed的索引, 包括隱藏的.
  • open: 默認, 表示只查詢開放中的索引
  • closed: 只匹配closed的索引
  • hidden: 隱藏的(hidden)索引, 必須和open/closed聯合使用.
  • none: 不接受通配符.

force

  (可選, bool) 如果設置爲true, 即使沒有索引沒有任何變更需要提交(commit)也會強制執行一次flush操作。默認true

  可以使用此參數來增加事務日誌(translog)的版本號(generation number)。

  此參數被視爲內部參數。

ignore_unavailable

  (可選, bool) 如果爲true,則 返回數據中不會包含missing或closed的索引。默認false

wait_if_ongoing

  (可選, bool) 如果爲true,則該flush操作會等待另外一個正在執行的flush操作。

  如果爲false,則當有另外一個flush操作在執行時, ES會拋出錯誤。

  默認true

幾個例子

1、 flush指定的一個索引

POST /myindex/_flush

2、 flush多個索引

POST /myindex,order_2021/_flush
POST /order*/_flush

3、 flush當前集羣的所有索引

POST /_flush

# 下面兩種不常用
POST /_all/_flush
POST /*/_flush

4. 同步Flush (Synced flush)

synced-flush從ES 7.6版本開始棄用,8.0版本會移除!使用flush代替. 從7.6版本開始, flush與synced flush效果相同。

#! Deprecation: Synced flush is deprecated and will be removed in 8.0. Use flush at _/flush or /{index}/_flush instead.

POST|GET /<index>/_flush/synced
POST|GET /_flush/synced

本節內容省略, 如有需要參考官方文檔 synced-flush


5. 強制合併 (Force merge API)

強制合併一個或多個索引的分片。

POST /<index>/_forcemerge

通過將分片中的一些段(segment)合併到一起,減少了分片中段的數量,還釋放了已刪除文檔所佔用的空間。 合併通常是自動進行的,但有時手動觸發合併也是有用的。

Warning! 強制合併只應該在索引寫入完成後被調用。 強制合併可能導致產生非常大的段(>5GB),如果你繼續對這樣的索引進行寫操作,那麼自動合併策略將永遠不會考慮這些段是否需要合併,直到段中大部分都是已刪除的文檔。 這可能會導致索引中保留非常大的段,從而導致磁盤使用增加和搜索性能下降。

強制合併操作引起的阻塞問題 (Blocks during a force merge)

調用這個API會導致阻塞,直到合併操作完成。 如果客戶端在操作完成之前丟失連接,強制合併進程仍將在後臺繼續執行。 任何新的強制合併同一個索引的請求也將被阻塞,直到正在進行的強制合併完成。

強制合併多個索引

強制合併API可以在一次調用中同時操作多個索引,甚至可以使用_all操作所有索引。 一個節點一次可以執行一個分片的多個索引操作。 強制合併使得被合併的分片的存儲空間臨時增加,在max_num_segments參數設置爲1的情況下,最大可以增加到兩倍的大小,因爲所有的段都需要重寫到一個新的段。

ES 7.15文檔 中有提及: 默認每個節點只有一個fore_merge線程。如果想在一個節點上同時對多個分片進行強制合併,則需要增大此線程數。

路徑參數

<index>

  (可選, string) 支持索引名稱的英文逗號分割的列表或通配符表達式。如果要flush所有索引, 可以忽略這個參數或者使用_all*

查詢參數

allow_no_indices

  (可選, bool) 默認true。如果設置爲true, 則當全部使用通配符*_all只檢索不存在(missing)或者已關閉(closed)的索引(或索引別名)時,會拋出錯誤。

expand_wildcards

  (可選, string) 通配符查詢時的範圍限制。支持多個條件以逗號分割。默認open

  • all: 匹配open和closed的索引, 包括隱藏的.
  • open: 默認, 表示只查詢開放中的索引
  • closed: 只匹配closed的索引
  • hidden: 隱藏的(hidden)索引, 必須和open/closed聯合使用.
  • none: 不接受通配符.

flush

  (可選, bool) 如果爲true, 則ES在強制合併後執行flush操作。默認true

ignore_unavailable

  (可選, bool) 如果爲true,則 返回數據中不會包含missing或closed的索引。默認false

max_num_segments

 (可選, integer) 段合併的目標數量(要把索引的所有的段合併成幾個段)。如果要完全合併索引,請設置爲1。默認會檢查是否需要執行合併(比如原來就是一個segment,你發命令告訴es再合併成一個segment,那es就認爲不需要執行合併了),如果需要則執行之。

only_expunge_deletes

  (可選, bool) 如果爲true, 僅刪除包含有已刪除文檔的段。默認false

  在Lucene中,段中的文檔並沒有被真正刪除,只是做了個已刪除的標記而已。在合併過程中,會創建一個新的不包含刪除文檔的段。

該參數不會覆蓋index.merge.policy.expunge_deletes_allowed設置。

幾個栗子

1、強制合併一個索引

POST /myindex/_forcemerge

2、強制合併多個索引

POST /myindex,customers/_forecemerge
POST /orders*/_forecemerge

3、強制合併所有索引

POST /_forcemerge

# 下面兩個不常用
POST /_all/_forcemerge
POST /*/_forcemerge

4、基於時間的索引 (Time-based indices)

強制合併對基於時間的索引很有用, 特別是使用rollover時。 在這些情況下,每個索引只在一段時間內接收索引流量。 一旦索引不再接收到寫操作,它的分片就可以被強制合併爲一個段。

# 把索引強制合併爲一個段
POST /logs-000001/_forcemerge?max_num_segments=1

This can be a good idea because single-segment shards can sometimes use simpler and more efficient data structures to perform searches.

這會是一個好主意,因爲只有一個段的分片有時可以使用更簡單和高效的數據結構來執行搜索。

last updated at 2021/11/8 22:55

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章