1. 分片优化
    每个分片大小不要超过30GB,常规需要y = x/30个分片,增长速度快建议修正为y = x/30+1
    每个节点建议的单个索引分片数<3,即按6个节点计算,最多有12个分片。
    即分片数满足条件为y=x/30或y=x/30+1且y<=12,
    更改分片数量,需要重建索引结构、刷数据。

  2. 路由控制

  3. 默认路由计算方式:shard_num = hash(_routing) % num_primary_shards routing默认为id,每个文档_id都不一样,可以指定_routing为group_id,即同集团数据在一个分片

  4. 增加routing_partition_size配置路由计算方式:shard_num = (hash(_routing) + hash(_id) % routing_partition_size) % num_primary_shards

  5. 指定路由为group_id可以使用,hash(_routing)为固定值,hash(_id) %routing_partition_size为变化值,计算结果只有routing_partition_size个值。

  6. 出现数据倾斜设定,使数据均匀分布在一组分片

  7. 如果数据量过大,满足条件 x/30 > 12,可使用按时间分段索引,使用分段索引时要求所有的查询必须有对应的时间查询条件且格式为范围查询,系统会根据时间范围确定要查询哪个索引。

参考资料

内存

官方建议: Min(32GB,机器内存大小/2)。
磁盘需求最优比例=1:50 256g=12800G=13T
8G内存对应8*50=400G磁盘
总体内存大小没有具体要求,但肯定是内容越大,检索性能越好。
除了JVM之外的预留内存要充足,否则也会经常OOM。

节点类型优化分配

集群节点数:<=3,建议:所有节点的master:true, data:true。既是主节点也是路由节点。
集群节点数:>3, 根据业务场景需要,建议:逐步独立出Master节点和协调/路由节点。

角色隔离

ES 集群中的数据节点负责对数据进行增、删、改、查和聚合等操作,所以对 CPU、内存和 I/O 的消耗很大。
在搭建 ES 集群时,我们应该对 ES 集群中的节点进行角色划分和隔离。
候选主节点:node.master= true node. data= false
数据节点:node.master= false node. data= true

避免脑裂

网络异常可能会导致集群中节点划分出多个区域,区域发现没有 Master 节点的时候,会选举出了自己区域内 Maste 节点 r,导致一个集群被分裂为多个集群,使集群之间的数据无法同步,我们称这种现象为脑裂。
为了防止脑裂,我们需要在 Master 节点的配置文件中添加如下参数:
discovery.zen.minimum_master_nodes=(master_eligible_nodes /2)+1 //默认值为 1
其中 master_eligible_nodes 为 Master 集群中的节点数。这样做可以避免脑裂的现象都出现,最大限度地提升集群的高可用性。
只要不少于 discovery.zen.minimum_master_nodes 个候选节点存活,选举工作就可以顺利进行,即保持至少一半节点存活。

分片

设置多少分片?

建议根据数据量衡量。经验值:建议每个分片大小不要超过30GB。

分片数设置?

单个索引分片数=数据量÷30g
每个节点建议的单个索引分片数<3:因为分片分布在同一个服务器上。请求开始竞争相同的硬件资源时, 性能便会逐步下降。
如果该索引分片数过多可以考虑业务需求是否需要分割索引。周表,天表,月表等划分。

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

PS:分片的大小如何影响性能?

在Elasticsearch中,每个查询在每个分片的单个线程中执行。然而,可以并行处理多个分片,并可以在相同分片上执行多个查询和聚合。
【小分片的利弊】这意味着,在不涉及高速缓存时,最小查询延迟将取决于数据、查询的类型、分片的大小。查询大量小分片将使得每个分片的处理速度更快,但是随着更多的任务需要按顺序排队和处理,它不一定要比查询较小数量的更大的分片更快。如果有多个并发查询,则有很多小碎片也会降低查询吞吐量。

副本数设置?

除非你对系统的健壮性有异常高的要求,比如:银行系统。可以考虑2个副本以上。否则,1个副本足够。
注意:副本数是可以通过配置随时修改的。

MAPPING

限制写入ES的字段

根据业务需要选择合适的类型,有利于节省空间和提升精度。Fetch方法只返回要查询的字段,对每组数据做校验,可以避免使用默认mapping的字段类型,增加写入速度、节省空间。