网站建设企业开发,行业关键词一览表,北京seo公司网站,网站备案好不好当一条数据写到ES要经历哪些过程#xff1f;
当插入一条新的数据时#xff0c; 数据会进入Translog 和 MemoryBuffer两个内存中#xff0c;并添加了事务日志#xff0c;此时该文档不可查询当translog大到一定程度时#xff0c;会发生一个commit操作#xff0c;也就是全量…当一条数据写到ES要经历哪些过程
当插入一条新的数据时 数据会进入Translog 和 MemoryBuffer两个内存中并添加了事务日志此时该文档不可查询当translog大到一定程度时会发生一个commit操作也就是全量提交会把translog中的数据全部刷到磁盘translog也会先写到os cache中默认每隔5秒刷一次到磁盘中所以默认情况下可能会有5秒钟数据停留在【buffer】 或者 【translog文件的os cache中】所以如果在5秒内宕机了数据就会丢失所以最多会有5秒的数据丢失随后MemoryBuffer会每隔1秒刷新到Segment段中每次刷新都会生成新的Segment段Refresh操作默认是每秒执行一次即每秒会刷一次到Segment中(总结就是内存缓冲区数据 — 文件系统缓冲区 都是缓存内存缓冲区数据不可读文件系统缓冲区才能读)因此在MemoryBuffer中的那1秒是搜不到数据的有1秒的延迟只有刷到Segment中才会被搜索当文档从MemoryBuffer刷到Segment时MemoryBuffer会全部被清空但这个刷新过程是非常耗时的因此针对实时性不高的数据可以配置刷洗时间比如30秒刷一次不要1秒一次这也是优化性能的重要方法Segment中的数据默认30分钟会flush刷盘的磁盘中并且同时会清空translog而这个过程中如果translog满了也会把translog中的数据刷到DISK中并清空translog。 注意5秒一次是针对Translog的而默认30分钟是针对Segment中的数据刷盘注意分清这两个刷盘时间的含义这个过程中refresh, flush的刷新刷盘时间可以配置translog的达到临界size刷盘的这个size也可以配置
MemoryBuffer配置刷新时间:
PUT /refreshTest
{settings: {refresh_interval: 30s}
}合并(merge)
默认每秒都会有新的segment生成因为MemoryBuffer默认每秒刷一次Segment所以如果没有合并则Segment的数量会暴涨每个段都将消耗文件句柄内存和CPU资源。因为搜索的时候也会遍历segment。所以ES会在后台合并这些段ES会定期将一些小的Segment 或 没用的Segment段进行合并减少存储占用空间小段被合并成大段再合并成更大的段然后将新的大Segment打开提供搜索旧的会删除不合并segment的影响 (1). 每个segment占据的内存【不会】随着gc释放的。导致系统内存不足进一步导致超时问题 (2). 查询时会遍历每个segment过多的segment会导致查询速度下降
刷盘(flush)
实现文档数据从文件系统缓存中刷到磁盘的过程会定期触发也可以当translog的数据达到某个上限的时候触发flush刷盘操作默认条件是 每30分钟主动进行一次flush 或者当translog文件大于512MB主动进行一次flush
配置代码:
index.translog.flush_threshold_period 和 index.translog.flush_threshold_size再ES中要保证被索引的文档能够立即被搜索到有两种方法 _refresh 或 _flush。