声明:本系列教程參考资料《Mysql性能调优与架构设计》
Why Mysql?
大家可能怀疑。数据库有好多种,为什么选择Mysql作为数据切分的案例,为什么不选择Oracle、MS SqlServer或者DB2等等。
原因是大家都知道,淘宝网最開始选择LAMP的架构设计。即Linux+Apache+Mysql+PHP,最開始系统遇到的瓶颈是当时PHP不支持数据库连接池,国外当时有一个支持连接池的PHP技术。可是价格很昂贵,后来不得不将核心业务用Java改写,经过一段时间的发展,淘宝的架构变成
Java+ibatis+Oracle,可是Oracle须要跑到IBM的微型机上。成本相当高。这时淘宝又选择了Mysql,由于Mysql是第一个在Linux下执行的数据库,集群性能和稳定性特别好,对server的性能要求也不高,所以淘宝最新的系统很多其它的是用Mysql来承担的。
抛开淘宝,京东、新浪等等都是选择Mysql,他们在大数据的处理上面都选择Mysql。证明应用Mysql数据库是一个不错的选择。
什么是数据切分?
数据切分(Sharding)是指通过某种特定的条件。将我们存放在同一个数据库中的数据分散存放到多个数据库(主机)上面。以达到分散单台设备负载的效果。
数据的切分同一时候还能够提高系统的整体可用性,由于单台设备Crash之后,仅仅有整体数据的某部分不可用,而不是全部的数据。
数据的切分(Sharding)依据其切分规则的类型,能够分为两种切分模式。一种是依照不同的表(或者Schema)来切分到不同的数据库(主机)之上。这样的切能够称之为数据的垂直(纵向)切分。第二种则是依据表中的数据的逻辑关系,将同一个表中的数据依照某种条件拆分到多台数据库(主机)上面,这样的切分称之为数据的水平(横向)切分。
垂直切分还是水平切分?
垂直切分的最大特点就是规则简单,实施也更为方便,尤其适合各业务之间的耦合度非常低。相互影响非常小,业务逻辑非常清晰的系统。在这样的系统中。能够非常easy做到将不同业务模块所使用的表分拆到不同的数据库中。依据不同的表来进行拆分,相应用程序的影响也更小,拆分规则也会比較简单清晰。
水平切分于垂直切分相比,相对来说略微复杂一些。由于要将同一个表中的不同数据拆分到不同的数据库中,对于应用程序来说,拆分规则本身就较依据表名来拆分更为复杂,后期的数据维护也会更为复杂一些。
在我们的系统中,假设用垂直切分足够解决这个问题,那么我们首选垂直切分,垂直切分带来的优点是不言而喻的,假如垂直切分仍然不能满足要求的时候,那么我们就不得不垂直切分和水平切分联合使用了,可是进行水平切分的时候一定要细致斟酌切分规则,不同的切分规则会带来截然不同的维护成本。尽量做到符合业务需求。
Why Sharding?
理由一般是这种。要么数据量非常大。要么并发非常大,总之,由于数据库不能非常好的为他的client服务了。
大家有没有想过,腾讯的QQ号是放在一个数据库了吗?新浪的微博信息是存放在一张表里了吗?还有微信的聊天记录是放在一个数据库的一张表了吗?答案当然是否定的。
几个亿的QQ号、海量的微博信息和聊天记录放在一个数据库的一张表里无疑是一场灾难。如此大的数据量就要用到数据的切分技术。
数据的切分不光是解决大数据的问题。同一时候也会给高并发提供了一定的帮助。对于聊天记录,我们能够利用数据的垂直切分。将聊天记录业务与其它业务分离开来。这样client訪问数据库的时候能够有更理想的性能。同一时候,我们能够利用水平切分,每一个人一张表,这样能够保证每一个人读取自己的聊天记录的时候也会有更理想的效果,当然,即使你这样做了。数据量还是非常大,你也能够依据业务进行更大力度的切分,一般垂直切分和水平切分联合使用能够解决大部分问题。