HBase的行键按照字典顺序排序,这样的设计优化了扫描。
但是这样的设计可能会导致hotspotting问题,大量的客户端(读写)请求可能集中在一个或者几个region server上,造成一个或者几个机器的压力过大,在同一个region server上的其他region会收到影响,影响集群效率。
为了防止出现hotspotting,在设计行键的时候,应该使得数据尽量同时往多个region上写而不是一个。
常用方法:
1,salting
指的是将随机数放在rowkey的起始处,即给每一个rowkey随机指定了前缀来使其分布在不同的region上,例如随机对rowkey加上‘a-’,'b-'的前缀。
由于前缀的分配是随机的,因此如果想要按照字典顺序找到这些行,需要对rowkey做额外的工作。
salting能保证写操作分布在不同的region,增大了写操作的吞吐量,但是降低了读操作的效率。
2,hashing
用单向hash散列来确定rowkey。如MD5等。
在分散了regionserver负载的同时,也允许在读操作时能够正确预测。确定性hash能让客户端重建完整的rowkey,进而得到完整的行数据。
3,反转
可以反转一个固定长度的键,来让最长改变的部分(最低显著位)在第一位,这样有效打乱了行键,但是牺牲了行排列的属性。