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