Cassandra 数据如何写入

数据如何写入?

Apache Cassandra™(DDAC)数据库DataStax分发在写入路径上的多个阶段处理数据,从立即记录写入开始,最后是将数据写入磁盘:

  1. 在提交日志中记录数据
  2. 将数据写入内存表
  3. 从内存表中刷新数据
  4. 在SSTables中的磁盘上存储数据

Cassandra 数据如何写入_第1张图片

 

注意:所有写入的时间戳均为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

 

 

 

 

你可能感兴趣的:(Cassandra 数据如何写入)