Elasticsearch之Alias別名經典應用場景

序言

Elasticsearch提供了很多開發與運維便利的特性,很多特性看起來微不足道,需要時感慨真是臥虎藏龍。以下圍繞Elasticsearch提供的別名特性展開,主要探討幾個方面:

  • 別名的應用類型
  • 別名的應用場景


Elasticsearch之Alias別名經典應用場景

別名本質是一種內置代理


需求背景

早期基於Lucene自主開發搜索應用,定期重新生成索引,之後應用訪問平滑的切換,需要做一大堆的輔助工作,後接觸到Elasticsearch,提供了索引別名特性,很容易完成切換。

應用場景

Elasticsearch提供了兩種別名機制:

  • 索引別名
  • 字段別名

索引別名

Elasticsearch索引本質上是個虛擬的空間,本後的實際數據存儲查詢都是由分片完成,索引訪問索引本身也是通過索引代理實現,可以這樣理解,默認索引別名就是索引名稱本身。

索引別名,應用在索引訪問層面。

  • 應用索引重建切換

在應用系統中,索引需要定期維護,如索引重建,重建時為了不影響線上系統應用,一般會重新創建新的索引,待新索引數據重建完成,就需要無縫的替換掉原有索引,這個時候就需要引入索引別名


Elasticsearch之Alias別名經典應用場景

索引重建切換

  • 應用索引外部隔離

互聯網行業中,典型的如電商訂單場景,有實時訂單與歷史訂單;常規設計有實時訂單索引與歷史訂單索引分開,實時索引存儲最近未完成的訂單數據,如最近30天內;歷史索引則相當於全量的訂單數據,相比實時會有一些延遲,歷史的數量非常的龐大,一般也會拆分成很多個索引,訪問歷史索引數據可以通過別名來指定,綁定所有歷史索引,而不用人工指定索引查詢,這帶來了很便利。


Elasticsearch之Alias別名經典應用場景

歷史訂單索引別名綁定隔離

  • 應用索引內部隔離

索引創建多了,集群需要管理更多的元數據,消耗更多的管理節點資源,如果索引本身數量不是很大,可以將很多數據合併到一個索引中,對外採用多別名的方式隔離,每個別名僅限其中某些類型的數據訪問。


Elasticsearch之Alias別名經典應用場景

別名綁定索引內部隔離,某電商商品內部隔離


字段別名

字段別名,更容易理解,應用在字段訪問層面。

  • 字段代理查詢

在傳統關係型數據庫中,由於業務原因,早期設計數據表時,字段與業務的映射是基於某種場景需求,後期又增加了更多的數據字段,原來的字段命名與新的會有很多奇異,造成一些開發與設計困擾,在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>


Elasticsearch之Alias別名經典應用場景

單個索引別名綁定多個索引

  • 索引別名創建,限定索引內容查詢場景實現
<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技術合作夥伴


分享到:


相關文章: