JAVA面试——Cassandra(二)

简介: JAVA面试——Cassandra

Cassandra 总是认为返回数据是对的,那就会发生删除的数据又出现了的事情,这些数据可以叫”

僵尸”,并且他们的表现是不可预见的。

墓碑

删除一个 column 其实只是插入一个关于这个 column 的墓碑(tombstone),并不直接删除原

有的 column。该墓碑被作为对该 CF 的一次修改记录在 Memtable 和 SSTable 中。墓碑的内容

是删除请求被执行的时间,该时间是接受客户端请求的存储节点在执行该请求时的本地时间

(local delete time),称为本地删除时间。需要注意区分本地删除时间和时间戳,每个 CF 修改

记录都有一个时间戳,这个时间戳可以理解为该 column 的修改时间,是由客户端给定的。

垃圾回收 compaction

由于被删除的 column 并不会立即被从磁盘中删除,所以系统占用的磁盘空间会越来越大,这就

需要有一种垃圾回收的机制,定期删除被标记了墓碑的 column。垃圾回收是在 compaction 的过

程中完成的。

数据读取(memtable+SStables

为了满足读 cassandra 读取的数据是 memtable 中的数据和 SStables 中数据的合并结果。读取

SSTables 中的数据就是查找到具体的哪些的 SSTables 以及数据在这些 SSTables 中的偏移量

(SSTables 是按主键排序后的数据块)。首先如果 row cache enable 了话,会检测缓存。缓存命中

直接返回数据,没有则查找 Bloom filter,查找可能的 SSTable。然后有一层 Partition key cache

找 partition key 的位置。如果有根据找到的 partition 去压缩偏移量映射表找具体的数据块。如果

缓存没有,则要经过 Partition summary,Partition index 去找 partition key。然后经过压缩偏移

量映射表找具体的数据块。

1. 检查 memtable

2. 如果 enabled 了,检查 row cache

3. 检查 Bloom filter

4. 如果 enable 了,检查 partition key 缓存

5. 如果在 partition key 缓存中找到了 partition key,直接去 compression offset 命中,如果没

有,检查 partition summary

6. 根据 compression offset map 找到数据位置

7. 从磁盘的 SSTable 中取出数据

image.png

image.png

MemTable:如果 memtable 有目标分区数据,这个数据会被读出来并且和从 SSTables 中读出

来的数据进行合并。SSTable 的数据访问如下面所示的步骤。

Row CacheSSTables 中频繁被访问的数据)

在 Cassandra2.2+,它们被存储在堆外内存,使用全新的实现避免造成垃圾回收对 JVM 造成压力

存在在 row cache 的子集数据可以在特定的一段时间内配置一定大小的内存。row cache 使用

LRU(least-recently-userd)进行回收在申请内存。存储在 row cache 中的数据是 SSTables 中频繁

被访问的数据。存储到row cache中后,数据就可以被后续的查询访问。row cache不是写更新。

如果写某行了,这行的缓存就会失效,并且不会被继续缓存,直到这行被读到类似的,如果一

个partition更新了,整个partition的cache都会被移除,但目标的数据在row cache中找不到,

就会去检查 Bloom filter。

Bloom Filter(查找数据可能对应的 SSTable

首先,Cassandra 检查 Bloom filter 去发现哪个 SSTables 中有可能有请求的分区数据。Bloom

filter 是存储在堆外内存每个 SSTable 都有一个关联的 Bloom filter。一个 Bloom filter 可以建

立一个 SSTable 没有包含的特定的分区数据。同样也可以找到分区数据存在 SSTable 中的可能性。

它可以加速查找 partition key 的查找过程。然而,因为 Bloom filter 是一个概率函数,所以可能

会得到错误的结果,并不是所有的 SSTables 都可以被 Bloom filter 识别出是否有数据。如果

Bloom filter 不能够查找到 SSTable,Cassandra 会检查 partition key cache。Bloom filter 大小

增长很适宜,每 10 亿数据 1~2GB。在极端情况下,可以一个分区一行。都可以很轻松的将数十

亿的 entries 存储在单个机器上。Bloom filter 是可以调节的,如果你愿意用内存来换取性能。

Partition Key Cache(查找数据可能对应的 Partition key

partition key 缓存如果开启了,将 partition index 存储在堆外内存。key cache 使用一小块可配

置大小的内存。在读的过程中,每个”hit”保存一个检索。如果在 key cache 中找到了 partition

key。就直接到 compression offset map 中招对应的块。partition key cache 热启动后工作的更

好,相比较冷启动,有很大的性能提升。如果一个节点上的内存非常受限制,可能的话,需要限

制保存在 key cache 中的 partition key 数目。如果一个在 key cache 中没有找到 partition key。

就会去partition summary中去找。partition key cache 大小是可以配置的,意义就是存储在key

cache 中的 partition keys 数目。

Partition Summary(内存中存储一些 partition index 的样本)

partition summary 是存储在堆外内存的结构,存储一些 partition index 的样本。如果一个

partition index 包含所有的 partition keys。鉴于一个 partition summary 从每 X 个 keys 中取

样,然后将每 X 个 key map 到 index 文件中。例如,如果一个 partition summary 设置了 20keys

进行取样。它就会存储 SSTable file 开始的一个 key,20th 个 key,以此类推。尽管并不知道

partition key 的具体位置,partition summary 可以缩短找到 partition 数据位置。当找到了

partition key 值可能的范围后,就会去找 partition index。通过配置取样频率,你可以用内存来

换取性能,当 partition summary 包含的数据越多,使用的内存越多。可以通过表定义的 index

interval 属性来改变样本频率。固定大小的内存可以通过 index_summary_capacity_in_mb 属性

来设置,默认是堆大小的 5%。

Partition Index(磁盘中)

partition index 驻扎在磁盘中,索引所有 partition keys 和偏移量的映射。如果 partition

summary 已经查到 partition keys 的范围,现在的检索就是根据这个范围值来检索目标 partition

key。需要进行单次检索和顺序读。根据找到的信息。然后去 compression offset map 中去找磁

盘中有这个数据的块。如果 partition index 必须要被检索,则需要检索两次磁盘去找到目标数据。

Compression offset map(磁盘中)

compression offset map 存储磁盘数据准确位置的指针。存储在堆外内存,可以被 partition key

cache 或者 partition index 访问。一旦 compression offset map 识别出来磁盘中的数据位置,

就会从正确的 SStable(s)中取出数据。查询就会收到结果集


目录
相关文章
|
8天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
31 2
|
13天前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
18天前
|
存储 缓存 Oracle
Java I/O流面试之道
NIO的出现在于提高IO的速度,它相比传统的输入/输出流速度更快。NIO通过管道Channel和缓冲器Buffer来处理数据,可以把管道当成一个矿藏,缓冲器就是矿藏里的卡车。程序通过管道里的缓冲器进行数据交互,而不直接处理数据。程序要么从缓冲器获取数据,要么输入数据到缓冲器。
Java I/O流面试之道
|
15天前
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
39 4
|
15天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
55 4
|
28天前
|
存储 Java 程序员
Java面试加分点!一文读懂HashMap底层实现与扩容机制
本文详细解析了Java中经典的HashMap数据结构,包括其底层实现、扩容机制、put和查找过程、哈希函数以及JDK 1.7与1.8的差异。通过数组、链表和红黑树的组合,HashMap实现了高效的键值对存储与检索。文章还介绍了HashMap在不同版本中的优化,帮助读者更好地理解和应用这一重要工具。
54 5
|
27天前
|
存储 Java
[Java]面试官:你对异常处理了解多少,例如,finally中可以有return吗?
本文介绍了Java中`try...catch...finally`语句的使用细节及返回值问题,并探讨了JDK1.7引入的`try...with...resources`新特性,强调了异常处理机制及资源自动关闭的优势。
20 1
|
1月前
|
Java 程序员
Java 面试高频考点:static 和 final 深度剖析
本文介绍了 Java 中的 `static` 和 `final` 关键字。`static` 修饰的属性和方法属于类而非对象,所有实例共享;`final` 用于变量、方法和类,确保其不可修改或继承。两者结合可用于定义常量。文章通过具体示例详细解析了它们的用法和应用场景。
28 3
|
25天前
|
算法 Java
JAVA 二叉树面试题
JAVA 二叉树面试题
15 0
|
3月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。