es 设置刷新时长

write -> refresh -> flush

  • write:文档数据到内存缓存,并存到 translog

  • refresh:内存缓存中的文档数据,到文件缓存中的 segment 。此时可以被搜到

  • flush 是缓存中的 segment 文档数据写入到磁盘

写入过程

Elasticsearch写入数据到索引的过程大致是这样的:

首先客户端会根据配置的连接节点,通过轮询的方式选择一个coordinate节点。

coordinate节点通过路由函数(shard = hash(routing)%number_of_primary_shards),计算出数据应该落到那个shard中,根据coordinate节点上维护的shard信息,将请求发送到Node1上。

Node1先校验索引数据,然后在主分片上执行请求,执行成功后,将请求并行转发到副本集存在Node2、Node3。

Node2、Node3写入成功数据成功后,发送ack信息给主分片所在的Node1节点。

Node1节点再将ack信息发送给coordinate节点。

coordinate 节点 发送ack节点给客户端。

在主分片上执行写入请求的过程如下:

当有数据写入时,为了提升写速度,也是先将数据写入到内存(Memory Buffer)中的;

因为先写入了内存所以为了保证内存中的数据不丢失,也会同时写入Translog到内存中。

每隔一定时间(可配置)将数据从Memory Buffer中refresh到FileSystemCache中,生成segment文件,一旦生成segment文件,就能通过索引查询到了。

refresh完,memory buffer就清空了。Translog 也是从buffer flush到磁盘中。

定期/定量从FileSystemCache中,结合Translog内容flush index到磁盘中。做增量flush的。

因为Elasticsearch的这个刷盘机制,也说明并非是一个实时的搜索引擎。

更新数据

在早期的全文检索中为整个文档建立了很大的倒排索引,并将其写入到磁盘。如果索引有更新,就需要重新全量创建一个索引来替换原来的索引。

这种方式在数据量很大时效率很低,并且由于创建一次索引的成本很高,所以对数据的更新不能过于频繁,也就不能保证实效性。

分段存储

在搜索中引入了段(segment)的概念(将一个索引文件拆分为多个子文件,则每个子文件叫做段),每个段都是一个独立的可被搜索的数据集,并且段具有不变性,一旦索引的数据被写入硬盘,就不可修改

由于Elasticsearch中的每个分片包含多个segment(段),每一个segment都是一个倒排索引;因此在在查询的时,会把所有的segment查询结果汇总归并为最终的分片查询结果返回。

那么在这种分段存储的模式下Elasticsearch是如何进行数据操作的呢?

新增: 当有新的数据需要插入索引时,由于段的不可变性,会新建一个段来存储新增数据。

删除: 也是由于段的不可变,所以删除的时候会新增一个.del文件,专门用来存储被删除的数据id。这样虽然查询的时候还是能查到,但是在进程查询结果汇总的时候会将已删除的数据id过滤掉。

更新: 更新操作其实就是删除和新增的组合操作,先在.del文件中积累旧数据,然后在新段中添加一条更新后的数据。

分段存储的优点和缺点

segment优点

读写都不用加锁,不直接更新数据,所以不用考虑多线程下读写不一致的问题。

长驻内存,由于segment的不可变性,这样只要空间足够大,数据都是直接存储在内存中的。因此查询数据时直接访问内存,不用频繁操作磁盘。

增量创建,分段可以做到增量创建索引,即轻量级的对索引进行改变,不用操作整个索引文件,这样在频繁更新数据时,使系统接近实时更新。

segment缺点

删除,对段数据进行删除时,旧数据在.del文件中并不会马上删除。而旧数据只有等到段合并时才会被删除,这样会造成大量的空间浪费。

更新,因为更新操作是有删除和新增组合而成,若是频繁的更新也会造成大量的空间浪费。

新增,由于每次新增数据都是新建一个段,当段的数量过多时,对服务器的资源的消耗会非常大,查询性能也会受到影响。

过滤,查询后的结果再汇总时需要对已删除的数据进行过滤,增加了系统的处理负担。

这里要注意一点,并不是每新增一条记录(Document)就创建一个段(segment)的,而是数据先落到Memory Buffer中后,批量刷到Segment中的。



 

链接:https://www.jianshu.com/p/5f033c607ed7

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值