`
阅读更多

Cassandra是一个混合型的非关系的数据库,类似于Google的BigTable。其主要功能比Dynomite(分布式的Key-Value存储系统)更丰富.Cassandra最初由Facebook开发,后转变成了开源项目。它是一个网络社交云计算方面理想的数据库。以Amazon专有的完全分布式的Dynamo为基础,结合了Google BigTable基于列族(Column Family)的数据模型。P2P去中心化的存储。很多方面都可以称之为Dynamo 2.0。
  功能
  Cassandra的主要特点就是它不是一个数据库,而是由一堆数据库节点共同构成的一个分布式网络服务,对Cassandra 的一个写操作,会被复制到其他节点上去,对Cassandra的读操作,也会被路由到某个节点上面去读取。对于一个Cassandra群集来说,扩展性能是比较简单的事情,只管在群集里面添加节点就可以了。

 
  这里有很多理由来选择Cassandra用于您的网站。和其他数据库比较,有三个突出特点:
  1、模式灵活 :使用Cassandra,像文档存储,你不必提前解决记录中的字段。你可以在系统运行时随意的添加或移除字段。这是一个惊人的效率提升,特别是在大型部署上。
  2、真正的可扩展性 :Cassandra是纯粹意义上的水平扩展。为给集群添加更多容量,可以指向另一台电脑。你不必重启任何进程,改变应用查询,或手动迁移任何数据。
      3、多数据中心识别:你可以调整你的节点布局来避免某一个数据中心起火,一个备用的数据中心将至少有每条记录的完全复制。

应用客户:Digg, Facebook, Twitter, Reddit, Rackspace, Cloudkick,
项目网址:http://cassandra.apache.org/

 

使用RingCache提高Cassandra读写效率

我们在之前的文章(谈谈Cassandra的客户端)中讲解了如果在Client端查询Cassandra中的数据。
为什么要使用RingCache
Cassandra的内部读写流程大概是这样的:
1 先随机找到Cassandra集群中的一台机器,然后将查询请求发送给这台Cassandra机器。
2 接收到查询请求的Cassandra机器会判断需要查询的数据是否在本机中:如果在本机中,直接查询;如果不在本机中,将请求转发给另外一台机器来查询,并等待另外一台机器的查询结果。
3 查询请求的Cassandra机器将最终的结果返回给Client端。

Cassandra 的限制

大家在使用Cassandra的时候,往往容易忽视Cassandra本身的限制。
在Wiki中,我们可以看到Cassandra的限制:CassandraLimitations

在Eclipse中开发Cassandra

在之前的文章中,我们讲解了Cassandra如何安装于配置:如何安装和配置Cassandra
在这篇文章中,我们将从svn中下载Cassandra的源代码,完成编译,并执行相应的单元测试。
配置环境
1 安装jdk6,ant。
2 安装Eclipse3.5
3 在Eclipse中安装http://subclipse.tigris.org/update_1.6.x
在Eclipse的菜单选择:Help –> Install New Software

整合Cassandra与Hadoop MapReduce

看到这个标题,大家一定会问了。这个整合如何定义?
我个人认为,所谓的整合是指:我们可以编写MapReduce程序,从HDFS中读取数据然后插入到Cassandra中。也可以是直接从Cassandra中读取数据,然后进行相应的计算。

介绍Cassandra中的压缩

在《如何安装和配置Cassandra》中,我们可以在DataFileDirectories中配置数据的存放位置。
当Cassandra启动后,向其中插入的数据就会放在DataFileDirectories的目录下,如图:

这里有2个Column Family,分别是Standrad1,Super1。
大家可以想象,如果没有压缩功能的话,那么随着数据量的增加,DataFileDirectories目录中的文件会越来越多。
在Cassandra中的压缩功能避免了在DataFileDirectories目录中存在大量的数据文件。

反转Cassandra索引

问题
通过前面的文章:《谈谈Cassandra的客户端》和《大话Cassandra数据模型》我们已经了解了Cassandra的数据模型和编程接口的情况。
假如我们在实际的应用中我们的数据是这样保存的:

每一个key对应了一些列的Column:port,Version,Service,Status等等。
通过某一个key,我们能够找到和这个key相关的所有Column的值。
假设我们要找到Column的name为Service,并且Column的值为app2的所有的Key值,那么我们应该如何操作呢?
根据Cassandra提供的Thrift API,我们并不能够直接找到这样的数据,唯一可以操作的方式就是通过KeyRange的方式:进行全表扫描,找到符合条件的值。
这种方式虽然可以解决问题,但是当数据量非常巨大的时候,进行这种查询的效率还是非常有限的。

使用Binary Memtable将大量数据导入Cassandra

在这篇《谈谈Cassandra的客户端》文章中,我们谈到了如何使用Thrift API以及更加高级的封装(Hector)如果将数据导入到到Cassandra中,但是在导入大量数据的时候这会遇到很多的问题,比如插入失败,超时等等问题。为了解决这个问题,我们可以尝试使用Binary Memtable。
在Cassandra的wiki上,对Binary Memtable的描述如下:
Binary Memtable is the name of Cassandra’s bulk-load interface. It avoids several kinds of overhead associated with the normal Thrift API:

Converting to Thrift from the internal structures and back
Routing (copying) from a coordinator node to the replica nodes
Writing to the commitlog
Serializing the internal structures to on-disk format

The tradeoff [...]

谈谈Cassandra的客户端

最近试用了一段时间Cassandra,将Oracle中的数据导入进来,遇到了问题然后解决问题,收获挺大。在这个过程中,除了设计一个合理的数据模型,再就是使用Cassandra API进行交互了。
Cassandra在设计的时候,就是支持Thrift的,这意味着我们可以使用多种语言开发。
对于Cassandra的开发本身而言,这是使用Thrift的好处:支持多语言。坏处也是显而易见的:Thrift API功能过于简单,不具备在生产环境使用的条件。
在Cassandra Wiki页面上,也有基于Thrift API开发的更加高级的API,各个语言都有,具体信息可以参考:http://wiki.apache.org/cassandra/ClientExamples。
这次只谈谈下面两类Java的客户端:
1 Thrift Java API
2 hector

基于Cassandra搭建简单Blog程序后台

在上一篇博客《大话Cassandra数据模型》中,我们讲解了Cassandra的数据模型。在这篇博客中,我们将基于Cassandra搭建一个简单的Blog程序后台。
需求
Blog程序的需求如下:
1 允许不同的用户写Blog。 2 Blog内容包括:标题,内容,ID,发布日期。 3 每一篇Blog可以打上任意多个Tag。 4 人们可以在Blog上留言,内容包括:留言内容,留言人的名字,留言时间。

大话Cassandra数据模型

Cassandra是一个开源的分布式数据库,结合了Dynamo的Key/Value与Bigtable的面向列的特点。
Cassandra的特点如下:
1.灵活的schema:不需要象数据库一样预先设计schema,增加或者删除字段非常方便(on the fly)。
2.支持range查询:可以对Key进行范围查询。
3.高可用,可扩展:单点故障不影响集群服务,可线性扩展。

我们可以将Cassandra的数据模型想象成一个四维或者五维的Hash。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics