用单库自增键来生成id了,后期怎么分库?哎,这个坑大!
创始人
2025-03-17 14:00:34
0次

星球水友“写代码的”提问:

沈老师,我们现在用户中心是单库单表,uid使用数据库自增主键,uid被很多业务关联,不能变化。

现在用户中心数据量逐步变大,有分库需求了,如何由单库升级为多库,保持历史uid不变,并且新生成的数据不冲突,有什么好办法么?

==问题描述完==

应该有不少公司都会利用数据库“插入数据自动自增id”来作为业务id,这种方法会使得业务与id生成强耦合,导致id生成算法难以升级。

今天和大家一起简单探讨下,id生成要考虑哪些要素。画外音:别误会,不是说“自增id”不好,是说它与业务耦合了,难以升级。

[[275323]]

一、id生成要考虑的技术点

几乎所有业务,都会有一个业务唯一标识:

  • 用户标识:uid(user-id)
  • 消息标识:mid(msg-id)
  • 订单标识:oid(order-id)

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

画外音:索引《1分钟了解不同索引的差异》。

这个标识,也经常被用来做流量负载均衡,数据负载均衡的依据,即这个id必须在统计上必须是完全随机的。于是,对这个id有:随机性的要求。

同时,id生成算法升级,理论上对业务系统是透明的。于是,对这个id的生成有:独立性需求。

为了保证id生成的上述特性,要有一个:

  1. uint64_t GenID() 

的独立方法(或者独立接口)来生成id,生成id具体做什么用,该方法不关心,可以是用来做uid,也可以是用来做oid,甚至log-id。

当然,id生成的具体细节,业务也不用关心。即,GenID()的内部实现,可以是利用数据库的自增id,也可以使用时间递增,目前行业内最流行的,是仿照snowflake生成分布式id。

这个封装,屏蔽了id生成的细节,保留方案升级的可能性,是系统设计中,解耦的体现。 如果使用了此类方法生成业务id,数据库由单库扩展多库就很容易了:

  • 确定一个路由算法,例如hash取模;
  • 将单库中的数据,通过这个路由算法迁移到多库中去,以实现单库数据量的减少;
  • 通过这个路由算法寻找数据(读);
  • 通过这个路由算法插入数据(写);

假如架构设计前期没有提前考虑独立的id生成,后期又要实施单库拆多库,该怎么办呢?

二、针对星球水友提到的例子

历史的坑已经铸成,没有解耦id生成方法,而且也没法批量修改id,该怎么办呢?

假设由单库拆分为3库,可以这么玩:

做一个1主2从数据库集群,相当于每条数据复制成了3份;

  • 将路由算法,设为取模hash算法,%3;
  • 第一个库,%3=0,把余1和余2的uid删掉;
  • 第二个库,%3=1,把余0和余2的uid删掉;
  • 第三个库,%3=2,把余0和余1的uid删掉;
  • 将每个库的自增步长设置为3,这样每个库的id生成就不会重复了;
  • 升级用户中心,按照路由算法查询uid数据;

搞定,拆库扩容达成:

  • 单库数据量下降为了原来的1/3;
  • 读写实例个数扩充为了原来的3倍;
  • 并且id生成与查询都不会冲突;

希望这个取巧的方法对你有帮助。

但更希望,大伙提前考虑id生成的唯一性、随机性、趋势递增性、独立性。

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

【本文为51CTO专栏作者“58沈剑”原创稿件,转载请联系原作者】

戳这里,看该作者更多好文

 

相关内容

热门资讯

PHP新手之PHP入门 PHP是一种易于学习和使用的服务器端脚本语言。只需要很少的编程知识你就能使用PHP建立一个真正交互的...
网络中立的未来 网络中立性是什... 《牛津词典》中对“网络中立”的解释是“电信运营商应秉持的一种原则,即不考虑来源地提供所有内容和应用的...
各种千兆交换机的数据接口类型详... 千兆交换机有很多值得学习的地方,这里我们主要介绍各种千兆交换机的数据接口类型,作为局域网的主要连接设...
粉嫩如何诠释霸道 东芝M805... “霸道粉”是个什么玩意东芝M805拿过来的时候,笔者扑哧笑了,不是笑这款笔记本,而是笑这款产品的颜色...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
什么是大数据安全 什么是大数据... 在《为什么需要大数据安全分析》一文中,我们已经阐述了一个重要观点,即:安全要素信息呈现出大数据的特征...
只需三步,让你掌握阿尔法路由器... 请参照以下阿尔法路由器设置方法,通过浏览器进入及设置宽带路由器。经过这三个步骤的设置,基本上能够熟悉...
如何更省钱? 近期特价热门硒鼓... 如今激光打印设备已经成为商务或企业的绝对主力办公设备,但采购者往往忽视了激光打印设备所用的耗材,相对...
全面诠释网络负载均衡 负载均衡的出现大大缓解了服务器的压力,更是有效的利用了资源,提高了效率。那么我们现在来说一下网络负载...
如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...