Mapping优化
- 合理设置字段类型
text类型的字段,默认会分词创建倒排索引,不需要检索的text类型字段,应该关闭倒排索引
keywork类型的字段,默认会创建正排索引,不需要检索,聚合,排序的字段,应该关闭正排索引
fielddata类型要谨慎使用,fielddata类型在使用时,会在jvm堆中创建字段的全量正排索引,容易引发OOM异常。 - 原文存储
es有两种存储原文信息的方式,_source和store,es底层存储文件的最小单位是document,用户添加的一条数据对应一个document,_source和store是document中的两个部分,每次查询(fetch)一个document时,会加载全部的_source信息,即便用户只需要部分字段,也是把_source中的字段全部加载到内存中,再做过滤,给client返回需要的字段。而store区域的原文字段信息默认是不会加载的,只有用户指定了要查询的store字段,才会加载,而且store类型的字段是需要那些加载那些,不会全部加载到内存后再做过滤。
数据的原文信息,不需要的话,不要存储,以减小带宽压力,尤其是有大字段时,要格外注意,看有没有其他的存储方式,比如大字段单独存放在其他的数据库中,单独查询。store类型要谨慎使用,查询多字段时,每个字段都会有一次磁盘io,效率反而会下降。要根据实际业务情况合理选择。 - 分片
分片数应根据集群的实际情况来设计,增加分片数可以提高索引的qps,设置副本分片可以实现索引的高可用。但是分片过多会增加网络开销,副本分片和主分片需要占用相同的资源,增加副本分片,还会加大系统资源的开销。所以实际工作当中,应该根据实际情况合理设计,大体有以下几点经验:
分片的大小不要超过50G。
分片数的设计原则:不断增加分片数,监控检索速度,当检索效率开始下降时,说明分片数已经到达上限,这样来确定分片数
JVM优化
es中每个分片都是一个lucene实例,lucene管理索引使用的是系统内存。所以es的堆要合理设置,预留出足够的系统内存供索引使用。
es是堆应该控制在4G到32G之间。最大也不要超过32G,不然会导致指针压缩失效,浪费大量内存,增加gc开销,还会降低os的缓存命中率。在满足需求的情况下,越小越好。
ES集群优化
- es节点类型
master节点(主节点)
1. 索引的创建或删除
2. 跟踪哪些节点是集群的一部分
3. 决定哪些分片分配给相关的节点
稳定的主节点对集群的健康非常重要,集群较大时,应将主节点和data节点分离,并设置集群数,防止脑裂。
data节点(数据节点)
1. 存储索引数据
2. 对文档进行增删改查,聚合操作
数据节点对xcpu,内存,io要求较高,在优化的时候需要监控数据节点的状态,当资源不够时,需要在集群中添加新的节点。每个主节点和数据节点都需要知道分片,索引,元数据的物理存储位置。
client节点(客户端节点/路由节点)
1. 处理路由请求
2. 处理搜索
3. 分发索引
从本质上来说client节点表现为智能负载平衡器。独立的客户端节点在一个比较大的集群中是非常有用的,他协调主节点和数据节点,客户端节点加入集群可以得到集群的状态,根据集群的状态可以直接路由请求。
部落节点
1.部落节点可以跨越多个集群,它可以接收每个集群的状态,然后合并成一个全局集群的状态,它可以读写所有节点上的数据。
Ingest节点(提取节点)
官方建议:
一个节点的缺省配置是:主节点+数据节点两属性为一身。对于3-5个节点的小集群来讲,通常让所有节点存储数据和具有获得主节点的资格。你可以将任何请求发送给任何节点,并且由于所有节点都具有集群状态的副本,它们知道如何路由请求。
通常只有较大的集群才能开始分离专用主节点、数据节点。 对于许多用户场景,路由节点根本不一定是必需的。
专用协调节点(也称为client节点或路由节点)从数据节点中消除了聚合/查询的请求解析和最终阶段,并允许他们专注于处理数据。
在多大程度上这对集群有好处将因情况而异。 通常我会说,在查询大量使用情况下路由节点更常见。
预热数据
保持常用索引常驻内存