elasticsearch 7重要更新内容

elasticsearch 7更新了,其中有一些很不错的功能点。比如集群间的备份,查询熔断器,索引生命周期管理,生产环境级别的xpack-sql,完善的hive-level-rest-client等。

重要更新

默认自适应选择分片

在6.x及以前的版本,请求是会轮询发放给主分片和副本分片的,如果其中一个分片出现了超长的gc,那这时候响应就会很慢。6.1的时候新增了个配置项,可以让es自适应选择性能较好的分片优先查询,但该配置项是默认关闭的,在7.0里该配置项默认打开。

分片搜索空闲时跳过refresh

以前版本的数据插入,每一秒都会有refresh动作,这使得es能成为一个近实时的搜索引擎。但是当没有查询需求的时候,该动作会使得es的资源得到较大的浪费。

在es7中,如果一个分片处于搜索空闲状态(30秒内都没有查询),那么插入数据不会被refresh,直到有一个查询过来触发refresh,或者显示的触发refresh。该改动可以显著的插入索引性能。

默认单分片

往前的版本默认都是5个分片,在数据量有限的情况下,如果是日增索引,那么每天都会有5个索引,会导致索引非常的多,使得master在管理的内存上开销比较大。新版本上变成了默认1个分片。

Lucene升级为lucene 8

es可以看过是分布式lucene,lucene的性能直接决定es的性能。lucene8在top k及其他查询上有很大的性能提升。

跨集群搜索的优化

es 5.3开始提供了跨集群搜索的功能。es7的跨集群搜索增加了ccs_minimize_roundtrips模式,暂不细究该模式的实现方式,该模式会减少不需要的网络交互,在高延迟的场景下,该模式能带来更好的性能。

新的集群调度系统实现

以前版本的es统一用一套方便的可插板的集群调度ZenDiscovery,详见:http://note.youdao.com/noteshare?id=cf568cab9970d55e14b2a9c2a6ba2b6a ;该调度系统非常方便,但是minimum_master_nodes这个配置项经常被遗忘,可能会导致脑裂。在存活的大集群中维护该配置项也是个成本很大的工作。

在es7中,该部分已被重构。新版本的只需要亚秒级就可以完成选举,而老的Zen那套可能需要几秒钟才能完成。也不再需要配置minimum_master_nodes,不用担心脑裂问题。 据说该改动的重构也为es后期的扩展性得到了提升。

更好的熔断器

在查询的时候,熔断器会拒绝掉大查询以避免节点出现oom,集群被拖垮的情况。

跨集群备份可在生产环境使用

非常非常非常有用的功能,跨集群备份!!!

该功能在6.5的时候还处于beta地步,现在可以在线上环境使用了,跨集群备份!可以做集群双活了。

索引生命周期管理

索引声明周期管理(Index Lifecycle Management ),简称ILM,ILM在es 6.6的时候为beta版,在7中可在生产环境使用,该功能可以轻松的控制es中的数据,很实用的功能。内容较多,具体查看https://www.elastic.co/guide/en/elasticsearch/reference/7.0/index-lifecycle-management.html

xpack-sql在生产环境ready

es 6.3中内置了sql,当时还是GA版的,由于很多功能的缺失,用起来比较鸡肋,现在终于是正式版了,并且提供了GA版的jdbc。

java High Level REST Client客户端功能完善

es 6后就主推了Rest Client,但是在早期的版本中,由于很多功能未实现,需要通过Low level Cient来模拟发送http请求来获取返回内容。 在es7中该部分功能得到了极大的完善。

支持纳秒级的时间

老版本的时间只支持到毫秒级,现在使用date_nanos字段可以写入到纳秒级的时间。

更快的top k查询

es 7在top k上查询进行了性能优化,得分最高的若干个是可配置的,默认值为10000.大概原理为查top k的时候会跳过得分低于10000的文档来达到更快的性能。在命中的结果集小于10000的情况下,该性能优化并不会生效。 该方法是通过跳过较低的排名记录得到的实现,所以在聚合查询上并不生效。详细原理点击查看:https://www.elastic.co/blog/faster-retrieval-of-top-hits-in-elasticsearch-with-block-max-wand

支持TLS 1.3协议

然并卵的功能,TLS 1.3协议对开发来说能带来什么好处呢?

支持自定义的jdk版本

以前只能用open jdk,现在公司自己的jdk版本也可以支持了。

Rank Features

增加了rank_feature 和 rank_features两个字段类型,不知道这类型有什么作用。

一些不算亮点的改动

Aggregations
- 老版本中统计函数遇到控制返回为null,百分比函数返回为NaN;百分比统计函数和排序统计函数当遇到空值的时候返回值为null;
- 老版本中当field1不存在时,sum(field1)=0,而stats.sum(field1)=null;统一都返回为0。
- 上个版本_agg 中的一些decprecated函数被移除。
一些权限相关的
- 略过不谈
CRUD
- 然并卵的版本冲突提示优化,老版本提示冲突版本号为-1,新版本提示版本号不存在
- UpdateRequest加入了ObjectParser,老版本中会有一些肯定无法执行的update script,会被接受但不会具体执行,新版本则是拒绝。
- 移除并发控制时候cas指定内部版本号的功能。这个功能会带来比较严重的问题,[详见链接](https://github.com/elastic/elasticsearch/pull/38254)        
Indices APIs
- 没什么重要的更新,nested字段默认10000上限,exists索引不存在时候返回404之类的
Java Low Level REST Client
- 画重点,不再支持jdk7!
Store
- 存储上增加了一个叫elasticsearch-shard的东西,删除掉了index.shard.check_on_startup: fix这个配置和elasticsearch-translog。起因是他们认为这个配置项太危险,同时他们需要一个自动删除腐化分片的工具。详见:https://github.com/elastic/elasticsearch/issues/31389
其他
- 略