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