使用sequence作为多区域部署的id

栏目: 数据库 · 发布时间: 5年前

内容简介:随着业务量的增长和国际化的需求,多区域部署已是家常便饭,如果各区域数据需要互通那数据库id就要全局唯一,自建sequence作为一种自增id就是为了解决mysql多区域部署id冲突问题。使用sequence作为mysql增长id唯一麻烦之处就在于要控制id段,如果id段划分太小容易出现id冲突,划分太大又容易出现新增区域id不足的问题,所以需要评估业务量,当然如果不在乎id是否有序,使用snowflake生成uuid也是一种不错的选择。

随着业务量的增长和国际化的需求,多区域部署已是家常便饭,如果各区域数据需要互通那数据库id就要全局唯一,自建sequence作为一种自增id就是为了解决 mysql 多区域部署id冲突问题。

优劣势

优点

  1. 和uuid相比较,sequence配置在数据库中不依赖机器环境,且是有序的
  2. 和mysql自增id相比较,适用于多区域部署,可以划分id段且随时可控

缺点

  1. 需要根据业务评估id段,并在后期需要时进行调整
  2. 单区域id增长过快时,id分配不平均,已分配的id段不可用会造成id浪费

划分原则

  1. 推荐使用bigint,不要使用bigint unsigned,因为bigint unsigned超出了long和int64的范围,很多软件包会报错
  2. bigint最大值为9223372036854775807,为方便扩展id划分时不要一次性全部分配完,如中国0-10e,美国10e-20e,欧洲20e-30e,当新增区域或者某一区域id段使用完时再新增id段,如美国修改sequence起始为30e

具体操作

  1. 检查mysql 自定义函数功能是否开启

    执行 show variables like '%log_bin_trust_function_creators%' 检查是否开启,如aws默认是没开启的需要修改数据库配置,执行 SET GLOBAL log_bin_trust_function_creators=1; 打开该功能,如遇到权限问题修改原始配置

  2. 创建sequence表

    -- sequence表
    DROP TABLE IF EXISTS sequence;
    -- 建sequence表,指定seq列为大整型,可支持:0(default)到9223372036854775807(0到2^63–1)。
    CREATE TABLE sequence (
    name            VARCHAR(50) NOT NULL,      -- 表名
    current_value   BIGINT NOT NULL DEFAULT 0, -- 当前值
    increment       INT NOT NULL DEFAULT 1,    -- 步长
    PRIMARY KEY (name)  -- 不允许重复seq的存在
    ) ENGINE=InnoDB;
    复制代码
  3. 创建函数

  • function获取当前id
    -- DELIMITER的作用是修改分隔符,因为语句中包含有分号需要替换成其他分隔符
    DELIMITER /
    DROP FUNCTION IF EXISTS currval /
    CREATE FUNCTION currval(seq_name VARCHAR(50))
    RETURNS BIGINT
    BEGIN
        DECLARE value BIGINT;
        SELECT current_value INTO value
        FROM sequence
        WHERE upper(name) = upper(seq_name); -- 大小写不区分.
        RETURN value;
    END;
    /
    DELIMITER ;
    复制代码
  • function获取下一个id
    DELIMITER /
    DROP FUNCTION IF EXISTS nextval /
    CREATE FUNCTION nextval (seq_name VARCHAR(50))
    RETURNS BIGINT
    BEGIN
        DECLARE value BIGINT;
        UPDATE sequence
        SET current_value = current_value + increment
        WHERE upper(name) = upper(seq_name);
        RETURN currval(seq_name);
    END;
    /
    DELIMITER ;
    复制代码
  1. 检查函数是否创建成功
drop function 自定义函数名
show create function 自定义函数名
show function status
alert function
insert into `sequence`(`name`,`current_value`,`increment`) values('session',1000,2)
INSERT INTO `session`(`id`, `uid`, `sig`, `expired`) VALUES (nextval('session'),123,'1231',now())

结束语

使用sequence作为mysql增长id唯一麻烦之处就在于要控制id段,如果id段划分太小容易出现id冲突,划分太大又容易出现新增区域id不足的问题,所以需要评估业务量,当然如果不在乎id是否有序,使用snowflake生成uuid也是一种不错的选择。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

赛博空间的奥德赛

赛博空间的奥德赛

(荷兰)约斯·德·穆尔 (Jos de Mul) / 麦永雄 / 广西师范大学出版社 / 2007-2 / 38.00元

本书揭示了数码信息时代的电子传媒与赛博空间为人类历史的发展提供的新的可能性。本书第一部分“通向未来的高速公路”,涉及无线想象、政治技术和极权主义在赛博空间的消解等题旨;第二部分“赛博空间的想象” ,讨论空间文学探索简史、电影和文化的数码化;第三部分”可能的世界” ,关涉世界观的信息化、数码复制时代的世界、数码此在等层面;第四、五部分探讨主页时代的身份、虚拟人类学、虚拟多神论、赛博空间的进化、超人文......一起来看看 《赛博空间的奥德赛》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

随机密码生成器
随机密码生成器

多种字符组合密码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具