您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > Cassandra模型&源码分析
Cassandra分布式模型与源代码分析文茂V0.7文件更改摘要:修订记录日期修订说明修订人批准人2010-7-18创建文茂2010-8-19修订文茂1简介Cassandra是一个开源的分布式数据库,结合了Dynamo的Key/Value与Bigtable的面向列的特点。1.1Cassandra的特点1.灵活的schema不需要象数据库一样预先设计schema,增加或者删除字段非常方便(onthefly)。2.支持range查询可以对Key进行范围查询。3.高可用,可扩展单点故障不影响集群服务,可线性扩展。我们可以将Cassandra的数据模型想象成一个四维或者五维的Hash。ApacheCassandra是一套开源分布式数据库管理系统。它最初由Facebook开发,用于储存特别大的数据。Facebook目前在使用此系统。模式灵活:使用Cassandra,你不必提前解决记录中的字段。你可以在系统运行时随意的添加或移除字段。真正的可扩展性:Cassandra是纯粹意义上的水平扩展。为给集群添加更多容量,可以指向另一台电脑。你不必重启任何进程,改变应用查询,或手动迁移任何数据。多数据中心识别:你可以调整你的节点布局来避免某一个数据中心起火,一个备用的数据中心将至少有每条记录的完全复制。范围查询:如果你不喜欢全部的键值查询,则可以设置键的范围来查询。列表数据结构:在混合模式可以将超级列添加到5维。分布式写操作:有可以在任何地方任何时间集中读或写任何数据。并且不会有任何单点失败。应用客户:twitter、facebook1.2主要特性分布式基于column的结构化高伸展性Cassandra的主要特点就是它不是一个数据库,而是由一堆数据库节点共同构成的一个分布式网络服务,对Cassandra的一个写操作,会被复制到其他节点上去,对Cassandra的读操作,也会被路由到某个节点上面去读取。对于一个Cassandra群集来说,扩展性能是比较简单的事情,只管在群集里面添加节点就可以了。Cassandra是一个混合型的非关系的数据库,类似于Google的BigTable。其主要功能比Dynomite(分布式的Key-Value存储系统)更丰富,但支持度却不如文档存储MongoDB(介于关系数据库和非关系数据库之间的开源产品,是非关系数据库当中功能最丰富,最像关系数据库的。支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。)Cassandra最初由Facebook开发,后转变成了开源项目。它是一个网络社交云计算方面理想的数据库。以Amazon专有的完全分布式的Dynamo为基础,结合了GoogleBigTable基于列族(ColumnFamily)的数据模型。P2P去中心化的存储。很多方面都可以称之为Dynamo2.0。1.3功能Cassandra的主要特点就是它不是一个数据库,而是由一堆数据库节点共同构成的一个分布式网络服务,对Cassandra的一个写操作,会被复制到其他节点上去,对Cassandra的读操作,也会被路由到某个节点上面去读取。对于一个Cassandra群集来说,扩展性能是比较简单的事情,只管在群集里面添加节点就可以了。这里有很多理由来选择Cassandra用于您的网站。1.4和其他数据库比较模式灵活:使用Cassandra,像文档存储,你不必提前解决记录中的字段。你可以在系统运行时随意的添加或移除字段。这是一个惊人的效率提升,特别是在大型部署上。真正的可扩展性:Cassandra是纯粹意义上的水平扩展。为给集群添加更多容量,可以指向另一台电脑。你不必重启任何进程,改变应用查询,或手动迁移任何数据。多数据中心识别:你可以调整你的节点布局来避免某一个数据中心起火,一个备用的数据中心将至少有每条记录的完全复制。一些使Cassandra提高竞争力的其他功能:范围查询:如果你不喜欢全部的键值查询,则可以设置键的范围来查询。列表数据结构:在混合模式可以将超级列添加到5维。对于每个用户的索引,这是非常方便的。分布式写操作:有可以在任何地方任何时间集中读或写任何数据。并且不会有任何单点失败2数据模型2.1ColumnColumn是Cassandra中最小的数据单元。它是一个3元的数据类型,包含:name,value和timestamp。将一个Column用JSON的形式表现出来如下:{//这是一个Columnname:email,value:gpcuster@gmali.com,timestamp:123456789}为了简单起见,我们可以忽略timestamp。就把column想象成一个name/value即可。注意,这里提到的name和value都是byte[]类型的,长度不限。2.2SuperColumn我们可以将SuperColumn想象成Column的数组,它包含一个name,以及一系列相应的Column。将一个SuperColumn用JSON的形式表现如下:{//这是一个SuperColumnname:地址,//包含一系列的Columnsvalue:{street:{name:street,value:1234xstreet,timestamp:123456789},city:{name:city,value:sanfrancisco,timestamp:123456789},zip:{name:zip,value:94107,timestamp:123456789},}}Columns和SuperColumns都是name与value的组合。最大的不同在于Column的value是一个“string”,而SuperColumn的value是Columns的Map。还有一点需要注意的是:SuperColumn本身是不包含timestamp的。2.3ColumnFamilyColumnFamily是一个包含了许多Row的结构,你可以将它想象成RDBMS中的Table。每一个Row都包含有client提供的Key以及和该Key关联的一系列Column。我们可以看看结构:UserProfile={//这是一个ColumnFamilyphatduckk:{//这是对应ColumnFamily的key//这是Key下对应的Columnusername:gpcuster,email:gpcuster@gmail.com,phone:6666},//第一个row结束ieure:{//这是ColumnFamily的另一个key//这是另一个Key对应的columnusername:pengguo,email:pengguo@live.com,phone:888age:66},}ColumnFamily的类型可以为Standard,也可以是Super类型。我们刚刚看到的那个例子是一个Standard类型的ColumnFamily。Standard类型的ColumnFamily包含了一系列的Columns(不是SuperColumn)。Super类型的ColumnFamily包含了一系列的SuperColumn,但是并不能像SuperColumn那样包含一系列StandardColumnFamily。这是一个简单的例子:AddressBook={//这是一个Super类型的ColumnFamilyphatduckk:{//keyfriend1:{street:8thstreet,zip:90210,city:BeverleyHills,state:CA},John:{street:Howardstreet,zip:94404,city:FC,state:CA},Kim:{street:Xstreet,zip:87876,city:Balls,state:VA},Tod:{street:Jerrystreet,zip:54556,city:Cartoon,state:CO},Bob:{street:QBlvd,zip:24252,city:Nowhere,state:MN}},//row结束ieure:{//keyjoey:{street:Aave,zip:55485,city:Hell,state:NV},William:{street:ArmpitDr,zip:93301,city:Bakersfield,state:CA},},}2.4KeyspaceKeyspace是我们的数据最外层,你所有的ColumnFamily都属于某一个Keyspace。一般来说,我们的一个程序应用只会有一个Keyspace。2.5RowRow以key为表示,一个key对应的数据可以分布在多个columnfamily中,通常我们都只会存放在一个columnfamily中。2.6简单测试我们将Cassandra运行起来以后,启动命令行,执行如下操作:cassandrasetKeyspace1.Standard1['jsmith']['first']='John'Valueinserted.cassandrasetKeyspace1.Standard1['jsmith']['last']='Smith'Valueinserted.cassandrasetKeyspace1.Standard1['jsmith']['age']='42'Valueinserted.这个时候,Cassandra中就已经有3条数据了。其中插入数据的各个字段含义如下:接下来,我们执行查询操作:cassandragetKeyspace1.Standard1['jsmith'](column=age,value=42;timestamp=1249930062801)(column=first,value=John;timestamp=1249930053103)(column=last,value=Smith;timestamp=1249930058345)Returned3rows.这样,我们就可以将之前插入的数据查询出来了。2.7排序有一点需要明确,我们使用Cassandra的时候,数据在写入的时候就已经排好顺序了。在某一个Key内的所有Column都是按照它的Name来排序的。我们可以在storage-conf.xml文件中指定排序的类型。目前Cassandra提供的排序类型有:BytesType,UTF8Type,LexicalUUIDType,TimeUUIDType,AsciiType,和LongType。现在假设你的原始数据如下:{name:123,value:hellothere},{name:832416,value:kjjkbcjkcbbd},{name:3,value:101010101010},{name:976,value:kjjkbcjkcbbd}当我们storage-conf.xml文件中指定排序的类型为LongType时:!--ColumnFamily在storage-conf.xml中定义--ColumnFamilyCompareWith=LongTypeName=CF_NAME_HERE/排序后的数据就是这样的:{name:3,value:101010101010},{name:123,value:hellothere},{name:976,value:kjjkbcjkcbbd},{name:832416,value:kjjkbcjkcbbd}如果我们指定排序的类型为UTF8Type!--ColumnFamily在storage-conf.xml中定义--ColumnFamilyCompareWith=UTF8TypeName=CF_NAME_HERE/排序后的数据就是这样的:{name:123,value:hellothere},{name:3,value:101010101010},{name:832416,value:kjjkbcjkcbbd},{name:976,value:kj
本文标题:Cassandra模型&源码分析
链接地址:https://www.777doc.com/doc-4326285 .html