好吧,我们将潜入当今分布式数据库的琐碎世界。您知道,那些复杂的系统将数据划分为多个节点或碎片(零件的幻想名称),以确保事物顺利运行。该游戏中的最大玩家之一是Shard Key。这是一个特定的字段或字段,决定如何在节点上分配数据。
分键在分布式数据库中的重要性
shard键是用于确定分布式数据库系统中节点跨节点分区的特定字段或一组。碎片键的选择是确保数据平衡分布并优化读写操作的性能。因此,精心选择的碎片键可以更好地利用资源,提高查询性能并提高可扩展性。
高基数:甚至分发的关键
基数是源自数学,特别是集合理论的术语,用于计算集合中的元素数量。但是,在数据库的背景下,基数具有略有不同的含义。它仍然是关于计数的,但是在这里它是指列或一组列中的唯一值的数量。
例如,考虑一个数据库,该数据库存储有关人的信息。如果有“性别”的列,并且您只录制“男性”,“女性”和“不愿说”,则“性别”列的基数为3,因为有3个唯一的值。但是,如果有“社会安全号码”列,那么基数将很高(假设您有很多记录),因为每个人都有一个独特的社会安全号码。
高基数是指具有非常罕见或唯一的值的列。具有高基数的列将具有通常不同或不寻常的值。这可能是电子邮件地址或交易ID,每个记录都有一个唯一的值。
另一方面,低基数是指具有非常常见或重复的值的列。例如,“是/否”列的基数为2。
在分布式数据库中的碎片键的上下文中,首选高基数,因为它为数据提供了更多的潜在分区,从而可以在数据库群集中的节点上进行更均匀的分布。如果您的基数碎片键低,则最终会得到较少的潜在分区,这可能会导致数据分布不均,这可能会影响您的数据库的性能。
简而言之,基数是关于列中数据的唯一性,并且在选择碎片键时,高速级别可以帮助您确保在分布式数据库系统中更平衡,更有效地分布数据。 P>
低频:避免碎片钥匙热点
最简单的术语是在数据集中发生特定值的频率。因此,当我们谈论与数据库有关的低频时,我们指的是不经常出现的列中的值。
想象您有一个数据库表,可以在网站上记录用户的活动。如果有一个名为“ active_type”的列记录用户是否登录“登录”,“登录”,“发布评论”,“喜欢帖子”等,则每个活动的频率是在该活动中出现的频率柱子。如果“登录”和“已登录”是非常常见的活动,则它们的频率很高。另一方面,如果“删除帐户”是一种罕见的活动,则其频率低。
现在,让我们将碎片键带入图片。在为分布式数据库选择碎片键时,选择具有低频值的碎片键通常是有益的。原因如下:如果碎片钥匙值非常频繁,则意味着许多记录将具有相同的碎片钥匙值,并且它们都将被定向到同一碎片或节点。这可能会在数据分发中造成不平衡,其中一个碎片正在处理大量数据(因此起作用),而其他数据则较少,并且可能被用完了。
这也可能导致“热点”,由于大量的读/写请求,一个节点成为热点。热点可以严重降低数据库的性能。因此,选择具有低频值的碎片键可以通过确保在整个碎片上更均匀的数据分布来帮助避免这种情况。
因此,总结一下,当我们在碎片键的背景下说“低频”时,我们正在谈论选择一个具有许多独特或不常见的值的字段,这有助于平衡负载跨分布式数据库系统中的节点,并防止任何一个节点不知所措。
用例注意事项
虽然高率和低频是一般原理,但理想的碎片键也将取决于特定用例,包括数据的性质,预期查询模式和读/写入工作负载。例如,如果数据库主要支持读取操作,并且数据不经常更新,则不同的碎片策略可能更有效。通常,可以使用复合碎片键(由多个字段组成)来实现更好的分布和性能。
这里有几个示例:
-
用户配置文件表中的用户ID :假设您有一个存储用户配置文件的表,其中每一行代表一个唯一的用户。在这种情况下,使用“ user_id”作为分区密钥将是理想的选择。每个“ User_id”都是单个用户所独有的(高基数),并且由于每个用户_ID只会在用户配置文件表中出现一次,因此它的频率很低。这样可以确保数据跨Cassandra节点的平衡分布。
-
电子商务交易表中的交易ID :在电子商务应用程序中,您可以有一个表记录所有交易的表。每个交易都将具有独特的“ TransAction_ID”,这将是分区密钥的理想选择。与上一个示例类似,这提供了高基数(每次交易都是唯一的)和低频(每个“ Transaction_ID”仅显示一次)。
例如,如果您经常基于“ user_id”和“ transaction_date”检索数据,则可以选择由这两个字段组成的复合分区密钥。这仍然可以提供高的基数(假设您有许多用户和交易分布在不同的日期中),并且“ user_id”和“ transaction_date”的每种组合都会有低频,从而有助于在节点上均匀分发数据。