elasticsearch写入的原理

es的每一个index可能有多个shard(每个shard是一个Lucence的index),每个shard由多个segment组成,每个segment里面有很多倒排索引。每次新文档创建的时候会归属一个新的segment,不会动原来的segment。
在这里插入图片描述

每个新文档创建的时候会写入内存(in memory buffer)和事务日志(translog),这时数据还是搜索不到的。

es默认每秒钟会执行一次_refresh操作,会将buffer的数据写入一个新的segment,这时候就可以被检索了,同时会清空内存buffer。
在这里插入图片描述
flush的操作:_refresh操作把buffer写入到了segment,
flush会把多个segment每30分钟合并到新的segment然后刷盘,并且清空translog

refresh清空的是in memory buffer , flush清空的是translog。

近实时搜索
es不会因为每次写操作都写入磁盘,需要一个合并buffer的东西,所以在buffer和磁盘之间加入了 file system cache(segment) 来过渡,buffer中的数据是查询不到的,而segment和磁盘的数据是能查询到的,这样每秒钟(默认)将buffer中的数据写入segment,然后再由segment每30分钟(默认)的flush操作写入磁盘的方式降低了io次数。

如果创建了一个文档并且想立即搜索到它,可以手动刷新一下

#刷新全部索引
POST  /_refresh
#刷新指定索引
POST  /test_index/_refresh
#刷新文档
PUT  /test_index/_doc/1?refresh
{"test": "test"}
PUT  /test_index/_doc/2?refresh=true
{"test": "test"}

可以根据实际情况调整refresh的频率
如果想优化索引速度而不是近实时搜索,可以降低refresh的的刷新频率

PUT /test_index
{
  "settings":  {  "refresh_interval": "30s" }
}

为了保证数据能从失败中恢复,es增加了事务日志(translog),es如果发生意外退出的情况,那么它的buffer和file system cache(segment)的数据会丢失,但是事务日志还在,系统重启的时候可以从translog中恢复数据,在segment被flush到磁盘的时候,translog会被清掉。

手动flush的方式(很少使用)

#刷新test_index索引
POST /test_index/_flush
#刷新全部索引并等待
POST /_flush?wait_for_ongoin

translog是一个磁盘文件,写入的方式也是os cache+磁盘。
默认情况下translog是5秒钟从os cache刷新到磁盘
如果需要每次写请求都直接写入到translog的磁盘
可以配置

PUT /test_index/_settings {
	"index.translog.durability":"request"
}

默认是异步的

PUT /test_index/_settings {
    "index.translog.durability":"async",
    "index.translog.sync_interval":"5s"
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值