用单库自增键来生成id了,后期怎么分库?哎,这个坑大!

简介: 系统性考虑问题,知其然,知其所以然。

星球水友“写代码的”提问:
沈老师,我们现在用户中心是单库单表uid使用数据库自增主键,uid被很多业务关联,不能变化 现在用户中心数据量逐步变大,有分库需求了,如何由单库升级为多库,保持历史uid不变,并且新生成的数据不冲突有什么好办法么? ==问题描述完== 应该有不少公司都会利用数据库“插入数据自动自增id”来作为业务id,这种方法会使得业务与id生成强耦合,导致id生成算法难以升级。
今天和大家一起简单探讨下,id生成要考虑哪些要素。画外音:别误会,不是说“自增id”不好,是说它与业务耦合了,难以升级。
一、id生成要考虑的技术点 几乎所有业务,都会有一个业务唯一标识:

  • 用户标识:uid(user-id)

  • 消息标识:mid(msg-id)

  • 订单标识:oid(order-id)

这个标识,在存储系统里通常是主键,主键使用聚集索引 (clustered-index) ,即在物理存储上以这个id排序。 于是,对这个id有: 唯一性 趋势递增性的要求。

这个标识,也经常被用来做流量负载均衡,数据负载均衡的依据,即这个id必须在统计上必须是完全随机的。 于是,对这个id有: 随机性 的要求。
同时,id生成算法升级,理论上对业务系统是透明的。 于是,对这个id的生成有: 独立性 需求。 为了保证id生成的上述特性,要有一个: uint64_t GenID() 的独立方法(或者独立接口)来生成id, 生成id具体做什么用,该方法不关心 ,可以是用来做uid,也可以是用来做oid,甚至log-id。 当然, id生成的具体细节,业务也不用关心 。即,GenID()的内部实现,可以是利用数据库的自增id,也可以使用时间递增,目前行业内最流行的,是仿照snowflake生成分布式id。 这个封装, 屏蔽了id生成的细节,保留方案升级的可能性 ,是系统设计中,解耦的体现。 如果使用了此类方法生成业务id,数据库由单库扩展多库就很容易了: (1)确定一个路由算法,例如hash取模; (2)将单库中的数据,通过这个路由算法迁移到多库中去,以实现单库数据量的减少; (3)通过这个路由算法寻找数据(读); (4)通过这个路由算法插入数据(写);
假如架构设计前期没有提前考虑独立的id生成,后期又要实施单库拆多库,该怎么办呢? 二、针对星球水友提到的例子
历史的坑已经铸成,没有解耦id生成方法,而且也没法批量修改id,该怎么办呢?
假设由单库拆分为3库,可以这么玩: (1)做一个1主2从数据库集群,相当于每条数据复制成了3份; (2)将路由算法,设为取模hash算法,%3; (3) 第一个库 ,%3=0, 把余1和余2的uid删掉 (4)第二个库,%3=1,把余0和余2的uid删掉; (5)第三个库,%3=2,把余0和余1的uid删掉; (6) 将每个库的自增步长设置为3 ,这样每个库的id生成就不会重复了; (7)升级用户中心,按照路由算法查询uid数据; 搞定,拆库扩容达成: (1)单库数据量 下降 为了原来的1/3; (2)读写实例个数 扩充 为了原来的3倍; (3)并且id生成与查询都不会冲突; 希望这个取巧的方法对你有帮助。 但更希望,大伙提前考虑id生成 唯一性、随机性、趋势递增性、独立性
系统性 考虑问题,知其然,知其所以然

欢迎大家继续提问,有问必答。

本文转自“架构师之路”公众号,58沈剑提供。

目录
相关文章
|
机器学习/深度学习 人工智能 程序员
《全球机器学习技术大会:阿里云张玉明解密通义灵码AI程序员》
4月18日至19日,2025全球机器学习技术大会(ML-Summit)在上海成功举办。大会聚焦人工智能与机器学习前沿技术,吸引了众多行业精英参与。阿里巴巴高级技术专家张玉明以“通义灵码 AI 程序员解密”为主题发表演讲,分享了AI辅助编程工具如何重塑软件开发范式。通义灵码通过大模型和Agent技术,实现从辅助编码到对话式编程的跨越,未来将进入AI自主编程阶段。张玉明还介绍了通义灵码的核心技术架构及典型应用场景,并展望了智能编程的未来发展。
《全球机器学习技术大会:阿里云张玉明解密通义灵码AI程序员》
|
前端开发 开发者 容器
使用CSS Grid实现响应式布局
使用CSS Grid实现响应式布局
|
存储 算法 C++
【C++】哈希桶
哈希桶是哈希表中的基本存储单元,用于存放通过哈希函数映射后的数据元素。当不同元素映射至同一桶时,产生哈希冲突,常用拉链法或开放寻址法解决。哈希桶支持高效的数据插入、删除与查找操作,时间复杂度通常为O(1),但在最坏情况下可退化为O(n)。
655 6
|
数据采集 缓存 NoSQL
分布式新闻数据采集系统的同步效率优化实战
本文介绍了一个针对高频新闻站点的分布式爬虫系统优化方案。通过引入异步任务机制、本地缓存池、Redis pipeline 批量写入及身份池策略,系统采集效率提升近两倍,数据同步延迟显著降低,实现了分钟级热点追踪能力,为实时舆情监控与分析提供了高效、稳定的数据支持。
544 1
分布式新闻数据采集系统的同步效率优化实战
|
人工智能 算法 机器人
关于开展“人工智能大模型应用工程师”培训的通知
为贯彻落实《"十四五"机器人产业发展规划》和 2025年政府工作报告关于具身智能的战略部署,推进人工智能与实体经济深度融合,培育专业人才队伍,推动具身智能产业创新发展,工业和信息化部电子工业标准化研究院依据行业标准 SJ/T11805-2022《人工智能从业人员能力要求》,联合北京博创鑫鑫教育科技有限公司定于 2025年7月在广东、大连北京等地举办“人工智能大模型应用工程师”(具身智能实践案例提升与融合创新算法提升)培训,TsingtaoAI负责本次培训的交付事项。
456 12
|
网络协议 算法 JavaScript
快手虚拟ip地址永久免费版分享
虚拟IP技术原理与实现方案 1. 虚拟IP核心概念
|
存储 缓存 安全
【原理】【Java并发】【volatile】适合初学者体质的volatile原理
欢迎来到我的技术博客!我是一名热爱编程的开发者,梦想是写出高端的CRUD应用。2025年,我正在沉淀自己,博客更新速度也在加快。在这里,我会分享关于Java并发编程的深入理解,尤其是volatile关键字的底层原理。 本文将带你深入了解Java内存模型(JMM),解释volatile如何通过内存屏障和缓存一致性协议确保可见性和有序性,同时探讨其局限性及优化方案。欢迎订阅专栏《在2B工作中寻求并发是否搞错了什么》,一起探索并发编程的奥秘! 关注我,点赞、收藏、评论,跟上更新节奏,让我们共同进步!
590 8
【原理】【Java并发】【volatile】适合初学者体质的volatile原理
|
网络协议
TCP/IP与OPC协议的深度比较
总的来说,TCP/IP和OPC协议各有其优点和应用场景。TCP/IP协议是网络通信的基础,而OPC协议则是工业自动化领域的重要工具。在实际应用中,我们需要根据具体的需求和场景,选择合适的协议。
548 11
|
运维 安全 IDE
加速阿里云部署:Terraform在甄云科技的深度应用
甄云科技是一家领先的数字化采购平台服务商,通过Terraform实现全球云基础设施的高效管理与快速部署。公司成立于2017年,已服务全球30多个行业的中大型企业,客户遍布20多个国家和地区。利用IaC(基础架构即代码)理念和Terraform工具,甄云科技显著提升了开发与运维效率,减少了人为错误,加快了迭代速度,并支持业务快速扩展,为全球化战略提供了稳固的云基础架构支持。未来,公司将持续优化技术框架,回馈社区,助力更多企业的数字化转型。
|
JSON 前端开发 Java
【Java笔记+踩坑】SpringMVC基础
springmvc简介、入门案例、bean加载控制、PostMan工具的使用、普通和JSON和日期格式请求参数传递、响应JSON或jsp或文本、Rest风格
【Java笔记+踩坑】SpringMVC基础