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