数据的分片方式

Pegasus的数据采用hash的分片方式。在Pegasus中建表时,必须指定每张表要分割成多少个分片。在MetaServer节点收到建表请求后,会根据当前的节点数,把各分片按照数量均匀地分配到不同的机器进行服务。客户端在进行读写请求时,先要从MetaServer查询表中每个分片的位置,然后自己会把自己的key映射到一个具体的分片上,并和对应的ReplicaServer做通信。

HashKey到分片的映射方法为:

PartitionId = Crc32(HashKey) % PartitionCount

在同一个hash分片下,Pegasus还提供了SortKey。顾名思义,所有value是按照SortKey来进行排序的。所以从客户读写请求的角度来看,Pegasus的数据模型如下:

(HashKey, SortKey) -> Value

因为同一个HashKey的数据落在同一个数据分片上,所以在使用的时候需要控制下HashKey的规模(一个HashKey下不宜有太多的SortKey)。过大的HashKey,对于负载的均衡是不太友好的。

随着一个表中数据容量的不断扩张,Pegasus会对数据分片进行分裂,以实现数据的动态扩容。在分裂的时候,每个数据分片都一分为二,因而表中的分片数会变为原来的2倍。然后再结合负载均衡算法,Pegasus会把新的分片迁移到新加入的机器中。分片分裂这一特性目前还在开发中,等稳定上线后,会加入专门的篇章对这一部分进行描述。