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

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 题记网上当前(截止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

1

2

3

默认情况下,节点同时是主节点和数据节点,这适合小集群(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 pool

thread_pool.search.size: 24

thread_pool.search.queue_size: 2000


# Bulk pool

thread_pool.bulk.size: 24

thread_pool.bulk.queue_size: 1000


# Index pool

thread_pool.index.size: 24

thread_pool.index.queue_size: 1000

1

2

3

4

5

6

7

8

9

10

11

12

13

如果你的批量请求数目高于队列大小,将会出现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

1

2

3

4

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


修改后查看:


[elasticsearch@4da2 bin]$ ps -ef | grep elasticsearch

root 17501 17474 0 Sep13 pts/2 00:00:00 su elasticsearch

500 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

1

2

3

注意:

最大可分配堆内存大小为:

32GB与当前ES宿主机内存二者的最小值。

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

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


4、禁止swapping操作

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


bootstrap.memory_lock : true

1

核心原因:内存交换 到磁盘对服务器性能来说是 致命 的。

早期的版本叫:bootstrap.mlockall,5.X版本改名为:bootstrap.memory_lock。

参考:


bootstrap.memory_lock: true导致Elasticsearch启动失败问题的解决方案:

http://www.cnblogs.com/zhzhang/p/6741070.html


5、修改文件描述符数目(ok)

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


步骤1)、设置环境变量。

vim /etc/profile

1

增加


ulimit -n 65535

1

用以设定同一时间打开的文件数的最大值为65535。

source /etc/profile 使得命令生效。


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

/etc/security/limits.conf

1

增加


* soft nofile 65536

* hard nofile 65536

1

2

用来限制打开文件数65535


步骤3)、切换到Elasticsearch用户,使用ulit -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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

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


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


6、修改 最大映射数量 MMP

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


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


sysctl -w vm.max_map_count=262144

1

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


[root@4ad config]# tail -f /etc/sysctl.conf

vm.max_map_count=262144

1

2

实施生成环境或者部署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

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
9月前
|
缓存 运维 jenkins
上线操作规范——基础版本
最近团队成员的上线操作让人头疼。几个特别突出的问题: 1、上线准备不足,设计文档中没有体现、也没有考虑到可能的资源依赖,导致临操作了才想起来做资源申请; 2、暗箱操作... 一再要求上线时需要在群内周知,以便前后端、测试、产品共同配合完成,但依然不加理会,总是要主动询问才回复已操作; 3、发布完成就认为上线完成,有时甚至不做基本的校验...
176 0
|
10月前
|
运维 监控 应用服务中间件
【运维知识进阶篇】集群架构-Nginx基础(安装+启动+配置+多业务实现+日志管理)(下)
【运维知识进阶篇】集群架构-Nginx基础(安装+启动+配置+多业务实现+日志管理)(下)
168 0
|
10月前
|
存储 运维 前端开发
【运维知识进阶篇】集群架构-Nginx基础(安装+启动+配置+多业务实现+日志管理)(上)
【运维知识进阶篇】集群架构-Nginx基础(安装+启动+配置+多业务实现+日志管理)
162 0
|
Prometheus Kubernetes Cloud Native
上线控制台,降低使用门槛|Higress 1.0.0 RC 版本发布
一个遵循开源Ingress/Gateway API标准,提供流量调度、服务治理、安全防护三合一的高集成、易使用、易扩展、热更新的下一代云原生网关。
上线控制台,降低使用门槛|Higress 1.0.0 RC 版本发布
|
大数据 流计算 开发者
环境篇 ES 集群的测试|学习笔记
快速学习环境篇 ES 集群的测试
125 0
|
分布式计算 安全 Hadoop
环境篇 ES 集群安装准备工作|学习笔记
快速学习环境篇 ES 集群安装准备工作
72 0
|
JSON 测试技术 数据格式
|
运维 Kubernetes Cloud Native
Rainbond 5.6 版本发布,增加多种安装方式,优化拓扑图操作体验
Rainbond 5.6 版本,主要致力于提升拓扑图操作效率以及快速安装体验,降低用户使用门槛。
Rainbond 5.6 版本发布,增加多种安装方式,优化拓扑图操作体验
|
自然语言处理
多语言、导入SLB和应用生命周期挂钩脚本功能上线
信息摘要: 多语言方面支持Go、PHP和原生应用,支持导入用户已有SLB实例和应用生命周期挂钩脚本功能。适用客户: 有多语言应用托管诉求的个人开发者用户 / 小程序类应用的运维人员 / 具有在线业务的中小微企业 / 具有应用上云需求的长尾用户版本/规格功能: 1.
592 0