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