`
ahuaxuan
  • 浏览: 639513 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

深入浅出cassandra 3 例子背后的模型

阅读更多


/**
   * author: ahuaxuan(张荣华)
   * date 2010-2-25
   */


深入浅出cassandra 3 例子背后的模型

在上一篇文章中,ahuaxuan和大家一起写了一个cassandra的insert和get的例子。从这个例子中我们也得知了操作cassandra的最基本流程,
除此之外我们也初步了解了cassandra中的数据模型,但是只是肤浅的了解了一下,那么我们接着上一篇的话题,继续阐述这个问题。


在我们操作数据的代码中:

      
 String table = "Keyspace1";
        String row = "row007";
        ColumnPath col = new ColumnPath("Standard1", null, "ahuaxuan".getBytes());


        cassandraClient.insert(table, row, col, " first cassandra sample of ahuaxuan".getBytes(), 1, 1);



 


我们遇到了三个概念,第一个是keyspace, 第二个是ColumnFamily, 第三个是Row。
前面两个属性,我们将可以看成是数据库和表的关系,那么第三个属性呢?
在cassandra文中写道:ColumnFamily的数据是排序后存放在单独的文件中的,row就是排序因子,那个row其实就可以是我们的key,
事实上在cassandra的源代码中row就是key,比如我们看这段源代码:


看上面这个方法的第二个参数,其实就是key.


所以看到这里,我们基本上确定了cassandra中的存储模型,为:
Keyspace1--row007--Standard1,可以确定某个keyspace下的某个key的某个ColumnFamily,
然后再创建某个Column, 包括Column Name和Column Value, 还包含一个timestamp.


这里有一点需要注意, 那就是相同的key中,且在相同的ColumnFamily中,column的名字必须唯一,如果重复,那么可能会产生覆盖。我们来看一段代码

 

public static void main(String[] args) throws TException, TimedOutException, InvalidRequestException, UnavailableException, NotFoundException {
        init();
        String table = "Keyspace1";
        String row = "row007";
        ColumnPath col = new ColumnPath("Standard1", null, "ahuaxuan".getBytes());
        ColumnPath col2 = new ColumnPath("Standard2", null, "ahuaxuan".getBytes());


        cassandraClient.insert(table, row, col, " first cassandra sample of ahuaxuan".getBytes(), 3, 1);
        cassandraClient.insert(table, row, col2, " second cassandra sample of ahuaxuan ".getBytes(), 4, 1);
        Column column = cassandraClient.get(table, row, col, 1).column;
        Column column2 = cassandraClient.get(table, row, col2, 1).column;


        System.out.println("read row " + row);
        System.out.println("column name: " + new String(column.name));
        System.out.println("column value" + ": " + new String(column.value));
        System.out.println("column timestamp" + ":" + (column.timestamp));


        System.out.println("\r\nread row " + row);
        System.out.println("column name: " + new String(column2.name));
        System.out.println("column value" + ": " + new String(column2.value));
        System.out.println("column timestamp" + ": " + (column2.timestamp));
    } 
 
第一次放到Keyspace1--row007--Standard1中,列名为ahuaxuan,列值为first cassandra sample of ahuaxuan,timestamp为3,
接着我更新Keyspace1--row007--Standard1中,列名为ahuaxuan,列值为second cassandra sample of ahuaxuan,timestamp为2
结果更新不成功,但是如果我把timestamp改成4,更新可以成功。


而且从上面这段例子中,我们还可以看出,如果keyspace---row---columnfamily中有一个不一样,那么就不会产生覆盖问题。


所以我们说这里可能产生覆盖,而是否覆盖时由代码中的那个timestamp决定的,如果说当前cassandra中的那条数据的timestamp大于要插入的数据,那么则不会产生覆盖,反之,则产生覆盖
但是本质上未必是覆盖,因为在bigtable的论文中写的很清楚,以前的版本将会被保留,也就是说老的数据还是会存在,当然,我们不能保持所有的老版本数据,那么就一定有一个阈值来
控制具体要保持多少个老版本。其论文写道:


我们对每一个列族支持两个设定,以便于Bigtable对表项的版本自动进行垃圾清除。用户可以指明只保留表项的最后n个版本,或者只保留足够新的版本(比如,只保留最近7天的内容)。


就这样写一个毫无实际意义的例子会让人感觉到比较空洞,所以这里ahuaxuan忍不住引用bigtable论文中的一个例子来描述以下这个模型适用的场景.



如上图所示

 这 是一个存储Web网页的范例列表片断。行名是一个反向URL{即com.cnn.www}。contents列族{原文用 family,译为族,详见列族} 存放网页内容,anchor列族存放引用该网页的锚链接文本。CNN的主页被Sports Illustrater{即所谓SI,CNN的王牌体育节目}和MY-look的主页引用,因此该行包含了名叫“anchor:cnnsi.com”和 “anchhor:my.look.ca”的列。每个锚链接只有一个版本{由时间戳标识,如t9,t8};而contents列则有三个版本,分别由时间 戳t3,t5,和t6标识。

当然可以使用这种数据模型的场景很多,很多时候我们可以把它当作key-value系统来使用,由于有版本号的特征,所以它也能解决一部分数据一致性的问题(这个问题非常重要,我们会在后面的文章中详细阐述).


那么接下来的问题是:cassandra是如何实现这个模型的呢,请您接着往下看


to be continued







7
0
分享到:
评论
4 楼 zhangcheng 2010-03-05  
Cassandra的数据从memtable刷新到sstable的之后,这个存储sstable文件就不会被更新了,如果需要更新,就要创建新的数据文件来存储sstable。

不知道楼主对这句话描述的机制有什么理解。

http://www.ningoo.net/html/2010/cassandra_storage.html

源自这篇文章。

3 楼 ahuaxuan 2010-02-26  
cmzx3444 写道
听说 Twitter 也要用cassandra了,我也想学学这神奇的东西,不知道他怎么做查询的,有类似sql语句的方式吗,现在的系统要是迁移到casaadta会不会很麻烦啊

据我目前看到的代码里并没有搜索的模块,主要还是通过row, column来查找,

如果需要强大的查询功能,我想一个search平台是跑不掉的。至少要像solr那样的。
2 楼 cmzx3444 2010-02-26  
听说 Twitter 也要用cassandra了,我也想学学这神奇的东西,不知道他怎么做查询的,有类似sql语句的方式吗,现在的系统要是迁移到casaadta会不会很麻烦啊
1 楼 yangfuchao418 2010-02-26  
呵呵 ,楼主更新那个特性提醒了我

相关推荐

    Cassandra的数据模型介绍

    amily 是 Cassandra 数据模型的核心组成部分,用来组织和管理 Column 和 SuperColumn。在 Cassandra 中,一个 ColumnFamily 相当于传统数据库中的表,但它不遵循严格的行与列的关系,而是以键值对的形式存储数据,...

    Cassandra:Cassandra数据模型与CQL教程.docx

    Cassandra:Cassandra数据模型与CQL教程.docx

    分布式存储系统:Cassandra:Cassandra数据模型与CQL语言.docx

    分布式存储系统:Cassandra:Cassandra数据模型与CQL语言.docx

    Cassandra数据模型

    **Cassandra 数据模型详解** Cassandra 是一种分布式非关系型数据库系统,由Facebook开发并开源,主要用于处理大规模数据分布式存储。其数据模型是Cassandra的核心特性之一,它不同于传统的SQL数据库,而是基于列族...

    Cassandra数据模型设计最佳实践

    本文是Cassandra数据模型设计第一篇(全两篇),该系列文章包含了eBay使用Cassandra数据模型设计的一些实践。其中一些最佳实践我们是通过社区学到的,有些对我们来说也是新知识,还有一些仍然具有争议性,可能在要...

    解Cassandra数据模型

    解Cassandra数据模型

    深入浅出分布式技术原理 教程 下载 下载3.zip

    分布式技术是现代IT领域中的重要组成部分,它涉及多个计算设备协同工作以完成大规模...通过下载并阅读提供的“深入浅出分布式技术原理教程 下载 下载3.txt”文件,你可以更深入地学习和掌握这些重要的分布式技术概念。

    Cassandra_的数据模型是基于列族(Column_Family)的四维或五维模型。它借鉴

    Cassandra_的数据模型是基于列族(Column_Family)的四维或五维模型。它借鉴了_A_mumu-cassandra

    Laravel开发-cassandra

    在本文中,我们将深入探讨如何在Laravel框架中集成Cassandra数据库,并利用Laravel的Cassandra雄辩模型和查询生成器来实现高效的数据操作。Laravel是一个流行的PHP框架,以其优雅的设计和强大的功能深受开发者喜爱。...

    Learning_Apache_Cassandra

    3. 数据插入和查询操作,以及Cassandra不提供写入反馈的特性。比如,文档中提到“写入数据不产生反馈”、“部分插入”、“缺失行”和“分页检索结果”的概念。 4. 数据模型的发展,它强调了为Cassandra设计高效数据...

    spring boot与cassandra集成,使用JPA方式。

    在本文中,我们将深入探讨如何将Spring Boot框架与Cassandra数据库集成,并利用Java Persistence API (JPA) 进行数据操作。Spring Boot以其简洁的配置和开箱即用的特性,已经成为Java开发中的首选框架之一。而...

    Cassandra实战.pdf

    在深入探讨《Cassandra实战.pdf》这一资源时,我们聚焦于Apache Cassandra数据库系统的全面解析与实践应用,这是一份详尽的技术文档,旨在为数据库管理员、开发者以及对分布式数据库技术感兴趣的专业人士提供深入...

    cassandra权威指南(中文)

    综上所述,《Cassandra权威指南(中文)》涵盖了Cassandra的各个方面,不仅深入浅出地介绍了其基础知识和技术细节,还提供了丰富的实战案例和社区资源,对于初学者和专业人士来说都是一本不可或缺的手册。...

    Cassandra JDBC Driver

    7. **异常处理**:当发生错误时,Cassandra JDBC Driver会抛出适当的JDBC异常,帮助开发者快速定位并解决问题。 8. **元数据支持**:驱动程序提供了获取表、列族(表的别名)、列等元数据的方法,方便开发者了解...

    深入研究Cassandra后重读Dynamo

    ### 深入研究Cassandra后重读Dynamo——架构对比与反思 #### 一、引言 在深入了解Cassandra数据库之后,再次回顾Amazon Dynamo的论文,本文旨在探讨两者之间的架构差异及其潜在的问题。经过一系列的实践经验和理论...

Global site tag (gtag.js) - Google Analytics