对uuid进行模运算以确定shard_id

时间:2015-10-08 08:52:33

标签: database postgresql math uuid sharding

我们有Postgresql数据库,我们正在做一些分片。我们也在做READ负载平衡。为此,首先我们检查哪个分片数据。

我们根据以下公式获取分片ID:

entry_id % num_of_shards = shard_id

它运作良好。目前我们有自动增量ID(int)。

我们想切换到uuid v4。如果uuid确定shard_id,将使用什么公式?

由于

2 个答案:

答案 0 :(得分:4)

最简单的方法是将shard_id转换为文本值。如果你想要16个分片,那么只使用uuid中的第一个字符。对于256个分片,使用前2个字符,依此类推。

select substring(uuid_generate_v4()::text from 1 for 2) as shard_id;
 shard_id 
----------
 c6

只有两个分片得到第一个字符的最低位:

select
    substring(
        ('x' || substring(uuid_generate_v4()::text from 1 for 1))::bit(4) 
        from 4 for 1
    ) as shard_id
;
 shard_id 
----------
 0

对于四个分片,得到2位(from 3 for 2),依此类推。或者对于注释的整数:

select 
    (
        'x' || substring(uuid_generate_v4()::text from 1 for 1)
    )::bit(4)::int % 2 as shard_id

答案 1 :(得分:0)

您是否仅使用UUID来避免向用户显示连续的ID?在这种情况下,保留串行样式ID并添加UUID(只需在其上添加UNIQUE索引)。这样你可以继续使用模块,你也可以使用简单的数字ID,例如在外键上。

如果您使用UUID,因为您需要全局唯一ID(因为序列始终是“本地”),您将不得不使用某种方式将UUID转换为数字。

最简单的方法可能是取UUID的几位数并将它们转换为数字。