ES
2021-03-02 14:02:29 0 举报
AI智能生成
登录查看完整内容
为你推荐
查看更多
ES
作者其他创作
大纲/内容
ES
架构设计
文件
segment file
倒排索引的集合,每次创建一个新的 Document , 都会归属于一个新的 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
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
7.translog,每5s或者请求结束前,会强制将translog日志刷到磁盘。可以通过修改配置,是否异步来提高性能。
8.主分片节点写入成功之后,转发数据同步给备份的分片节点。可以设置写入多少个分片成功才算成功
0 条评论
回复 删除
下一页