当前位置: 首页>数据库>正文

es每秒写入100万 es写入数据慢

1.缩减索引字段

es中只保留必要字段,缩减字段能有效缩减文档大小,提高写入速度。

2.合理设置分片数和副本数

7.*默认1个分片1和副本。Elasticsearch官方建议一个分片的大小应该在20到40 GB左右分片个数建议 >= 集群节点的个数,但是当索引较小时(写入性能需求 > 搜索性能需求时),可以使用1个分片,过多的分片也会影响写入性能。

分片大小对于搜索查询非常重要。

  • 一方面, 如果分配给索引的分片太多,则Lucene分段会很小,从而导致开销增加。 当同时进行多个查询时,许多小分片也会降低查询吞吐量。
  • 另一方面,太大的分片会导致搜索性能下降和故障恢复时间更长。

在批量索引文档前可以将副本数设置为0,索引完成后恢复原来的值。

"number_of_replicas":1
"number_of_shards":1

3.索引刷新间隔refresh_interval

默认情况下refresh_interval为1s,数据写入1秒后就可以被搜索到,每次索引的refresh会产生一个新的Lucene段,Lucene段即为segment,segment在复合一定条件后,会自动合并,因此这会导致频繁的segment merge行为,如果不需要特别高的搜索实时性,应该降低索引refresh周期。-1:禁止刷新。在批量索引文档前可以将refresh_interval设置为-1,完成后修改为默认值。由于我的场景是每天都会全量同步,此处将refresh_interval设置为120s

"refresh_interval": "120s"

假如refresh_interval设置为-1,只是es中的定时任务不会执行。但是es会根据一个versionMap去强制做一次refresh操作,缓冲区满的时候也会触发refresh操作。每30秒有个定时器去检查shardIndexingBufferSize大小,最终调用updateShardBuffers方法去refresh

4.translog设置

随着translog文件越来越大时要考虑把内存中的数据刷新到磁盘中,这个过程称为flush。在默认设置下,translog的持久化策略为: request,每个请求 都“flush”,配置异步刷新,刷新时间120s。

"index.translog.durability": "async"
"index.translog.sync_interval": "120s"

5.线程池队列

当写入队列满时,es会拒绝接受索引事件,适当增加写入队列大小,默认为200。线程池大小官方不建议进行修改。

thread_pool.write.queue_size: 500

6.使用es自动生成的id

无更新操作时,尽量使用es自动生成的id,当你index一个document使用特定的id,ES需要去检查是否在同一个shard存在相同的ID的文档,这是一个相当昂贵的操作,并且随着文档数量的增加,花费呈指数增长。如果使用自动生成id,ES会跳过这个检查,使得Index速度更快。但是当需要更新操作时不适用。

7.Indexing 缓冲大小

在执行大量的索引操作时,indices.memory.index_buffer_size的默认 设置可能不够,这和可用堆内存、单节点上的shard数量相关,可以考虑适当增大该值,增大该值,减少segment,就会减少merge。默认大小为10% 48mb

indices.memory.index_buffer_size: 20%
indices.memory.min_index_buffer_size: 96mb

8.jvm.options

Xmx和Xms的大小默认为1g,可以适当增加该值。

-Xms2g
-Xmx2g

9.禁用swapping

在ES的官方文档上,要求Disabled Swapping。执行swapoff -a暂时禁用,机器重启后会恢复。要永久的关闭swapping,需要编辑/etc/fstab文件,将包含swap的行的注释掉。


https://www.xamrdz.com/database/6uv1934716.html

相关文章: