测试过程中对分库分表的理解

分库分表背景

分库:

    比如为了区分不同的业务系统,实现多个系统的解耦合,将各个系统拆分到单独的数据库去运行,解决了表过多的问题,更有利于系统数据库的稳定性和易维护,及当一个数据库出现问题不会影响到其他的库,然后对于运营来说也好维护备份。

分表:

    比如最近改变了对账方式,因为要涉及存储大量客户的还款计划数据、对账时的请求量也会加大,单个的表数据量过大的话会极大影响SQL的执行性能,对于前端业务人员查看客户还款计划数据的时候页面上响应也会很慢,所以单表已无法满足需要,基于此原因要做分表处理。

分库

分库策略

    确定分库方式:垂直切分还是水平切分,目前涉及到的是垂直切分。 确定是按照range来分还是按照某个字段hash均匀分散。range即每个库一端连续的数据,一般按照时间范围来处理,但是这种做法会导致大量的流量都打到最新的数据上所以使用的较少,优点是扩容比较容易;hash比较常用,是按照某个字段hash一下均匀分布,优点是将数据量和请求平均分配给每个库和表。 数据库中间件的选取。 首先明白中间件可以发挥什么作用:中间件可以根据你指定的某个字段值如userid,自动路由到对应的库对应的表中。 常见的分库分表中间件有cobar,TDDL,atlas,sharding-jdbc,mycat。sharding-jdbc支持分库分表、读写分离、分布式id生成等。

分表

分表策略

    目前涉及到的分表方式属于水平切分,水平切分意为拆分的表的结构完全相同,即将数据分不到多个库中的多个表中,比如某表按日拆分为多个表,plan_0,plan_1,plan_2,plan_3,......,plan_29,每个表中的字段数量和名称是完全一致的。 另一个分表方式属于垂直分表,即如果表中的字段数量太多会导致查询缓慢等性能问题的时候可以用到垂直分表,比如某表共100个字段,可将前50个字段建表A_1,后50个字段建表A_2,一般可以把访问频率较高的放到一起放到一个表,访问频率低的字段放到其他表中,因为数据库的缓存问题,这样设置的话会有更好的性能体验。 确定是按照range来分还是按照某个字段hash均匀分散,根据业务特点来选择。 如果根据数值范围来切分,比如订单号是1~10000的客户放到第一个表,10001~20000放到第二个表,以此类推。 根据数值取模来切分,比如业务特点是每天都会产是新的业务,则可以通过日期除以30取模落对应分表。 数据库中间件的选取,通常使用sharding-jdbc。

测试过程中分库分表的测试思路

    按照现有分表结果来确认用例,举例,如果程序落数是按照日期来落到分表,可以考虑 通过边界值用例设计法,选取某月边界日期如20210101,20210131,20210201,20210228来触发程序落数并校验结果。 通过等价类划分法,选取月中的日期做校验。 性能方面可以考虑通过循环语句批量创建大量的各个日期的客户数据来落库落表。sql写法见本人文章,命令四:SQL命令

参考

经验分享 程序员 微信小程序 职场和发展