• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase
您的位置:首页 > 数据库 >Mysql > 分布式情况下生成数据库唯一ID的解决方案

分布式情况下生成数据库唯一ID的解决方案

作者:匿名 字体:[增加 减小] 来源:互联网 时间:2018-12-05

匿名通过本文主要向大家介绍了mysql等相关知识,希望本文的分享对您有所帮助
ID作为业务的唯一标识,在数据设计中屡见不鲜,例如:

?商品 —— product_id

?订单 —— order_id

?消息 —— message_id

这些标识往往就是数据库的主键,MySQL会在主键是建立聚簇索引,这个索引直接指向数据地址。相比普通索引指向聚簇索引,减少了一次索引查询,速度很快。消息、订单类似业务一般会有按照时间倒序查询数据的需求,一种做法是在时间列上建立索引,更好的是依赖ID本身的插入有序性。所以,分布式ID需要满足两个核心条件:

?全局唯一

?时间趋势有序

可能有人会说了,直接用MySQL的auto_increment不就行了么。在创业初期的时候我也会选择这个方案,简单、高效、快速——创业公司还是得快速迭代,尽快出产品,而且产品经常变,花太多时间搞出的牛逼架构说不定不太用得上,浪费了宝贵的时间。但这个方案是存在一些问题的:

?影响并行插入——B记录依赖A记录的主键,需要等到A记录插入成功,拿到A.id,才能插入B记录

?数据恢复难度大——数据误删或者丢失后,由于日志中没有ID,不能直接确定数据关联性

?影响分库分表——由于ID要插入后才知道,不能根据业务的主键进行分库分表

所以,在业务稳定后,一定要抽出时间来还早期的技术债务。

常见方案

使用数据库的auto_increment来生成唯一ID

优点

?简单,使用已有功能,开发量小

?ID步长固定

缺点

?写入单点,非高可用

?即使按照不同auto_increment起点扩展多个主库,虽然提高了可用性,但却不能保证ID的严格有序

?每次都需要访问数据库,容易到达性能天花板

批量拉取ID,逐一分配

这种方案也是将ID数据存入数据库,ID服务每次从数据库中拉取N个ID,并将当前已用ID最大值更新为原始数据+N,ID服务每次接到ID生成请求时就从这N个ID中依次返回。

优点

?批量获取,不用每次访问数据库,数据库压力小

缺点

?整个服务还是单点

?服务宕机重启会造成ID不连续

?无法水平扩展

改进

增加一套备用服务,主服务挂了漂移到备用服务上,可以采用vip + keepalived或者增加proxy。

uuid

优点

?本地生成ID,没有单点问题,没有性能瓶颈

缺点

?不能保证递增有序

?长度过长,作为主键性能低

类snowflake算法

snowflake是twitter开源的分布式ID生成算法,其核心思想是:一个long型的ID,使用其中41bit作为毫秒数,10bit作为机器编号,12bit作为毫秒内序列号。这个算法单机每秒内理论上最多可以生成1000*(2^12),也就是400W的ID,完全能满足业务的需求。

借鉴snowflake的思想,结合各公司的业务逻辑和并发量,可以实现自己的分布式ID生成算法。

优点

?时间在高位,趋势递增

?实现简单,不依赖其它服务,方便扩展

缺点

?没有全局时钟,单机绝对有序,但从整个集群来看,是趋势有序的

注意事项

?由于ID常作为分库分表的标识,所以需要这些ID有一定的随机性,不至于分库后的数据不均匀,可以在每个毫秒开始时序列号不从1开始,二是从0-9中的任意一个开始

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

相关文章

  • 2018-12-05MySQL基础教程11 — 函数之Cast函数和操作符
  • 2018-12-05oracle日志操作模式(归档模式和非归档模式的利与弊)
  • 2018-12-05MS SQL Server和MySQL区别
  • 2017-05-11分析MySQL中索引引引发的CPU负载飙升的问题
  • 2018-12-05SQL Server修改标识列方法 如自增列的批量化修改
  • 2018-12-05Oracle 实现类似SQL Server中自增字段的一个办法
  • 2018-12-05Mysql的编译安装以及简单介绍
  • 2018-12-05mysql query browser中文乱码的解决方法
  • 2018-12-05linux如何使用binary方式来安装mysql
  • 2018-12-05MySQL数据库修改密码&忘记密码

文章分类

  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase

最近更新的内容

    • SQL中Exists的用法实例详解
    • SQL 提权 常用命令
    • SQLServer中用T—SQL命令查询一个数据库中有哪些表的sql语句
    • MySQL架构
    • mysql主从配置
    • MySQL常用的数据库管理命令
    • MySQL之-Replication监控及自动故障切换的详细分析
    • mongodb性能优化
    • Windows下通过DOS命令登录MYSQL的方法
    • mysql 触发器实现两个表的数据同步

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有