Cassandra CDC初体验

简介: CDC(Change data capture)是Cassandra提供的一种用于捕获和归档数据写入操作的机制,这个功能在3.8以上版本支持。当对一个表设置了“cdc=true”属性之后,包含有这个表的数据的CommitLog在丢弃时会被移动到指定的目录中,用户可以自己编写程序消费(解析并删除)这些日志,实现诸如增量数据导出、备份等功能。

CDC(Change data capture)是Cassandra提供的一种用于捕获和归档数据写入操作的机制,这个功能在3.8以上版本支持。当对一个表设置了“cdc=true”属性之后,包含有这个表的数据的CommitLog在丢弃时会被移动到指定的目录中,用户可以自己编写程序消费(解析并删除)这些日志,实现诸如增量数据导出、备份等功能。本文介绍CDC功能的使用并分析其特点。

配置参数

cassandra.yaml中,如下参数和CDC功能有关:
cdc_enabled (默认: false)
true表示节点上开启cdc功能。
cdc_raw_directory (默认: $CASSANDRA_HOME/data/cdc_raw)
当一个Commitlog文件不再需要保留(相关的改动已经全部从memtable持久化到sstable)时,会把日志文件移动到这个目录下。
cdc_free_space_in_mb: (默认: min(4096,磁盘空间的1/8))
当cdc_raw_directory目录下的日志和当前正在写入的日志占用空间超过这个值时,会停止开启了cdc的表的写入。
cdc_free_space_check_interval_ms (默认: 250)
计算日志占用空间的周期。

开启表的CDC

通过如下语句可以在一个表上开启CDC:

CREATE TABLE foo (a int, b text, PRIMARY KEY(a)) WITH cdc=true;

ALTER TABLE foo WITH cdc=true;

消费日志

CDC日志的格式和Commitlog是一致的,在Cassandra中提供了解析Commitlog的类CommitLogReader,借助这个类,我们只需要实现自己的CommitLogReadHandler类来处理捕获的写入操作就可以实现对CDC日志的消费。下面的示例代码实现了一个简单的功能:解析日志并把日志中的写操作输出到屏幕上。
pom文件中增加如下依赖:

        <dependency>
            <groupId>org.apache.cassandra</groupId>
            <artifactId>cassandra-all</artifactId>
            <version>${cassandra.version}</version>
        </dependency>

消费日志的代码如下:

    DatabaseDescriptor.toolInitialization();
    CommitLogReader reader = new CommitLogReader();
    CommitLogReadHandler handler = new CommitLogReadHandler() {
      @Override public boolean shouldSkipSegmentOnError(CommitLogReadException e)
          throws IOException {
        return false;
      }

      @Override public void handleUnrecoverableError(CommitLogReadException e) throws IOException {

      }

      @Override public void handleMutation(Mutation mutation, int i, int i1,
          CommitLogDescriptor commitLogDescriptor) {
        for (PartitionUpdate partition : mutation.getPartitionUpdates()) {
          System.out.println(partition.toString());
        }

      }
    };
    File dir = new File($CDC日志目录);
    while (true) {
      String[] paths = dir.list();
      if( paths.length == 0 ) {
        Thread.sleep(1000);
      }
      for (String path : paths) {
        File f = new File(dir, path);
        reader.readAllFiles(handler, ArrayUtils.toArray(f));
        f.delete();
      }
    }

运行时需要将Cassandra需要的路径加入到classpath里面(可以通过在脚本中调用bin/cassandra.in.sh实现),或者至少指定-Dcassandra.config和-Dcassandra.storagedir这两个路径作为启动参数。这是因为在解析日志时需要表的meta信息。

总结

CDC功能主要起到两个作用:
(1)能够将增量数据可靠的归档到CDC日志目录下面。在CDC出现之前,我们只能通过commitlog_archiving这样的功能归档增量日志,但是commitlog_archiving的机制是调用命令行,在一些异常情况下可能会出现归档失败。而CDC则可以保证日志在成功归档到CDC日志目录中之前绝对不会被删除。
(2)可以起到反压的作用,避免日志占用过多的磁盘空间。当日志量超过cdc_free_space_in_mb的配置后,开启CDC的表会拒绝写请求(抛出WriteTimeoutException)。
一些限制:
(1)通过CDC不能实时读取到增量数据。根据我们前面分析的机制,只有一个日志文件写满并且不需要保留时才会移动到CDC目录下面。
(2)CDC日志中不仅包含开启了cdc功能的表,如果业务场景只需要某个表的数据,需要自己过滤。
(3)在多副本的情况下,同一个(逻辑上的)写入会在多个节点都写入日志,所以如果业务上要求避免重复,需要自己做去重。

入群邀约

为了营造一个开放的 Cassandra 技术交流,我们建立了微信群公众号和钉钉群,为广大用户提供专业的技术分享及问答,定期开展专家技术直播,欢迎大家加入。另外阿里云提供免费Cassandra试用:https://www.aliyun.com/product/cds

8c677711345d2450b80800d50aab3fa0b5a95ded

钉钉群入群链接:https://c.tb.cn/F3.ZRTY0o

微信群公众号:
2a9d5b6c3b9030d06ddb59131aab7287945ead53

目录
相关文章
|
存储 网络协议 虚拟化
如何操作VMware ESXi虚拟机的迁移?
如何操作VMware ESXi虚拟机的迁移?
|
11月前
|
人工智能 IDE Java
我们从零开始实现了一个cursor的codebase功能(踩了很多RAG的坑)
VoidMuse 是一个以学习为目标的开源AI IDE插件,支持IntelliJ IDEA与VS Code,集成20+优秀开源组件,助力开发者在实践中掌握AI工程化技术。本文深入解析其基于混合检索的Codebase实现,涵盖向量化、索引构建与检索优化,助你真正理解并应用Function Call等核心技术。
1483 5
我们从零开始实现了一个cursor的codebase功能(踩了很多RAG的坑)
|
10月前
|
数据采集 监控 数据可视化
数据治理工具哪家强?2025 年国内优质厂商及核心工具推荐
2025年,数据治理工具向智能化、全链路协同升级。瓴羊Dataphin、WeData、DataArts Studio等13大工具脱颖而出,覆盖数据集成、建模、质量管控与资产化服务,助力企业打破数据孤岛,实现高效治理与业务创新融合。
|
消息中间件 存储 算法
深度揭秘!Kafka和ZooKeeper之间的相爱相杀
**摘要:** 本文介绍了Kafka和ZooKeeper的角色及其关系。Kafka是分布式流处理平台,用于实时数据管道和流应用;ZooKeeper是分布式协调服务,处理同步和集群协调。在Kafka中,ZooKeeper存储元数据,管理集群成员,选举Controller。随着KIP-500提案,Kafka计划移除对ZooKeeper的依赖,转向基于Raft的共识机制,以简化架构、提高性能和一致性。此外,文章提到了etcd作为基于Raft的元数据存储系统的应用。本文旨在帮助读者理解ZooKeeper在Kafka面试中的重要性,并了解Kafka的未来发展方向。
2325 2
|
SQL 人工智能 Linux
Microsoft SQL Server 下载汇总 (2025 年 7 月更新)
Microsoft SQL Server 下载汇总 (2025 年 7 月更新)
4163 0
|
存储 分布式计算 调度
Flink Shuffle 技术演进之路
本文由阿里云智能Flink团队郭伟杰与哔哩哔哩蒋晓峰在Flink Forward Asia 2024上的分享整理而成,聚焦Flink Shuffle技术的演进与未来规划。内容涵盖低延迟的Pipelined Shuffle、高吞吐的Blocking Shuffle、流批一体的Hybrid Shuffle三大模式及其应用场景,并探讨了Flink与Apache Celeborn的整合、性能优化及长期发展路线图。通过Hybrid Shuffle等创新技术,Flink实现了资源调度灵活性与高性能的平衡,为流批一体化计算提供了强大支持。未来,社区将进一步优化Shuffle机制,提升系统智能化与易用性。
904 14
Flink Shuffle 技术演进之路
|
存储 监控 程序员
21个Python脚本自动执行日常任务(1)
21个Python脚本自动执行日常任务(1)
|
存储 JSON 安全
深入理解与实践:Token的使用及其在Web应用安全中的重要性
【7月更文挑战第3天】在现代Web应用程序中,Token作为一种关键的安全机制,扮演着维护用户会话安全、验证用户身份的重要角色。本文将深入探讨Token的基本概念、类型、工作原理,并通过实际代码示例展示如何在Web应用中实现Token的生成、验证及应用,以确保数据传输的安全性和用户认证的有效性。
4519 2
|
机器学习/深度学习 算法
XGBoost中正则化的9个超参数
本文探讨了XGBoost中多种正则化方法及其重要性,旨在通过防止过拟合来提升模型性能。文章首先强调了XGBoost作为一种高效算法在机器学习任务中的应用价值,并指出正则化对于缓解过拟合问题的关键作用,具体包括降低模型复杂度、改善泛化能力和防止模型过度适应训练数据。随后,文章详细介绍了四种正则化方法:减少估计器数量(如使用`early_stopping_rounds`)、使用更简单的树(如调整`gamma`和`max_depth`)、采样(如设置`subsample`和`colsample`)以及收缩(如调节`learning_rate`, `lambda`和`alpha`)。
1058 0
XGBoost中正则化的9个超参数

热门文章

最新文章