1、分库分表解决了那些问题?

  • 数据库分表可以解决单表海量数据的查询性能问题
  • 数据库分库可以解决单台数据库的并发访问压力问题
  • 解决系统本身IO、CPU瓶颈
  • 磁盘读写IO瓶颈,热点数据太多,尽管使用了数据库本身缓存,但是依旧有大量IO,导致sql执行速度慢
  • 网络IO瓶颈,请求的数据太多,数据传输大,网络带宽不够,链路响应时间变长
  • CPU瓶颈,尤其在基础数据量大单机复杂SQL计算,SQL语句执行占用CPU使用率高,也有扫描行数大、锁冲突、锁等待等原因

2、分库分表存在的缺陷?

问题一:跨节点数据库Join关联查询和多维度查询

  • 数据库切分前,多表关联查询,可以通过sql join进行实现
  • 分库分表后,数据可能分布在不同的节点上,sql join带来的问题就比较麻烦
    解决办法:冗余双写。建立另一个表,根据用户ID或账号手机号字段分表,把数据写到另一个表。(会带来分布式事务的问题)写到nosql里边,比如es,通过kafka中间件写入到es。
  • 问题二:分库操作带来的分布式事务问题
  • 操作内容同时分布在不同库中,不可避免会带来跨库事务问题,即分布式事务
  • 解决方案:可以使用seate、rabbitmq异步+task定时任务解决
  • 问题三:执行的SQL排序、翻页、函数计算问题
  • 分库后,数据分布再不同的节点上, 跨节点多库进行查询时,会出现limit分页、order by排序等问题
  • 而且当排序字段非分片字段时,更加复杂了,要在不同的分片节点中将数据进行排序并返回,然后将不同分片返回的结果集进行汇总和再次排序(也会带来更多的CPU/IO资源损耗)
  • 问题四:数据库全局主键重复问题
  • 常规表的id是使用自增id进行实现,分库分表后,由于表中数据同时存在不同数据库中,如果用自增id,则会出现冲突问题
    解决办法:使用mybatis-plus自带的雪花算法。但是需要避免时针回调。部署多台服务器,时间需要保持一致。
  • 问题五:容量规划,分库分表后二次扩容问题
  • 业务发展快,初次分库分表后,满足不了数据存储,导致需要多次扩容
    解决办法:使用分库分表中间件的API来进行自定的的分库分表。精准分片算法。