大表:在行键上使用时间戳时避免热点

时间:2019-02-27 17:41:34

标签: bigtable google-cloud-bigtable

Cloud Bigtable docs on schema design for time series说:

  

在大多数情况下,时间序列查询正在访问给定时间段内的给定数据集。因此,请确保给定时间段内的所有数据都存储在连续的行中,除非这样做会引起热点。

另外,here's what they recommend to avoid hotspotting

  

如果您要存储手机的电池状态,并且行键由单词“ BATTERY”和时间戳组成,则行键将始终按顺序增加。由于Cloud Bigtable将相邻的行键存储在同一服务器节点上,因此所有写入将仅集中在一个节点上,直到该节点已满为止,此时写入将移至群集中的下一个节点。

建议现场推广

  

将字段数据从列数据移到行键中,以使写操作不连续。

例如:

BATTERY#20150301124501001 --> BATTERY#Corrie#20150301124501001

问题:

  1. 现场推广可以解决热点问题。还是,这会使按时间范围进行查询有点困难吗?
  2. 另一方面,如果只想通过TIMESTAMP查询范围,是否可以避免热点?不这么认为吧?

谢谢!

1 个答案:

答案 0 :(得分:2)

  
      
  1. 现场推广可以解决热点问题。还是,这会使按时间范围进行查询有点困难吗?
  2.   

这取决于查询的外观。例如,如果要查询从T1到T2的Corrie电池状态,可以轻松构造一个行范围:[BATTERY#Corrie#T1BATTERY#Corrie#T2]。但是,如果要查询所有用户的电池状态,则将扫描所有前缀为BATTERY的行。

因此,最重要的查询应决定要提升为行键的字段。同样,具有高基数的字段在提升为行键时会有所帮助,因为它们会将负载分配给大量平板电脑。

  
      
  1. 另一方面,如果只想通过TIMESTAMP查询范围,是否可以避免热点?不这么认为吧?
  2.   

我不确定“仅查询时间戳范围”是什么意思,您能举个例子吗?

很大程度上取决于“时间戳”的含义。如果您总是要查询最近10分钟,那么所有查询都将在任何给定时间转到单个服务器,并且您会遇到热点问题。

要记住的另一件事是,如果没有正确设计行键,写入将遇到热点,并且您将无法获得良好的写入吞吐量。建议设计行键以避免热点。