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

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

内容简介:随着业务量的增长和国际化的需求,多区域部署已是家常便饭,如果各区域数据需要互通那数据库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)到922337203685477580702^631)。
    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也是一种不错的选择。


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

查看所有标签

猜你喜欢:

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

Agile Web Application Development with Yii 1.1 and PHP5

Agile Web Application Development with Yii 1.1 and PHP5

Jeffrey Winesett / Packt Publishing / 2010-08-27

In order to understand the framework in the context of a real-world application, we need to build something that will more closely resemble the types of applications web developers actually have to bu......一起来看看 《Agile Web Application Development with Yii 1.1 and PHP5》 这本书的介绍吧!

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具