Cassandra 是 Apache 的分布式数据库,具有高度可扩展性,旨在管理非常大量的结构化数据。 它提供无单点故障的高可用性。
本教程首先对 Cassandra 进行了基本介绍,然后是其体系结构、安装以及重要的类和接口。 此后,它继续介绍如何使用 CQLSH 和 Java API 对键空间、表和索引执行创建、更改、更新和删除等操作。 本教程还有专门的章节来解释 CQL 中可用的数据类型和集合,以及如何使用用户定义的数据类型。
Apache Cassandra 是一个高度可扩展、高性能的分布式数据库,旨在处理跨许多商品服务器的大量数据,提供高可用性,没有单点故障。 它是一种 NoSQL 数据库。 让我们首先了解 NoSQL 数据库的作用。
NoSQL数据库
NoSQL 数据库(有时称为 Not Only SQL)是一种数据库,它提供一种机制来存储和检索数据,而不是关系数据库中使用的表格关系。 这些数据库是无模式的,支持简单的复制,具有简单的 API,最终一致,并且可以处理大量数据。
NoSQL 数据库的主要目标是
设计简洁,
水平缩放,和
更好地控制可用性。
与关系数据库相比,NoSql 数据库使用不同的数据结构。 它使 NoSQL 中的某些操作更快。 给定 NoSQL 数据库的适用性取决于它必须解决的问题。
NoSQL 与关系数据库
下表列出了关系数据库与 NoSQL 数据库的区别点。
关系数据库 | NoSql |
---|---|
支持强大的查询语言。 | 支持非常简单的查询语言。 |
它有一个固定的表 | 没有固定的表 |
遵循 ACID(原子性、一致性、隔离性和持久性)。 | 它只是“最终一致”。 |
支持事物 | 不支持事物 |
除了 Cassandra,我们还有以下非常流行的 NoSQL 数据库 -
Apache HBase - HBase 是一个开源、非关系、分布式数据库,仿照 Google 的 BigTable 并用 Java 编写。 它是作为 Apache Hadoop 项目的一部分开发的,运行在 HDFS 之上,为 Hadoop 提供类似 BigTable 的功能。
MongoDB - MongoDB 是一个跨平台的面向文档的数据库系统,它避免使用传统的基于表的关系数据库结构,转而使用具有动态模式的类 JSON 文档,从而使某些类型的应用程序中的数据集成更加容易和快速。
什么是 Apache Cassandra?
Apache Cassandra 是一个开源、分布式和去中心化/分布式存储系统(数据库),用于管理分布在世界各地的海量结构化数据。 它提供无单点故障的高可用性服务。
下面列出了 Apache Cassandra 的一些值得注意的点 -
它具有可扩展性、容错性和一致性。
它是一个面向列的数据库。
它的分布设计基于亚马逊的 Dynamo 及其在谷歌 Bigtable 上的数据模型。
它创建于 Facebook,与关系数据库管理系统截然不同。
Cassandra 实现了无单点故障的 Dynamo 式复制模型,但增加了更强大的“列族”数据模型。
Cassandra 被一些最大的公司使用,例如 Facebook、Twitter、Cisco、Rackspace、ebay、Twitter、Netflix 等。
Cassandra的特点
Cassandra 因其出色的技术特性而变得如此受欢迎。 下面给出了 Cassandra 的一些特性:
弹性可扩展性 - Cassandra 具有高度可扩展性; 它允许根据需要添加更多硬件以容纳更多客户和更多数据。
Always on architecture - Cassandra 没有单点故障,它可以持续用于不能承受故障的关键业务应用程序。
Fast linear-scale performance - Cassandra 是线性可扩展的,即,当您增加集群中的节点数量时,它会增加您的吞吐量。 因此,它保持快速响应时间。
灵活的数据存储- Cassandra 适应所有可能的数据格式,包括:结构化、半结构化和非结构化。 它可以根据您的需要动态地适应对数据结构的更改。
Easy data distribution − Cassandra 通过跨多个数据中心复制数据,提供了在您需要的地方分发数据的灵活性。
交易支持——Cassandra 支持原子性、一致性、隔离性和持久性 (ACID) 等属性。
快速写入 - Cassandra 旨在运行在廉价的商品硬件上。 它的写入速度极快,可以存储数百 TB 的数据,而不会牺牲读取效率。
Cassandra的历史
Cassandra 是在 Facebook 开发的,用于收件箱搜索。
它于 2008 年 7 月由 Facebook 开源。
Cassandra 于 2009 年 3 月被 Apache 孵化器接纳。
2010年2月起成为Apache顶级项目。
Cassandra 的设计目标是在没有任何单点故障的情况下处理跨多个节点的大数据工作负载。 Cassandra 具有跨节点的点对点分布式系统,数据分布在集群中的所有节点中。
集群中的所有节点都扮演着相同的角色。 每个节点都是独立的,同时又与其他节点互连。
集群中的每个节点都可以接受读取和写入请求,而不管数据实际位于集群中的哪个位置。
当一个节点出现故障时,可以从网络中的其他节点提供读/写请求。
Cassandra 中的数据复制
在 Cassandra 中,集群中的一个或多个节点充当给定数据的副本。 如果检测到某些节点响应了过时的值,Cassandra 会将最新的值返回给客户端。 返回最新值后,Cassandra 在后台执行读取修复以更新陈旧值。
下图是Cassandra如何使用集群中节点间的数据复制来保证无单点故障的示意图。
注意 - Cassandra 在后台使用 Gossip 协议允许节点相互通信并检测集群中的任何故障节点。
Cassandra的组件
Cassandra 的主要组成部分如下 -
节点 - 这是存储数据的地方。
数据中心 - 它是相关节点的集合。
Cluster - 集群是包含一个或多个数据中心的组件。
Commit log - 提交日志是 Cassandra 中的一种崩溃恢复机制。 每个写操作都写入提交日志。
Mem-table - 内存表是内存驻留数据结构。 提交日志后,数据将写入内存表。 有时,对于一个单列家族,会有多个内存表。
SSTable - 这是一个磁盘文件,当其内容达到阈值时,数据将从内存表中刷新到该文件中。
Bloom filter - 这些只是用于测试元素是否是集合成员的快速、不确定的算法。 它是一种特殊的缓存。 布隆过滤器在每次查询后访问。
Cassandra 查询语言
用户可以使用 Cassandra 查询语言 (CQL) 通过其节点访问 Cassandra。 CQL 将数据库 (Keyspace) 视为表的容器。 程序员使用 cqlsh:提示使用 CQL 或单独的应用程序语言驱动程序。
客户端接近任何节点以进行读写操作。 该节点(协调器)在客户端和保存数据的节点之间充当代理。
写操作
节点的每个写入活动都由写入节点的提交日志捕获。 稍后数据将被捕获并存储在内存表中。 每当 mem-table 已满时,数据将写入 SStable 数据文件。 所有写入都会在整个集群中自动分区和复制。 Cassandra 会定期合并 SSTable,丢弃不必要的数据。
读取操作
在读取操作期间,Cassandra 从内存表中获取值并检查布隆过滤器以找到包含所需数据的适当 SSTable。
数据模型
Cassandra 的数据模型与我们通常在 RDBMS 中看到的有很大不同。 本章概述了 Cassandra 如何存储其数据。
Cluster
Cassandra 数据库分布在多台一起运行的机器上。 最外面的容器称为集群。 对于故障处理,每个节点都包含一个副本,如果发生故障,副本将负责。 Cassandra 将节点以环形形式排列在集群中,并为它们分配数据。
键空间
Keyspace 是 Cassandra 中最外层的数据容器。 Cassandra 中 Keyspace 的基本属性是 -
复制因子 - 它是集群中将接收相同数据副本的机器数量。
Replica placement strategy - 只不过是将副本放置在环中的策略。 我们有简单策略(机架感知策略)、旧网络拓扑策略(机架感知策略)和网络拓扑策略(数据中心共享策略)等策略。
列族 - 键空间是一个或多个列族列表的容器。 反过来,列族是行集合的容器。 每行包含有序列。 列族代表数据的结构。 每个键空间至少有一个而且通常有很多列族。
创建键空间的语法如下 -
CREATE KEYSPACE Keyspace name WITH replication = {'class': 'SimpleStrategy', 'replication_factor' : 3};
下图显示了键空间的示意图。
Column Family 列族
列族是有序行集合的容器。 每一行又是一个有序的列集合。 下表列出了列族与关系数据库表的区别点。
关系表 | Cassandra column Family |
---|---|
关系模型中的模式是固定的。 一旦我们为表定义了某些列,在插入数据时,在每一行中,所有列都必须至少填充一个空值。 | 在 Cassandra 中,虽然定义了列族,但没有定义列。 您可以随时自由地将任何列添加到任何列族。 |
关系表只定义列,用户用值填充表。 | 在 Cassandra 中,一个表包含列,或者可以定义为一个超列族。 |
Cassandra 列族具有以下属性 -
keys_cached - 它表示每个 SSTable 保持缓存的位置数。
rows_cached - 它表示其全部内容将缓存在内存中的行数。
preload_row_cache - 它指定是否要预填充行缓存。
注意 - 与列族模式不固定的关系表不同,Cassandra 不强制单个行具有所有列。
下图显示了 Cassandra 列族的示例。
列
列是 Cassandra 的基本数据结构,具有三个值,即键或列名称、值和时间戳。 下面给出的是列的结构。
超列
超级列是一个特殊的列,因此,它也是一个键值对。 但是超级列存储子列的映射。
通常,列族以单独的文件形式存储在磁盘上。 因此,为了优化性能,将您可能要查询的列放在同一个列族中很重要,而超级列在这里可能会有所帮助。下面给出了超级列的结构。
Cassandra 和 RDBMS 的数据模型
下表列出了 Cassandra 数据模型与 RDBMS 数据模型的区别点。
RDBMS | Cassandra |
---|---|
RDBMS 处理结构化数据。 | Cassandra 处理非结构化数据。 |
它有一个固定的模式。 | Cassandra 有一个灵活的模式。 |
在 RDBMS 中,表是数组的数组。 (行 x 列) | 在 Cassandra 中,表是“嵌套键值对”的列表。 (行 x 列键 x 列值) |
数据库是最外层的容器,包含与应用程序对应的数据。 | 键空间是最外层的容器,包含与应用程序对应的数据。 |
表是数据库的实体。 | 表或列族是键空间的实体。 |
行是 RDBMS 中的单个记录。 | 行是 Cassandra 中的一个复制单元。 |
列表示关系的属性。 | Column 是 Cassandra 中的一个存储单元。 |
RDBMS 支持外键、连接的概念。 | 关系使用集合表示。 |