NoSQL之Cassandra
http://www.cnblogs.com/LBSer/p/3328841.html
9月初听了一个讲座,演讲者是张月同学,他给我们分享了Cassandra nosql数据库,讲得很精彩,听完之后收益良多。
Cassandra是一个noSQL数据库,在国外被广泛使用,比如FaceBook、Twitter、Intel等,国内用的较少,只有奇虎360等公司在大规模使用。张月首先讲了Cassandra怎么来的,之后讲了Cassandra的一些具体细节,让我印象比较深刻的有数据分布以及通讯协议两个部分,最后讲了Cassandra的效率以及使用情况。
1. Cassandra怎么来的
他山之石可以攻玉,Cassandra从Dynamo和BigTable中借鉴了相应的思想。
类似Dynamo的特性 |
类似bigTable的特性 |
对称、P2P的结构,没有主节点 |
稀疏、列存储模型 |
基于 Gossip的集群管理 |
commit log,内存有 MemTable,SSTable Files |
分布式哈西表 |
支持Hadoop |
最终一致性 |
2. Cassandra中的数据是怎样分布的?
1.2版本之前使用的是普通一致性哈西算法,如图上部所示,一共6个节点,每个节点计算Hash值a,之后各个节点根据各自的hash值映射到一段区间上,比如Node1对应着A,此外,各个节点保存着其它节点的两个副本,比如Node1还保存着Node5的E,以及Node6的F。
普通的一致性哈西有个缺点,当增加或删除节点时会导致数据分布不均衡,比如Node2宕机后,原先Node2的数据全部分布到Node3上,造成Node3的数据量大大多余其它节点;同理,当在区间B插入一个节点Node7时,会使得Node2和Node7的数据量大大小于其它节点。
为了解决上述问题,1.2版本使用带有虚拟节点的一致性哈西算法,如图下部所示,一共6个节点,每个节点需要计算两次hash,首先与传统一样计算Hash值a,然后根据这个值a计算多个hash值a1,a2,a3...,即将一个节点映射到多个hash值,从而每个节点不再仅仅对应一个区间,而是对应着许多小区间,如果保证各个hash值是随机的,则能使得这些小区间的分布也是随机的,从而确保了数据分布的均衡性
3. Gossip协议管理集群
每隔T秒,集群中各个节点将都会将自己的Heartbeat信息通过Gossip传递给其他节点。Gossip协议效率较高,只需要Log(N)次就能将所有节点状态信息传递给各个节点。
4. Cassandra的效率以及使用情况
张月给了张图,上面显示Cassandra读写速度远远大于Hbase和MongoDB,但是也有很多人质疑这个图,因为他没有给出这张图的实验条件,比如多大数据量,各个数据库是否在同一集群上等等。不过我后来查看了些文献,发现Cassandra的性能还是很不错的。
5. 讨论
会后有个问题:既然Cassandra性能这么出色, 为什么国内很少有公司使用Cassandra? 为什么国外的facebook和twitter等都弃用Cassandra而转用HBase了,Cassandra有什么不足?
张月的回答是国内的宣传不够,至于facebook和twitter为什么转用HBase,可能和HBase天生支持Hadoop有关系,可以结合mapreduce,虽然Cassandra也支持Hadoop,但是配置起来特别麻烦。
后来我网上查了下,Cassandra还是有一些缺点,或许因为这些使得很多大公司转向HBase。
a)Cassandra来源自Facebook,但是在Facebook内部Cassandra 目前只用在inbox search产品上,容量大约有一两百T,且Inbox Search在Facebook的也不是核心应用;
b)Cassandra出身较晚,自身还存在不少问题。
NoSQL之Cassandra的更多相关文章
- 开源软件:NoSql数据库 - 图数据库 Cassandra
转载原文:http://www.cnblogs.com/loveis715/p/5299495.html Cassandra简介 在前面的一篇文章<图形数据库Neo4J简介>中,我们介绍了 ...
- Cassandra简介
在前面的一篇文章<图形数据库Neo4J简介>中,我们介绍了一种非常流行的图形数据库Neo4J的使用方法.而在本文中,我们将对另外一种类型的NoSQL数据库——Cassandra进行简单地介 ...
- 10 things you should know about NoSQL databases
For a quarter of a century, the relational database (RDBMS) has been the dominant model for database ...
- Cassandra
NoSQL之Cassandra 9月初听了一个讲座,演讲者是张月同学,他给我们分享了Cassandra nosql数据库,讲得很精彩,听完之后收益良多. Cassandra是一个noSQL数据库, ...
- Cassandra内部架构
Cassandra是一个开源的.分布式.无中心节点.弹性可扩展.高可用.容错.一致性协调.面向列的NoSQL数据库 Cassandra集群(Cluster) Cluster Data center(s ...
- C#写的NoSQL开源项目/系统(系列)
http://www.cnblogs.com/unruledboy/archive/2013/01/07/CSharpNoSQL.html 闲扯 好久没写开源项目了,也没写对新开源项目的介绍,今晚看了 ...
- IM 去中心化概念模型与架构设计
今天打算写写关于 IM 去中心化涉及的架构模型变化和设计思路,去中心化的概念就是说用户的访问不是集中在一个数据中心,这里的去中心是针对数据中心而言的. 站在这个角度而言,实际上并非所有的业务都能做去中 ...
- Hash函数及其应用
本文部分内容摘自网络,参考资料链接会在文后给出,在此感谢原作者的分享. 计算理论中,没有Hash函数的说法,只有单向函数的说法.所谓的单向函数,是一个复杂的定义,大家可以去看计算理论或者密码学方面的数 ...
- 资源list:Github上关于大数据的开源项目、论文等合集
Awesome Big Data A curated list of awesome big data frameworks, resources and other awesomeness. Ins ...
随机推荐
- underscore utility
1._.noConflict:命名冲突处理方法 _.noConflict = function() { root._ = previousUnderscore; //返回this不错 return t ...
- java中的static(包括类前面修饰的static、方法前面修饰的static、成员变量前面修饰的static)
static是静态修饰符: 什么叫静态修饰符呢?大家都知道,在程序中任何变量或者代码都是在编译时由系统自动分配内存来存储的,而所谓静态就是指在编译后所分配的内存会一直存在,直到程序退出内存才会释放这个 ...
- Fig 7.2.4 & Fig 7.3.2
Fig 7.2.4 \documentclass[varwidth=true, border=2pt]{standalone} \usepackage{tkz-euclide} \begin{docu ...
- What is Pay Me to Learn——Google Summer of Code 2013
原文链接:http://zhchbin.github.io/2013/10/17/what-is-pay-me-to-learn/ 背景 今天早上才想起来,自己还欠着一件事情没有做完.很久在人人上之前 ...
- [leetcode] 19. Count and Say
这个还是一开始没读懂题目,题目如下: The count-and-say sequence is the sequence of integers beginning as follows: 1, 1 ...
- 【加密算法】AES
一.简介 AES(Advanced Encryption Standard):高级加密标准,是下一代的加密算法标准,速度快,安全级别高. 用AES加密2000年10月,NIST(美国国家标准和技术协会 ...
- C#委托、事件剖析(上)
本节对委托.事件做以总结. 一.委托: 1.概念:先来说明变量和函数的概念,变量,以某个地址为起点的一段内存中所存储的值,函数,以某个地址为起点的一段内存中存储的机器语言指令.有了这2个概念以后,我们 ...
- 分享一个经验,代码打开mysql链接,执行存储过程时,提示:Table 'mysql.proc' doesn't exist
先说说的场景 老项目,因为服务器升级了mysql数据库版本,从5.7.13升到8.0.15 然而代码里面有直连数据的访问,通过执行存储过程来查询数据的业务,此时抛出异常 Table 'mysql. ...
- H5实现页面内跳转页面
<!DOCTYPE html><html><body> <iframe src="/example/html/demo_iframe.html&qu ...
- ES6字符串相关扩展
变量的解构赋值 // 数组的解构赋值 let [a,b,c] = [1,2,3]; //1,2,3 let [a,b,c] = [,123,]; //undefined 123 undefined l ...