第 1 章引言
随着互联网应用的广泛普及,海量数据的存储和访问成为了系统设计的瓶颈问题。对于一个大型的互联网应
用,每天几十亿的 PV 无疑对数据库造成了相当高的负载。对于系统的稳定性和扩展性造成了极大的问题。通过数
据切分来提高网站性能,横向扩展数据层已经成为架构研发人员首选的方式。水平切分数据库,可以降低单台机
器的负载,同时最大限度的降低了了宕机造成的损失。通过负载均衡策略,有效的降低了单台机器的访问负载,
降低了宕机的可能性;通过集群方案,解决了数据库宕机带来的单点数据库不能访问的问题;通过读写分离策略
更是最大限度了提高了应用中读取(Read)数据的速度和并发量。目前国内的大型互联网应用中,大量的采用了
这样的数据切分方案,Taobao,Alibaba,Tencent,它们大都实现了自己的分布式数据访问层(DDAL)。
以实现方式和实现的层次来划分,大概分为两个层次(Java 应用为例):JDBC 层的封装,ORM 框架层的实
现。就 JDBC 层的直接封装而言,现在国内发展较好的一个项目是被称作“变形虫”(Amoeba)的项目,由阿里集团
的研究院开发,现在仍然处于测试阶段(beta 版),其运行效率和生产时效性有待考究。就 ORM 框架层的实现
而言,比如 Taobao 的基于 ibatis 和 Spring 的的分布式数据访问层,已有多年的应用,运行效率和生产实效性得
到了开发人员和用户的肯定。本文就是以 ORM 框架层为基础而实现的分布式数据访问层。本课题的难点在于分库
后,路由规则的制定和选择以及后期的扩展性,比如:如何做到用最少的数据迁移量,达到扩充数据库容量(增
加机器节点)的目的。核心问题将围绕数据库分库分表的路由规则和负载均衡策略展开。
第 2 章基本原理和概念
2.1 基本原理:
人类认知问题的过程总是这样的:what(什么)-why(为什么)-how(怎么
做),接下来,本文将就这三个问题展开讨论和研究:
2.1.1 什么是数据切分
%%"Shard" 这个词英文的意思是"碎片",而作为数据库相关的技术用语,似乎最早见于大型多人在线角色扮演游戏
中。"Sharding"姑且称之为"分片"。Sharding 不是一门新技术,而是一个相对简朴的软件理念。众所周知,
MySQL 5 之后才有了数据表分区功能,那么在此之前,很多MySQL 的潜在用户都对MySQL 的扩展性有所顾虑,
而是否具备分区功能就成了衡量一个数据库可扩展性与否的一个关键指标(当然不是唯一指标)。数据库扩展性是一
个永恒的话题,MySQL 的推广者经常会被问到:如在单一数据库上处理应用数据捉襟见肘而需要进行分区化之类
的处理,是如何办到的呢? 答案是:Sharding。
Sharding 不是一个某个特定数据库软件附属的功能,而是在具体技术细节之上的抽象处理,是水平扩展
(ScaleOut,亦或横向扩展、向外扩展)的解决方案,其主要目的是为突破单节点数据库服务器的I/O 能力限制,
解决数据库扩展性问题。
通过一系列的切分规则将数据水平分布到不同的 DB 或 table 中,在通过相应的 DB 路由或者 table 路由规则
找到需要查询的具体的 DB 或者 table,以进行 Query 操作。这里所说的“sharding”通常是指“水平切分”,这也