变更数据捕获
概述
变更数据捕获 (CDC) 提供了一种机制来标记特定表以进行归档,以及在 CDC 日志达到可配置的磁盘大小后拒绝写入这些表。操作员可以通过设置表属性 cdc=true
来在表上启用 CDC(在 创建表
时或 更改表
时)。在 CommitLogSegment 创建时,会在 cassandra.yaml
中指定的目录中创建对该段的硬链接。在段 fsync 到磁盘时,如果 CDC 数据存在于该段的任何位置,则还会创建一个 <segment_name>_cdc.idx 文件,其中包含原始段中持久化到磁盘的数据量。在最终段刷新时,将在 _cdc.idx 文件中添加第二行,其中包含人类可读的单词“COMPLETED”,表示 Cassandra 已完成对该文件的所有处理。
我们使用索引文件,而不是仅仅鼓励客户端实时解析内存映射句柄上的日志,因为数据可能反映在尚未持久化到磁盘的内核缓冲区中。仅解析 _cdc.idx 文件中列出的偏移量之前的数据,将确保您只解析持久化数据的 CDC 数据。
请注意,在极少数情况下,例如磁盘速度慢,消费者可能会从 _cdc.idx 文件中读取空值,因为更新是通过首先截断文件然后写入文件来实现的。在这种情况下,消费者应该重试读取索引文件。
yaml 中指定了允许的总磁盘空间阈值,在此阈值之后,新分配的 CommitLogSegments 将不允许 CDC 数据,直到消费者解析并从指定的 cdc_raw 目录中删除文件。
配置
在表上启用或禁用 CDC
CDC 通过 cdc 表属性启用或禁用,例如
CREATE TABLE foo (a int, b text, PRIMARY KEY(a)) WITH cdc=true;
ALTER TABLE foo WITH cdc=true;
ALTER TABLE foo WITH cdc=false;
cassandra.yaml 参数
以下 cassandra.yaml 选项可用于 CDC
cdc_enabled
(默认值:false)-
在节点范围内启用或禁用 CDC 操作。
cdc_raw_directory
(默认值:$CASSANDRA_HOME/data/cdc_raw
)-
在所有相应的 memtable 刷新后,CommitLogSegments 将被移动到的目标位置。
cdc_total_space
:(默认值:4096MiB 和 1/8 卷空间的最小值)-
计算为所有允许 CDC 的活动 CommitLogSegments 的总和
cdc_raw_directory
中的所有已刷新 CDC 段。 cdc_free_space_check_interval
(默认值:250ms)-
在容量达到上限时,我们会限制重新计算
cdc_raw_directory
占用的空间的频率,以防止不必要地消耗 CPU 周期。默认情况下,每秒检查 4 次。
读取 CommitLogSegments
使用 CommitLogReader.java。用法 非常简单,可以使用 各种签名。为了处理从磁盘读取的变异,请实现 CommitLogReadHandler.