ES(Elasticsearch) 別名深入理解

本文,我們將討論以下ES中最容器使用、可能也是最有用的特性之一:別名。別名正如其名,他們是你使用的指針或者名稱,對於1個或多個具體的所有。由於其提供的靈活性,別名再擴展集羣和管理數據在索引中的分佈時是非常有用的。即使使用的Elasticsearch集羣只有一個單獨的索引,也請使用別名。因爲,以後你會爲其賦予靈活性而感謝現在。

什麼是別名

🤔思考:別名到底是什麼,創建一個別名會爲Elasticsearch帶來怎樣的額外負載(任何額外功能,不可能不存在不需要資源就能實現)?

別名是索引之上得抽象,非常強大和靈活。別名的生命週期是存於集羣狀態之中,由主節點管理。這意味着,如果有一個稱爲idaho的別名,指向了名爲土豆的索引,那麼負載就是集羣狀態映射中額外的鍵,將名稱idaho映射爲具體的索引名稱-土豆。這就意味着,和額外的索引相比,別名更加輕量級,維護數千個別名都不會負面地影響集羣。不過,我們反對創建數十萬甚至是上百萬的別名,因爲到了這個臨界點,即使最小的單個映射條目都會引起集羣狀態膨脹爲一個很大的規模。由於每次集羣狀態發生變化時,整個狀態都需要發送到每個節點,所以創建一個新集羣狀態的操作將耗費更長的時間

別名爲什麼是有用的

(1)靈活的擴容:推薦每個人爲他們的Elasticsearch所以使用別名,因爲在未來重建索引的時候,別名會賦予你更多的靈活性。假設一開始創建索引只有一個主分片,之後你又決定爲索引擴容。如果爲原索引使用的是別名,現在你可以修改別名讓其指向額外創建的新索引,而無須修改被搜索的索引之名稱(假設一開始你就爲搜索使用了別名)。

(2)動態的滾動查詢:在實際應用中,我們也不應該向單個索引持續寫入數據,知道它的分片巨大無比。巨大的索引會在數據老化後難以刪除,以——id爲單位刪除文檔不會立即釋放空間,刪除doc只在lucene分段合併時纔會真正從磁盤中刪除。即使手工觸發分段合併,仍會引起較高的I/O壓力,並且可能因爲分段巨大導致合併過程中磁盤空間不足(分段大小大於此片可用空間的一半)

因此,另外一個有用的特性是:在不同的索引創建窗口。比如,如果爲數據創建了每日索引,你可能期望一個滑動窗口覆蓋過去一週的數據,別名就稱爲last-7-days.然後,每天創建新的每日索引時,將其加入別名,同時刪除第8天前的舊索引。

這樣,對於業務方來說,讀取時使用的別名不變,當需要刪除數據的時候,可以直接刪除整個索引

(3)進行索引分組

(4)使用別名過濾器來屏蔽文檔,他們可以對正在執行的查詢自動地實施過濾

(5)結合別名和路由,在查詢或索引得時候自動地使用路由值。

管理別名

使用專門的別名API端點和一系列操作來創建別名。每個操作是一個添加或刪除的映射,外加這個操作所針對的索引和別名。

添加和移除索引別名

上面爲get-together索引增加名爲gt-alias的別名,而虛構的old-get-together索引將刪除別名gt-alias,如果索引不存在,別名操作將會失敗。

當然上面複合操作也可以用Elasticsearch的HTTP方法,在別名API上執行單個的操作:

別名的創建

當創建別名的時候,API端點有很多選項可供選擇。例如,你可以在一個具體的索引上、多個索引上或名稱符合某個模式的索引上創建別名。

別名的刪除

接收同樣的路徑參數格式

curl -XDELETE 'localhost:9200/{index}/_aliaa/{alias}'

別名信息的獲取

當然你也可以向某個索引發送一個_alias的GET請求,檢索指向該索引的全部別名。或者也可以去掉索引名稱,檢索某個別名所指向的全部索引。

除了索引_alias端點,你有一系列不同的方法來獲取索引的別名信息:

補充

使用別名過濾器來屏蔽文檔

他們可以對正在執行的查詢自動地實施過濾。比如:對於你的get-together數據,一個別名僅僅指向包含elasticsearch標籤的分組,那麼這個別名可能非常有用的。如此依賴,你可以創建一個自動進行過濾的別名,如下:

結合別名和路由

注:定製路由允許你將分享同一個路由值得多篇文檔歸集到單一分片中,而一旦這些文檔放入到統一索引,就可以路由某些查詢,讓它們可以在索引分片得子集中執行

別名是索引之上得抽象,非常強大和靈活。假設別名指向一個單獨得索引,那麼他們也可以和路由一起使用,在查詢或索引得時候自動地使用路由值。如果某個別名指向了多個索引,而你試圖將文檔索引到該別名,那麼Elasticsearch就會返回一個錯誤,原因是系統不知道文檔應該被索引到哪個具體的索引數據。

仍然使用前面的例子,你可以創建一個稱爲denver-events的別名,自動地將名稱中包含“denver”關鍵詞的活動挑選出來。同時將“denver”加入路由,這樣在搜索和索引的時候,系統會限制查詢的執行範圍。

當使用denver-events別名來建立索引的時候,這和使用routing=denver字符串參數的效果相同。由於別名是輕量級的,可以根據需要創建很多,而與此同時使用定製路由來支持更好的擴展

參考

《ES實戰》

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