星球水友“写代码的”提问:
创新互联服务项目包括澄江网站建设、澄江网站制作、澄江网页制作以及澄江网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,澄江网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到澄江省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!
沈老师,我们现在用户中心是单库单表,uid使用数据库自增主键,uid被很多业务关联,不能变化。
现在用户中心数据量逐步变大,有分库需求了,如何由单库升级为多库,保持历史uid不变,并且新生成的数据不冲突,有什么好办法么?
==问题描述完==
应该有不少公司都会利用数据库“插入数据自动自增id”来作为业务id,这种方法会使得业务与id生成强耦合,导致id生成算法难以升级。
今天和大家一起简单探讨下,id生成要考虑哪些要素。画外音:别误会,不是说“自增id”不好,是说它与业务耦合了,难以升级。
一、id生成要考虑的技术点
几乎所有业务,都会有一个业务唯一标识:
这个标识,在存储系统里通常是主键,主键使用聚集索引(clustered-index),即在物理存储上以这个id排序。于是,对这个id有:唯一性,趋势递增性的要求。
画外音:索引《1分钟了解不同索引的差异》。
这个标识,也经常被用来做流量负载均衡,数据负载均衡的依据,即这个id必须在统计上必须是完全随机的。于是,对这个id有:随机性的要求。
同时,id生成算法升级,理论上对业务系统是透明的。于是,对这个id的生成有:独立性需求。
为了保证id生成的上述特性,要有一个:
- uint64_t GenID()
的独立方法(或者独立接口)来生成id,生成id具体做什么用,该方法不关心,可以是用来做uid,也可以是用来做oid,甚至log-id。
当然,id生成的具体细节,业务也不用关心。即,GenID()的内部实现,可以是利用数据库的自增id,也可以使用时间递增,目前行业内最流行的,是仿照snowflake生成分布式id。
这个封装,屏蔽了id生成的细节,保留方案升级的可能性,是系统设计中,解耦的体现。 如果使用了此类方法生成业务id,数据库由单库扩展多库就很容易了:
假如架构设计前期没有提前考虑独立的id生成,后期又要实施单库拆多库,该怎么办呢?
二、针对星球水友提到的例子
历史的坑已经铸成,没有解耦id生成方法,而且也没法批量修改id,该怎么办呢?
假设由单库拆分为3库,可以这么玩:
做一个1主2从数据库集群,相当于每条数据复制成了3份;
搞定,拆库扩容达成:
希望这个取巧的方法对你有帮助。
但更希望,大伙提前考虑id生成的唯一性、随机性、趋势递增性、独立性。
系统性考虑问题,知其然,知其所以然。
【本文为专栏作者“58沈剑”原创稿件,转载请联系原作者】
当前文章:用单库自增键来生成id了,后期怎么分库?哎,这个坑大!
网页路径:http://www.shufengxianlan.com/qtweb/news32/482532.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联