5.1 数据库瓶颈阻碍业务的持续发展
在淘宝平台向共享服务体系改造的过程中,通过各个服务中心拥有各自独立数据库的方式,即采用数据垂直分区的方式对业务数据进行分区,确实在很大程度上缓解了当时数据库连接数资源捉襟见肘和数据库因为表多、数据多造成的性能等问题。从当时淘宝业务突飞猛进式的发展势头来看,单一服务中心的数据访问压力也必然很快会达到单机数据库的承载上限,所以在进行服务化改造的同一时间段内,淘宝技术团队也开始了对数据库能力扩展的工作。
首先实施的是数据库的读写分离(如图5-1所示)。读写分离基本原理是让主数据库处理事务性增、改、删(INSERT、UPDATE、DELETE)操作,而从数据库专门负责处理查询(SELECT)操作,在数据库的后台会把事务性操作导致的主数据库中的数据变更同步到集群中的从数据库。
图5-1 采用读写分离方式扩展数据库读写能力
采用读写分离的方式,拓展了数据库对数据读的处理能力,整体上也大大提升了数据库的读写能力。但这样的架构在主数据库的数据写入能力依然没法扩展,一旦数据库写压力比较大时,则对整个平台带来非常大的影响。而且数据库单表的数据量是有限制的,当单表数据量达到一定数量后数据库性能会出现显著下降的情况,所以简单的读写分离方案并不能满足淘宝业务发展的要求。
基于数据库分区的思路,当出现单个表的数据量很大的情况,则需要采用水平分区的方式对数据进行拆分,即将同一个表中的不同数据拆分到不同的数据库中,以用户中心的应用为例(如图5-2所示),淘宝平台的用户量已接近6亿,将所有用户的信息保存到MySQL数据库上,如果不采用数据水平拆分的方式,这6亿条数据且不说数据的读写访问性能,就连存到一个数据库的单表中都是不可能的一件事。在图5-2中,示意了对用户数据按照用户ID进行hash取模的方式实现用户数据平均分布在8个(对6亿数据进行拆分的数据库数量会远大于8个,在此只为示意)数据库中,确保了单个数据库中保存的数据量在单机数据库能提供良好读写性能的范围之内。
单单对数据进行拆分的操作本身不复杂,但在很多实际的业务场景中,不可避免会出现跨库的表join、事务操作,以及数据的统计、排序等情况,而且数据进行了拆分后,对于数据库的运维管控也提出了更高的要求。为了更好地在数据库层面支持好淘宝的业务,在2008年,阿里巴巴内部开始了分布式数据库的研发工作,相关的平台和工具陆续登上了淘宝技术发展史的历史舞台。
图5-2 用户数据按用户ID取模进行数据均衡拆分
