全文索引Listener同步问题

RocksDB 使用了 LSM(Log-Structured Merge)树结构来管理数据。这种结构会将数据先写入内存中的 MemTable,然后定期将 MemTable 的内容刷新到磁盘上,生成 SSTable(Sorted String Table)文件。随着时间的推移,小的 SSTable 文件会被合并成更大的 SSTable 文件,以减少查询时的文件数量和提高读取效率。

具体流程如下:

  1. 写入流程

MemTable:数据先写入内存中的 MemTable,并同时写入一个 Write-Ahead Log (WAL) 以保证数据持久性。

Flush:当 MemTable 达到一定大小时,系统会将 MemTable 的内容写入磁盘,生成一个新的 SSTable 文件。

  1. Compaction(合并)

Minor Compaction:当生成的小 SSTable 文件数量达到一定数量或某个文件的大小超过设定的阈值时,会进行一次 minor compaction,将这些小的 SSTable 文件合并成一个更大的 SSTable 文件。这通常发生在同一层级(Level)内。

Major Compaction:当某一层级(如 Level 0)上的 SSTable 文件数量达到设定的上限时,会触发 major compaction,将这一层级的所有 SSTable 文件与下一层级(如 Level 1)的 SSTable 文件合并。这个过程会重复进行,以此类推,直到合并到最高层级。

所以在生成小文件的时候,listener 就会收到这个小文件然后把这个小文件录入到ES 中,当这个小文件被合并成大文件的时候,listener又会收到这个大文件,然后又把大文件录到 ES 中,所以相当于这个小文件就在被重复录入,就会出现很多删除记录,实际新增数据很少

但是wal 只会过期后删除,然后合并成 SST 存在磁盘,listener 只会监听 wal 文件的变化

1 个赞