ElasticSearch工作原理及使用建议

本文介绍了Elasticsearch的写入及读取性能优化方法,包括调整refresh interval、使用bulk request等提升写入速度;增大文件系统缓存、优化查询条件等提高读取速度。同时,也提供了减少磁盘空间使用的技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

准实时索引的实现

如果对mysql的innodb有了解的话,es的实现原理相似

  1. client只能搜索到commit point指向的segment
  2. 写入到memory buffer和translog之后,即写入成功
  3. memory buffer中的内容,每隔1s(可以通过/_refresh控制),异步刷新到磁盘
  4. 刷新到磁盘后,flush掉translog
  5. 很过个segment由单独merge线程处理segment的merge操作

上图:

ES准实时的实现

routing和replica

  1. 每个对象都有routing字段,默认是_id值
计算对象所在的shard通过以下方式:
shard = hash(routing) % number_of_primary_shards
所以创建索引,指定的分片数不能变,一旦变化,所有的索引数据都会读取失败
  1. replica一致性
默认写完一半以上即为成功。
int((primary + number_of_replicas) / 2) + 1
也可以设置为one或者all

如何提升写入性能

参见:https://www.elastic.co/guide/en/elasticsearch/reference/current/tune-for-indexing-speed.html

  1. 使用bulk request
  2. 使用多线程发送数据
  3. 增加refresh interval
  4. 在批量数据加载初始化的时候,可以关闭refresh
  5. 禁用交换空间
  6. 给文件系统较大的memory
  7. 使用自生成的id
  8. 使用更高效的硬件,例如:SSD
  9. 如果索引比较大,调大indices.memory.index_buffer_size

如何提升读取性能

参见:https://www.elastic.co/guide/en/elasticsearch/reference/current/tune-for-search-speed.html

  1. 给文件系统缓存更大的内存
  2. 使用更高效的硬件,例如:SSD
  3. 优化查询条件:避免join操作、nested操作和parent-child关系
  4. 数据预处理
  5. 一些情况下mapping使用keyword而不是integer或者long
  6. 强制merge read-only索引
  7. 文件系统缓存预热

如何减少磁盘使用空间

参见:https://www.elastic.co/guide/en/elasticsearch/reference/current/tune-for-disk-usage.html

  1. 禁用不必要的feature
  2. 不要使用默认的string mapping
  3. 禁用_all
  4. 使用best_compression

其他建议

参见:https://www.elastic.co/guide/en/elasticsearch/reference/current/general-recommendations.html

  1. 避免返回大的结果集,使用scroll代替
  2. 避免索引大文档,默认最大是100MB,(http.max_context_length)
  3. 避免在同一个索引下加入不相关的数据
  4. 避免过多的types,使用单独的index代替

转载于:https://my.oschina.net/serverx/blog/836793

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值