期望的行为
我正在尝试配置cassandra cdc,以便定期将提交日志段刷新到cdc_raw目录(假设每10秒刷新一次)。
根据 http://abiasforaction.net/apache-cassandra-memtable-flush/和 https://docs.datastax.com/en/dse/5.1/dse-admin/datastax_enterprise/config/configCDCLogging.html 的文档,我发现:
memtable_flush_period_in_ms– 这是一个 CQL 表属性,它 指定内存表应达到的毫秒数 刷新。此属性在创建表时指定。
和
将内存表刷新到磁盘时,提交包含数据的日志段 将启用 CDC 的表移动到配置的cdc_raw目录中。
将这些放在一起,我认为通过设置memtable_flush_period_in_ms: 10000
cassandra 刷新,CDC 每 10 秒刷新一次磁盘,这就是我想要完成的。
我的配置
根据上述和我的配置,我希望内存表每 10 秒刷新一次到 cdc_raw 目录。我使用以下配置:
Cassandra.yaml:
cdc_enabled: true
commitlog_segment_size_in_mb: 1
commitlog_total_space_in_mb: 2
commitlog_sync: periodic
commitlog_sync_period_in_ms: 10000
表配置:
memtable_flush_period_in_ms = 10000
cdc = true
问题
内存表不会定期刷新到 cdc_raw 目录,而是在达到特定大小阈值时刷新到 commitlogs 目录。
详细地,会发生以下情况:
当提交日志段达到 1MB 时,它会刷新到提交日志目录。提交日志目录中最多有 2 个提交日志(请参阅配置 commitlog_total_space_in_mb:2)。 达到此阈值时,提交日志目录中最早的提交日志文件将移动到cdc_raw目录中。
问题
如何定期将 Cassandra CDC 更改刷新到磁盘?
当前版本中Apache Cassandra的CDC很棘手。
提交日志是"全局"的,这意味着对任何表的更改都会转到相同的提交日志。
- 提交日志段可以(并且将)包含启用了 CDC 的表以外的表中的日志。其中包括系统表。 刷新提交日志
- 段中的每个日志后,将删除提交日志段并将其移动到
cdc_raw
目录中。
因此,即使您将启用了 CDC 的表配置为每 10 秒刷新一次,来自其他表的日志仍位于同一提交日志段中,这会阻止将提交日志移动到 CDC 目录。
除了尝试通过减少commitlog_segment_size_in_mb
来加快进程之外,没有其他方法可以更改行为(但您需要注意不要将其减小到小于单个写入要求的大小)。
此行为已得到改进,并将在下一个主要版本 v4.0 中发布。读取 CDC 的速度与将提交日志同步到磁盘的速度一样快(因此,当您使用提交日志同步时periodic
则可以每commit_log_sync_period_in_ms
毫秒读取一次更改。
有关详细信息,请参阅 CASSANDRA-12148。
顺便说一句,您将commitlog_total_space_in_mb
设置为 2,我绝对不建议这样做。您现在看到的是,当您的提交日志大小超过此值时,Cassandra 会刷新每个表以腾出更多空间。如果你无法回收你的提交日志空间,那么Cassandra将开始抛出错误并拒绝写入。