ElasticSearch工作原理及使用建议
博客专区 > selfless 的博客 > 博客详情
ElasticSearch工作原理及使用建议
selfless 发表于1年前
ElasticSearch工作原理及使用建议
  • 发表于 1年前
  • 阅读 35
  • 收藏 1
  • 点赞 0
  • 评论 0

移动开发云端新模式探索实践 >>>   

准实时索引的实现

如果对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代替
  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 24
博文 26
码字总数 21597
×
selfless
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: