如何定期将 Cassandra CDC 更改刷新到磁盘?



期望的行为

我正在尝试配置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: 10000cassandra 刷新,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将开始抛出错误并拒绝写入。

最新更新