简介
Apache Cassandra是一个高度可扩展的高性能分布式数据库,旨在处理许多商用服务器上的大量数据,提供高可用性而没有单点故障。它是NoSQL数据库的一种。首先让我们了解一下NoSQL数据库的作用。
NoSQL 数据库
NoSQL数据库(有时称为“Not Only SQL”)是一种数据库,它提供了一种存储和检索关系数据库中使用的表格关系以外的数据的机制。这些数据库是无模式的,支持简单的复制,具有简单的API,最终是一致的,并且可以处理大量数据。
NoSQL数据库的主要目标是:
- 设计简单
- 水平缩放
- 更好地控制可用性
与关系数据库相比,NoSql数据库使用不同的数据结构。它使NoSQL中的某些操作更快。给定NoSQL数据库的适用性取决于它必须解决的问题。
NoSQL vs 关系型数据库
下表列出了将关系数据库与NoSQL数据库区分开的要点。
关系数据库
NoSql 数据库
支持强大的查询语言
支持非常简单的查询语言
schema固定
schema不固定
遵循ACID
最终一致性
支持事务
不支持事务
除了Cassandra,我们还有以下非常流行的NoSQL数据库-
- Apache HBase-HBase是一种以Google的BigTable建模的开源,非关系,分布式数据库,并使用Java编写。它是Apache Hadoop项目的一部分,在HDFS之上运行,为Hadoop提供类似BigTable的功能。
- MongoDB-MongoDB是一个跨平台的面向文档的数据库系统,它避免使用传统的基于表的关系数据库结构,而是使用具有动态模式的类似JSON的文档,从而使数据在某些类型的应用程序中的集成更加容易和快捷。
什么是Apache Cassandra?
Apache Cassandra是一个开源,分布式和分散/分布式存储系统(数据库),用于管理分布在世界各地的大量结构化数据。它提供高可用性服务,没有单点故障。
以下列出了Apache Cassandra的一些值得注意的地方-
- 它具有可伸缩性,容错性和一致性。
- 它是一个面向列的数据库。
- 其分发设计基于亚马逊的Dynamo及其在Google的Bigtable上的数据模型。
- 它创建于Facebook,与关系数据库管理系统截然不同。
- Cassandra实现了Dynamo风格的复制模型,没有单点故障,但是添加了更强大的“column family”数据模型。
- 一些大型公司(例如Facebook,Twitter,Cisco,Rackspace,ebay,Twitter,Netflix等)正在使用Cassandra。
Cassandra特点
Cassandra由于其出色的技术特性而变得如此受欢迎。以下是Cassandra的一些功能:
- 弹性可扩展性– Cassandra具有高度可扩展性;它允许添加更多硬件,以根据需求容纳更多客户和更多数据。
- 始终在线-Cassandra没有单点故障,并且可以连续用于无法承受故障的关键业务应用程序。
- 快速的线性规模性能-Cassandra具有线性可扩展性,即,随着集群中节点数量的增加,它可以提高吞吐量。因此,它保持了快速的响应时间。
- 灵活的数据存储-Cassandra可容纳所有可能的数据格式,包括:结构化,半结构化和非结构化。它可以根据需要动态适应对数据结构的更改。
- 轻松进行数据分发-Cassandra通过在多个数据中心之间复制数据,提供了在所需位置分发数据的灵活性。
- 事务支持-Cassandra支持原子性,一致性,隔离性和持久性(ACID)等属性。
- 快速写入-Cassandra旨在在廉价的商品硬件上运行。它执行快速的写入,并且可以存储数百TB的数据,而不会牺牲读取效率。
架构
Cassandra的设计目标是在多个节点上处理大数据工作负载而不会出现任何单点故障。 Cassandra在其节点之间具有对等分布式系统,并且数据分布在集群中的所有节点之间。
- 集群中的所有节点都扮演相同的角色。每个节点都是独立的,并同时互连到其他节点。
- 集群中的每个节点都可以接受读写请求,而不管数据实际位于集群中的何处。
- 当某个节点发生故障时,可以从网络中的其他节点处理读/写请求。
Cassandra中的数据复制
在Cassandra中,集群中的一个或多个节点充当给定数据段的副本。如果检测到某些节点响应的值过时,则Cassandra会将最新值返回给客户端。返回最新值后,Cassandra在后台执行读取修复以更新过时的值。
下图显示了Cassandra如何在集群中的节点之间使用数据复制以确保没有单点故障的示意图。
Cassandra使用Gossip协议,以允许节点彼此通信并检测集群中的任何故障节点。
Cassandra 组件
组成部分如下-
- Node − 它是存储数据的地方。
- Data center − 它是相关节点的集合。
- Cluster − 是包含一个或多个数据中心的组件。
- Commit log − 是Cassandra中的崩溃恢复机制。每个写操作都会写入commit log。
- Mem-table − 内存表是驻留内存的数据结构。commit log后,数据将被写入内存表。有时,对于single-column family,将有多个内存表。
- SSTable − 它是一个磁盘文件,当其内容达到阈值时,会将数据从内存表中刷新到该磁盘文件中。
- Bloom filter − 这些仅是用于测试元素是否为集合成员的快速,不确定性算法。这是一种特殊的缓存。每次查询后都会访问Bloom筛选器。
Cassandra 查询语言
用户可以使用Cassandra查询语言(CQL)通过其节点访问Cassandra。 CQL将数据库Keyspace视为表。程序员使用cqlsh进行查询。
客户端接近任何节点以进行读写操作。该节点(协调器)在客户端和保存数据的节点之间扮演代理角色。
写操作
:节点的每个写入活动均由写入节点中的commit logs捕获。之后,将捕获数据并将其存储在mem-table中。每当mem-table已满时,数据将被写入SStable数据文件中。所有写入将自动分区并在整个集群中复制。 Cassandra定期合并SSTable,丢弃不必要的数据。
读操作
: 在读取操作期间,Cassandra从mem-table中获取值,并检查Bloom筛选器以找到保存所需数据的适当SSTable。
数据模型
Cassandra的数据模型与我们通常在RDBMS中看到的模型大不相同。本章概述了Cassandra如何存储其数据。
Cluster
Cassandra数据库分布在多台计算机上。最外层的容器称为cluster。为了进行故障处理,每个节点都包含一个副本,如果发生故障,则由副本负责。 Cassandra以环形格式将节点排列在cluster中,并为其分配数据。
Keyspace
Keyspace是Cassandra中数据的最外层容器。 Cassandra中Keyspace的基本属性是 -
- Replication factor − 集群中将接收相同数据副本的计算机数。
- Replica placement strategy − 将副本放置在环中的策略。我们有诸如简单策略(机架感知策略),旧网络拓扑策略(机架感知策略)和网络拓扑策略(数据中心共享策略)之类的策略。
- Column families − Keyspace是一个或多个Column family的容器。Column family又是行集合的容器。每行包含有序的列。Column family代表数据的结构。每个Keyspace至少有一个Column family,通常有许多Column family。
创建Keyspace的语法如下 -
CREATE KEYSPACE Keyspace name
WITH replication = {'class': 'SimpleStrategy', 'replication_factor' : 3};
下图显示了Keyspace的示意图。
Column Family
Column Family是用于有序收集行的容器。每行又是列的有序集合。Cassandra Column Family具有以下属性 -
- keys_cached − 它代表每个SSTable保持缓存的位置数。
- rows_cached − 它代表其全部内容将被缓存在内存中的行数。
- preload_row_cache − 它指定是否要预填充行缓存。
与关系表中Column Family的模式不固定的情况不同,Cassandra不会强制单个行包含所有列。
下图显示了Cassandra Column Family的示例。
Column
列是Cassandra的基本数据结构,具有三个值,即键或列名,值和时间戳。下面给出的是列的结构。
SuperColumn
超级列是特殊列,因此,它也是一个键值对。但是超级列存储子列的映射。
通常,Column Family存储在磁盘上的单个文件中。因此,为了优化性能,将可能要查询的列保持在同一Column Family中很重要,在此超级列可能会有所帮助。以下是超级列的结构。
PS: 本文主要翻译自官方文档
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。