上线必备 | 高性能ES5.X部署配置清单

| 题记 |

网上当前(截止20170914)流传的各种配置文件普通存在以下问题:

1)版本低,不能和当前版本5.X匹配。

2)5.X的配置本身较1.X,2.X就有很大不同,原有配置已不适用。

3)ES英文、中文文档也没有及时更新。

现在,确保ES5.X的高性能到底需要哪些配置越发令人神往。

以下清单内容参考了ES官网文档,且都是在ES5.4.0的环境中验证过的,请放心使用。

清单1:了解ES集群拓扑结构

您需要确定您的部署拓扑,以便做出正确的Elasticsearch配置决策。

当我们启动Elasticsearch的实例,就会启动至少一个节点。相同集群名的多个节点的连接组成一个集群,

在默认情况下,集群中的每个节点都可以处理Http请求和集群节点的数据传输。

集群中的所有的节点都知道集群中其他所有的节点,可以将客户端请求转发到适当的节点。 了解节点的类别,如下

主节点(master): node.master:true node.data:false 数据节点(data): node.master:false node.data:true 客户端/路由节点(client): node.master:false node.data:false

默认情况下,节点同时是主节点和数据节点,这适合小集群(3个节点);大于3个节点后,分离主节点和数据节点变得非常重要。

清单2:配置线程池

尽量不要动线程池这个配置,如果要动,建议改为: int(( 核心数 3 )/ 2 )+ 1 。 同时满足:不允许bulk和’indexing’线程池的大小大于CPU内核数。

举例:24核处理器,检索服务器是24核,所以:线程池的大小

=(24*3)/2+1=37,

同时要满足cpu核数为24。37和24取最小值,应该选择24。

默认的队列大小是1000, 现在的问题是:并发请求数据超过了队列最大的大小,导致出错。

可能的解决方案:

1)、增加队列大小;(太大了,可能会导致内存溢出)

2)、增加节点数和副本数。

队列大小: 在elasticsearch.yml中新增如下配置(5.X已经验证):

## Threadpool Settings### Search poolthread_pool.search.size: 24thread_pool.search.queue_size: 2000#Bulk poolthread_pool.bulk.size: 24thread_pool.bulk.queue_size: 1000# Index poolthread_pool.index.size: 24thread_pool.index.queue_size: 1000

如果你的批量请求数目高于队列大小,将会出现RemoteTransportException异常。

清单3:配置堆内存

Elasticsearch 默认安装后设置的堆内存是 1 GB。

修改方式一:

如下环境变量修改方式,指定堆内存大小为4g。 export ES_HEAP_SIZE=4g

修改方式二:

命令行启动设置方式。 ./bin/elasticsearch -Xmx4g -Xms4g

修改方式三:(5.x版本建议)

修改 jvm.options配置文件。

# Xms represents the initial size of total heap space# Xmx represents the maximum size of total heap space-Xms4g
-Xmx4g

确保堆内存最小值( Xms )与最大值( Xmx )的大小是相同的,防止程序在运行时改变堆内存大小, 这是一个很耗系统资源的过程。

修改后查看:

[elasticsearch@4da2 bin]$ ps -ef | grep elasticsearch
root 17501 17474 0 Sep13 pts/2 00:00:00 su elasticsearch500 20389 1 17 04:31 pts/2 00:00:47 /usr/java/jdk1.8.0_91/bin/java -Xms4g -Xmx4g -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -server -Xss1m -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Djna.nosys=true -Djdk.io.permissionsUseCanonicalPath=true -Dio.netty.noUnsafe=true -Dio.netty.noKeySetOptimization=true -Dio.netty.recycler.maxCapacityPerThread=0 -Dlog4j.shutdownHookEnabled=false -Dlog4j2.disable.jmx=true -Dlog4j.skipJansi=true -XX:+HeapDumpOnOutOfMemoryError -Des.path.home=/opt/elasticsearch -cp /opt/elasticsearch/lib/* org.elasticsearch.bootstrap.Elasticsearch -d

注意: 最大可分配堆内存大小为: 32GB与当前ES宿主机内存二者的最小值。

举例1):ES宿主机内存:128GB,可供分配的堆内存:32GB。(建议31GB)

举例2):ES宿主机内存:32GB,可供分配的堆内存:16GB。

清单4:禁止swapping操作

在你的 elasticsearch.yml 文件中的Memory部分,修改设置如下:

bootstrap.memory_lock : true

核心原因:内存交换 到磁盘对服务器性能来说是 致命 的。 早期的版本叫:bootstrap.mlockall,

5.X版本改名为:bootstrap.memory_lock。

清单5:配置文件描述符数目

切换到ES的启动账户,如Elasticsearch。

步骤1)设置环境变量。

vim /etc/profile

增加

ulimit -n 65535

用以设定同一时间打开的文件数的最大值为65535。 source /etc/profile 使得命令生效。

步骤2)修改limits.conf配置文件。

/etc/security/limits.conf

增加

* soft nofile 65536* hard nofile 65536

用来限制打开文件数65535

步骤3)切换到Elasticsearch用户,使用ulimit -a 查看是否修改成功。

[root@4da2 elasticsearch]# ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 516047 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 65535 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 10240 cpu time (seconds, -t) unlimited max user processes (-u) 4096 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited

核心原因: Elasticsearch 在节点和 HTTP 客户端之间进行通信也使用了大量的套接字(注:sockets)。 所有这一切都需要足够的文件描述符。

而: 许多现代的 Linux 发行版本,每个进程默认允许一个微不足道的 1024 文件描述符。这对一个小的 Elasticsearch 节点来说实在是太 低 了,更不用说一个处理数以百计索引的节点。

清单6:修改最大映射数量MMP

Elasticsearch 对各种文件混合使用了 NioFs( 非阻塞文件系统)和 MMapFs ( 内存映射文件系统)。

请确保你配置的最大映射数量,以便有足够的虚拟内存可用于 mmapped 文件。这可以暂时设置:

sysctl -w vm.max_map_count=262144

或者你可以在 /etc/sysctl.conf 通过修改 vm.max_map_count 永久设置它。

[root@4ad # tail -f /etc/sysctl.confvm.max_map_count=262144

实施生成环境或者部署ES环境供使用之前,请仔细核对以上清单列表。

小结

确保ES的高性能是一个永恒的话题,还有很长的路要走。 让我们一起精进,高效习得ES技能!

[1] 5.X版本的配置变化: https://www.elastic.co/guide/en/elasticsearch/reference/current/breaking_50_settings_changes.html [2] 线程池大小问题 https://github.com/elastic/elasticsearch/issues/15582 [3] swap配置 https://www.elastic.co/guide/en/elasticsearch/reference/master/setup-configuration-memory.html

原文发布于微信公众号 - 铭毅天下(gh_0475cf887cf7)

原文发表时间:2017-09-14

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Seebug漏洞平台

GNU tar 解压路径绕过漏洞(CVE-2016-6321) 分析

Author: LG (知道创宇404安全实验室) 漏洞简介 GNU tar文档管理命令是linux系统下常用的一个打包、压缩的命令。经CSS(FSC1V Cy...

3696
来自专栏惨绿少年

KICKSTART无人值守安装

1.1 环境说明 [root@test ~]# cat /etc/redhat-release CentOS release 6.9 (Final) [roo...

2670
来自专栏Java帮帮-微信公众号-技术文章全总结

Quartz调度源码分析【面试+工作】

Quartz内部提供的调度类是QuartzScheduler,而QuartzScheduler会委托QuartzSchedulerThread去实时调度;当调度...

1112
来自专栏黑泽君的专栏

day67_Redis学习笔记_03

  上边的配置说明当前该【从redis服务器】所对应的【主redis服务器】的IP是192.168.5.128,端口是6379。

1103
来自专栏上善若水

005-centos7 搭建svn服务器

可以看到,没有telnet服务和3690端口。增加telnet服务器和3690端口:

2634
来自专栏Netkiller

PHP 安全与性能

PHP 安全与性能 摘要 我的系列文档 Netkiller Architect 手札Netkiller Developer 手札Netkiller PHP 手札...

3665
来自专栏向治洪

eclipse搭建ssh后台

SSH框架是最常用的框架之一,在搭建SSH框架的时候总有人遇到这样,那样的问题。下面我介绍一下SSH框架搭建的全过程。  第一步:准备工作。    下载好...

4465
来自专栏Hadoop实操

HDFS添加 NFS Gateway 角色实例启动失败问题及解决办法

昨天登录公司测试集群的时候,发现HDFS存在告警信息,查看详细信息,发现 NFS Gateway 进程退出,尝试重启该角色实例,执行重启操作后,报如下异常:

1.3K3
来自专栏技术专栏

SpringMVC添加异步请求支持

注意web.xml应用需在所有的servlet和filter配置加上<async-supported>true</async-supported>

6511
来自专栏大数据学习笔记

ElasticSearch 6.x 学习笔记:2.head与Kibana安装

2.1 Head插件简介 ElasticSearch-head是一个H5编写的ElasticSearch集群操作和管理工具,可以对集群进行傻瓜式操作。 显示集群...

5849

扫码关注云+社区

领取腾讯云代金券