我根据以下限制使用 Google BigTable 存储事件日志数据:
- 每个键都应包含用户名和时间戳,允许连续读取每个用户的时间序列数据,例如:USERNAME_TIMESTAMP。
- 我每天将存储多达 10,000,000 个事件日志或更多,因此自然需要避免热点并确保我在每个节点上均匀分布记录。
- 此数据库有一个庞大的安全组件,因此,我想在将用户名用作 BigTable 中的 key 之前对其进行加密。
显然,我想避免在读取或写入时执行额外的步骤,因此我考虑在将用户名作为 key 添加到 BigTable 之前使用 SHA1 对其进行加密。因此,BigTable 中的所有键现在都将采用如下格式:
cf23df2207d99a74fbe169e3eba035e633b65d94_2018_01_30_15090001
我们知道 SHA1 是正态分布的,所以假设我的所有记录将均匀分布在节点之间,同时确保所有用户名都位于一起是否安全?这实际上会阻止热点吗?这种方法中是否有我错过的任何边缘情况?
最佳答案
假设 User Id 分布良好(即没有一个用户每秒的操作超过 10K),这种方法应该没问题。
仅供引用,Cloud Bigtable 以每秒行数衡量操作,您希望在确定节点数时考虑峰值吞吐量。每个节点每秒可支持 10,000 次简单读取或写入。我们最小的生产配置是 3 个节点,每秒最多可支持 30,000 行(如果最大连续使用,则每天可支持 26 亿行)。
关于database - 使用 SHA1 key 避免 BigTable 或 HBase 中的热点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48529938/