在 scylla db 中使用 IP 地址作为主键是一种好的做法吗?

Is using IP address as primary key a good practice in scylla db?

我正在使用 scylla db 并且有一个 table 使用 IP 地址作为主键。集群的 RF 为 3。 我发现一些节点比其他节点有更多的负载(占用更多磁盘 space),即使 owns 统计数据接近(31% ~ 35%)

我想知道是不是因为我使用 IP 地址作为主键,而某些 IP 地址比其他 IP 地址更热(例如这些 IP 的更多更新)?

你可能是对的,最好添加另一个字段以更好地传播数据

Is using IP address as primary key a good practice in scylla db?

单独回答您的问题,假设 IP 地址均匀分布并且您的访问模式均匀分布,这对于任何具有数据分片的数据库都是完全没问题的。在很多情况下,当你的分布不是很均匀时,它也会很好。例如您的访问模式与某些 IP 的接触比其他更多。

根据数据库分片策略,如果您摄取单调递增的值(例如顺序 IP)(MongoDB、Spanner、DataStore 等),它会有所不同。但在 ScyllaDB 的情况下,Scylla 默认使用 MurMurHash3 对每个分区键进行哈希处理,因此您可以假设您的数据摄取均匀分布在令牌环上。

无论如何,如果您需要通过 Key == IP read/write,您没有多少选择。不过,这可能取决于您的任务的具体情况。

find some nodes have way more loads (take more disk space) than others even if the owns stats are close (31% ~ 35%)

负载通常以吞吐量衡量,即磁盘 IOPS 或应用程序 Requests/Sec,或以百分比表示的利用率。如果考虑磁盘 space 利用率,那就完全不同了。

如果您指的是相对吞吐量节点利用率,那么它可以是例如:

  • 您的数据分布
  • 你的负载(访问)在键中的分布space,自读写关系
  • 节点令牌的分布,可以单独给出 % 方差

如果你指的是磁盘space,除了我提到的还有很多其他因素:

  • 提示
  • 未修复实例,修复时间表
  • 逻辑删除、gc、压缩

I am wondering is that because I'm using the IP address as the primary key

没有

and some IP address are hotter than others (like more update on those IPs)?

这取决于上述因素以及您所说的负载。如果您指的是磁盘 space,您的读访问不会影响它。写可以。

出于这些原因,将 IP 地址作为主键是一种不好的做法。

  1. IP 地址可能会改变。如果发生这种情况,我不确定您如何使用旧 IP 地址进行查询。
  2. 如果您保留了 IP 地址(静态且不变),那么,如果您从几个 IP 收到更多请求,那么您就没有创建均匀分布的节点。
  3. 添加另一个字段可能会让事情变得更好,但除非我知道访问模式,否则我不推荐这样做。

有些 IP 地址比其他 IP 地址更热 - 读取或写入的次数更多 - 通常这不是什么大问题,而且很常见。 Scylla 会在不同节点(以及每个节点上的内核)之间随机分配它们,只要您的热分区比集群中的内核多得多,负载和磁盘使用率就应该相当平衡。

在极端情况下情况可能会有所不同,例如每次更新 增长 一个分区(即向其添加一行)时,只有少数分区非常热。例如,您可以想象一个用于记录请求的数据库,除了每天有 10 个请求的 100 万普通客户端外,还有 10 "attackers" 个每天发出 100 万个请求的客户端。在这种极端情况下,您会发现自己的某些节点承载的负载 and/or 磁盘 space 比其他节点多得多。这种极端情况也会导致其他问题:虽然最近Scylla对大分区的支持有所改善,但仍不完善,如果能避免这种极端情况就更好了。

最后,如果我回到你原来的问题,"Is using IP address as primary key a good practice in scylla db?",答案是 "yes, but":

它是 "yes" 因为 Scylla 没有将 IP 地址作为密钥的具体问题 - 它随机将不同的 IP 地址分配给不同的节点(使用 "murmur3" 哈希函数)所以没有特别的IP 地址聚集在一起的问题(例如,来自同一子网的多个客户端不只是被发送到相同的集群节点)。

这是 "but",因为问题不在于 IP 地址本身,而是您打算为其存储的分区的内容,以及更新频率和大小的偏差程度- 对于不同的分区。

哦,还有最后一点:

如果您正在使用 Size Tierd Compaction Strategy (STCS),最大磁盘-space 在任何特定时刻的使用量可能会比实际数量高很多正在存储的数据。如果你的工作负载覆盖率很高(数据没有被添加,而是被替换、删除等),在压缩完成它的工作之前,磁盘上的数据很可能是实际数据量的两倍。如果是这种情况,如果您在某个随机时间检查系统,您 注意到一些节点在磁盘上的数据比其他节点多,这取决于它们在压缩工作中的随机位置你做这个测量。您可以做一些事情来验证这是否是您所看到的是在所有节点上调用 "major compaction",然后测量磁盘使用情况 - 期望看到跨节点的磁盘 space 使用更加统一。