【MySQL】分库分表

[亡魂溺海] 提交于 2020-10-27 19:52:12

一、常见问题

       1、为什么要分库分表(设计高并发系统的时候,数据库层面该如何设计)?用过哪些分库分表中间件?不同的分库分表中间件都有什么优点和缺点?你们是如何对数据库进行垂直拆分或水平拆分。

       2、如何设计可以动态扩容的分库分表方案?

       3、分库分表之后,ID如何处理。

二、为啥要分库分表

       其实,这块肯定是扯到高并发了,因为分库分表一定是为了支撑高并发、数据量大两个问题。而且现在说实话,尤其是互联网公司类的公司面试,基本上都会来这么一下。分库分表如何普通的技术问题,不问实在不行,而如果你不知道那也实在说不过去。

       说白了,分库分表是两回事,大家可别搞混了,可能光分库不分表,也可能光分表不分库。都有可能,先给大家抛出一个问题。

       随着用户量的增长,每天活跃用户数上千万。每天单表新增数据,多个50万。目前1个表的总容量都已经达到两三千万啦!数据库磁盘容量不断消耗掉,高峰期并打达到了5000-8000。单机系统支撑不到现在。公司业务发展越好,用户就越多,数据量越大,请求量越大。那单个数据库一定扛不住。

       假设把MySQL从单机变成了三机。

       ① MySQL从单机变成了三机,现在可以承受的并发增加了3倍。

       ② 将原来3千万数据从1个库分到了3个库,每个库就1/3的数据量,数据库服务器的磁盘使用率大大降低。

       ③ 原来1个单表是3千万数据,一个SQL要花3秒去跑,拆分之后,每个库的每个表就1千万数据,一个SQL花1秒去跑就可以啦。   

三、用过哪些分库分表中间件,不同的分库分表中间件都有什么优点和缺点?

       比较常见的包括sharding-jdbc、mycat。

       1、sharding-jdbc:当当网开源的,属于client层方案。支持分库分表、读写分离、分布式ID生成、柔性事务(最大努力送达形事务、TCC事务)。

       2、mycat:基于cobar改造的,属于proxy层方案。支撑的功能非常完善,不断流行的数据库中间件,社区很活跃。

       sharding-jdbc这种client层方案的优点在于不用部署,运维成本低。但是如果遇到需要升级啥的需求各个系统都重新升级版本再发布;mycat这种proxy层方案的缺点在于需要部署及运维一套中间件。运维成本高。但是好处在于对各个项目是透明的,如果遇到升级,只需要搞中间件那里就ok。

        一般建议中小公司使用sharding-jdbc。client层方案轻便,而且维护成本低,不需要额外增派人手,中小公司系统复杂度会低一些。项目也没那么多。但是中大型公司最好还是选用mycat这类proxy层方案,因为可能大公司系统和项目非常多。团队很大,人员充足,最好专门弄个人来研究和维护mycat。然后大量项目直接透明使用。

四、你们具体是如何对数据库进行垂直拆分或水平拆分

1、垂直拆分:

                  

       把常用的字段放在一张表,把不常用的字段放在另一张表。

其实这个挺常见的,把一个大表拆开。订单表、订单支付表、订单商品表。

2、水平拆分:

                       

                                                          

分成3个库,1个库里4个表。每个表的数据量从原来的单表600万,变成每个表50万。SQL的执行效率可能会增加好几倍。单库最高承受2000/s的QPS,3个库最高承受6000/s的QPS。假设原来单个库600万数据。占据了600M的磁盘空间。现在单库200万数据,仅仅占用200MB的磁盘空间。

       一般来说,分库分表其实就是指的水平拆分。垂直拆分一般做业务涉及的时候就进行了拆分。一般是按照某个关键字段取余。  

五、如何设计可以动态扩容的分库分表方案

       1、停机扩容

       这个方案和停机迁移一样,步骤几乎一致。唯一的点就是那个导数的工具。是吧现有表里的数据查出来插入到新表里去,但是最好别这么晚,因为不靠谱。既然分库分表就说明数据量实在太大了。可能多达几亿条、甚至几十亿。这么玩,可能会出问题。

       从单库单表迁移到分库分表,数据量并不是很大,单表最大也就两三千万。写个工具,多弄几台机器并行跑。1个小时数据就导完了。

     2、优化后的方案

       01_分库分表的扩容方案

       一开始上来就是32个库,每个库32个表。1024张表。这个分法,第一,基本上国内的互联网公司基本上是够用了。第二,无论是并发支撑还是数据量支撑都没问题。

       每个库正常承载的并发量是1000,那么32个库就可以承载32*1000=32000的写并发。如果每个库承载1500的写并发,32*1500=48000,接近5万每秒的写入并发。前面再加一个MQ,削峰,每秒写入MQ8万条数据,每秒消费5万条数据。

       1024张表,假设每个表放500万数据,在MySQL里面可以放50亿条数据。5万/s的写并发,总共50亿条数据,对于大部分公司而言足够了。

       谈及分库分表的扩容,第一次分库分表就给他分个够。32个库,1024张表。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!