自 2007 年开发以来, Apache Cassandra已经建立了坚如磐石、高度可扩展、可靠的 NoSQL 数据存储的声誉,被世界上一些最大的企业所使用。但使用 Cassandra 也需要一定水平的经验和专业知识。所以在学习这个开源数据库的过程中出现很多问题是可以理解的。
本文涵盖了开发人员在各种社区论坛中提出的一些热门问题。
了解宽列数据库中的主键与关系型主键有何不同是学习运用 Cassandra 强大功能的关键一步。
像 Cassandra 这样的宽列存储使用列族的概念,这是一个数据库对象,包含多列相关数据,这些列一起使用,类似于传统的关系数据库表。在给定的列族中,所有数据都以逐行的方式存储,这样给定行的列存储在一起,而不是每个列单独存储。
换句话说,列族是键值对,其中键映射到作为一组列的值。与关系数据库进行类比,列族就像一个“表”,每个键值对都是一个“行”。对于开发人员而言,宽列表可以通过代码或 API 将自己呈现为熟悉且易于使用的行列表。
让我们看一些示例代码,以帮助将概念变为现实。
在上面的代码中,我们有一个键空间,一些字段,如“城市”、“姓氏”和“名字”。主键在底部。顺便说一下,Cassandra 中的所有表都必须至少包含一个分区键。在上图突出显示的示例中,我们将按“城市”进行分区。
后面的任何其他内容都是簇列。请注意“city”周围的括号——这表明这是分区键。如果您的分区键是复合的并且有多个列,我们使用括号来指示分区键是什么。那么哪些列是主键列,哪些列是聚簇列就一目了然了。
主键的主要目的是确保一行是唯一的。它还可能包含零个或多个聚类列,这些列可以控制排序。但主键也可以是“复合”或“复合”,这意味着它有两列或更多列。
分区键用于对我们的行进行分区,并且具有一列或多列。
有些人似乎认为驱动程序客户端只是将数据发送到随机节点。但是您的驱动程序确实有一种非随机的方式来选择要与之交谈的节点。该节点称为协调器节点。通常选择它是因为它最接近。
客户端请求可以发送到任何节点——首先它们被发送到你的驱动程序知道的节点。但是一旦驱动程序软件连接并了解集群的拓扑结构,它可能会变成更紧密的协调器。查看开源生态系统项目Stargate ,了解如何分离计算和存储以实现可扩展性。
开源 Cassandra 集群中的节点使用八卦协议相互交换拓扑信息。 gossiper 每秒运行一次,并确保所有节点都与您配置的任何 snitch 的数据保持同步。告密者跟踪每个节点属于哪个数据中心和机架。这样,协调器节点也有关于哪些节点负责每个令牌范围的数据。
您可以通过从命令行运行节点工具“ring”来查看此信息,但如果您使用的是虚拟节点或“vnodes”,那么确定所有 256 个虚拟节点(默认设置)上的数据会有点棘手金额)将很快在屏幕上闪烁。
在K8ssandra.io上,这种行为更像是 Kubernetes 原生的,并且使用 Etcd 代替 Gossip 协议来传播集群元数据以及安全模式更新。
索引非常微妙。它有助于了解数据库内部结构。这个查询在 Cassandra 内部如何工作?看看这个示例代码:
这个查询在 Cassandra 内部如何工作?
基本上会返回作用域ID等于35、表单ID等于78005的分区的所有数据,然后通过记录链接ID索引进行过滤。它将查找 9897 的记录索引 ID 条目,并尝试匹配与范围 ID 等于 35 且表单 ID 等于 78005 的返回行相匹配的条目。将返回分区键和索引键的行的交集.
您可能会问,像记录链接 ID 索引这样的高基数列是否会影响查询性能。高基数索引实质上为主表中的几乎每个条目创建一行。性能可能会受到影响,因为 Cassandra 专为查询结果的顺序读取而设计。随着索引基数的增加,索引查询本质上会强制 Cassandra 执行随机读取,因此查找查询值所需的时间也会增加。
那么,Cassandra 会触及上述查询的所有节点吗?不,它应该只接触负责范围 ID 等于 35 且表单 ID 等于 78005 分区的节点。同样,索引存储在本地并且仅包含对本地节点有效的条目。
Cassandra 是一个开源 NoSQL 数据库,它为您可能每天都在使用的大规模分布式应用程序提供支持。但是,这取决于您和您的团队进行自我管理。
另一方面, Astra DB是一种无服务器数据库即服务。它是一种基于 Cassandra 构建的完全托管的自动缩放云服务,可在您选择的公共云提供商上运行。
随着开源数据 API 网关Stargate的加入,Cassandra 和 Astra DB 都为文档、列式和键值 NoSQL 工作负载提供服务。使用 Astra DB,Stargate 会自动为您设置。
想了解更多关于 Cassandra 的信息吗?加入我们 3 月 14 日的免费数字活动Cassandra Forward !
也发布在这里。