MySQL分布式ID_分布式唯一ID系列(3)——数据库自增ID机制适合做分布式ID吗

数据库自增ID机制原理介绍

在分布式里面,数据库的自增ID机制的主要原理是:数据库自增ID和mysql数据库的replace_into()函数实现的。这里的replace数据库自增ID和mysql数据库的replace_into()函数实现的。这里的replace into跟insert功能类似,不同点在于:replace into首先尝试插入数据列表中,如果发现表中已经有此行数据(根据主键或唯一索引判断)则先删除,再插入。否则直接插入新数据。

单机mysql数据库的自增id实现如下所示 :

首先表结构如下所示

create table t_test(

id bigint(20) unsigned not null auto_increment PRIMARY KEY,

stub char(1) not null default '',

unique key stub (stub)

)

然后我们插入的sql语句和查询的语句如下所示

replace into t_test (stub) values('b');

select last_insert_id();

此时可以看到看到我们刚刚插入的id值是1

cc49ed37edb65ee329966a6a29d80a6b.png

以上就是单机版mysql的自增id的实现过程,但是这里讲的是分布式id,所以我们要分析一下数据库的自增ID机制在分布式里面是怎么实现的。

分布式id在数据库里面的实现过程:

既然是分布式id,那么最少要使用两个数据库,这里我们使用3台来讲解,为了保证每一台数据库里面的id自增的时候不会重复,那么我们就要给每一台数据库设置auto-increment-increment和auto-increment-offset这两个属性值(auto-increment-increment表示每一台数据库的起始id值,然后auto-increment-offset表示每一台数据库每一次的增加数字),设置值如下所示

Server1:

auto-increment-increment = 1

auto-increment-offset = 3

Server2:

auto-increment-increment = 2

auto-increment-offset = 3

Server2:

auto-increment-increment = 3

auto-increment-offset = 3

那么如果我们有n台数据库的话,那么上面的auto-increment-increment和auto-increment-offset这两个属性值应该怎么设计呢,我们给每一台数据库设置初始值分别为1,2,3...N,然后每一台数据库自增步长为机器的台数N,如下图所示

c31d8760aa684e701db7784d8096b1ea.png

数据库自增ID是否适合做分布式ID:

那数据库自增ID机制适合作分布式ID吗?答案是不太适合,为什么呢,我总结了下面两个原因:

1:系统水平扩展比较困难,比如定义好了步长和机器台数之后,如果要添加机器该怎么做?假设现在只有一台机器发号是1,2,3,4,5(步长是1),这个时候需要扩容机器一台。可以这样做:把第二台机器的初始值设置得比第一台超过很多,比如14(主要这里设置14的前提是:在扩容期间第一台机器的ID不可能增加到14),同时设置步长为2,那么这台机器下发的号码都是14以后的偶数。然后摘掉第一台,把ID值保留为奇数,比如7,然后修改第一台的步长为2。让它符合我们定义的号段标准。扩容方案看起来复杂吗?貌似还好,现在想象一下如果我们线上有100台机器,这个时候要扩容该怎么做?简直是噩梦。所以系统水平扩展方案复杂难以实现。

2:数据库压力还是很大,每次获取ID都得读写一次数据库,非常影响性能,不符合分布式ID里面的延迟低和要高QPS的规则(在高并发下,如果都去数据库里面获取id,那是非常影响性能的)

看到这里的同学,觉得好的话就帮忙推荐下吧,Thanks♪(・ω・)ノ

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/308532.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

7-15 QQ帐户的申请与登陆 (25 分)(map做法+思路分析)

一:题目 实现QQ新帐户申请和老帐户登陆的简化版功能。最大挑战是:据说现在的QQ号码已经有10位数了。 输入格式: 输入首先给出一个正整数N(≤10 ​5 ​​ ),随后给出N行指令。每行指令的格式为:“命令符&a…

[Redis6]新数据类型_HyperLogLog

HyperLogLog 简介 在工作当中,我们经常会遇到与统计相关的功能需求,比如统计网站PV(PageView页面访问量),可以使用Redis的incr、incrby轻松实现。 但像UV(UniqueVisitor,独立访客)、独立IP数…

每天都在支付,你真的了解信息流和资金流?

作为一个财务类的产品经理,除了每天被财务“虐待”千百遍,还需要对整个资金流向很清楚:钱给谁,怎么给,怎么做逆向流程,谁参与容错等。财务很在意资金的流转安全,但又极不愿意花时间关注它。诸如…

mysql改表字段类型导致数据丢失_故障分析 | 记一次 MySQL 主从双写导致的数据丢失问题【转】...

一、问题起源不久前用户反馈部门的 MySQL 数据库发生了数据更新丢失。为了解决这个问题,当时对用户使用的场景进行了分析。发现可能是因为用户在两台互为主从的机器上都进行了写入导致的数据丢失。如图所示,是正常和异常情况下应用写入数据库的示例。随后…

[Redis6]新数据类型_Geospatial

Geospatial 简介 Redis 3.2 中增加了对GEO类型的支持。GEO,Geographic,地理信息的缩写。该类型,就是元素的2维坐标,在地图上就是经纬度。redis基于该类型,提供了经纬度设置,查询,范围查询&…

《Apache SkyWalking实战》送书活动结果公布

截至2020.07.31 本次送书活动 这么多Apache顶级项目,SkyWalking为何一枝独秀?,本次很多同学在看到活动的书,自行就到网上购买了书。下面把Top 8的留言截图给大家回顾一下。以下8位同学将获赠书籍一本:landon、田晓青、…

7-16 一元多项式求导 (20 分)(详解+题目分析)

7-16 一元多项式求导 (20 分) 1:题目 设计函数求一元多项式的导数。 输入格式: 以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。 输出格式: 以与输入相同的格式输出导数多项式非零项的系数和…

[MyBatisPlus]通用枚举

通用枚举 数据库表添加字段sex 创建通用枚举类型 package com.xxxx.mybatisplus.enums;import com.baomidou.mybatisplus.annotation.EnumValue; import lombok.Getter;Getter public enum SexEnum {MALE(1,"男"),FEMALE(2,"女");EnumValue // 将注解所标…

信创产业发展应不忘初心牢记使命

受国际大环境影响,信创市场国产化替代步伐已然加速。由于其中存在巨大的商机,信创市场中已然出现一些乱象。有的厂商拿洋技术标榜和宣传自主;有的厂商全国各地跑马圈地建产业园,进而向当地政府要政策要市场;有的厂商恶…

mysql采用 级触发_Mysql高级之触发器(trigger)

触发器是一类特殊的事务 ,可以监视某种数据操作(insert/update/delete),并触发相关操作(insert/update/delete)。看以下事件:完成下单与减少库存的逻辑Insert into o (gid,num) values (2,3); // 插入语句Update g set goods_num goods_num - 3 where id 2;// 更新…

[MyBatisPlus]代码生成器

代码生成器 引入依赖 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.5.1</version></dependency><dependency><groupId>org.freemarker</groupId…

飞机游戏项目完整代码(详解JAVA300集)

一&#xff1a;简介 这是一个可以通过键盘移动飞机位置 然后可以躲避 炮弹的打击 &#xff0c;游戏结束为 当炮弹与飞机发生碰撞 则 最后显示出飞机存活的时长 代表游戏结束 二&#xff1a;上码 1&#xff1a;运行游戏的类 package src.src.cn.wyj.飞机;import java.awt.Co…

[MyBatisPlus]模拟多数据源环境及测试

模拟多数据源环境 多数据源 适用于多种场景&#xff1a;纯粹多库、 读写分离、 一主多从、 混合模式等 目前我们就来模拟一个纯粹多库的一个场景&#xff0c;其他场景类似 场景说明&#xff1a; 我们创建两个库&#xff0c;分别为&#xff1a;mybatis_plus&#xff08;以前…

生活有哪些残忍的真相?

1.很多人拼尽全力&#xff0c;只是为了艰难的生存。2.大多数人一点也不喜欢读书&#xff0c;只是喜欢被别人贴上“爱读书”的标签罢了。3.你越没能力&#xff0c;社交圈质量就越低&#xff0c;碰到的傻逼就越多。4.职场绝不能追求快乐&#xff0c;只能追求痛苦的成长。5.抬起头…

7-17 汉诺塔的非递归实现 (25 分)(思路分析)

一&#xff1a;题目 借助堆栈以非递归&#xff08;循环&#xff09;方式求解汉诺塔的问题&#xff08;n, a, b, c&#xff09;&#xff0c;即将N个盘子从起始柱&#xff08;标记为“a”&#xff09;通过借助柱&#xff08;标记为“b”&#xff09;移动到目标柱&#xff08;标记…

[MyBatisPlus]MyBatisX插件

MyBatisX插件 MyBatis-Plus为我们提供了强大的mapper和service模板&#xff0c;能够大大的提高开发效率 但是在真正开发过程中&#xff0c;MyBatis-Plus并不能为我们解决所有问题&#xff0c;例如一些复杂的SQL&#xff0c;多表联查&#xff0c;我们就需要自己去编写代码和SQ…

7-19 求链式线性表的倒数第K项 (20 分)(思路分析+极简代码+超容易理解)

一&#xff1a;题目描述&#xff1a; 给定一系列正整数&#xff0c;请设计一个尽可能高效的算法&#xff0c;查找倒数第K个位置上的数字。 输入格式: 输入首先给出一个正整数K&#xff0c;随后是若干非负整数&#xff0c;最后以一个负整数表示结尾&#xff08;该负数不算在序…

很认真地聊一下 “选择比努力更重要”

这是头哥侃码的第211篇原创两周前&#xff0c;蚂蚁集团官宣上市计划&#xff0c;在科创板和港交所寻求同步上市的消息&#xff0c;刷爆了朋友圈。消息爆出的第二天&#xff0c;我就看到在某个微信群里的一位 “热心” 小伙伴给他在蚂蚁金服的朋友算了一笔账&#xff0c;说是能套…

Java计算时间差_传统的SimpleDateFormat类

Java计算时间差_传统的SimpleDateFormat类 SimpleDateFormat simpleFormat new SimpleDateFormat("yyyy-MM-dd HH:mm");/*天数差*/Date fromDate1 simpleFormat.parse("2022-03-23 12:00");Date toDate1 simpleFormat.parse("2022-03-23 13:00&qu…

使用神经网络进行稀疏采样_使用python+opencv进行神经网络迁移

梵高画作什么是神经网络的风格迁移&#xff0c;简单来件就是输入1张照片(自己的照片)&#xff0c;输出具备另外一张照片(例子梵高画作)风格的图片&#xff0c;同时保留原本自己图片的元素&#xff0c;如下图片表明了神经网络风格迁移的过程&#xff0c;当然你也可以使用自己的神…