剑客
关注科技互联网

ElasticSearch 5.0 测评以及使用体验

前言

目前我厂需要上线一批ElasticSerach服务器,我们针对ElasticSearch的索引性能及查询性能进行了测试,以保证能满足上线需求。在我们测试2.4.1版本的中期,ElasticSearch发布了5.0.0版本。我们感到异常的兴奋,所以对5.0.0版本也进行了测试。

ElasticSearch 5.0.0版本的升级变动相对来说还是比较大的,本文主要针对5.0.0版本关于设置方面的变动与升级进行阐述。

运行环境

1、JDK 环境

ElasticSearch5.0.0需要Java 8的环境,但是如果服务器上还有其它的应用程序,需要Java 7的环境。或者升级到Java 8代价太高,可以使用Java 7和Java 8共存的方式,在程序启动的时候指定使用Java 8运行环境。题外话:目前发现很多基础软件正向Java 8靠拢,升级Java 8的日子看来指日可待啊!

我们采用如下的方式:

1)touch setup.sh

2)echo "export JAVA_HOME=/your/jdk/path/jdk-8/;export      PATH=${JAVA_HOME}/bin/:$PATH;cd /your/es/path/es-cluster-test;./bin/elasticsearch" >> setup.sh

值得注意的是,只需把Java 8的安装包放到服务器某个目录下,不用配置环境变量,在节点启动的时候指定Java 8环境即可。

2、服务器参数配置

ElasticSearch5.0.0需要设置服务器max_map_count,ElasticSearch5.0.0要求最小为262144。

切换到root用户权限下执行:

sysctl -w vm.max_map_count=262144

3、JVM参数设置

通常我们在启动ElasticSearch的时候设置ES_MIN_MEN或者ES_MAX_MEN参数,但是在ElasticSearch5.0.0中不在支持ES_MIN_MEN及ES_MAX_MEN参数设置。随之替换为ES_JAVA_OPTS,具体写法如下:

ES_JAVA_OPTS="-Xms28g -Xmx28g" ./bin/elasticsearch

备注: 根据5.0.0的设置风格,建议一般有关于JVM参数的设置最好在jvm.options中进行设置。

ElasticSearch 5.0 测评以及使用体验

Setting Changes

从5.0开始所有的设置项目在节点启动的时候都会进行验证 , 而且参数如果设置不合理会抛出异常信息,如果设置的属性需要服务器特定的环境不符合设置的需求也会抛出异常。节点级别或者默认的索引级别的设置在节点启动的时候进行验证,集群和索引的动态设置也会在更新或者增加的时候进行验证。

在以前的es版本中可以允许特殊的索引配置作为节点级别的默认配置。从es5.0开始只有特定的设置才能在节点级别进行设置。其它的设置必须在各自相应的索引上进行设置。在现实使用中我们很容易会遇到针对每个索引都进行某项设置,这时候我们可以通过建立索引模版的方式,对某一类的索引配置参数。

以下参数设置是我们在实际测试过程中ElasticSearch5.0.0改变或者被移除的情况。

1、bootstrap.memory_lock

众所周知内存溢出对于集群的安全运行是毁灭性的,对于ElasticSearch来说一个很好的实现方式就是通过设置bootstrap.memory_lock为Enable。

ElasticSearch5.0.0采用bootstrap.memory_lock写法替换之前的bootstrap.mlockall的写法。

2、线程池设置

为了减少每个节点管理的线程对内存的消耗,每个节点都会拥有自己的线程池。这些线程池与队列相关联,使请求变为挂起而不是丢弃。所以根据自己的业务需求设置合理的参数是十分必要的,我厂目前主要针对bulk参数进行了设置。

thread_pool:

bulk:

size: 20

queue_size: 1000

在ElasticSearch5.0.0之前的版本中是如下的方式:

threadpool:

bulk:

size: 20

queue_size: 1000

备注:size最大应为服务器(物理内核数-1)的5倍,否则会抛出如下的异常信息

ElasticSearch 5.0 测评以及使用体验

如果在之前的版本中设置了不支持的属性,节点会正常启动只是不会起作用也不会抛出异常提示,但是在5.0.0版本中,如果设置不当的话会抛出异常如我进行这样设置会抛出如下的异常信息。

thread_pool: 

bulk:

type: fixed

size: 100

queue_size: 1000

ElasticSearch 5.0 测评以及使用体验

3、master节点选举超时设置

根据业务需要及数据量大小情况,我们对discovery.zen.ping_timeout参数进行了调整,目前我厂设置的为:10s。在ElasticSearch5.0.0之前的版本设置的方式是discovery.zen.ping.timeout: 10s。目前5.0.0的版本替换为discovery.zen.ping_timeout: 10s

4、index.translog.flush_threshold_ops

为什么要有Translog? 因为Translog顺序写日志比构建索引更高效。我们不可能每加一条记录就Commit一次,这样会有大量的文件和磁盘IO产生。但是我们又想避免程序挂掉或者硬件故障而出现数据丢失,所以有了Translog,通常这种日志我们叫做Write Ahead Log。我们应该根据业务需求适当的调整其对应的参数大小可以提高集群的索引速度。

备注:上文引用威廉大神的原话。(http://www.jianshu.com/p/5eeeeb4375d4)

index.translog.flush_threshold_ops在ElasticSearch5.0.0中被取消,被index.translog.flush_threshold_size替换。

但是根据节点设置级别限制,不能在配置文件中进行设置即不能在节点级别设置,如果设置的话会抛出:

ElasticSearch 5.0 测评以及使用体验

5、日志文件的变更

ElasticSearch5.0.0 日志文件的配置移植到log4j2.properties文件中,取消在logging.yml文件中设置,并且如果在目录中同时存在这两个文件,在启动的时候会报异常,程序不能正常启动。

备注:由于本人的懒癌症本想把之前版本的日志配置,直接通过拷贝文件过来使用。发现有异常抛出,从此也反映出ElasticSearch5.0.0的Check机制的强大。

6、改变配置文件地址

ElasticSearch配置文件地址默认为ES_HOME下的config文件目录。由于业务或者服务器配置的需求,ElasticSearch应用程序的config文件目录地址发生变化。故需要在程序启动的时候动态指定config文件目录。ElasticSearch5.0.0的版本采用bin/elasticsearch -Epath.conf=/path/to/your/config进行配置文件路径的更换。在之前的版本中采用/bin/elasticsearch -Des.path.conf=/path/to/your/config进行更换。

Mapping Changes

ElasticSearch5.0.0版本对mapping改动也比较多,目前设计到我厂的还是对string字段的更改。

string字段被text/keyword字段替代,string自动目前的默认配置

{

"type": "text",

"fields": {

"keyword": {

"type": "keyword",

"ignore_above": 256

}

}

}

这主要为了能更高效的实现全文检索及排序还有聚合操作,应该根据自己的业务需求,把之前索引中string的字段按照业务需求进行更改,比如设置keyword合适的就设置成keyword类型。

索引及性能对比

在相同硬件环境及配置相同的情况下,我们分别对ElasticSearch5.0.0和ElasticSearch2.4.1版本的建立索引的性能进行了对比测试。目前我们测试通过威廉大神开源的streamingpro项目(https://github.com/allwefantasy/streamingpro),进行简单的配置从Parquet导入数据到ElasticSearch集群。

ES集群配置了25台物理机,其中Data Node为20台,Master Node为3台,Client Node为2台。

每台物理机的硬件配置如下:

ElasticSearch 5.0 测评以及使用体验

创建索引spark程序配置如下:

ElasticSearch 5.0 测评以及使用体验

两个版本的集群在相同的配置环境下进行数据的写入测试

ElasticSearch 5.0 测评以及使用体验

备注:根据实际情况测试5.0.0版本相比2.4.1版本性能没有提高,并且经过多次测试结果差不多。与之前期待的5.0.0版本会有80%的提升还有一定的差距,欢迎各位童鞋探讨。

监控及展示

ElasticSearch5.0.0对监控和展示也进行了整合,目前我厂简单逻辑的展示采用kibana进行展示。在测试阶段采用Marvel进行监控,在ElasticSearch5.0.0版本中需要安装x-pack插件。

安装x-pack插件的命令:

bin/elasticsearch-plugin install x-pack

备注:安装插件也需要java8的环境,目前我厂采用的是离线安装的方式。

bin/elasticsearch-plugin install file:///path/to/file/x-pack-5.0.0.zip

踩过的坑

1、数据导入

因为streamingpro项目依赖ElasticSearch-hadoop项目,在往ElasticSearch5.0.0集群中导入数据的时候发现,需要更新ElasticSearch-hadoop项目的版本到5.0.0。在更新项目对ElasticSearch-hadoop依赖之后,发现ElasticSearch-hadoop项目需要JDK运行环境为Java8。瞬间崩溃因为我们Spark集群目前JDK运行环境为Java7,升级到Java8风险与代价很高。经过组内简短的讨论及ElasticSearch-hadoop项目代码的分析,我们发现此ElasticSearch-hadoop项目没有用到Java8的新增特性。我们决定自己用Java7环境去把代码重新编译,然后进行打包上传。

写到这里不得不再吐槽一下ElasticSearch-hadoop之前版本,在利用别名进行查询的时候最多支持32个节点。所以当我们集群超过32这个规模之后,发现利用ElasticSearch-hadoop进行别名查询的时候会出现问题。不过查找文档发现ElasticSearch-hadoop5.0.0版本修复了此问题,于是经过上面的操作(即对ElasticSearch-hadoop5.0.0采用Java7环境编译打包,然后把之前用的版本替换成新打的包)我们也顺便解决了我们利用ElasticSearch-hadoop进行别名查询的问题。

2、存在的问题

目前通过ElasticSearch-hadoop5.0.0倒入数据到ElasticSearch集群,发现一个异常。我们后续也会跟踪此bug,希望对这方面感兴趣的童鞋一起进行探讨。

ElasticSearch 5.0 测评以及使用体验

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址