ES
2021-03-02 14:02:29 0 举报
AI智能生成
ES
作者其他创作
大纲/内容
架构设计
文件
segment file
倒排索引的集合,每次创建一个新的 Document , 都会归属于一个新的 Segment , 而不会去修改原来的 Segment ;
且每次的文档删除操作,会仅仅标记 Segment 中该文档为删除状态, 而不会真正的立马物理删除,
且每次的文档删除操作,会仅仅标记 Segment 中该文档为删除状态, 而不会真正的立马物理删除,
es 每秒都会生成一个 segment 文件,当文件过多时 es 会自动进行 segment merge(合并文件),合并时会同时将已经标注删除的文档物理删除;
commit point
记录当前所有可用的 segment ,每个 commit point 都会维护一个 .del 文件( es 删除数据本质是不属于物理删除),当 es 做删改操作时首先会在 .del 文件中声明某个 document 已经被删除,文件内记录了在某个 segment 内某个文档已经被删除,当查询请求过来时在 segment 中被删除的文件是能够查出来的,但是当返回结果时会根据 commit point 维护的那个 .del 文件把已经删除的文档过滤掉
translog
translog 提供所有还没有被刷到磁盘的操作的一个持久化记录
当 Elasticsearch 启动的时候, 它会从磁盘中使用最后一个提交点去恢复已知的段,并且会重放 translog 中所有在最后一次提交后发生的变更操作
新文档被索引意味着文档会被首先写入内存 buffer ,操作会被写入 translog 文件。每个 shard 都对应一个 translog 文件
translog 会每隔 5 秒异步执行或者在每一个请求完成之后执行一次 fsync 操作,同步刷盘或异步刷盘
操作
commit
为了数据安全, 每次的索引变更都最好要立刻刷盘, 所以 Commit 操作意味着将 Segment 合并,并写入磁盘。保证内存数据尽量不丢。刷盘是很重的 IO 操作, 所以为了机器性能和近实时搜索, 并不会刷盘那么及时。
refresh
写入和打开一个新 segment 的轻量的过程,es 接收数据请求时先存入内存中,默认每隔一秒会从内存 buffer 中将数据写入 filesystem cache 中的一个 segment,内存 buffer 被清空,这个时候索引变成了可被搜索的,这个过程叫做 refresh;
fsync
将内存 buffer 中的数据存储到文件系统. 这里作了优化, 是指将 filesystem cache 中的所有 segment 刷新到磁盘的操作
flush
es 默认每隔 30 分钟或者操作数据量达到 512mb ,会将内存 buffer 的数据全都写入新的 segment 中,内存 buffer 被清空,一个 commit point 被写入磁盘,并将 filesystem cache 中的数据通过 fsync 刷入磁盘,同时清空 translog 日志文件,这个过程叫做 flush
写入流程
1.连接一个节点,hash(routing_id)当前写入的index所在的主分片是否在该节点,如果不是,则协调该请求到对应主分片节点写入
2.数据写入到buffer,同时记录到translog
3.内存buffer 默认间隔1s,将据刷到文件系统缓存中 (此时,写入的数据已可以被搜索)
4.文件系统缓存将数据刷到文件,生成segment文件,每秒一个文件,同时更新commit文件
5.commit文件包含索引内所有的segment文件,后台会开启独立线程合并segment后删除旧的segment
6.translog用于恢复系统宕机时的数据。当segment刷到磁盘时,且commit文件更新,
translog文件才会清空。每30分钟主动flush或者文件大小大于512M,将translog更新到commit
translog文件才会清空。每30分钟主动flush或者文件大小大于512M,将translog更新到commit
7.translog,每5s或者请求结束前,会强制将translog日志刷到磁盘。可以通过修改配置,是否异步来提高性能。
8.主分片节点写入成功之后,转发数据同步给备份的分片节点。可以设置写入多少个分片成功才算成功
0 条评论
下一页