我的问题是关于分片环境的 ID 生成。我遵循与instagram相同的步骤来生成唯一 ID。我对在 MySQL 中实现这个 id 生成有几个问题。
这就是生成 ID 的方式(这是一个 PGQL 存储过程。)
CREATE OR REPLACE FUNCTION insta5.next_id(OUT result bigint) AS $$
DECLARE
our_epoch bigint := 1314220021721;
seq_id bigint;
now_millis bigint;
shard_id int := 5;
BEGIN
SELECT nextval('insta5.table_id_seq') %% 1024 INTO seq_id;
SELECT FLOOR(EXTRACT(EPOCH FROM clock_timestamp()) * 1000) INTO now_millis;
result := (now_millis - our_epoch) << 23;
result := result | (shard_id << 10);
result := result | (seq_id);
END;
$$ LANGUAGE PLPGSQL;
CREATE TABLE insta5.our_table (
"id" bigint NOT NULL DEFAULT insta5.next_id(),
...rest of table schema...
)
我的问题是如何在 MySQL 中做到这一点(等效代码)。应该从查询中调用此存储过程以获取下一个 id。
我的另一个问题是关于查询分片。据我了解,他们使用映射到实际服务器的逻辑分片。如果他们决定将一个逻辑分片映射到一个新的服务器,这意味着他们必须同时查询两个服务器来聚合结果,因为在他们为同一个逻辑分片分配一个新服务器之前,一些数据被添加到较旧的服务器。我只是想知道是否有更好的方法来使用逻辑分片,并且可以选择查询数据所在的单个服务器,而不是查询属于该逻辑分片的所有服务器?
谢谢。