Cassandra 数据读取过程

时间:2022-07-05 04:47:11

Cassandra 数据读取过程



讲解

橘黄色的部分都是位于JVM heap中的组件(位于内存中 on heap)。蓝色的部分也位于内存之中但不是出于JVM heap中(off heap)。

Coordinator是接受到由client发来的读请求的节点。

Memtable 是位于JVM heap中的表。它会周期性地flush到硬盘上成为SSTable。

SSTable 是位于硬盘上的表,无法修改。它会周期性地与其他的SSTable合并,该过程成为compaction。

Partition Index 是对于SSTable 文件的索引。内容是每个key的偏移量。它是位于硬盘上的文件。

Partition Summary 是对于 Partition Index 的二级索引。类似于一个简化版的 Partition Index。用于加速 Partition Index 的查找。它是位于内存中(off heap)的结构。Partition Summary 相当于是 Partition Index 的一个抽样。可以设置成每128个 Partition Index 中的记录就放入 Partition Summary中一个。

BloomFilter 是用于确定SSTable是否包含指定key的概率数据结构。它位于内存中,同样是 off heap。

Key Cache 是一个缓存。用于确定查找的 key 的位于SSTable的偏移地址是否之前已经被缓存。

Row Cache 是一个缓存。用于加速查找的 key 的整列value。


读请求的过程

1. 接收到读请求 Read <pk7>。

2. 在 Row Cache 中查找 pk7 的value 是否已经被缓存。若在缓存中找到 pk7 的 value,返回。

3. 若缓存中没有找到 pk7,查找每个 SSTable 的 BloomFilter,看是否在该 SSTable 中。如果 BloomFilter 表示该 SSTable 不存在 pk7,则不需要查看该 SSTable 的 Partition Summary 和 Partition Index。

4. 查找 SSTable 的 Partition Summary。确定 pk7 在 Partition Index 中的大概位置。再查找 Partition Index 中 pk7 位于 SSTable 中的偏移量。并且在查找完成之后将 pk7 位于 SSTable 中的偏移量放入 Key Cache 中,并且每个 SSTable 的偏移量都要放进去。

5. 在各个 SSTable 中找到 pk7 的所有 value,再在 Memtable 中找到 pk7 的 value。 对所有的 value 进行合并操作,原则是取时间戳最新的数据作为正确地数据。

6. 将合并后的数据返回给 Coordinator 并且将 pk7 及其 value 放入 Row Cache 缓存中。