分布式ID解决方案(一)数据库号段方式

news2024/10/7 10:13:33

一、前言
在一些简单系统中,我们可以直接使用数据库ID自增方式来标识和保存数据,但是随着系统的逐渐复杂,数据量的日益增多,我们可能需要对数据表、数据库实现分库分表。单纯的使用数据库的ID自增无法满足业务场景了,所以我们必须找到一种方式来生成一个全局唯一的ID。我们可以先想一下,这个生成的ID的系统需要满足什么条件呢?
1.必须是全局唯一的:如果在一个订单系统中,订单号是重复的那将是灾难的。
2.高性能:生成ID,可以说是一个业务逻辑实现非常小的环节,如果在这个环节浪费很多时间,那么势必会对业务逻辑造成影响,也是不可取的。
3.高可用:让系统99.9%是可用的
4.简单:简单是我们设计一个功能应该是一直追求的。

二、实现原理
数据库号段:顾名思义就是一个数据的一个范围,例如(100,200],这个100到200就可以称为一个号段。我们可以一次向数据库申请一个号段,然后加载到内存中,然后用自增的方式生成这个ID,如果这个号段用完了,再向数据库申请另一个新的号段。
1、数据表的设计:

idbiz_typemax_idtepversion
1000110020000

biz_type::业务标识,不同业务使用不同的号段
max_id:当前最大的可用ID
tep:每次生成ID的范围长度
version:版本号,乐观锁,每次更新加上版本号,保证并发更新的准确性

2、使用步骤:

  1. 查询当前的max_id信息:select id, biz_type, max_id, step, version from tiny_id_info where biz_type=‘0001’;
  2. 计算新的max_id: new_max_id = max_id + step
  3. 更新DB中的max_id:update tiny_id_info set max_id=#{new_max_id} , verison=version+1 where id=#{id} and max_id=#{max_id} and version=#{version}
  4. 如果更新成功,则可用号段获取成功,新的可用号段为(max_id, new_max_id]
  5. 如果更新失败,则号段可能被其他线程获取,回到步骤a,进行重试。

三、高可用架构
在这里插入图片描述
ID生成系统对外提供http服务,请求经过负载均衡选择一个server,从事先加载好的号段中生成一个ID,如果没有号段或者号段已经用完,再向DB按照上边的步骤获取一个新的号段,多个server通过version乐观锁保证生成的号段不会重复。

四、问题与优化

  1. 假如某一个server重启或者宕机
    那么这个server生成的号段就作废了,而且只是浪费一部分号段,对这个ID生成系统没影响。
  2. DB挂了怎么办
    DB挂了,我们依然可以通过缓存加载的号段对外提供服务,不过这个时间是有限的,如果缓存的号段都用完了,那么就无法对外提供服务了。我们想要彻底解决这个问题,DB就不能是单机的。
  3. DB不是单机的,怎么保证不会生成重复ID呢?
    其实这个解决方案还是挺简单的,我们只需要在上边设计的数据表里新增字段。假如有A、B两个DB,那么我们就设定一个标识字段,让A生成偶数号段,B生成奇数号段即可。

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

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

相关文章

Seata 的可观测实践

作者:察溯 Seata 简介 Seata 的前身是阿里巴巴集团内大规模使用保证分布式事务一致性的中间件,Seata 是其开源产品,由社区维护。在介绍 Seata 前,先与大家讨论下我们业务发展过程中经常遇到的一些问题场景。 业务场景 我们业务…

数据规模缩小 200 倍!指令微调高效指导大模型学习

夕小瑶科技说 原创 作者 | 智商掉了一地、Python 最近大型语言模型(LLMs)的指令微调备受研究人员的关注,因为它可以开发 LLM 遵循指令的潜力,使其更加符合特定的任务需求。虽然指令微调(Instruction Tuning&#xff…

JavaEE-HTTPS的加密流程

目录 对称加密非对称加密证书的引入 对称加密 对称加密就是用同一个密钥把明文进行加密变成密文,也能把密文解密为明文. 理想状态下: 引入对称加密之后, 即使数据被截获, 由于黑客不知道密钥是啥, 因此就无法进行解密, 也就不知道请求的真实内容是啥了. 但同一时刻服务器服务…

数据库规范与SQL调优

数据库设计规范章节,依旧以《阿里巴巴Java开发手册》为原型进行修正和完善。 MySQL规约 (一) 建表规约 (二) 索引规约 (三) SQL规约 (四) ORM规约 (一) 建表规约 1. 【强制】 表达是与否概念的字段,必须使用is_xxx的方式命名,数据类型是…

Windows修改为Mac的字体方法

一: 首先下载字体文件和修改器 Mac字体修改 https://www.aliyundrive.com/s/KKvcRNYkP5p 提取码: 6d3p 点击链接保存,或者复制本段内容,打开「阿里云盘」APP ,无需下载极速在线查看,视频原画倍速播放。 二: 设置并修改字体 1:…

服务(第二十八篇)rsync

配置rsync源服务器: #建立/etc/rsyncd.conf 配置文件 vim /etc/rsyncd.conf #添加以下配置项 uid root gid root use chroot yes #禁锢在源目录 address 192.168.80.10 …

浅谈管网抢维修效率对产销差率的影响

1 背景 多年来,漏损治理工作一直围绕检漏、分区计量或压力管理等相关话题,却忽视了抢维修速度与质量对漏损治理成效的影响。实际上,不管是DMA分区计量,还是检漏,最终还是要通过抢维修来修复漏点达到控制漏损的目的。尽…

Vue 3中利用UseStorage轻松实现本地存储功能,释放数据持久化的力量

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: 三十天精通 Vue 3 文章目录 一、介绍1.1 什么是本地存储1.2 Vue 3中的UseStorage插件简介 二、…

第18章_MySQL8其它新特性

第18章_MySQL8其它新特性 1. MySQL8新特性概述 MySQL从5.7版本直接跳跃发布了8.0版本,可见这是一个令人兴奋的里程碑版本。MySQL 8版本在功能上做了显著的改进与增强,开发者对MySQL的源代码进行了重构,最突出的一点是多MySQL Optimizer优化器…

MySQL-1-SQL语句的分类、MySQL命令、SQL查询语句

一、SQL语句的分类(任何一条sql语句以分号结尾;SQL语句不区分大小写) DQL(数据查询语言):查询语句,凡是select都是DQL。 DML(数据操作语言):insert、delete、…

Midjourney 介绍-AI绘画工具

《Midjourney》是一款2022年3月面世的AI绘画工具,创始人是David Holz。 它一款基于浏览器的在线应用程序,因此你无需安装任何软件,只需在浏览器中访问MidJourney的官方网站即可开始使用。 只要输入想到的文字,就能通过人工智能产出…

一文带你了解MySQL之基于成本的优化

前言 本文章收录在MySQL性能优化原理实战专栏,点击此处查看更多优质内容。 目录 一、什么是成本二、单表查询的成本2.1 准备数据2.2 基于成本的优化步骤2.3 基于索引统计数据的成本计算 三、连接查询的成本2.1 准备数据2.2 Condition filtering介绍2.3 多表连接的成…

『MySQL 实战 45 讲』16 - “order by” 是怎么工作的

“order by” 是怎么工作的 首先创建一个表 CREATE TABLE t ( id int(11) NOT NULL, city varchar(16) NOT NULL, name varchar(16) NOT NULL, age int(11) NOT NULL, addr varchar(128) DEFAULT NULL, PRIMARY KEY (id), KEY city (city) ) ENGINEInnoDB;全字段排序 在 cit…

正确甄别API、REST API、RESTful API和Web Service之间的异同

看到API你会想起什么?是接口、第三方调用、还是API文档?初看你可能会觉得这太熟悉了,这不是系统开发日常系列吗?但你仔细想一想,你会发现API的概念在你脑海里是如此的模糊。如何你通过搜索引擎检索API,你会…

目标检测数据预处理——部件截图,按一定比例进行外扩

本片是截图的篇的升级版本,简单版本的截图请参考根据目标框外扩一定比例进行截图(连带标签)。 对目标框(类别名称)进行分类,将同一类的目标框进行截图并分类保存在不同的文件夹中。 在本篇当中,…

Vue3中响应式Reactive的独特之处:它在哪些场景下胜出Ref?

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: 三十天精通 Vue 3 文章目录 一、Vue 3中响应式Reactive的独特之处1.1 引言1.2 Vue 3中的响应式…

算法leetcode|51. N 皇后(rust重拳出击)

文章目录 51. N 皇后:样例 1:样例 2:提示: 分析:题解:rust:go:c:python:java: 51. N 皇后: 按照国际象棋的规则,皇后可以…

详解c++STL—STL常用算法

目录 1、常用遍历算法 1.1、for_each 1.2、transform 2、常用查找算法 2.1、find 2.2、find_if 2.3、adjacent_find 2.4、binary_search 2.5、count 2.6、count_if 3、常用排序算法 3.1、sort 3.2、random_shuffle 3.3、merge 3.4、reverse 4、常用拷贝和替换算…

在MyBatis XML文件中处理特殊符号的方法,如“>”、“<”、“>=”、“<=”这些符号XML会报错如何处理

前言 在MyBatis的XML映射文件中,我们经常需要使用特殊符号,比如"大于"、"小于"、"大于等于"、"小于等于"等比较操作符。然而,这些符号在XML中具有特殊的含义,因此需要进行特殊处理&…

nginx缓存及rsync远程访问控制

nginx缓存功能 http{ proxy_cache_path /data/nginx/cache/levels1:2 keys_zonemy_cache:10m max_size10g inactive60m use_temp_pathoff; path强制参数,指定缓存文件的存放路径。 levels: 定义了缓存目录的层级。每层可以用1(最多16种选择,0-f)或2(最…