Elasticsearch调优
写入性能优化
业务优化
在业务上,最常见的优化手段就是变单条写入为批量写入
。而es本身支持批量插入,就是bulk操作
。
常用优化方式是:数据接入时,先不写库,而是直接推送到消息队列中(参考rabbitmq)。然后监听该队列,批
量拿消息
。一次拿1000条,最后将这1000条数据批量写入es。实测结果1000条批量写入耗时和单条写入耗时相差不大。
除了按数量批量写入外,还可以按照时间
。比如每秒写入一次,有多少数量就写入多少
。其实这种方法应该更合
理,像mysql底层数据和日志落盘的策略,其中就有每秒落盘一次的策略。
底层优化
除了业务优化外,还有就是从底层优化。而底层优化,最常见的就是刷盘策略。因为我们都知道,正在的耗时就是磁盘IO。优化参数,如下:
参数 | 优化后值 | 含义 |
---|---|---|
index.refresh_interval | 10s | 缓存刷新时间,即10s后数据才能被搜索 |
index.translog.durability | async | 异步 |
index.translog.flush_threshold_size | 1024mb | translog大小达到多大时落盘 |
index.translog.sync_interval | 30s | translog每隔多久落盘 |
其中,效果最明显的就是index.translog.durability
。它表示的是日志持久化策略,默认情况下是同步策
略,即写一条数据要等日志落盘后才返回。这种效率慢,但能保证数据安全性。
将index.translog.durability改为async后,就是异步策略。数据写入缓存后,里面返回,不会等待日志是否落盘
成功。这种效率很快,但数据安全性差。document模型设计避免复杂的关联查询,大表设计这样。