分片策略优化
在Elasticsearch中,分片策略优化是非常重要的,它直接影响到系统的性能和稳定性。以下是根据搜索结果总结的分片策略优化的一些关键点。
分片和副本的设计为Elasticsearch提供了支持分布式和故障转移的特性,但并不意味着分片和副本是可以无限分配的。一个分片的底层即为一个Lucene索引,会消耗一定文件句柄、内存、以及CPU运转。用于计算相关度的词项统计信息是基于分片的。如果有许多分片,每一个都只有很少的数据会导致很低的相关度。一个业务索引具体需要分配多少分片可能需要架构师和技术人员对业务的增长有个预先的判断,横向扩展应当分阶段进行。只有当你进入到下一个阶段,你才有时间思考需要作出哪些改变来达到这个阶段。
对于节点瞬时中断的问题,默认情况,集群会等待一分钟来查看节点是否会重新加入,如果这个节点在此期间重新加入,重新加入的节点会保持其现有的分片数据,不会触发新的分片分配。通过修改参数delayed_timeout,可以延长再均衡的时间,可以全局设置也可以在索引级别进行修改。
当我们查询文档的时候,Elasticsearch如何知道一个文档应该存放到哪个分片中呢?它其实是通过下面这个公式来计算出来:
shard=hash(routing)%number_of_primary_shards
routing默认值是文档的id,也可以采用自定义值,比如用户id。不带routing查询,在查询的时候因为不知道要查询的数据具体在哪个分片上,所以整个过程分为2个步骤:聚合:协调节点搜集到每个分片上查询结果,在将查询的结果进行排序,之后给用户返回结果。带routing查询,查询的时候,可以直接根据routing信息定位到某个分配查询,不需要查询所有的分配,经过协调节点排序。
ES的默认配置,是综合了数据可靠性、写入速度、搜索实时性等因素。针对于搜索性能要求不高,但是对写入要求较高的场景,我们需要尽可能的选择恰当写优化策略。综合来说,可以考虑以下几个方面来提升写索引的性能:加大TranslogFlush,目的是降低Iops、Writeblock。增加IndexRefresh间隔,目的是减少SegmentMerge的次数。调整Bulk线程池和队列。优化节点间的任务分布。优化Lucene层的索引建立,目的是降低CPU及IO。
磁盘在现代服务器上通常都是瓶颈。这里有一些优化磁盘I/O的技巧:使用SSD。就像其他地方提过的,他们比机械磁盘优秀多了。使用RAID0。条带化RAID会提高磁盘I/O,代价显然就是当一块硬盘故障时整个就故障了。另外,使用多块硬盘,并允许Elasticsearch通过多个path.data目录配置把数据条带化分配到它们上面。不要使用远程挂载的存储,比如NFS或者SMB/CIFS。这个引入的延迟对性能来说完全是背道而驰的。
除了上述提到的策略之外,还有一些其他的优化策略,例如:
优化数据结构设计和索引优化。
优化SQL语句和缓存策略。
优化硬件选择和路由选择。
优化写入速度和存储设备的使用。
以上就是关于Elasticsearch分片策略优化的一些关键点,希望对您有所帮助。