专栏首页铭毅天下Elasticsearch基础但非常有用的功能之一:别名

Elasticsearch基础但非常有用的功能之一:别名

0、题记

本文是系列文章第一篇。介绍Elasticsearch的一些非常基础但实战开发确非常有用的技术点。了解这些技术点会帮助你设计更易于维护的数据索引,预先知道PB级大数据索引实战中的坑,提升工作效率。

本文从别名分类、索引别名实践、索引别名的好处、索引别名常见问题及坑解读、字段别名实践一把 五个方面进行详细解读。

1、别名分类

别名在Elasticsearch中有两种分类。

1.1 索引别名

官方释义: 索引别名可以指向一个或多个索引,并且可以在任何需要索引名称的API中使用。 别名为我们提供了极大的灵活性。它们允许我们执行以下操作:

1)在正在运行的集群上的一个索引和另一个索引之间透明切换;

2)对多个索引进行分组组合(例如,lastthreemonths的索引别名:是过去3个月索引 logstash201903, logstash201904, logstash_201905的组合);

3)在索引中的文档子集上创建“视图”(结合业务场景,会提升检索效率)。

通俗解释: 索引别名类似:windows的快捷方式,linux的软链接,mysql的视图。

  • 前提:Elasitcsearch创建索引后,索引名不允许改。很多业务场景下单一索引可能无法满足要求。
  • 场景1:PB级别增量数据,借助rollover api实现,由基于日期的n个索引组成,显然,对外提供服务使用别名会很便捷。
  • 场景2:试想,线上提供服务的某个索引出了问题,比如:某字段分词定义不准确,如何保证对外提供服务不停止(不更改业务代码)的前提下更换索引,显然,别名更合适。

注意:实际业务场景使用别名会很方便、灵活、快捷、业务松耦合!!

1.2 字段别名

在Elasticsearch Mapping定义的6.4+版本才有的字段类型。

通俗解释

试想一下有一种业务场景。比如在实际的业务开发中:需要对Facebook、twitter行采集,采集入库的是两个业务团队。

他们对content,分别使用了两个字段。其中一个是,content。另外一个是cont。 这时候存储到elasticsearch会有两个字段。

这样如果我们在检索、写业务代码的时候,是不是要写两个不同的字段来处理呢? 如果有可能写成一个字段,代码方面就很避开业务耦合,就很方便了。

我认为这是字段别名的由来。

2、索引别名实践

2.1 假设没有别名,如何处理多索引检索?

  • 方式一:多索引逗号分隔检索。
POST visitor_logs_2017,visitor_logs_2018/_search
  • 方式二:通配符索引检索。
POST visitor_logs_*/_search

2.2 有了别名后,操作变得简单

实战中,我们不需要知道操作的实际索引名称,我们可以透明地更改别名引用的索引而不会影响使用别名的用户。

  • 步骤1:别名关联已有索引。
POST /_aliases?pretty{  "actions": [    {      "add": {        "index": "visitor_logs_2017",        "alias": "visitor_logs"      }    },    {      "add": {        "index": "visitor_logs_2018",        "alias": "visitor_logs"      }    }  ]}
  • 步骤2:使用别名检索
GET /visitor_logs/_search

3、索引别名的好处

3.1 大数据量的管理

场景: 实战中,可能需要基于时间的数据保留策略(利用rollover机制实现),并从系统中删除旧数据。 使用索引别名:

  • 好处1:来简化从Elasticsearch中删除数据的过程。
  • 好处2:在没有任何停机时间的情况下从Elasticsearch中删除最旧的数据,不会出现任何查询中断,也不会进行任何客户端更改。 基于时间索引的实现机制如下:

推荐阅读:

  • https://gitbook.cn/books/5c52c6923417565017a61ce0/index.html

试想一下:如果不是基于时间的索引,而使用大索引,删除历史数据会发生什么?

答案:

  • 1、删除索引数据只能使用:deletebyquery,相比删除索引,deletebyquery删除数据只是逻辑删除;
  • 2、真正的删除实际是段合并后的物理删除分段,也就是deletebyquery后,有一段时间磁盘空间不降反升。此时的检索效率会非常低。

3.2 用户无感知的重建索引

实战中,索引的设计可能不是一步到位。 随着业务的扩展,可能会在开发的中后期,调整索引Mapping结构, 比如:

  • 1)iksmart改成ikmax_word分词以高效分词,
  • 2)long类型改成keyword以提升检索效率,
  • 3)修改索引分片数以便于机器横向扩展,
  • 4)索引分成更小粒度的索引等以提升性能。

通常的做法,都需要借助:reindex操作完成索引的迁移。 如果要确保线上环境的可靠运行且用户无感知(即无需告知用户,不影响用户的业务),使用别名指向更改前和更改后的索引是 绝佳方案

实战举例:

POST /_aliases?pretty{  "actions": [    {      "remove": {        "index": "visitor_logs_2018",        "alias": "visitor_logs"      }    },    {      "add": {        "index": "visitor_logs_2018_01",        "alias": "visitor_logs"      }    }  ]}

试想一下,如果没有索引别名呢?

答案:

  • 1、无法保证查询的连续性;
  • 2、无法保证线上业务查询的可靠性(需要告知用户,业务中断一段时间)。

4、索引别名常见问题及坑解读

问题1:ES批量插入可以使用别名插入吗?

会报错:

no write index is defined for alias[xxx]....

注意:索引别名不是在任何地方都通用。写入或更新数据的时候需要指明物理索引,不要向别名写入数据。

问题2:ES怎么获取所有别名信息 alias?

或者问题:如何通过索引别名查找实际索引名称?

GET _cat/aliases

返回信息:

visitor_logs visitor_logs_2017 - - -.kibana      .kibana_1         - - -visitor_logs visitor_logs_2018 - - 

`

问题3:使用别名和基于索引效率一样吗?

是一致的。

前提:索引和别名指向相同的数据,相同的检索条件。

原理:索引别名只是物理索引的软链接名称而已。

问题4:如何使用别名提升检索效率?

  • 方式一:基于时间创建索引,指定多索引别名。 比如分为:近1年索引别名,近3个月索引别名,近1个月索引别名,近1周索引别名,近3天索引别名。 检索的时候,先 敲定时间范围,然后在指定范围的别名下检索。 核心原理:物理上基于时间做了分隔,再加上冷热数据分离机制,会极大缩小了检索样本。
  • 方式二:使用filter 别名或者 路由别名机制,提升效率。 filter Alias上代码,实际业务中极易被忽视,但会极大提升效率。
POST /_aliases{    "actions" : [        {            "add" : {                 "index" : "test1",                 "alias" : "alias2",                 "filter" : { "term" : { "user" : "kimchy" } }            }        }    ]}

路由机制参考官方文档即可。

5、字段别名实践一把

星友的问题: “Aliasdatatype,这个数据类型,在现实工作中的使用场景是什么?看官方文档,没有很好理解?”

字段别名原理第一部分已详细解释,不再赘述。 这里实践一把,加深理解。

PUT trips{  "mappings": {    "_doc": {      "properties": {        "distance": {          "type": "long"        },        "route_length_miles": {          "type": "alias",          "path": "distance"        },        "transit_mode": {          "type": "keyword"        }      }    }  }}

注意: 当用户使用检索时,实际可以使用routelengthmile字段替代distance做检索,以达到distance一样的效果。

6、小结

  • 实战中,一般在开发 中后期才发现索引别名的妙处。正如文中分析:1、高效索引管理;2、用户无感知维护数据修改更新。
  • 建议:相同索引别名的物理索引有 一致的Mapping和数据结构,以提升检索效率。
  • 注意:发挥索引别名在检索方面的优势,在写入和更新还得使用 物理索引

你的实际Elasticsearch业务场景,有哪些非常基础但实战开发非常有用的技术点呢? 欢迎留言留下你的思考,让我们一起精进!

参考:

https://cambium.consulting/articles/2018/2/22/our-favorite-elasticsearch-features-part-2-index-aliases

本文分享自微信公众号 - 铭毅天下(gh_0475cf887cf7),作者:铭毅天下

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-06-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 干货 | Elasticsearch 索引设计实战指南

    随着 Elastic 的上市,ELK Stack 不仅在 BAT 的大公司得到长足的发展,而且在各个中小公司都得到非常广泛的应用,甚至连“婚庆网站”都开始使用 ...

    铭毅天下
  • 干货 | Elasticsearch Reindex性能提升10倍+实战

    reindex和snapshot的速率比用filebeat或者kafka到es的写入速率慢好几个数量级(集群写入性能不存在瓶颈),reindex/snapsho...

    铭毅天下
  • 干货 | Elasticsearch索引生命周期管理探索

    Elasticsearch上海Meetup中ebay工程师提了索引生命周期管理的概念。的确,在Demo级别的验证阶段我们数据量比较小,不太需要关注索引的生命周期...

    铭毅天下
  • Elasticsearch基础但非常有用的功能之一:别名

    本文是系列文章第一篇。介绍Elasticsearch的一些非常基础但实战开发确非常有用的技术点。了解这些技术点会帮助你设计更易于维护的数据索引,预先知道PB级大...

    用户1461999
  • Linux进程间通信——匿名管道

    版权声明:本文为博主原创文章,转载请注明博客地址: https://blog.csdn.ne...

    zy010101
  • 又见程序媛 | 从索引的创建角度分析热门“面试题”

    关于周一 Eygle 在文章《千头万绪:从一道面试题看数据库性能和安全的方方面面》讲到的 SELECT* FROM girls WHERE age BETWEE...

    数据和云
  • (一)Mybatis的入门 - Titan的Mybatis系列学习笔记

    MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集...

    泰坦HW
  • Ubuntu pip3安装uwsgi报错

    py3study
  • 都有哪些进程间通信方式?麻烦你不要再背了

    学习软件工程规范的时候,我们知道瀑布模型,在整个项目开发过程分为多个阶段,上一阶段的输出作为下一阶段的输入。各个阶段的具体内容如下图所示

    我是程序员小贱
  • 前端基础-CSS属性选择器

    cwl_java

扫码关注云+社区

领取腾讯云代金券