Hycz's Blog

Life is a game. Why so serious?

Cassandra 0.8.0源码包简介

一、overall

这个是Cassandra 0.8.0在Eclipse中配置完毕之后的有关于源码的部分,截图如下:



在正确配置之后,这个工程中应该有7个文件夹,分别是(1)java源代码(src/java);(2)生成java源代码(src/gen-java);(3)thrift生成java源代码(interface/thrift/gen-java);(4)cql的jdbc源代码(drivers/java/src);(5)cql的jdbc测试代码(drivers/java/gen-java);(6)单元测试代码(test/unit);(7)长时间测试代码(test/long)。

虽然文件夹是这么多,其实可以对所有的代码分个类,第一类是纯源代码,第二类是生成代码,第三类是测试代码。如果按照产品进行分类的话,那么也可以分为:第一类是Cassandra服务器端,第二类是Cassandra的Cli,第三类是CQL的JDBC,不过这里依赖关系比较多,所以也不尽然。

二、生成代码(gen-java)

那么先从不太重要的讲起,生成代码。所谓生成代码,就是在src版本中不存在,而是在build的时候生成的代码,在src版本中只有关于这些内容的中间语言版本。我的理解是,这是为了跨语言,比如我现在用的是java,那么就把那中间语言翻译成java,然后生成相应的java文件进行使用。

在上述的代码中,src/gen-java和interface/thrift/gen-java中的代码都是生成代码。Cassandra现在看来真是一个庞然大物,糅合了各种技术在其中,这里的生成代码的技术就用到了3种。

  • Antlr
    这个东西主要是生成自己的语法解析器,简单来说,用之前的JLine进行命令行的IO,然后把获得的命令在这里与相应的函数进行关联。使用的包是lib文件夹下的antlr-3.2.jar。具体用法见这里:http://wenku.baidu.com/view/d8580e5f804d2b160b4ec074.html。在源代码中,下面2个包使用Antlr生成的:src/gen-java下的org.apache.cassandra.cliorg.apache.cassandra.cql,原始文件是src/java/org/apache/cassandra/cli/Cli.gsrc/java/org/apache/cassandra/cql/Cql.g。具体的生成顺序(根据build.xml中),首先是检查生成语法(check-gen-xxx-grammar),从一个*.g 文件生成一个*.token文件,比如,在CLI中,就是从Cli.g文件生成了Cli.token文件,然后生成语法解析器,用生成xxxLexer.java和xxxParser.java,比如,在CLI中,生成了CliLexer.java和CliParser.java。
  • Avro
  • Thrift
    Avro和Thrift放在一起讲,下面的话引自这里:http://www.webguo.com/2011/02/11/avro_vs_thrift.html。“Avro和Thrift都是跨语言,基于二进制的高性能的通讯中间件. 它们都提供了数据序列化的功能和RPC服务. 总体功能上类似,但是哲学不一样. Thrift出自Facebook用于后台各个服务间的通讯,Thrift的设计强调统一的编程接口的多语言通讯框架. Avro出自Hadoop之父Doug Cutting, 在Thrift已经相当流行的情况下Avro的推出,其目标不仅是提供一套类似Thrift的通讯中间件更是要建立一个新的,标准性的云计算的数据交换和存储的Protocol。 这个和Thrift的理念不同,Thrift认为没有一个完美的方案可以解决所有问题,因此尽量保持一个Neutral框架,插入不同的实现并互相交互。而Avro偏向实用,排斥多种方案带来的 可能的混乱,主张建立一个统一的标准,并不介意采用特定的优化。Avro的创新之处在于融合了显式,declarative的Schema和高效二进制的数据表达,强调数据的自我描述,克服了以往单纯XML或二进制系统的缺陷。Avro对Schema动态加载功能,是Thrift编程接口所不具备的,符合了Hadoop上的Hive/Pig及NOSQL 等既属于ad hoc,又追求性能的应用需求.”在源代码中,使用Avro生成的是以下3个包:src/gen-java中的org.apache.cassandraorg.apache.cassandra.db.migration.avro以及org.apache.cassandra.utils.avro,他们都是从文件src/avro/internode.genavro中生成的。在源代码中,使用Thrift生成的是interface/thrift/gen-java中的org.apache.cassandra.thrift包,原始文件是interface/cassandra.thrift文件。

三、测试代码(test/unit, test/long and drivers/java/test)

没什么好讲的,就是针对每个包中的代码的测试。

四、源代码(src/java and drivers/java/src)

src/java中有34个包,有内容的有33个。正如同Cassandra的论文中的行文结构一样,Cassandra其实没有什么层次性,甚至连系统架构图都没有,然后再看各个包的话,可以发现其实是针对一个分布式系统的不同方面的实现,比如在论文中的系统架构章节提到的几个部分:Partitioning,Replication,Membership,Bootstrapping,Scaling the Cluster,Local Persistence,还有一些其他的实现技术,比如SEDA等等。这几个部分算是系统的几个主要模块,但是包与包之间又不是简单的模块关系,反而更像是根据分布式系统各部分相关论文的技术而做的实现,然后再以一种粗暴的方法拼接在一起,不牢固的地方再加上其他的实现加以过度。当然,这是我粗看之下的愚见,不能作数,但是Cassandra其实算不上优雅,更像是一个缝合憎恶。

所以,将这些包分成几个大的部分比较好:

  • 存储和数据模型
    这个部分如同名字,其实应该分为2个部分,但是由于这两部分的实现过于紧密(比如SStable和Memtable的实现就在不同的包中),只好归为一类。作为最底层的部分,存储部分的主要参照是Bigtable中的SStable+Memtable模型,使用这个模型就不可避免地需要用到BloomFilter和Compaction,当然还有一些cache的技术也算在这个部分,数据模型部分的主要参照也是Bigtable中的Keyspace+Row+ColumnFamily+Column的模型,不过Cassandra又在其中加上了SuperColumn一层,除了模型的实现,还有模型提供的各种操作的实现也在其中,此外,还要加上CommitLog的相关实现。具体的细节不在这里讨论,相关的包是以下几个:
    org.apache.cassandra.io
    org.apache.cassandra.io.sstable
    org.apache.cassandra.io.util
    org.apache.cassandra.db
    org.apache.cassandra.db.columniterator
    org.apache.cassandra.db.commitlog
    org.apache.cassandra.db.context
    org.apache.cassandra.db.filter
    org.apache.cassandra.db.marshal
    org.apache.cassandra.db.migration 
    org.apache.cassandra.cache 
  • P2P
    这个部分是用来实现P2P,也就是去中心化架构的,主要是实现了一个分布式哈希表(DHT),其中实现了几种不同的Partition方案供选择。相关的包是这个:
    org.apache.cassandra.dht 
  • 副本
    这个部分是用来实现分布式系统中常用的副本机制的,这里也提供了几种副本策略。关于副本的设置问题,在配置文件中有副本策略的设置,此外,还有副本数量的设置是写在每个Keyspace的Metadata中的。相关的包是这个:
    org.apache.cassandra.locator 
  • Gossip
    这个部分实现了Gossip,用来进行分布式系统中的成员管理。相关的类是下面这个:
    org.apache.cassandra.gms 
  • SEDA
    这个部分实现了SEDA的框架,用于更高效的并行操作。相关的类是下面这个:
    org.apache.cassandra.concurrent 
  • 通信
    这个部分实现了分布式系统内部用于通信的消息机制,以及内部传输的数据流机制。相关的包是以下几个:
    org.apache.cassandra.net
    org.apache.cassandra.net.io
    org.apache.cassandra.net.sink 
    org.apache.cassandra.streaming 
  • 请求调度
    对到达的请求进行简单的调度,相关包是:
    org.apache.cassandra.scheduler 
  • 服务封装
    这个部分实现了系统对外的调用接口,无论系统内部是如何实现的,对使用者来说,只需要从这里的服务中进行调用就可以了。此外,与hadoop的接口算在其中。相关的包是下面这2个:
    org.apache.cassandra.service 
    org.apache.cassandra.thrift 
    org.apache.cassandra.hadoop 
  • 客户端
    这个部分包括了用于管理系统的命令行接口和CQL客户端,至于Thrift客户端,那个在生成代码中。相关的包是下面这几个:
    org.apache.cassandra.cli
    org.apache.cassandra.client
    org.apache.cassandra.cql 
    org.apache.cassandra.tools 
  • 配置
    这个部分用来读取配置然后导入到系统中。相关的包是下面这个:
    org.apache.cassandra.config 
  • 授权与安全
    这个部分实现的是简单的用户授权管理和安全管理。相关的包是下面几个:
    org.apache.cassandra.auth
    org.apache.cassandra.security
    org.apache.cassandra.security.streaming  
  • 憎恶的缝合线
    好吧,这里卖萌了,其实这里就是我所说的用来对整个系统进行修修补补的地方,比如为了实现某个功能,但是少了个什么东西,于是就实现了放在这里,具体是下面2个包:
    org.apache.cassandra.utils
    org.apache.cassandra.utils.obs 
Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: