1.1 Cassandra简介
Apache Cassandra(社区内一般简称为C*)是一套开源分布式NoSQL数据库系统。它最初由Facebook开发,用于储存收件箱等简单格式数据,集Google BigTable的数据模型与Amazon Dynamo的完全分布式架构于一身。Facebook于2008将 Cassandra 开源,09年成为Apache旗下的项目,10年成为正式的基金项目,目前主要由专门进行Cassandra商业化运作的DataStax公司来开发,也有一些来自其他公司或独立的开发者。此后,由于Cassandra良好的可扩展性和性能,被 Apple, Comcast,Instagram, Spotify, eBay Rackspace, Netflix等知名网站所采用,成为了一种流行的分布式结构化数据存储方案。Cassandra优先保证AP(CAP定理),即可用性和分区容错性。
在数据库排行榜“DB-Engines Ranking”中,Cassandra排在第七位,在非关系型数据库中排名第二(仅次于MongoDB)。
但是目前在国内支持度并不是很好(相较于MongoDB),没有一个很好的中文社区,文档资料也很少,即使是官方的文档也是不全的。但是在国外的应用如火如荼,在国内Cassandra的热度远远低于MongoDB和HBase。原因可能是MongoDB公司进入中国市场并建立了中文组,而HBase在阿里的大范围使用下并公开一些资料火起来。目前Cassandra与Spark已经合作,Spark+Cassandra可能也会被应用起来。
1.2 Cassandra特性
1.2.1 经过验证
超过1500家公司用cassandra,有大的、活跃的数据集。
1.2.2 容错性
数据自动复制到多个节点的容错。支持多个跨数据中心的复制。失败的节点可以被替换,这样没有停机时间。
1.2.3 高性能
由于其基础架构的选择(点对点分布式系统,集群中各节点平等),在一些基准测试和实际应用中使得cassandra的性能要优于一些流行的NoSQL方案。
1.2.4 分散性
没有单一的故障点,没有网络瓶颈,集群中的每个节点都相同。
1.2.5 可扩展性
一些最大的生产部署如苹果公司,超过75000以上的节点存储超过10PB级数据,Netflix公司(2500节点,420TB数据,每天超过1W亿次请求),中文搜索引擎宜搜(270节点,400TB,每天超过8亿次请求)和易趣网(100+节点,250TB数据)。
1.2.6 持久化
不能丢失数据,cassandra是一个非常合适的应用程序,即便整个数据中心down掉。
1.2.7 维护一致性
选择为每个更新选择同步或者异步之间的复制。高可用的异步操作进行了优化,像提示移交(当节点掉线,或者各个副本节点中网络闪断的时候,此时数据的保存,等节点间恢复正常以后,副本数据就可以一致了)、读取修复(客户端读取某个对象的时候,触发对该对象的一致性检查,不一致的话进行一致性的修复)和分布式删除(本地并不立即删除一个数据对象,而是给该对象标记一个hint,定期对标记了hint的对象进行垃圾回收。在垃圾回收之前,hint一直存在,这使得其他节点可以有机会由其他几个一致性保证机制得到这个hint)
1.2.8 灵活性
读写吞吐量都随着新机器的增加而线性增加,不用停机或者中断应用程序。
1.2.9 专业支持
Cassandra也有一些第三方的机制提供技术支持服务,这些机构基本上都有一些Cassandra的核心开发者在其中,以保证其对Cassandra能有足够的了解。
1.3 Cassandra 数据类型
Cassandra在CQL语言层面支持多种数据类型。
CQL类型 | 对应Java类型 | 描述 |
ascii | String | ascii字符串 |
bigint | long | 64位整数 |
blob | ByteBuffer/byte[] | 二进制数组 |
boolean | boolean | 布尔 |
counter | long | 计数器,支持原子性的增减,不支持直接赋值 |
decimal | BigDecimal | 高精度小数 |
double | double | 64位浮点数 |
float | float | 32位浮点数 |
inet | InetAddress | ipv4或ipv6协议的ip地址 |
int | int | 32位整数 |
list | List | 有序的列表 |
map | Map | 键值对 |
set | Set | 集合 |
text | String | utf-8编码的字符串 |
timestamp | Date | 日期 |
uuid | UUID | UUID类型 |
timeuuid | UUID | 时间相关的UUID |
varchar | string | text的别名 |
varint | BigInteger | 高精度整型 |
1.4 与类似开源系统的比较
HBase是Apache Hadoop项目的一个子项目,是Google BigTable的一个克隆,与Cassandra一样,它们都使用了BigTable的列族式的数据模型,但是:
l Cassandra只有一种节点,而HBase有多种不同角色,除了处理读写请求的region server之外,其架构在一套完整的HDFS分布式文件系统之上,并需要ZooKeeper来同步集群状态,部署上Cassandra更简单。
l Cassandra的数据一致性策略是可配置的,可选择是强一致性还是性能更高的最终一致性;而HBase总是强一致性的。
l Cassandra通过一致性哈希来决定一行数据存储在哪些节点,靠概率上的平均来实现负载均衡;而HBase每段数据(region)只有一个节点负责处理,由master来动态分配一个region是否大到需要拆分成两个,同时会将过热的节点上的一些region动态的分配给负载较低的节点,因此实现动态的负载均衡。
l 因为每个region同时只能有一个节点处理,一旦这个节点无响应,在系统将这个节点的所有region转移到其他节点之前这些数据便无法读写,加上master也只有一个节点,备用master的恢复也需要时间,因此HBase在一定程度上有单点问题;而Cassandra无单点问题。
l Cassandra的读写性能优于HBase。
l 但是!HBase的开发者众多并且都是顶尖高手!在FaceBook的两大阵营(Cassandra Team和HBase Team)较量中,HBase胜出。而且HBase和Hadoop是兄弟,被广泛使用。