序言
Elasticsearch提供了很多開發與運維便利的特性,很多特性看起來微不足道,需要時感慨真是臥虎藏龍。以下圍繞Elasticsearch提供的別名特性展開,主要探討幾個方面:
- 別名的應用類型
- 別名的應用場景
需求背景
早期基於Lucene自主開發搜索應用,定期重新生成索引,之後應用訪問平滑的切換,需要做一大堆的輔助工作,後接觸到Elasticsearch,提供了索引別名特性,很容易完成切換。
應用場景
Elasticsearch提供了兩種別名機制:
- 索引別名
- 字段別名
索引別名
Elasticsearch索引本質上是個虛擬的空間,本後的實際數據存儲查詢都是由分片完成,索引訪問索引本身也是通過索引代理實現,可以這樣理解,默認索引別名就是索引名稱本身。
索引別名,應用在索引訪問層面。
- 應用索引重建切換
在應用系統中,索引需要定期維護,如索引重建,重建時為了不影響線上系統應用,一般會重新創建新的索引,待新索引數據重建完成,就需要無縫的替換掉原有索引,這個時候就需要引入索引別名
- 應用索引外部隔離
互聯網行業中,典型的如電商訂單場景,有實時訂單與歷史訂單;常規設計有實時訂單索引與歷史訂單索引分開,實時索引存儲最近未完成的訂單數據,如最近30天內;歷史索引則相當於全量的訂單數據,相比實時會有一些延遲,歷史的數量非常的龐大,一般也會拆分成很多個索引,訪問歷史索引數據可以通過別名來指定,綁定所有歷史索引,而不用人工指定索引查詢,這帶來了很便利。
- 應用索引內部隔離
索引創建多了,集群需要管理更多的元數據,消耗更多的管理節點資源,如果索引本身數量不是很大,可以將很多數據合併到一個索引中,對外採用多別名的方式隔離,每個別名僅限其中某些類型的數據訪問。
字段別名
字段別名,更容易理解,應用在字段訪問層面。
- 字段代理查詢
在傳統關係型數據庫中,由於業務原因,早期設計數據表時,字段與業務的映射是基於某種場景需求,後期又增加了更多的數據字段,原來的字段命名與新的會有很多奇異,造成一些開發與設計困擾,在Elasticsearch中,一樣有此問題,所以可以通過字段別名替代,消除這種歧義。
- 注意字段別名不能直接更新,可直接更新別名指向的字段
技術實現
Elasticsearch提供的別名API非常簡單,相當容易理解。
索引別名
- 索引別名創建,簡單代理場景實現
<code>#為索引myindex_001創建別名myindex PUT /myindex_001/_alias/myindex #原有索引訪問方式 GET myindex_001/_search #通過別名訪問方式 GET myindex/_search/<code>
- 索引別名創建,綁定多個索引場景實現
<code>#為索引myindex_001~005 綁定相同別名 myindex PUT myindex_001/_alias/myindex PUT myindex_002/_alias/myindex PUT myindex_003/_alias/myindex PUT myindex_004/_alias/myindex PUT myindex_005/_alias/myindex #通過別名訪問所有索引 GET myindex/_search/<code>
- 索引別名創建,限定索引內容查詢場景實現
<code>#創建索引myuser_001的別名userid_12,限定訪問user_12的數據 PUT /myuser_001/_alias/user_12 { "routing" : "12", "filter" : { "term" : { "user_id" : 12 } } } #通過別名訪問所有索引 GET user_12/_search/<code>
字段別名
- 字段別名創建,簡單代理場景實現
<code>#創建字段別名索引 mytrips_001 PUT mytrips_001 { "mappings": { "properties": { "distance": { "type": "long" }, "route_length_miles": { "type": "alias", "path": "distance" }, "transit_mode": { "type": "keyword" } } } } #填充數據 POST mytrips_001/_doc { "distance":200, "transit_mode":"huoche" } #字段別名限制查詢 GET /mytrips_001/_search { "query": { "range" : { "route_length_miles" : { "gte" : 110 } } } }/<code>
注意事項
索引別名
索引別名確實相比過去自主實現切換確實代理了很多便利,但也不可以大規模混亂使用,使用時注意幾點
- 原有索引名稱命名要規範有規律可循,創建別名綁定時,容易歸類
- 索引別名可綁定多個索引,單個索引也可綁定多個索引別名,注意控制雙向綁定的數量
字段別名
字段別名限制在查詢領域,若是數據更新還是需要更新原有的數據字段,否則會出錯。
結語
課程
Elasticsearch產品很注重實戰便利,一方面降低了我們原有應用系統的複雜度,一方面減少了我們產品接入的成本。Elastic Stack是一個很龐大的數據產品系列,自主學習需要花費很多精力與金錢,為此我們設計了很多對應課程系列,面向多種用戶層面,面向企業客戶,面向個體用戶。 [《ES訓練營第一期:Elastic入門到進階實戰》](https://ke.qq.com/course/2328146?tuin=d3fd9a94)是我們面向個體用戶最簡單的課程系列之一。課程內容來源於我們的實際工作中提煉,與當下很多課程屬於學院派不一樣,我們知曉項目實際運用的需求。
加入我們的課程VIP學習計劃
內容
內容來源於筆者實際工作中運用多種技術棧實現場景需求,得出的一些實戰經驗與總結思考,提供後來者借鑑參考,請勿抄襲,內容原創,轉載請註明。
關於
李猛(ynuosoft),Elastic-stack產品深度用戶,通過Elastic工程師認證,2012年接觸Elasticsearch,對Elastic-Stack技術棧開發、架構、運維等方面有深入體驗,實踐過多種Elastic項目,最暴力的大數據分析應用,最複雜的業務系統應用;業餘為企業提供Elastic-stack諮詢培訓以及調優實施;多年實戰經驗,愛搗騰,擅長大數據,機器學習,系統架構領域。
深圳星圖智能 星圖智能是Elastic官方MSP技術合作夥伴