003 分库分表_数据库分库分表设计

垂直切分与水平切分:

1.垂直切分:垂直切分的最大特点就是规则简单,实施方便,尤其适合各个业务之间的耦合度低、互相影响小、业务逻辑非常清晰的系统。在这种熊中,可以很容易做到将不同的业务模块所使用的表拆分到不同的数据库中。根据不同的表来进行拆分,对应用程序影响也更小,拆分规则会比较简单清晰。

2.水平切分:对于垂直切分相比较而言稍微复杂,因为要将同一个表中的不同数据拆分到不同的数据库中,对应用程序来说,拆分规则本身就是根据表名(业务块)更为复杂,后期的数据维护、查询、统计分析也比较复杂。水平切分常用两种情况,库层面切分,根据业务逻辑规定切分维度,对同一个库进行规则切分;表层面切分,如果同一个表的列字段过多,需要进行表切分,惯用分为核心数据主表与N个扩展的附属数据表,核心数据表操作完成后应用异步处理附属数据,从而提升性能。

数据可架构的四种境界:随业务发展,流量不断增大,数据库的架构也会随之提升境界;

分库分表设计要点:

对于高并发系统,应该需要规避的问题,在库表设计的时候及代码编写的时候要注意的点:

1.实时写场景:面对比如订单这种高并发、实时写数据场景,第一要点就是拆分,进行水平拆分去设计分表,根据一些特定的规则做路由设置,例如,根据用户的一些维度,城市维度,A城市订单存入A城市订单库/表;

2.路由表设计:合理设计路由表结构,首先要定义好路由字段,其扩展性一定要强,保障随业务扩展可以持续扩充性,如何进行结构化存储,应该采用何种维度实现,并要考虑查询、统计效率,以及业务瓶颈问题;例如,订单按照订单ID进行扩展,类似O2O行业对对订单ID组合中加入区域维度来控制信息插入特定的区域分库/表中,那么依据订单ID结合区域维度进行插入的数据在后期查询过程中保持一致性就是要考虑的问题,查询上多应用订单ID取模的方式来定位库及表获取数据;类似于统计需求,比如针对某用户历史数据统计、某特定城市数据统计,要采用异构数据库来实现,可以落入ES进行异构,异构的策略要根据实际业务场景来进行。

3.切换数据源:多库多表设计要根据压测的实际情况进行合理数量分配,并决定应用何种策略进行切换数据源、散表等。

4.数据库事务:如果有分布式事务,应该如何做?是否该应用事务?如果不启动事务,面临数据不一致性等问题如何解决;如果使用事务,需要长事务还是短事务?如果高并发下出现事务死锁,那么业务就会出现很大的问题,这些都是要考虑的方面,必须通过实践压测之后给出结论;实际工作中互联网项目依照实际性能要求高,基本不会应用任何数据库事务,其性能至少提示一个量级(10倍);

分库分表设计策略:(简单根据Uid维度)

根据Uid维度进行数据库分库分表,8个订单数据库,每个库中10张表,共计80张表;

数据源切换算法:一般采用Hash一致性算法

根据Uid计算数据库编号:        数据库编号 = (Uid / 10) % 8 + 1

根据Uid计算表编号:        表编号 = Uid % 10

当Uid=9527时,根据上面的算法,Uid除10取整为952在模8(可以整除为0),加1为数据库编号DB1;Uid模10为7,表编号为order_7,所以Uid=9527的订单信息要去DB1库中的order_7表查找。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值