让Elasticsearch飞起来!——性能优化实践干货

原文:让Elasticsearch飞起来!——性能优化实践干货

版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/wojiushiwo987/article/details/85109769

0、题记

Elasticsearch性能优化的最终目的:用户体验

关于爽的定义——著名产品人梁宁曾经说过“人在满足时候的状态叫做愉悦,人不被满足就会难受,就会开始寻求。如果这个人在寻求中,能立刻得到即时满足,这种感觉就是爽!”。

Elasticsearch的爽点就是:快、准、全!

关于Elasticsearch性能优化,阿里、腾讯、京东、携程、滴滴、58等都有过很多深入的实践总结,都是非常好的参考。本文换一个思路,基于Elasticsearch的爽点,进行性能优化相关探讨。

1、集群规划优化实践

1.1 基于目标数据量规划集群

在业务初期,经常被问到的问题,要几个节点的集群,内存、CPU要多大,要不要SSD?

最主要的考虑点是:你的目标存储数据量是多大?可以针对目标数据量反推节点多少。

1.2 要留出容量Buffer

注意:Elasticsearch有三个警戒水位线,磁盘使用率达到85%、90%、95%。

不同警戒水位线会有不同的应急处理策略。

这点,磁盘容量选型中要规划在内。控制在85%之下是合理的。

当然,也可以通过配置做调整。

1.3 ES集群各节点尽量不要和其他业务功能复用一台机器。

除非内存非常大。

举例:普通服务器,安装了ES+Mysql+redis,业务数据量大了之后,势必会出现内存不足等问题。

1.4 磁盘尽量选择SSD

Elasticsearch官方文档肯定推荐SSD,考虑到成本的原因。需要结合业务场景,

如果业务对写入、检索速率有较高的速率要求,建议使用SSD磁盘。

阿里的业务场景,SSD磁盘比机械硬盘的速率提升了5倍。

但要因业务场景而异。

1.5 内存配置要合理

官方建议:堆内存的大小是官方建议是:Min(32GB,机器内存大小/2)。

Medcl和wood大叔都有明确说过,不必要设置32/31GB那么大,建议:热数据设置:26GB,冷数据:31GB

总体内存大小没有具体要求,但肯定是内容越大,检索性能越好。

经验值供参考:每天200GB+增量数据的业务场景,服务器至少要64GB内存。

除了JVM之外的预留内存要充足,否则也会经常OOM。

1.6 CPU核数不要太小

CPU核数是和ESThread pool关联的。和写入、检索性能都有关联。

建议:16核+

1.7 超大量级的业务场景,可以考虑跨集群检索

除非业务量级非常大,例如:滴滴、携程的PB+的业务场景,否则基本不太需要跨集群检索。

1.8 集群节点个数无需奇数

ES内部维护集群通信,不是基于zookeeper的分发部署机制,所以,无需奇数

但是discovery.zen.minimum_master_nodes的值要设置为:候选主节点的个数/2+1,才能有效避免脑裂。

1.9 节点类型优化分配

集群节点数:<=3,建议:所有节点的master:true, data:true。既是主节点也是路由节点。

集群节点数:>3, 根据业务场景需要,建议:逐步独立出Master节点和协调/路由节点。

1.10 建议冷热数据分离

热数据存储SSD和普通历史数据存储机械磁盘,物理上提高检索效率。

2、索引优化实践

Mysql等关系型数据库要分库、分表。Elasticserach的话也要做好充分的考虑。

2.1 设置多少个索引?

建议根据业务场景进行存储。

不同通道类型的数据要分索引存储。举例:知乎采集信息存储到知乎索引;APP采集信息存储到APP索引。

2.2 设置多少分片?

建议根据数据量衡量。

经验值:建议每个分片大小不要超过30GB

2.3 分片数设置?

建议根据集群节点的个数规模,分片个数建议>=集群节点的个数。

5节点的集群,5个分片就比较合理。

注意:除非reindex操作,分片数是不可以修改的。

2.4副本数设置?

除非你对系统的健壮性有异常高的要求,比如:银行系统。可以考虑2个副本以上。

否则,1个副本足够。

注意:副本数是可以通过配置随时修改的。

2.5不要再在一个索引下创建多个type

即便你是5.X版本,考虑到未来版本升级等后续的可扩展性。

建议:一个索引对应一个type。6.x默认对应_doc,5.x你就直接对应type统一为doc。

2.6 按照日期规划索引

随着业务量的增加,单一索引和数据量激增给的矛盾凸显。

按照日期规划索引是必然选择。

好处1:可以实现历史数据秒删。很对历史索引delete即可。注意:一个索引的话需要借助delete_by_query+force_merge操作,慢且删除不彻底。

好处2:便于冷热数据分开管理,检索最近几天的数据,直接物理上指定对应日期的索引,速度快的一逼!

操作参考:模板使用+rollover API使用

2.7 务必使用别名

ES不像mysql方面的更改索引名称。使用别名就是一个相对灵活的选择。

3、数据模型优化实践

3.1 不要使用默认的Mapping

默认Mapping的字段类型是系统自动识别的。其中:string类型默认分成:text和keyword两种类型。如果你的业务中不需要分词、检索,仅需要精确匹配,仅设置为keyword即可。

根据业务需要选择合适的类型,有利于节省空间和提升精度,如:浮点型的选择。

3.2 Mapping各字段的选型流程

3.3 选择合理的分词器

常见的开源中文分词器包括:ik分词器、ansj分词器、hanlp分词器、结巴分词器、海量分词器、“ElasticSearch最全分词器比较及使用方法” 搜索可查看对比效果。

如果选择ik,建议使用ik_max_word。因为:粗粒度的分词结果基本包含细粒度ik_smart的结果。

3.4 date、long、还是keyword

根据业务需要,如果需要基于时间轴做分析,必须date类型;

如果仅需要秒级返回,建议使用keyword

4、数据写入优化实践

4.1 要不要秒级响应?

Elasticsearch近实时的本质是:最快1s写入的数据可以被查询到。

如果refresh_interval设置为1s,势必会产生大量的segment,检索性能会受到影响。

所以,非实时的场景可以调大,设置为30s,甚至-1。

4.2 减少副本,提升写入性能。

写入前,副本数设置为0,

写入后,副本数设置为原来值。

4.3 能批量就不单条写入

批量接口为bulk,批量的大小要结合队列的大小,而队列大小和线程池大小、机器的cpu核数。

4.4 禁用swap

在Linux系统上,通过运行以下命令临时禁用交换:

sudo swapoff -a


  • 1

5、检索聚合优化实战

5.1 禁用 wildcard模糊匹配

数据量级达到TB+甚至更高之后,wildcard在多字段组合的情况下很容易出现卡死,甚至导致集群节点崩溃宕机的情况。

后果不堪设想。

替代方案:

方案一:针对精确度要求高的方案:两套分词器结合,standard和ik结合,使用match_phrase检索。

方案二:针对精确度要求不高的替代方案:建议ik分词,通过match_phrase和slop结合查询。

5.2极小的概率使用match匹配

中文match匹配显然结果是不准确的。很大的业务场景会使用短语匹配“match_phrase"。

match_phrase结合合理的分词词典、词库,会使得搜索结果精确度更高,避免噪音数据。

5.3 结合业务场景,大量使用filter过滤器

对于不需要使用计算相关度评分的场景,无疑filter缓存机制会使得检索更快。

举例:过滤某邮编号码。

5.3控制返回字段和结果

和mysql查询一样,业务开发中,select * 操作几乎是不必须的。

同理,ES中,_source 返回全部字段也是非必须的。

要通过_source 控制字段的返回,只返回业务相关的字段。

网页正文content,网页快照html_content类似字段的批量返回,可能就是业务上的设计缺陷。

显然,摘要字段应该提前写入,而不是查询content后再截取处理。

5.4 分页深度查询和遍历

分页查询使用:from+size;

遍历使用:scroll;

并行遍历使用:scroll+slice

斟酌集合业务选型使用。

5.5 聚合Size的合理设置

聚合结果是不精确的。除非你设置size为2的32次幂-1,否则聚合的结果是取每个分片的Top size元素后综合排序后的值。

实际业务场景要求精确反馈结果的要注意。

尽量不要获取全量聚合结果——从业务层面取TopN聚合结果值是非常合理的。因为的确排序靠后的结果值意义不大。

5.6 聚合分页合理实现

聚合结果展示的时,势必面临聚合后分页的问题,而ES官方基于性能原因不支持聚合后分页。

如果需要聚合后分页,需要自开发实现。包含但不限于:

方案一:每次取聚合结果,拿到内存中分页返回。

方案二:scroll结合scroll after集合redis实现。

6、业务优化

让Elasticsearch做它擅长的事情,很显然,它更擅长基于倒排索引进行搜索。

业务层面,用户想最快速度看到自己想要的结果,中间的“字段处理、格式化、标准化”等一堆操作,用户是不关注的。

为了让Elasticsearch更高效的检索,建议:

1)要做足“前戏”

字段抽取、倾向性分析、分类/聚类、相关性判定放在写入ES之前的ETL阶段进行;

2)“睡服”产品经理

产品经理基于各种奇葩业务场景可能会提各种无理需求。

作为技术人员,要“通知以情晓之以理”,给产品经理讲解明白搜索引擎的原理、Elasticsearch的原理,哪些能做,哪些真的“臣妾做不到”。

7、小结

实际业务开发中,公司一般要求又想马儿不吃草,又想马儿飞快跑

对于Elasticsearch开发也是,硬件资源不足(cpu、内存、磁盘都爆满)几乎没有办法提升性能的。

除了检索聚合,让Elasticsearch做N多相关、不相干的工作,然后得出结论“Elastic也就那样慢,没有想像的快”。

你脑海中是否也有类似的场景浮现呢?

提供相对NB的硬件资源、做好前期的各种准备工作、让Elasticsearch轻装上阵,相信你的Elasticsearch也会飞起来!

来日我们再相会…

推荐阅读:

1、阿里:https://elasticsearch.cn/article/6171

2、滴滴:http://t.cn/EUNLkNU

3、腾讯:http://t.cn/E4y9ylL

4、携程:https://elasticsearch.cn/article/6205

5、社区:https://elasticsearch.cn/article/6202

6、社区:https://elasticsearch.cn/article/708

7、社区:https://elasticsearch.cn/article/6202

Elasticsearch基础、进阶、实战第一公众号

原文地址:https://www.cnblogs.com/lonelyxmas/p/11612502.html

时间: 2024-08-27 22:34:52

让Elasticsearch飞起来!——性能优化实践干货的相关文章

Redis各种数据结构性能数据对比和性能优化实践

很对不起大家,又是一篇乱序的文章,但是满满的干货,来源于实践,相信大家会有所收获.里面穿插一些感悟和生活故事,可以忽略不看.不过听大家普遍的反馈说这是其中最喜欢看的部分,好吧,就当学习之后轻松一下. Redis各种数据结构性能数据对比 测试工具:perf4j 性能指标:平均值,最小值,最大值,方差 对比将814条数据按单条插入到哈希MAP和哈希SET: 对比从814条数据的哈希MAP和哈希SET中判断一个元素是否存在(map的hasKey和set的isMember): 大量数据插入哈希MAP,运

H5缓存机制浅析-移动端Web加载性能优化【干货】

转载:H5缓存机制浅析-移动端Web加载性能优化[干货] 作者:贺辉超,腾讯游戏平台与社区产品部 高级工程师 目录 1 H5缓存机制介绍 2 H5缓存机制原理分析 2.1 浏览器缓存机制 2.2 Dom Storgage(Web Storage)存储机制 2.3 Web SQL Database存储机制 2.4 Application Cache(AppCache)机制 2.5 Indexed Database (IndexedDB) 2.6 File System API 3 移动端Web加载

转:携程App的网络性能优化实践

http://kb.cnblogs.com/page/519824/ 携程App的网络性能优化实践 受益匪浅的一篇文章,让我知道网络交互并不是简单的传输和接受数据.真正的难点在于后面的性能优化 下面对文章中的几点进行总结和整理,作为个人的笔记 常见的网络性能问题: 1.DNS问题 DNS被劫持或失效 DNS解析慢或者失败 2.TCP连接问题 TCP的连接端口被封 TCP连接超时 3.write/Read问题 设置合理的读写超时时长 客户端所处环境的常用端口被限制 网络切换(即当用户的网络在WIF

C++的性能优化实践

C++的性能优化实践 内容目录: 1 Gprof 2. gprof使用步骤 1.初始化大对象耗时 2.Map使用不当 优化准则: 1. 二八法则:在任何一组东西中,最重要的只占其中一小部分,约20%,其余80%的尽管是多数,却是次要的:在优化实践中,我们将精力集中在优化那20%最耗时的代码上,整体性能将有显著的提升:这个很好理解.函数A虽然代码量大,但在一次正常执行流程中,只调用了一次.而另一个函数B代码量比A小很多,但被调用了1000次.显然,我们更应关注B的优化. 2. 编完代码,再优化:编

携程App的网络性能优化实践

本文转载至 http://kb.cnblogs.com/page/519824/ 作者: 陈浩然  来源: InfoQ  发布时间: 2015-04-29 23:42  阅读: 4018 次  推荐: 16   原文链接   [收藏] 摘要:在4月23日~25日举行的QCon全球软件开发大会(北京站)上,携程无线开发总监陈浩然分享了<移动开发网络性能优化实践>,总结了携程在App网络性能优化方面的一些实践经验.在2014年接手携程无线App的框架和基础研发工作之后,陈浩然面对的首要工作就是Ap

Hadoop YARN:调度性能优化实践(转)

https://tech.meituan.com/2019/08/01/hadoop-yarn-scheduling-performance-optimization-practice.html 文章对性能优化的思路,如果评测性能,找到性能瓶颈,优化,优化效果评估,上线部署给出了很好的教科书式的案例,值得一看!! 背景 YARN作为Hadoop的资源管理系统,负责Hadoop集群上计算资源的管理和作业调度. 美团的YARN以社区2.7.1版本为基础构建分支.目前在YARN上支撑离线业务.实时业务

第17 章 : 深入理解 etcd:etcd 性能优化实践

深入理解 etcd:etcd 性能优化实践 本文将主要分享以下五方面的内容: etcd 前节课程回顾复习: 理解 etcd 性能: etcd 性能优化 -server 端: etcd 性能优化 -client 端. etcd 前节课程回顾复习 etcd 诞生于 CoreOs 公司,使用 Golang 语言开发,是一个分布式 KeyValue 存储引擎.我们可以利用 etcd 来作为分布式系统元数据的存储数据库,存储系统里面重要的元信息.etcd 同样也被各大公司广泛使用. 下图为 etcd 的基

HoloLens开发与性能优化实践

HoloLens中国版终于于5月底在中国上市,同时国内的技术社区经过一年的成长也有了很大的扩张,越来越多的开发者开始进入了HoloLens开发领域,尝试着使用混合现实(Mixed Reality)技术来构建属于未来的创新应用. HoloLens开发回顾 HoloLens于2016年初正式开始发货,笔者有幸能够拿到第一波上市设备,当时大多流入国内的方式还是通过人肉搬运.当时的HoloLens开发在全球范围内都处于起步阶段,可以利用的开发资源只有官方文档等少数内容,然而今天则非常丰富,下面我们来看这

淘宝首页性能优化实践

想必很多人都已经看到了新版的淘宝首页,它与以往不太一样,这一版页面中四处弥散着个性化的味道,由于独特的个性化需求,前端也面临各方面的技术挑战: 数据来源多 串行请求渲染一个模块 运营数据和个性化数据匹配和管理 数据兜底容灾 本次淘宝首页改版,虽已不再支持 IE6 和 IE7 等低版本的古董浏览器,但依然存在多个影响首页性能的因素: 依赖系统过多,数据的请求分为三块,其一是静态资源(如 js/css/image/iconfont 等):其二是推到 CDN 的静态数据(如运营填写的数据.前端配置信息