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技术合作伙伴


分享到:


相關文章: