国内最专业的IT技术学习网

UI设计

当前位置:主页 > UI设计 >

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

发布时间:2019/09/02标签:   算法    点击量:

原标题:用单库自增键来生成id了,后期怎么分库?哎,这
星球水友“写代码的”发问:沈教师,咱们当初用户核心是单库单表,uid应用数据库自增主键,uid被许多营业关系,不能变更。当初用户核心数据量逐渐变大,有分库需要了,怎样由单库进级为多库,坚持汗青uid稳定,而且重生成的数据不抵触,有甚么好方法么?==成绩描写完==应当有很多公司都市应用数据库“拔出数据主动自增id”来作为营业id,这类方式会使得营业与id天生强耦合,招致id天生算法难以进级。明天和各人一同简略探究下,id天生要斟酌哪些因素。画外音:别误解,不是说“自增id”欠好,是说它与营业耦合了,难以进级。1、id天生要斟酌的技巧点简直全部营业,都市有一个营业独一标识: 用户标识:uid(user-id) 新闻标识:mid(msg-id) 定单标识:oid(order-id)这个标识,在存储体系里平日是主键,主键应用聚拢索引(clustered-index),即在物理存储上以这个id排序。因而,对这个id有:独一性,趋向递增性的请求。画外音:索引《1分钟懂得差别索引的差别》。这个标识,也常常被用来做流量负载平衡,数据负载平衡的根据,即这个id必需在统计上必需是完整随机的。因而,对这个id有:随机性的请求。同时,id天生算法进级,实践上对营业体系是通明的。因而,对这个id的天生有:自力性需要。为了保障id天生的上述特征,要有一个:uint64_tGenID()的自力方式(或许自力接口)来天生id,天生id详细做甚么用,该方式不关怀,能够是用来做uid,也能够是用来做oid,乃至log-id。固然,id天生的详细细节,营业也不必关怀。即,GenID()的外部完成,能够是应用数据库的自增id,也能够应用时光递增,现在行业内最风行的,是模仿snowflake天生散布式id。这个封装,屏障了id天生的细节,保存计划进级的能够性,是体系计划中,解耦的表现。 假如应用了此类方式天生营业id,数据库由单库扩大多库就很轻易了: 断定一个路由算法,比方hash取模; 将单库中的数据,经过这个路由算法迁徙到多库中去,以完成单库数据量的增加; 经过这个路由算法查找数据(读); 经过这个路由算法拔出数据(写);如果架构计划后期没有提早斟酌自力的id天生,前期又要实行单库拆多库,该怎样办呢?2、针对星球水友提到的例子汗青的坑曾经铸成,没有解耦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沈剑”原创稿件,转载请接洽原作者】

版权信息Copyright © IT技术教程 版权所有    ICP备案编号:鲁ICP备09013610号