文档章节

Cassandra【最新版V2.07】- 系列 1: Cassandra模型以及架构介绍

止静
 止静
发布于 2014/10/27 16:52
字数 1577
阅读 95
收藏 0

 NoSql的世界纷繁复杂,出去掉Redis等内存型的数据库之外,在整个NoSQl领域比较认可的是  Cassandra,Hbase,以及MongoDB。


对于Mongo,目前本ID的系列博文已经有部分,而Hbase有关的部分还未补充,待补。


高可靠性

    协议

1:Cassandra采用了gossip作为集群中节点的通信协议,该协议整个节点都处于同等的地位,没有主从

之分,这就使得任一节点的推出都不会导致整个集群的失效。

有关gossip协议的深入认知,请参考本ID的另外一篇博文:

           大数据系列博文:

              大数据体系【协议】系列-1:gossip协议


2:Cassandra 和Hbase在底层的架构设计都是借鉴了 Google Big Table的思想来构建自己的系统,而

Cassandra的创新就是将原本用在文件共享架构的P2P (Peer to Peer)引入到了NoSql


P2P的一大特点就是去中心化,集群之中的所有节点都有着同等的地位,这极大的避免了单个节点退出,

而使整个集群不能工作的可能,与之形成对比的是Hbase采用了Master/Slave的方式,这就存在了单点失效的可能。

对于P2P的深入认知,请参考本ID的另外一篇博文:

              大数据体系【协议】系列-1:P2P协议


1.2:高扩展性

随着时间的推移,集群中原有的规模不足以存储新增加的数据,目前NoSql的数据都已经实现了

级联的扩展,非常容易实现添加新的节点到已有集群,操作简单。

1.3:最终一致性

        在这里再次强调一下最终一致性:Cassandra采用了最终的一致性:

         最终的一致性是指分布式系统之中的一个数据对象的多个副本尽管在短时间内可能出现不一致,但是经过

一段时间以后,这些副本最终会达到一致。

        有关一致性,建议先了解本ID的另外一篇博文:

                         大数据体系【概念认知】系列-1:一致性


Cassandra是优先保证了AP,也就是我们经常说到的可用性,和分区容错性。


通常而言,大部分的NoSQL key-value的模式都是写入非常的高效,毕竟是为了大量数据的插入所涉及,

可是在数据的读取方面那就依据不同的情况而不同。

1 :如果是单个读取指定了的key,那就回很快的返回结果。 -》指定key查询。

2  :  如果是范围查询,由于查询的目标可能存储在多个节点之上,这就需要要对多个节点

       来进行查询,速度会比较慢。

3 :全表扫。毫无疑问,全表扫描数据,会非常的低效。


数据模型

       由于 Cassandra采用了类似与BigTable的数据结构组织,Cassandra和Hbase比较类似。所以Cassandra和Hbase相比也存在着许多相同的概念。

        

                如果抽象来看Cassandra。整个Cassandra都是一个五维的空间

      

            1:column        

                    column:列,在Cassandra之中是最小的一个数据单元,它包含了一个三元的数据类型:

             

   1: {  // 这是一个column
   2:     name: "美丽新世界",
   3:     value: "gpcuster@gmali.com",
   4:     timestamp: 123456789
   5: }

upercolumn:超级列

            我们可以将SuperColumn想象成Column的数组,他包含一个name。以及一系列的Column

              将一个SuperColumn 用JSON的形式表示如下

         {   // 这是一个SuperColumn
   2:     name: “美丽的新世界",
   3:     // 包含一系列的Columns
   4:     value: {
   5:         street: {name: "street", value: "1234 x street", timestamp: 123456789},
   6:         city: {name: "city", value: "san francisco", timestamp: 123456789},
   7:         zip: {name: "zip", value: "94107", timestamp: 123456789},
   8:     }
   9: }


            Columns和SuperColumns都是一个Key Value ,一个name和一个String的组合,最大的不同在于Column的Value是一个“String”,而SuperColumn的value是一个Cloumns的Map


            1:Column family

                    Column family是一个包含了一个许多行[Row]的结构,你可以将它想象成RDBMS中的Table,每一个行都包含有Clinet提供的Key和该KEY关联的的一系列的Column,我们可以看到如下的结构:

   1: UserProfile = { // 这是一个ColumnFamily
   2:     phatduckk: {   // 这是对应ColumnFamily的key
   3:         // 这是Key下对应的Column
   4:         username: "gpcuster",
   5:         email: "gpcuster@gmail.com",
   6:         phone: "6666"
   7:     }, // 第一个row结束
   8:     ieure: {   // 这是ColumnFamily的另一个key
   9:         //这是另一个Key对应的column
  10:         username: "pengguo",
  11:         email: "pengguo@live.com",
  12:         phone: "888"
  13:         age: "66"
  14:     },
  15: }


    1: UserProfile = { // 这是一个ColumnFamily
   2:     phatduckk: {   // 这是对应ColumnFamily的key
   3:         // 这是Key下对应的Column
   4:         username: "gpcuster",
   5:         email: "gpcuster@gmail.com",
   6:         phone: "6666"
   7:     }, // 第一个row结束
   8:     ieure: {   // 这是ColumnFamily的另一个key
   9:         //这是另一个Key对应的column
  10:         username: "pengguo",
  11:         email: "pengguo@live.com",
  12:         phone: "888"
  13:         age: "66"
  14:     },
  15: }

ColumnFamily的类型可以是Standard,也可以是Super的类型,我们刚刚看到的例子是一个Stand类型的ColumnFamily。除此之外,还有另外的一种形式,也就是不每一行不仅仅只是一个列,还可能是一个CF

如下所示:

   1: AddressBook = { // 这是一个Super类型的ColumnFamily
   2:     phatduckk: {    // key
   3:         friend1: {street: "8th street", zip: "90210", city: "Beverley Hills", state: "CA"}, 
   4:         John: {street: "Howard street", zip: "94404", city: "FC", state: "CA"},
   5:         Kim: {street: "X street", zip: "87876", city: "Balls", state: "VA"},
   6:         Tod: {street: "Jerry street", zip: "54556", city: "Cartoon", state: "CO"},
   7:         Bob: {street: "Q Blvd", zip: "24252", city: "Nowhere", state: "MN"},
   8:         ...
   9:     }, // row结束
  10:     ieure: {     // key
  11:         joey: {street: "A ave", zip: "55485", city: "Hell", state: "NV"},
  12:         William: {street: "Armpit Dr", zip: "93301", city: "Bakersfield", state: "CA"},
  13:     },
  14: }

        注意,在Hbase之中也有一个CL的概念,详细分别,请参考

           Hbase【最新版0.97】- 系列 1:  Hbase模型以及架构介绍

          

                   3:keySpace

                KeySpace是我们最外层的数据结构,通常的情况,我们的应用程序只有一个KeySpace,简单点来讲,keySpace,可以把keySpace想象成为RDBMS之中的 database。

             

                相对与关系型的数据库的三层结构:

                        database -> table -> colum而言。

                cassandra的结构层次如下:

                        keyspace->column family>【column|super column】

        

© 著作权归作者所有

止静
粉丝 122
博文 134
码字总数 125762
作品 0
东城
技术主管
私信 提问
Apache Cassandra 从入门到精通

为了营造一个开放的 Cassandra 技术交流环境,和国内对 Cassandra 感兴趣的开发者进行交流,我们准备在近期写一个 Apache Cassandra 从入门到精通的系列文章,具体文章目录如下(如果大家有补...

明惠
2019/04/23
0
0
如何实现节点间数据同步

Apache Cassandra3.X 系列,第 4 部分 如何实现节点间数据同步 周 明耀 2017 年 12 月 06 日发布 系列内容: 此内容是该系列 6 部分中的第 # 部分: Apache Cassandra3.X 系列,第 4 部分 ht...

周 明耀
2017/12/06
0
0
考虑 Apache Cassandra 数据库

简介 在数据库历史文章 “What Goes Around Comes Around”(参阅 参考资料)中,Michal Stonebraker 详细描述了存储技术是如何随着时间的推移而发展的。实现关系模型之前,开发人员曾尝试过...

ihaolin
2014/08/17
152
0
Cassandra数据模型设计

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

jsycwangwei
2015/05/26
203
0
Cassandra数据模型设计(上)

【编者注:InfoQ中文站获得了eBay工程师Jay Patel的授权,将会为陆续为读者呈现Cassandra数据模型设计的系列内容。】 本文是Cassandra数据模型设计第一篇(全两篇),该系列文章包含了eBay使...

啊莫
2015/12/07
109
0

没有更多内容

加载失败,请刷新页面

加载更多

如何标记电话号码?

我想在HTML文档中将电话号码标记为可调用链接。 我已经阅读了微格式方法 ,我知道, tel:方案将是标准的,但实际上没有实现。 据我所知,Skype定义了skype:和callto: ,后者已经获得了一些人气...

javail
5分钟前
14
0
单击手机网页中的链接时如何触发电话

我需要为移动设备构建一个网页。 只有一件事我还没弄明白:如何通过点击文字来触发电话? 是否有一个特殊的URL我可以输入,如mailto:标签的电子邮件? 设备特定解决方案不是优选的。 我知道i...

技术盛宴
20分钟前
33
0
[读书笔记] 大型网站性能优化实战-服务端性能优化

1 QPS (吞吐量) 1.1 RT (Response Time,响应时间) 服务器端 RT+网络开销 ≈ 客户端 RT。对于网络来讲,常见的优化方式有 CDN、 AND和专线, 分别适用于不同的场景。 服务器端 RT = Thread ...

QingHuo
39分钟前
21
0
concurrently 启动多个serve时命令行输出混乱

在script中配置中加入参数 -r "start": "npx concurrently -r \"npm:serve\" \"npm:web\"" 输出比较整洁 输出混乱, 会将有用的信息冲掉...

阿豪boy
今天
48
0
每天AC系列(三):电话号码的字母组合

1 题目 Leetcode第17题。 数字2-9映射字母,给出一个包含字符串的数字,列出字母的所有组合。 2 递归 拿到这样的题目想到了递归实现,创建一个Map映射对应的字母,然后把它传给递归函数,同时...

Blueeeeeee
今天
44
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部