JAVA面试——Cassandra(一)

简介: JAVA面试——Cassandra

16.1.1. 概念

Apache Cassandra 是高度可扩展的,高性能的分布式 NoSQL 数据库。 Cassandra 旨在处理许

多商品服务器上的大量数据,提供高可用性而无需担心单点故障。

Cassandra 具有能够处理大量数据的分布式架构。 数据放置在具有多个复制因子的不同机器上,

以获得高可用性,而无需担心单点故障。

16.1.2. 数据模型

Key Space(对应 SQL 数据库中的 database

1. 一个 Key Space 中可包含若干个 CF,如同 SQL 数据库中一个 database 可包含多个 table

Key(对应 SQL 数据库中的主键)

2. 在 Cassandra 中,每一行数据记录是以 key/value 的形式存储的,其中 key 是唯一标识。

column(对应 SQL 数据库中的列)

3. Cassandra 中每个 key/value 对中的 value 又称为 column,它是一个三元组,即:name,

value 和 timestamp,其中 name 需要是唯一的。

super columnSQL 数据库不支持)

4. cassandra 允许 key/value 中的 value 是一个 map(key/value_list),即某个 column 有多个

子列。

Standard Column Family(相对应 SQL 数据库中的 table

5. 每个 CF 由一系列 row 组成,每个 row 包含一个 key 以及其对应的若干 column

Super Column FamilySQL 数据库不支持)

6. 每个 SCF 由一系列 row 组成,每个 row 包含一个 key 以及其对应的若干 super column。

16.1.3. Cassandra 一致 Hash 和虚拟节点

一致性 Hash(多米诺 down 机)

为每个节点分配一个 token,根据这个 token 值来决定节点在集群中的位置以及这个节点所存储

的数据范围。

虚拟节点(down 机多节点托管)

由于这种方式会造成数据分布不均的问题,在 Cassandra1.2 以后采用了虚拟节点的思想:不需要

为每个节点分配 token,把圆环分成更多部分,让每个节点负责多个部分的数据,这样一个节点移

除后,它所负责的多个 token 会托管给多个节点处理,这种思想解决了数据分布不均的问题。

image.png

如图所示,上面部分是标准一致性哈希,每个节点负责圆环中连续的一段,如果 Node2 突然

down 掉,Node2 负责的数据托管给 Node1,即 Node1 负责 EFAB 四段,如果 Node1 里面有

很多热点用户产生的数据导致 Node1 已经有点撑不住了,恰巧 B 也是热点用户产生的数据,这样

一来 Node1 可能会接着 down 机,Node1down 机,Node6 还 hold 住吗?

下面部分是虚拟节点实现每个节点不再负责连续部分,且圆环被分为更多的部分如果 Node2

突然 down 掉,Node2 负责的数据不全是托管给 Node1,而是托管给多个节点。而且也保持了一

致性哈希的特点。

16.1.4. Gossip 协议

Gossip 算法如其名,灵感来自办公室八卦,只要一个人八卦一下,在有限的时间内所有的人都

会知道该八卦的信息,这种方式也与病毒传播类似,因此 Gossip 有众多的别名“闲话算法”、

“疫情传播算法”、“病毒感染算法”、“谣言传播算法”。 Gossip 的特点:在一个有界网络中,

每个节点都随机地与其他节点通信,经过一番杂乱无章的通信,最终所有节点的状态都会达成一

致。因为 Gossip 不要求节点知道所有其他节点,因此又具有去中心化的特点,节点之间完全对等,

不需要任何的中心节点。实际上 Gossip 可以用于众多能接受“最终一致性”的领域:失败检测、

路由同步、Pub/Sub、动态负载均衡。

Gossip 节点的通信方式及收敛性

Gossip 两个节点(AB)之间存在三种通信方式(pushpullpush&pull

1. push: A 节点将数据(key,value,version)及对应的版本号推送给 B 节点,B 节点更新 A 中比自

己新的数据

2. pull:A 仅将数据 key,version 推送给 B,B 将本地比 A 新的数据(Key,value,version)推送

给 A,A 更新本地。

3. push/pull:与 pull 类似,只是多了一步,A 再将本地比 B 新的数据推送给 B,B 更新本地。

如果把两个节点数据同步一次定义为一个周期,则在一个周期内,push 需通信 1 次,pull 需 2 次,

push/pull 则需 3 次,从效果上来讲,push/pull 最好,理论上一个周期内可以使两个节点完全一

致。直观上也感觉,push/pull 的收敛速度是最快的。

gossip 的协议和 seed list(防止集群分列)

cassandra 使用称为 gossip 的协议来发现加入 C 集群中的其他节点的位置和状态信息。gossip 进

程每秒都在进行,并与至多三个节点交换状态信息。节点交换他们自己和所知道的信息,于是所

有的节点很快就能学习到整个集群中的其他节点的信息。gossip 信息有一个相关的版本号,于是

在一次 gossip 信息交换中,旧的信息会被新的信息覆盖重写。要阻止分区进行 gossip 交流,那么

在集群中的所有节点中使用相同的 seed list,种子节点的指定除了启动起 gossip 进程外,没有其

他的目的。种子节点不是一个单点故障,他们在集群操作中也没有其他的特殊目的,除了引导节

点以外

16.1.5. 数据复制

Partitioners(计算 primary key token hash 函数)

在 Cassandra 中,table 的每行由唯一的 primarykey 标识,partitioner 实际上为一 hash 函数用

以计算 primary key 的 token。Cassandra 依据这个 token 值在集群中放置对应的行

两种可用的复制策略:

SimpleStrategy仅用于单数据中心,

将第一个 replica 放在由 partitioner 确定的节点中,其余的 replicas 放在上述节点顺时针方向的

后续节点中。

NetworkTopologyStrategy:可用于较复杂的多数据中心。

可以指定在每个数据中心分别存储多少份 replicas。

复制策略在创建 keyspace 时指定,如

CREATE KEYSPACE Excelsior WITH REPLICATION = { 'class' :

'SimpleStrategy','replication_factor' : 3 };

CREATE KEYSPACE Excalibur WITH REPLICATION = {'class' :'NetworkTopologyStrategy',

'dc1' : 3, 'dc2' : 2};

16.1.6. 数据写请求和协调者

协调者(coordinator)

协调者(coordinator)将 write 请求发送到拥有对应 row 的所有 replica 节点,只要节点可用便获取

并执行写请求。写一致性级别(write consistency level)确定要有多少个 replica 节点必须返回成功

的确认信息成功意味着数据被正确写入了 commit log 和 memtable

image.png

其中 dc1、dc2 这些数据中心名称要与 snitch 中配置的名称一致.上面的拓扑策略表示在 dc1 配置

3 个副本,在 dc2 配置 2 个副本

16.1.7. 数据读请求和后台修复

1. 协调者首先与一致性级别确定的所有 replica 联系,被联系的节点返回请求的数据

2. 若多个节点被联系,则来自各 replica 的 row 会在内存中作比较,若不一致,则协调者使用含

最新数据的 replica 向 client 返回结果。那么比较操作过程中只需要传递时间戳就可以,因为要

比较的只是哪个副本数据是最新的。

3. 协调者在后台联系和比较来自其余拥有对应 row 的 replica 的数据,若不一致,会向过时的

replica 发写请求用最新的数据进行更新 read repair。

image.png

16.1.8. 数据存储(CommitLog、MemTable、SSTable

写请求分别到 CommitLog 和 MemTable, 并且 MemTable 的数据会刷写到磁盘 SSTable 上. 除

了写数据,还有索引也会保存到磁盘上.

先将数据写到磁盘中的 commitlog,同时追加到中内存中的数据结构 memtable 。这个时候就会

返回客户端状态 , memtable 内 容 超 出 指 定 容 量 后 会 被 放 进 将 被 刷 入 磁 盘 的 队 列

(memtable_flush_queue_size 配置队列长度)。若将被刷入磁盘的数据超出了队列长度,将内存

数据刷进磁盘中的 SSTable,之后 commit log 被清空。

SSTable 文件构成(BloomFilterindexdatastatic

SSTable 文件有 fileer(判断数据 key 是否存在,这里使用了 BloomFilter 提高效率),index(寻

找对应 column 值所在 data 文件位置)文件,data(存储真实数据)文件,static(存储和统计

column 和 row 大小)文件。

16.1.9. 二级索引(对要索引的 value 摘要,生成 RowKey

在 Cassandra 中,数据都是以 Key-value 的形式保存的

image.png

KeysIndex 所创建的二级索引也被保存在一张 ColumnFamily 中。在插入数据时,对需要进行索

引的 value进行摘要,生成独一无二的key,将其作为 RowKey保存在索引的 ColumnFamily 中

同时在 RowKey 上添加一个 Column,将插入数据的 RowKey 作为 name 域的值,value 域则赋

空值,timestamp 域则赋为插入数据的时间戳。

如果有相同的 value 被索引了,则会在索引 ColumnFamily 中相同的 RowKey 后再添加新的

Column。如果有新的 value 被索引,则会在索引 ColumnFamily 中添加新的 RowKey 以及对应

新的 Column。

当对 value 进行查询时,只需计算该 value 的 RowKey,在索引 ColumnFamily 中的查找该

RowKey,对其 Columns 进行遍历就能得到该 value 所有数据的 RowKey。

16.1.10. 数据读写

数据写入和更新(数据追加)

Cassandra 的设计思路与这些系统不同,无论是 insert 还是 remove 操作,都是在已有的数据后

面进行追加,而不修改已有的数据。这种设计称为 Log structured 存储,顾名思义就是系统中的

数据是以日志的形式存在的,所以只会将新的数据追加到已有数据的后面。Log structured 存储

系统有两个主要优点:

数据的写和删除效率极高

传统的存储系统需要更新元信息和数据,因此磁盘的磁头需要反复移动,这是一个比较耗时

的操作,而 Log structured 的系统则是顺序写,可以充分利用文件系统的 cache,所以效率

很高。

错误恢复简单

由于数据本身就是以日志形式保存,老的数据不会被覆盖,所以在设计 journal 的时候不需

要考虑 undo,简化了错误恢复。

读的复杂度高

但是,Log structured 的存储系统也引入了一个重要的问题:读的复杂度和性能。理论上

说,读操作需要从后往前扫描数据,以找到某个记录的最新版本。相比传统的存储系统,这

是比较耗时的。

参考:https://blog.csdn.net/fs1360472174/article/details/55005335

数据删除(column 的墓碑)

如果一次删除操作在一个节点上失败了(总共 3 个节点,副本为 3, RF=3).整个删除操作仍然被

认为成功的(因为有两个节点应答成功,使用 CL.QUORUM 一致性)。接下来如果读发生在该节

点上就会变的不明确,因为结果返回是空,还是返回数据,没有办法确定哪一种是正确的。

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