我们有Postgresql数据库,我们正在做一些分片。我们也在做READ负载平衡。为此,首先我们检查哪个分片数据。
我们根据以下公式获取分片ID:
entry_id % num_of_shards = shard_id
它运作良好。目前我们有自动增量ID(int)。
我们想切换到uuid v4。如果uuid确定shard_id,将使用什么公式?
由于
答案 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的几位数并将它们转换为数字。