Cassandra CDC初体验-阿里云开发者社区

开发者社区> _陆豪> 正文

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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
怎么设置阿里云服务器安全组?阿里云安全组规则详细解说
阿里云服务器安全组设置规则分享,阿里云服务器安全组如何放行端口设置教程
6900 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
4477 0
使用OpenApi弹性释放和设置云服务器ECS释放
云服务器ECS的一个重要特性就是按需创建资源。您可以在业务高峰期按需弹性的自定义规则进行资源创建,在完成业务计算的时候释放资源。本篇将提供几个Tips帮助您更加容易和自动化的完成云服务器的释放和弹性设置。
7748 0
windows server 2008阿里云ECS服务器安全设置
最近我们Sinesafe安全公司在为客户使用阿里云ecs服务器做安全的过程中,发现服务器基础安全性都没有做。为了为站长们提供更加有效的安全基础解决方案,我们Sinesafe将对阿里云服务器win2008 系统进行基础安全部署实战过程! 比较重要的几部分 1.
5454 0
阿里云服务器安全组设置内网互通的方法
虽然0.0.0.0/0使用非常方便,但是发现很多同学使用它来做内网互通,这是有安全风险的,实例有可能会在经典网络被内网IP访问到。下面介绍一下四种安全的内网互联设置方法。 购买前请先:领取阿里云幸运券,有很多优惠,可到下文中领取。
9423 0
腾讯云服务器 设置ngxin + fastdfs +tomcat 开机自启动
在tomcat中新建一个可以启动的 .sh 脚本文件 /usr/local/tomcat7/bin/ export JAVA_HOME=/usr/local/java/jdk7 export PATH=$JAVA_HOME/bin/:$PATH export CLASSPATH=.
2135 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,云吞铺子总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系统盘、创建快照、配置安全组等操作如何登录ECS云服务器控制台? 1、先登录到阿里云ECS服务器控制台 2、点击顶部的“控制台” 3、通过左侧栏,切换到“云服务器ECS”即可,如下图所示 通过ECS控制台的远程连接来登录到云服务器 阿里云ECS云服务器自带远程连接功能,使用该功能可以登录到云服务器,简单且方便,如下图:点击“远程连接”,第一次连接会自动生成6位数字密码,输入密码即可登录到云服务器上。
16807 0
+关注
18
文章
0
问答
来源圈子
更多
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载