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
问题:
谢谢!
答案 0 :(得分:2)
- 现场推广可以解决热点问题。还是,这会使按时间范围进行查询有点困难吗?
这取决于查询的外观。例如,如果要查询从T1到T2的Corrie电池状态,可以轻松构造一个行范围:[BATTERY#Corrie#T1
,BATTERY#Corrie#T2
]。但是,如果要查询所有用户的电池状态,则将扫描所有前缀为BATTERY
的行。
因此,最重要的查询应决定要提升为行键的字段。同样,具有高基数的字段在提升为行键时会有所帮助,因为它们会将负载分配给大量平板电脑。
- 另一方面,如果只想通过TIMESTAMP查询范围,是否可以避免热点?不这么认为吧?
我不确定“仅查询时间戳范围”是什么意思,您能举个例子吗?
很大程度上取决于“时间戳”的含义。如果您总是要查询最近10分钟,那么所有查询都将在任何给定时间转到单个服务器,并且您会遇到热点问题。
要记住的另一件事是,如果没有正确设计行键,写入将遇到热点,并且您将无法获得良好的写入吞吐量。建议设计行键以避免热点。