zoukankan      html  css  js  c++  java
  • MySQL分布式实现ID自增

    由于数据量以及IO效率的因素,很多项目对数据支持的数据库会采取分库分表的方式。使用了分库分表之后需要解决的一个问题就是主键的生成。多个表之间的主键就不能用数据库本身的自增主键来支持,因为不同表之间生成的主键会重复。所以需要其他的方式获取主键ID。

    一般来说解决方案主要有三种:

    1. oracle sequence : 基于第三方oracle的SEQ.NEXTVAL来获取一个ID 优势:简单可用 缺点:需要依赖第三方oracle数据库
    2. mysql id区间隔离 : 不同分库设置不同的起始值和步长,比如2台mysql,就可以设置一台只生成奇数,另一台生成偶数. 或者1台用0~10亿,另一台用10~20亿. 优势:利用mysql自增id 缺点:运维成本比较高,数据扩容时需要重新设置步长.
    3. 基于数据库更新+内存分配: 在数据库中维护一个ID,获取下一个ID时,会对数据库进行ID=ID+100 WHERE ID=XX,拿到100个ID后,在内存中进行分配 优势:简单高效 缺点:无法保证自增顺序

    考虑到扩展性和维护性,我们采取了第三种方案。具体实现为:

    1. 我们设置获取ID步长为l,一共有n个表分配id。
    2. 初始化后,n个表中的id值分别为0,l, 2l,3l…
    3. 当应用从任意一个表获取ID,这个表中的ID会在原ID值上增加nl。

    举例说明,步长为100,共4个id表

    1. 初始化后,4个表中的值分别为, 1:0, 2:100, 3:200, 4:300
    2. 假设应用从表2获取了id,那么四个表的值变为,1:0, 2:500, 3:200, 4:300

    这样一来有如下几个好处:

    1. 实现了全局唯一ID。
    2. 不影响业务数据库的扩展。
    3. 获取ID有容灾,单个表无法访问不影响全局。
  • 相关阅读:
    SpringCloud就是分布式啊?!?!?!
    有没有可能让运算符作为函数参数?
    【问题】用C++结构体实现顺序表,数据超过数组长度后,表长自动+1
    数学模型与数据结构的丝连
    最浅显易懂的数据库索引讲解
    whois 信息
    旁站C段查询
    网络搜索引擎
    服务指纹识别
    绕过CDN查找ip方法总结
  • 原文地址:https://www.cnblogs.com/xiohao/p/9062996.html
Copyright © 2011-2022 走看看