10月27日ElasticStack发布了全新的5.0.0版本,ElasticStack是一个解决方案统称包括,Elasticsearch、Kibana、Beats、Logstash几个主要的程序。为了和其他产品版本号保持一致,elasticsearch的版本也从2.4版本直接跳到5.0版本。
升级指南:
5.X版本的ES可以读取2.X版本生成的索引,所以2.X版本要迁移到5.X, 需要重新启动完整的集群。系统不支持1.X版本到5.X版本的升级。对1.X版本的升级需要先对1.X版本的索引进行重建。
系统提供了一个迁移助手插件,可以帮助系统从2.3以上的版本迁移到5.X。
elasticsearch5.0.0主要新特性
索引性能
由于采用了很多新的技术,在5.0.0中的索引性能有了明显的提高。这些新技术包括采用了新的数字类型结构,在并发更新到同一文档中采用了新的技术减少了锁的冲突,在同步事务日志时减少锁定的条件。采用了异步同步日志机制,增加减少了磁盘寻址的时间。当依靠Elasticsearch自动生成文档ID时采用了采用了基于时间的用户实例增加了比较大的效率。支持实时文档内部更改的获取,可以增加更多的可用内存用于索引缓冲区,同时在垃圾收集中花费更少的时间。通常情况,可以提高25%-80%的效率。
数据转换(Ingest Node)
在5.0.0中,新增了一个特性数据转换(Ingest Nodes)。他可以不依赖于Logstash实现常用的过滤能力,比如grok, split, convert, date等。它可以用来执行常见的数据转换和处理。可以使用转换节点在实际索引之前对文档进行预处理。在任何转换节点中,处理索引或者块处理之前进行预处理转换。可以在任何节点开启转换功能,或者建立单独的转换节点。在默认情况下,在任何节点都有开启了转换能力,如果要关闭转换能力,需要在配置文件中添加:
node.ingest: false
在索引文档之前进行预处理,它定义了一个指定一系列处理器的管道。每个处理器以某种方式转换文档。例如,你可能有一个管道,包括一个处理器,从文档中删除字段,然后进入另一个处理器,对文档中的字段进行重命名。
使用一个管道,你只需在一个索引或批量请求后加入管道参数。例如:
PUT my-index/my-type/my-id?pipeline=my_pipeline_id { "foo": "bar" }
在使用前,需要先定义管道,例如定义上面的管道:
PUT _ingest/pipeline/my-pipeline-id { "description" : "describe pipeline", "processors" : [ { "set" : { "field": "foo", "value": "bar" } } ] }
本文由赛克 蓝德(secisland)原创,转载请标明作者和出处。
新增脚本Painless scripting
由于外部的脚本引擎太过于强大,什么都能做,用不好或者设置不当就会引起安全风险,基于安全和性能方面的考虑,在5.0中引入了一个新的脚本引擎Painless,顾名思义,简单安全,无痛使用,这个脚本引擎默认是开启的。和Groove的沙盒机制不一样,Painless使用白名单来限制函数与字段的访问,针对es的场景来进行优化,只做es数据的操作,更加轻量级,速度要快好几倍,并且支持Java静态类型,语法保持Groove类似,还支持Java的lambda表达式。
新的数据结构
在5.0版本中集成了Lucene 6,Lucene 6对数字类型和地理类型增加了一个新的点数据结构,叫做K-Ds树,它改变了数字类型的索引和搜索。它增加了36%的查询速度,增加了71%索引速度,减少了66%的硬盘空间占用,减少了85%的内存使用。新增加的IP字段支持IP4和IP6。根据Lucene 6新的LatLonPoint结构修改了地理点类型,使地理点查询的性能增加了一倍。同时还增加了一个半精度(half_float)浮点类型(16位)和大浮点类型(scaled_float),他们使用了数据压缩技术来减少磁盘占用。这些新类型可以意味着在许多情况下,特别是在数字型数据中将显着减少的磁盘空间。
引入新的字段类型Text/Keyword 来替换 String
以前的string类型被分成Text和Keyword两种类型,keyword类型的数据只能完全匹配,适合那些不需要分词的数据,对过滤、聚合非常友好,text当然就是全文检索需要分词的字段类型了。将类型分开的好处就是使用起来更加简单清晰,以前需要设置analyzer和index,并且有很多都是自定义的分词器,从名称根本看不出来到底分词没有,用起来很麻烦。另外string类型暂时还在的,6.0会移除。
搜索和聚合
Elasticsearch提供了Aggregation缓存,如果你的数据没有变化,ES能够直接返回上次的缓存结果,
但是有一个场景比较特殊,就是 date分组,如:from:now-30d to:now,now是一个变量,每时每刻都在变,所以query条件一直在变,这样缓存也就是没有利用起来。在5.0中做了改进,
首先,`now`关键字最终会被重写成具体的值;
其次,每个分片会根据自己的数据的范围来重写查询为 `match_all`或者是`match_none`查询,所以现在的查询能够被有效的缓存,并且只有个别数据有变化的分片才需要重新计算,大大提升查询速度。
搜索结果分页增加了search_after特性,它有效地跳过以前返回的结果只返回下一页的数据。移动搜索现在可以被并行执行。默认使用BM25评分算法,替换之前的TF/IDF评分算法。
增加了Percolator type映射类型。完全重写了completion suggester
用户友好性的改进
索引的改进
Elasticsearch的配置实在太多,在新的5.0版本中,对配置验证更加严格,保证原子性,如果其中一项失败,那个整个更新请求都会失败,不会一半成功一半失败。
新增了一个Shrink接口
在5.0之前的版本中索引的分片数是固定的,设置好了之后不能修改,如果发现分片太多或者太少,如果要修改,只能重建索引。在5.0中增加了Shrink接口,它可将分片数进行收缩成它的因数,如之前你是15个分片,你可以收缩成5个或者3个又或者1个,那么我们就可以想象成这样一种场景,在写入压力非常大的收集阶段,设置足够多的索引,充分利用shard的并行写能力,索引写完之后收缩成更少的shard,提高查询性能。
新增了一个Rollover接口
对于日志类的数据一般我们按天来对索引进行分割(数据量更大还能进一步拆分),我们以前是在程序里设置一个自动生成索引的模板,例如logstash中的logstash-[YYYY-MM-DD]模板,现在5.0中提供了一个更加简单的方式:Rollover API,例如:
PUT /logs-000001{ "aliases": { "logs_write": {} } } # Add > 1000 documents to logs-000001 POST /logs_write/_rollover
{ "conditions": { "max_age": "7d", "max_docs": 1000 } }
从上面可以看到,首先创建一个logs-0001的索引,它有一个别名是logs_write,然后我们给这个logs_write创建了一个rollover规则,即这个索引文档不超过1000个或者最多保存7天的数据,超过会自动切换别名到logs-0002,你也可以设置索引的setting、mapping等参数,剩下的es会自动帮你处理。
新增:Depreated logging
大家在用ES的时候,其实有些接口可能以及打上了Depreated标签,即废弃了,在将来的某个版本中就会移除,你当前能用是因为一般废弃的接口都不会立即移除,给足够的时间迁移,但是也是需要知道哪些不能用了,要改应用代码了,所以现在有了Depreated日志,当打开这个日志之后,你调用的接口如果已经是废弃的接口,就会记录下日志,那么接下来的事情你就知道你应该怎么做了。
新增: Cluster allocation explain接口
『谁能给我一个shard不能分配的理由』,现在有了,大家如果之前遇到过分片不能正常分配的问题,但是不知道是什么原因,只能尝试手动路由或者重启节点,但是不一定能解决,其实里面有很多原因,现在提供的这个explain接口就是告诉你目前为什么不能正常分配的原因,方便你去解决。
弹性
5.0版本增加了很多变化,它使ES的更加的安全。分布式模型的每一部分都已分离,重构,简化,并使之更可靠。群集状态更新要等待集群中的所有节点的确认。当主分片复制失败的时候,主要现在等待master节点的响应。索引的据路径现在使用UUID,而不是索引名称,可以避免命名冲突。
在5.0中增加了启动检查来来确保配置的正确性。同时引入了开发模式和生产模式两种方式,对生产模式的检查会更加的严格。系统增加了新的内存控制器,在聚合请求等过程监控内存的使用,当聚合内存有可能过大的时候则中断查询请求,正常情况下,内存不足的情况基本上不会发生。
对多用户的情况下,系统增加了更多的权限控制来减少普通用户的误操作,例如:请求超时后禁用的文本字段字段的数据加载,限制分片请求的数量,限制映射的字段数量等等。
java RestClient客户端
5.0里面提供了第一个Java原生的REST客户端SDK,相比之前的TransportClient,版本依赖简单,集群升级不影响,支持跨Java版本的调用等,新的基于HTTP协议的客户端对Elasticsearch的依赖解耦,没有jar包冲突,提供了集群节点自动发现、日志处理、节点请求失败自动进行请求轮询,充分发挥Elasticsearch的高可用能力,并且性能不相上下。
迁移助手
Elasticsearch迁移助手是一个网站的插件,它可以帮助你从Elasticsearch 2.3.x/2.4.x版本到5.x版本的迁移,它配备了三个工具:
集群的检查:在您的群集、节点和索引上运行一系列检查,并提醒您在升级之前需要纠正的任何已知问题。
重建索引助手:在V2.0.0版本之前的索引需要重新才可以在5.0中识别。重建索引助手通过一个按钮升级索引。
过期接口日志:当使用过期接口时,系统会把过期的日志打出来,助手可以在集群中打开或者关闭过期日志打印功能。
赛克蓝德(secisland)后续会逐步对Elasticsearch的最新版本的各项功能进行分析,近请期待。