📅  最后修改于: 2023-12-03 14:39:15.940000             🧑  作者: Mango
Apache Cassandra 是一个高度可扩展、高性能的开源分布式 NoSQL 数据库,采用基于列的数据模型和分布式架构,旨在提供高可用性、高容错性和低延迟。在 Cassandra 中,数据存储在 SSTable 中,SSTable 是 Cassandra 数据库中的核心概念之一。
SSTable 是Sorted String Table(排序字符串表)的缩写。它是一种在硬盘上维护的、不可变的有序字符串表,在 Cassandra 中用于存储数据。SSTable 是 Cassandra 数据库的主要磁盘存储格式之一,用于维护数据的持久性、一致性和可靠性。
SSTable 的基本结构由以下 4 个部分组成:
SSTable 数据的组织方式遵循了 LSM Tree(Log-Structured Merge Tree)的设计原则。LSM Tree 是一种经典的键值存储引擎实现方式,用于解决数据存储和查询的瓶颈问题。为了实现 LSM Tree,Cassandra 引入了两个关键概念:
内存表(Memtable):是一个位于内存中的有序映射表,用于存储最新的修改操作。当 Memtable 达到一定大小后或者到达一定时间间隔后,Cassandra 会将其转化为 SSTable 存储到磁盘上。
SSTable:硬盘上的有序字符串表,用于存储数据。SSTable 由多个块(Block)组成,每个块都是由多条键值对组成的固定大小的块。Cassandra 会定期将内存表(Memtable)中的数据刷新到磁盘上,形成一个新的 SSTable,之前的 SSTable 会被删除。当查询操作需要访问磁盘上的数据时,Cassandra 会先从最近的、最新的 SSTable 开始查找,然后逐步查找较旧的 SSTable,直到所有数据都被找到。
通过 SSTable 的索引(Index)可以快速定位到任意键(row key)在 SSTable 文件中的位置,进而快速获取对应的数据。SSTable 的索引(Index)采用基于偏移量的二分查找算法,由多个块组成,每个块都有一个对应的索引。索引格式如下:
Key1:Offset1
...
KeyN:OffsetN
其中,Key 是键,Offset 是键在 SSTable 文件中的偏移量。
当从 SSTable 中查询一个键时,Cassandra 会通过二分查找算法在所有索引块中查找,找到键所在的索引块,然后对该索引块中的 key-offset pairs 进行二分查找,最终可以快速定位到键对应的偏移量(也就是键值对在 SSTable 文件中的位置),然后读取该键值对的数据。
当写入一个新的键值对时,Cassandra 首先将数据写入到内存表(Memtable)中,然后等待数据溢出到磁盘上的 SSTable 中。每当 Memtable 达到一定的大小时,就会将其转化为 SSTable 存储到磁盘上,成为一个新的 SSTable。
在写入数据时,Cassandra 采用了一种类似于写前日志(WAL)的机制,称为对数列(CommitLog)。每当有新的写操作时,Cassandra 会将该操作写入到对数列中,然后立即响应客户端请求。此后,Cassandra 会将该操作写入到内存表(Memtable)中,如果客户端要求确认写入操作已提交,则 Cassandra 会将数据同步写入到磁盘上的 SSTable 中。