数据如何写入?
Apache Cassandra™(DDAC)数据库的DataStax分发在写入路径上的多个阶段处理数据,从立即记录写入开始,最后是将数据写入磁盘:
- 在提交日志中记录数据
- 将数据写入内存表
- 从内存表中刷新数据
- 在SSTables中的磁盘上存储数据
注意:所有写入的时间戳均为UTC(世界标准时间)。
记录写入和内存存储
发生写操作时,数据库将数据存储在称为memtable的内存结构中。为了提供可配置的持久性,数据库还将写操作追加到磁盘上的提交日志。当commitlog_sync设置为时sync
,提交日志将接收对节点的每次写入。即使节点断电,这些持久的写操作也会永久保留。memtable是数据库按键查找的数据分区的回写高速缓存。内存表按排序顺序存储写操作,直到达到可配置的限制,然后将其刷新。
从内存表中刷新数据
为了从内存表中刷新数据,数据库按内存表排序的顺序将数据写入磁盘。在磁盘上还会创建一个分区索引,该分区索引将令牌映射到磁盘上的某个位置。
当内存表的内容超过可配置的阈值,或者提交日志空间超过commitlog_total_space_in_mb时,内存表将放入刷新到磁盘的队列中。如果要刷新的数据超过了memtable_cleanup_threshold(它是自动计算的),则数据库块将写入直到下一次刷新成功为止。
您可以使用nodetool flush或 nodetool dump(清除内存表而不监听与其他节点的连接)来手动刷新表。为了减少提交日志重播时间,DataStax建议在重新启动节点之前刷新内存表。如果节点停止工作,则重播提交日志将恢复对该节点停止之前在内存表中的写入。
清除提交日志段
数据库使用提交日志来重建内存表。提交日志分为多个部分。当当前段达到commitlog_segment_size_in_mb时,将按顺序记录写入并创建新段。仅在将段中的所有数据从内存表刷新到磁盘后,数据库才清除提交日志段。如果提交日志目录达到最大大小(commitlog_total_space_in_mb),则会清除最旧的段,并将相应的表刷新到磁盘。
例如,考虑以下两个表:- 表A具有极高的吞吐量
- 表B的吞吐量很低
所有提交日志段均包含对表A和表B以及系统表的写入。表A的memtable快速填充并频繁刷新;而表B的内存表则缓慢填充,很少被刷新。当提交日志达到最大大小时,它将强制刷新表B的内存表,然后清除这些段。
表B刷新为大块,而不是数百个小的SSTable。如果提交日志空间和内存表空间相等,则表B的内存表将在每次刷新表A时刷新,尽管会小得多。总而言之,如果有多个表,则有较大的提交日志段空间是有意义的
在SSTables中的磁盘上存储数据
每个表都维护着Memtables和SSTables。提交日志在表之间共享。SSTable是不可变的,在刷新内存表后不会再次写入。因此,分区通常跨多个SSTable文件存储。存在许多其他SSTable结构来辅助读取操作。
SSTable名称和版本
SSTables是存储在磁盘上的文件。数据文件存储在数据目录中,该目录随安装而变化。对于每个键空间,数据目录中的目录将存储每个表。例如,/ data/ks1/cf1-5be396077b811e3a3ab9dc4b9ac088d/la-1-big-Data.db 表示数据文件。ks1表示密钥空间名称,以区分用于流式传输或批量加载数据的密钥空间。在此示例中,十六进制字符串5be396077b811e3a3ab9dc4b9ac088d附加到表名以表示唯一的表ID。
数据库为每个表创建一个子目录,该目录可通过符号链接(symlink)引用到选定的物理驱动器或数据卷。为了提高性能,此功能使您可以将非常活跃的表移动到更快的介质(例如SSD),并且还可以在所有连接的存储设备上划分表,以在存储层实现更好的I / O平衡。
数据库为每个SSTable创建以下结构:
- 数据(Data.db)
- SSTable数据
- 主索引(Index.db)
- 行键的索引以及指向它们在数据文件中位置的指针
- 布隆过滤器(Filter.db)
- 存储在内存中的结构,用于在访问磁盘上的SSTables之前检查内存表中是否存在行数据
- 压缩信息(CompressionInfo.db)
- 一个文件,其中包含有关未压缩的数据长度,块偏移量和其他压缩信息的信息
- 统计(Statistics.db)
- 有关SSTable内容的统计元数据
- 摘要(Digest.crc32,Digest.adler32或Digest.sha1)
- 包含数据文件的adler32校验和的文件
- CRC(CRC.db)
- 包含CRC32的文件,用于未压缩的文件中的块。
- SSTable索引摘要(SUMMARY.db)
- 存储在内存中的分区索引的样本
- SSTable目录(TOC.txt)
- 该文件存储SSTable TOC的所有组件的列表
- 二级索引(SI _。*。db)
- 内置二级索引。每个SSTable可能存在多个SI