Cassandra 数据如何写入

数据如何写入?

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

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

Cassandra 数据如何写入

 

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

 

 

 

 

上一篇:[学习记录]docker本地路径的一点杂谈


下一篇:git 拉去merged 仓库的代码步骤