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

栏目: 后端 · 发布时间: 7年前

内容简介:别名在Elasticsearch中有两种分类。

0、题记

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

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

1、别名分类

别名在Elasticsearch中有两种分类。

1.1 索引别名

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

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

2)对多个索引进行分组组合(例如,last three months的索引别名:是过去3个月索引 logstash 201903, logstash 201904, 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 假设没有别名,如何处理多索引检索?

  • 方式一:多索引逗号分隔检索。

  • 方式二:通配符索引检索。

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

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

  • 步骤1:别名关联已有索引。

  • 步骤2:使用别名检索

3、索引别名的好处

3.1 大数据量的管理

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

  • 好处1 :来简化从Elasticsearch中删除数据的过程。

  • 好处2 :在没有任何停机时间的情况下从Elasticsearch中删除最旧的数据,不会出现任何查询中断,也不会进行任何客户端更改。

    基于时间索引的实现机制如下:

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

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

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

答案:

  • 1、删除索引数据只能使用:delete by query,相比删除索引,delete by query删除数据只是逻辑删除;

  • 2、真正的删除实际是段合并后的物理删除分段,也就是delete by query后,有一段时间磁盘空间不降反升。此时的检索效率会非常低。

3.2 用户无感知的重建索引

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

  • 1)ik smart改成ik max_word分词以高效分词,

  • 2)long类型改成keyword以提升检索效率,

  • 3)修改索引分片数以便于机器横向扩展,

  • 4)索引分成更小粒度的索引等以提升性能。

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

实战举例:

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

答案:

  • 1、无法保证查询的连续性;

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

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

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

会报错: 

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

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

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

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

返回信息:

`

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

是一致的。

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

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

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

  • 方式一:基于时间创建索引,指定多索引别名。 比如分为:近1年索引别名,近3个月索引别名,近1个月索引别名,近1周索引别名,近3天索引别名。 检索的时候,先  敲定时间范围 ,然后在指定范围的别名下检索。

    核心原理: 物理上基于时间做了分隔,再加上冷热数据分离机制,会极大缩小了检索样本。

  • 方式二:使用filter 别名或者 路由别名机制,提升效率。 filter Alias上代码,实际业务中极易被忽视,但会极大提升效率。

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

5、字段别名实践一把

星友的问题: 

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

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

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

6、小结

  • 实战中,一般在开发  中后期 才发现索引别名的妙处。正如文中分析:1、高效索引管理;2、用户无感知维护数据修改更新。

  • 建议:相同索引别名的物理索引有  一致的Mapping和数据结构 ,以提升检索效率。

  • 注意:发挥索引别名在检索方面的优势,在写入和更新还得使用   物理索引

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

参考:

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

推荐阅读:

重磅 | Elasticsearch7.X学习路线图

Elasticsearch 7.0 正式发布,盘他!

干货 | Elasticsearch 7.1免费安全功能全景认知

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

加入星球,更短时间更快习得更多干货!


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Programming Ruby

Programming Ruby

Dave Thomas、Chad Fowler、Andy Hunt / Pragmatic Bookshelf / 2004-10-8 / USD 44.95

Ruby is an increasingly popular, fully object-oriented dynamic programming language, hailed by many practitioners as the finest and most useful language available today. When Ruby first burst onto the......一起来看看 《Programming Ruby》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具