读Youku架构之体会
原文连接:http://www.docin.com/p-24581860.html
youku数据库架构演进历史:单机->主从复制->垂直拆分->水平切片
感悟:
互联网应用与企业应用的区别之一在于系统用户的不确定性。
基于互联网的应用在早期的设计可能非常简单,数据库只是一台单机,访问量和数据量都非常的少,然而随着系统的受欢迎程度得到提升,会有越来越多的用户注册进来,所带来的问题便是数据库的吞吐量逐渐增大,以至于早期的设计不能满足现在的需求。需要引入集群,来实现性能扩充,集群的扩充方式有两种,复制和拆分。
如果系统的数据量有限而系统用户不断攀升,那么复制是合理的解决方案:
如图所示,所有的写操作集中在主数据库上进行,然后将主数据库中的数据同步到从服务器中,读操作在从服务器上进行,以此实现读写分离。该方式有效提升了数据库的读操作性能,但是写操作并没有得到扩充,因此主从复制适用于那些写操作很少,但是读操作很多的系统中使用(读操作远远大于写操作)。
除了复制,集群的另外一种扩充方式便是拆分,拆分的方式也有两种,一种是垂直拆分,还有一种是水平切片。
为何要进行拆分?如果系统数据每日都在递增,那么数据库终究会有饱和的一日,我们能想到的最本质的方法便是将一台数据库拆分成多台来分散这些数据的存储。
垂直拆分
垂直拆分是指按数据库的表结构进行拆分,比如数据库有3张表,表A、表B和表C,可分别把三张表拆分到3个不同的数据库中,以此来增加数据库的饱和度。可垂直拆分的前提是表结构之间必须是松散的,不存在join连接。表结构的拆分通常伴随着服务的拆分,比如将系统拆分成多个模块,或将模块拆分成多个应用,便可将模块以及应用在后台的数据从主数据库中独立出去。
垂直拆分虽然一定程度上缓解了数据库的饱和度,但是这种扩充并不是无限的,因为数据库的表格是有限的。而一旦单表数据量达到饱和,便只能引入另外一种拆分方式,水平切片。
水平切片是将表格在水平方向上拆分成多个单元,将每个单元分散到不同的数据库中存储,以此来实现容量的扩充。
理论上讲水平切片是可无限扩充的,通过增加机器节点即可。但是在查询过程中也会遇到一些棘手的问题,比如跨shard分页查询还有排序,办法之一是通过引入聚合服务器来对多个shard进行并行处理,然后将结果ID返回给客户端,在客户端进行分页处理(通过ID去缓存中取出相应数据)。当然最好的方法是避免出现跨shard查询的情况,通过对业务需求的透彻了解来对数据库表格进行合理的切片。
互联网应用与企业应用系统的另一区别:互联网应用约束性较低
基于互联网的应用数据量过于庞大,在用户检索信息时,只需要返回质量较高的数据即可;而基于企业的软件设计需要返回所有匹配数据。由于约束性的降低导致互联网的应用设计可以更加的灵活。
经验方法:
将数据量很大而且每日不断增长的数据信息独立出来做切片,同时引入聚合服务器来对所有切片进行并行处理;
数据库建表阶段,表格之间最好不要有join关联,为以后垂直拆分提供便利;
系统在创建初期到逐渐成熟,是架构反复迭代的过程,架构为需求而设计,没有最好的架构只有最合适的架构。没有必要一开始就创建一个很大的笼子想要装下一头大象,而最终的结果只是装一只鸡。