Partitioning in Depth: Consistent Hashing, Rebalancing, and Hot Keys