将多个时间序列放在一个 BigTable table 中是否可以避免热点?

Does putting multiple time-series in one BigTable table avoid hotspotting?

假设我有 3 个不相关的时间序列。每个写入的行键都以当前时间戳开头:timestamp#.....

将每个时间序列放在一个单独的 table 中会导致热点,因为新行总是在一个末端添加(最新时间戳)。

如果我们将所有 3 个时间序列加入一个 BigTable table 中,前缀为:

这样可以避免热点吗?每个集群节点会处理一个时间序列吗?

我假设每个集群有 3 个节点,并且 3 个时间序列中的每一个都将接收相似的负载并且大小均匀增长。

如果是,那么在一个 BigTable 中包含多个不相关的时间序列是否有任何缺点 table?

因为您将时间戳记作为行键的第一部分,所以我认为无论哪种方式您都会获得热点。

在 Bigtable 实例中,您的数据被分成多组连续的行键(称为 tablets),并且这些行键均匀分布在节点上。为了最大限度地提高 Bigtable 的效率,您需要将数据分布在节点之间和节点内作为 tablets。当您写入同一行或一组连续的行时,您会遇到热点问题,因为这一切都发生在一个 tablet 内。如果您不断地使用时间戳作为密钥的突出部分进行写入,您将继续写入相同的 tablet 直到它填满并且您必须转到下一个而不是写入多个 tablets 在一个节点内。

Bigtable 文档有一个 guide for time-series schema design,它为像您这样的用例推荐了一些解决方案:

  • 字段提升:在你的timestamp前的rowkey中增加一个字段,用来分隔出一组数据(USER_ID#timestamp#. ..)

  • Salting:取时间戳的散列值除以节点数,然后将其添加到行键(SALT_RESULT#时间戳#...)

  • 反转时间戳: 或者如果其中任何一个不起作用,反转时间戳。如果您最常见的查询是最新值,这种方法效果最好,但会使其他查询更加困难

编辑: 您的方法绝对类似于加盐,但由于您的数据已经在单独的 tables 中,您实际上并没有获得任何增加的好处,因为热点将在 tablet 级别引起。

为了进一步说明,假设您在单独的 table 中拥有此数据并开始写入数据。每个 table 将由 tablets 组成,其中捕获时间戳 0-10、11-20 等... 那些 tablets 将自动分发在节点中获得最佳性能。如果负载都相似,tablets 0-10 应该都在不同的节点上,11-20 都应该在不同的节点上等等。

根据您的架构设置方式,您不断写入最新的 tablet(假设现在时间是 91,)您只写入 91-100 而忽略所有该节点中的其他 tablets。由于 91-100 tablet 是唯一一个开始工作而不是其他 tablets,您的节点不会为您提供优化的性能,这就是我们所说的热点。某个 tablet 出现峰值,但负载均衡器没有足够的时间来纠正它。

如果你在同一个table中有它,我们现在可以只关注一个节点。 series1#0-10 将首先受到冲击,然后是 series1#11-20,然后是 series1#21-30。总有一个 tablet 负载过大而没有使用完整节点。

文档中有一些关于 load balancing 的更多信息。