快速,持续,稳定,傻瓜式
支持Mysql,Sqlserver数据同步

数据库分库分表策略的具体实现方案

请联系QQ:1793040 索取软件

来源:https://blog.csdn.net/xlgen157387/article/details/53976153

一、MySQL扩展具体的实现体例
随着业务规模的不竭扩大,需要选择合适的方案去应对数据规模的增长,以应对逐渐增长的拜候压力和数据量。
关于数据库的扩展主要包含:业务拆分、主从复制,数据库分库与分表。这篇文章主要讲述数据库分库与分表
(1)业务拆分
在 大型网站应用之海量数据和高并发解决方案总结一二 一篇文章中也具体讲述了为什么要对业务进行拆分。
业务起步初始,为了加快应用上线和快速迭代,很多应用都采取集中式的架构。随着业务系统的扩大,系统变得越来越复杂,越来越难以维护,开发效率变得越来越低,并且对资源的消耗也变得越来越大,通过硬件提高系统性能的体例带来的本钱也越来越高。
因此,在选型早期,一个优良的架构设计是后期系统进行扩展的重要保障。
例如:电商平台,包含了用户、商品、评价、订单等几大模块,最简单的做法就是在一个数据库中别离建立users、shops、comment、order四张表。

数据库分库分表策略的具体实现方案-1.jpg

登录/注册后可看大图

可是,随着业务规模的增大,拜候量的增大,我们不克不及不对业务进行拆分。每一个模块都使用零丁的数据库来进行存储,不合的业务拜候不合的数据库,将原本对一个数据库的依赖拆分为对4个数据库的依赖,这样的话就酿成了4个数据库同时承担压力,系统的吞吐量自然就提高了。

数据库分库分表策略的具体实现方案-2.jpg

登录/注册后可看大图

(2)主从复制
1、MySQL5.6 数据库主从(Master/Slave)同步安装与配置详解:
http://blog.csdn.net/xlgen157387/article/details/51331244
2、MySQL主从复制的常见拓扑、原理阐发以及如何提高主从复制的效率总结:
http://blog.csdn.net/xlgen157387/article/details/52451613
3、使用mysqlreplicate命令快速搭建 Mysql 主从复制:
http://blog.csdn.net/xlgen157387/article/details/52452394
上述三篇文章中,讲述了如何配置主从数据库,以及如何实现数据库的读写分手,这里不再赘述,有需要的选择性点击查看。

数据库分库分表策略的具体实现方案-3.jpg

登录/注册后可看大图

上图是网上的一张关于MySQL的Master和Slave之间数据同步的过程图。
主要讲述了MySQL主从复制的原理:数据复制的实际就是Slave从Master获取Binary log文件,然后再本地镜像的执行日志中记录的操作。由于主从复制的过程是异步的,因此Slave和Master之间的数据有可能存在延迟的现象,此时只能包管数据最终的一致性。
(3)数据库分库与分表
我们知道每台机器无论配置何等好它都有自身的物理上限,所以当我们应用已经能触及或远远超出单台机器的某个上限的时候,我们惟有寻找另外机器的帮忙或者继续升级的我们的硬件,但常见的方案还是通过添加更多的机器来共同承担压力。
我们还得考虑当我们的业务逻辑不竭增长,我们的机器能不克不及通过线性增长就能满足需求?因此,使用数据库的分库分表,能够立竿见影的提升系统的性能,关于为什么要使用数据库的分库分表的其他原因这里不再赘述,主要讲具体的实现策略。请看下边章节。
2、分表实现策略
关键字:用户ID、表容量
对大部分数据库的设计和业务的操作基本都与用户的ID相关,因此使用用户ID是最经常使用的分库的路由策略。用户的ID可以作为贯穿整个系统用的重要字段。因此,使用用户的ID我们不但可以便利我们的查询,还可以将数据平均的分派到不合的数据库中。(固然,还可以根据类别等进行分表操作,分表的路由策略还有很多体例)
接着上述电商平台假设,订单表order寄存用户的订单数据,sql脚本如下(只是为了演示,省略部分细节):

数据库分库分表策略的具体实现方案-4.jpg

登录/注册后可看大图

当数据比较大的时候,对数据进行分表操作,首先要确定需要将数据平均分派到几多张表中,也就是:表容量
这里假设有100张表进行存储,则我们在进行存储数据的时候,首先对用户ID进行取模操作,根据 user_id%100 获取对应的表进行存储查询操作,示意图如下:

数据库分库分表策略的具体实现方案-5.jpg

登录/注册后可看大图

例如,user_id=101 那么,我们在获取值的时候的操作,可以通过下边的sql语句:

select * from order_1 where user_id=101

其中,order_1是根据 101%100 计算所得,暗示分表之后的第一章order表。
注意:
在实际的开发中,如果你使用MyBatis做持久层的话,MyBatis已经提供了很好得支持数据库分表的功能,例如上述sql用MyBatis实现的话应该是:
接口界说:

数据库分库分表策略的具体实现方案-6.jpg

登录/注册后可看大图

xml配置映射文件:

数据库分库分表策略的具体实现方案-7.jpg

登录/注册后可看大图

其中${tableNum} 含义是直接让参数加入到sql中,这是MyBatis支持的特性。
注意:

另外,在实际的开发中,我们的用户ID更多的可能是通过UUID生成的,这样的话,我们可以首先将UUID进行hash获取到整数值,然后在进行取模操作。

三、分库实现策略
数据库分表能够解决单表数据量很大的时候数据查询的效率问题,可是无法给数据库的并发操作带来效率上的提高,因为分表的实质还是在一个数据库上进行的操作,很容易受数据库IO性能的限制。
因此,如何将数据库IO性能的问题平均分派出来,很显然将数据进行分库操作可以很好地解决单台数据库的性能问题。
分库策略与分表策略的实现很相似,最简单的都是可以通过取模的体例进行路由。
还是上例,将用户ID进行取模操作,这样的话获取到具体的某一个数据库,同样关键字有:
用户ID、库容量
路由的示意图如下:

数据库分库分表策略的具体实现方案-8.jpg

登录/注册后可看大图

上图中库容量为100。
同样,如果用户ID为UUID请先hash然后在进行取模。
四、分库与分表实现策略
上述的配置中,数据库分表可以解决单表海量数据的查询性能问题,分库可以解决单台数据库的并发拜候压力问题。
有时候,我们需要同时考虑这两个问题,因此,我们既需要对单表进行分表操作,还需要进行分库操作,以便同时扩展系统的并发措置能力和提升单表的查询性能,就是我们使用到的分库分表。
分库分表的策略相对前边两种复杂一些,一种常见的路由策略如下:

1、中间变量 = user_id%(库数量*每个库的表数量);2、库序号 = 取整(中间变量/每个库的表数量);3、表序号 = 中间变量%每个库的表数量;

例如:数据库有256 个,每一个库中有1024个数据表,用户的user_id=262145,依照上述的路由策略,可得:

1、中间变量 = 262145%(256*1024)=1;2、库序号 = 取整(1/1024)=0;3、表序号 = 1%1024=1;

这样的话,对user_id=262145,将被路由到第0个数据库的第1个表中。
示意图如下:

数据库分库分表策略的具体实现方案-9.jpg

登录/注册后可看大图

五、分库分表总结
关于分库分表策略的选择有很多种,上文中根据用户ID应该是比较简单的一种。其他体例好比使用号段进行分区或者直接使用hash进行路由等。有兴趣的可以自行查找学习。
关于上文中提到的,如果用户的ID是通过UUID的体例生成的话,我们需要零丁的进行一次hash操作,然后在进行取模操作等,其实hash自己就是一种分库分表的策略,使用hash进行路由策略的时候,我们需要知道的是,也就是hash路由策略的优缺点,优点是:数据散布均匀;缺点是:数据迁移的时候麻烦,不克不及依照机器性能分摊数据。
上述的分库和分表操作,查询性能和并发能力都获得了提高,可是还有一些需要注意的就是,例如:原本跨表的事物酿成了散布式事物;由于记录被切分到不合的数据库和不合的数据表中,难以进行多表关联查询,并且不克不及不指定路由字段对数据进行查询。分库分表之后,如果我们需要对系统进行进一步的扩阵容(路由策略变动),将变得很是不便利,需要我们重新进行数据迁移。
最后需要指出的是,分库分表目前有很多的中间件可供选择,最常见的是使用淘宝的中间件Cobar。
GitHub地址:https://github.com/alibaba/cobara
文档地址为:https://github.com/alibaba/cobar/wiki
关于淘宝的中间件Cobar本篇内容不具体介绍,会在后边的学习中在做介绍。
另外Spring也可以实现数据库的读写分手操作,后边的文章,会进一步学习。
六、总结
上述中,我们学到了如何进行数据库的读写分手和分库分表,那么,是不是可以实现一个可扩展、高性能、高并发的网站那?很显然还不成以!一个大型的网站使用到的技术远不止这些,可以说,这些都是其中的最基础的一个环节,因为还有很多具体的细节我们没有掌握到,好比:数据库的集群控制,集群的负载均衡,灾难恢复,故障自动切换,事务管理等等技术。因此,还有很多需要去学习去研究的处所。
总之:

路漫漫其修远兮,吾将上下而求索。

更多内容回复查看:

游客,如果您要查看本帖隐藏内容请回复

相关推荐

咨询软件
 
QQ在线咨询
售前咨询热线
QQ1793040