如何提高ElasticSearch 索引速度
我Google了下,大致给出的答案如下:
- 使用bulk API
- 初次索引的时候,把 replica 设置为 0
- 增大 threadpool.index.queue_size
- 增大 indices.memory.index_buffer_size
- 增大 index.translog.flush_threshold_ops
- 增大 index.translog.sync_interval
- 增大 index.engine.robin.refresh_interval
这篇文章会讲述上面几个参数的原理,以及一些其他的思路。这些参数大体上是朝着两个方向优化的:
- 减少磁盘写入
- 增大构建索引处理资源
一般而言,通过第二种方式的需要慎用,会对集群查询功能造成比较大的影响。
这里还有两种形态的解决方案:
- 关闭一些特定场景并不需要的功能,比如Translog或者Version等
- 将部分计算挪到其他并行计算框架上,比如数据的分片计算等,都可以放到Spark上事先算好
上面的参数都和什么有关
其中 5,6 属于 TransLog 相关。
4 则和Lucene相关
3 则因为ES里大量采用线程池,构建索引的时候,是有单独的线程池做处理的
7 的话个人认为影响不大
2 的话,能够使用上的场景有限。个人认为Replica这块可以使用Kafka的ISR机制。所有数据还是都从Primary写和读。Replica尽量只作为备份数据。
Translog
为什么要有Translog? 因为Translog顺序写日志比构建索引更高效。我们不可能每加一条记录就Commit一次,这样会有大量的文件和磁盘IO产生。但是我们又想避免程序挂掉或者硬件故障而出现数据丢失,所以有了Translog,通常这种日志我们叫做Write Ahead Log。
为了保证数据的完整性,ES默认是每次request结束后都会进行一次sync操作。具体可以查看如下方法:
org.elasticsearch.action.bulk.TransportShardBulkAction.processAfter
相关文章