概述
Apache Cassandra 是一个开源的分布式 NoSQL 数据库。它实现了分区宽列存储模型,具有最终一致性语义。
Cassandra 最初是在 Facebook 设计的,使用分阶段事件驱动架构 (SEDA)。此初始设计实现了 Amazon 的 Dynamo 分布式存储和复制技术以及 Google 的 Bigtable 数据和存储引擎模型的组合。Dynamo 和 Bigtable 都是为了满足对可扩展、可靠和高可用存储系统的不断增长的需求而开发的,但每个系统都有一些可以改进的地方。
Apache Cassandra 被设计为这两个系统的最佳组合,以满足不断增长的海量存储需求,无论是数据量还是查询量。随着应用程序开始需要完整的全球复制以及始终可用的低延迟读写,一种新的数据库模型成为满足这些新需求的必要条件。当时的关联数据库系统难以满足这些需求。
Apache Cassandra 的设计目标是解决这些挑战,并牢记以下设计目标:
-
完整的全主数据库复制
-
低延迟下的全球可用性
-
在商品硬件上扩展
-
每个额外处理器线性增加吞吐量
-
在线负载均衡和集群增长
-
分区键定向查询
-
灵活的模式
功能
Cassandra 提供了 Cassandra 查询语言 (CQL),这是一种类似 SQL 的语言,用于创建、修改和删除数据库模式,以及访问数据。CQL 允许用户使用以下方法在 Cassandra 节点集群中组织数据:
-
键空间:定义数据集如何按数据中心复制。复制是指每个集群保存的副本数量。键空间包含表。
-
表:表由行和列组成。列定义了表中单个数据的类型化模式。表根据分区键中提供的列进行分区。Cassandra 表可以灵活地向表添加新列,而不会造成停机。
-
分区:定义 Cassandra 中所有行必须具有的主键的强制部分,以标识存储该行的集群中的节点。所有高性能查询都在查询中提供分区键。
-
行:包含由分区键和可选的附加聚簇键组成的唯一主键标识的一组列。
-
列:属于行的单个数据,具有类型。
CQL 支持对分区数据集的许多高级功能,例如:
-
集合类型,包括集合、映射和列表
-
用户定义类型、元组、函数和聚合
-
用于辅助索引的存储附加索引 (SAI)
-
本地辅助索引 (2i)
-
用户定义类型、函数和聚合
-
具有原子比较和设置语义的单分区轻量级事务
-
(实验性) 物化视图
Cassandra 明确选择不实现需要跨分区协调的操作,因为这些操作通常很慢,而且很难提供高度可用的全局语义。例如,Cassandra 不支持:
-
跨分区事务
-
分布式联接
-
外键或参照完整性。
操作
Apache Cassandra 配置设置在 cassandra.yaml
文件中配置,该文件可以通过手动编辑或借助配置管理工具进行编辑。某些设置可以通过在线界面进行实时操作,但其他设置需要重新启动数据库才能生效。
Cassandra 提供了用于管理集群的工具。nodetool
命令与 Cassandra 的实时控制界面交互,允许从 cassandra.yaml
中实时操作许多设置。auditlogviewer
用于查看审计日志。fqltool
用于查看、重放和比较完整查询日志。
此外,Cassandra 还支持开箱即用的原子快照功能,该功能提供 Cassandra 数据的特定时间点 (PIT) 快照,以便轻松与许多备份工具集成。Cassandra 还支持增量备份,其中数据可以在写入时进行备份。