互联网时代,也是关系型数据库独领风骚的时代,从早期的oracle独步天下,到现在MySQL蒸蒸日上,关系型数据库是大多数互联网应用在数据可靠性存储上的“命脉”。
随着互联网产品在体量和规模上的日益膨胀,无论是oracle还是mysql,都会第一时间面临来自磁盘,CPU以及内存等单机瓶颈,为此,产品方除了需要不断购买成本难以控制的高规格服务器,还要面临不断迭代的在线数据迁移。在这种情况下,无论是海量的结构化数据还是快速成长的业务规模,都迫切需要一种水平扩展的方法将存储成本分摊到成本可控的商用服务器上,同时,也希望通过线性扩容降低全量数据迁移对线上服务带来的影响,分库分表方案便应运而生。
分库分表的原理是将数据按照一定的分区规则sharding到不同的关系型数据库中,应用再通过中间件的方式访问各个shard中的数据。分库分表的中间件,隐藏了数据sharding和路由访问的各项细节,使应用大多数场景下可以像使用单机数据库一样使用分库分表后的分布式数据库。业界中,网易DDB,阿里TDDL,corbar,mycat以及hotdb等系统都是分库分表中间件中的佼佼者。
背景——十年一剑
DDB(全称Distributed database)是网易杭研院立项最早,应用最为广泛的后台产品之一,也是国内最早出现的数据库分库分表中间件。
最早可以追溯到2006年,网易杭研成立之初,为了应对网易博客这个日活超过800W的大体量应用,由现任杭研院院长的汪源带队主导开发了DDB这套分库分表数据库,伴随着博客的成长,DDB集群也从最早的20+节点,到40+节点,最后到现在云端100+个RDS实例。除了博客外,十年来DDB也见证了很多其他的大体量应用,如易信,云音乐,云阅读,考拉等。在大家耳熟能详的网易互联网产品中,几乎都可以看到DDB的身影。
经过10年的发展和演变,DDB的产品形态已全面趋于成熟,功能和性能得到了众多产品的充分验证,下面罗列一些大家比较关注的功能特性:
- 与SQL92标准的兼容度达90%以上
- 支持跨库join和跨库事务,支持大部分标量函数
- 支持count,sum,avg,max,concat等常用聚合函数
- 支持与MySQL高度一致的用户管理
- 支持读写分离和数据节点高可用
- 支持数据节点在线扩缩容,在线更改表分布
- 提供有完善的数据库管理工具,WEB工具以及命令行工具
- 数据节点支持oracle和mysql
目前DDB在网易内部有近50个产品使用,最大集群过百数据节点,大部分部署在云端,为应用提供透明,无侵入,MySQL标准协议的分库分表服务。
DDB演变之路
十年来,DDB经历了三次服务模式的重大更迭,从最早的Driver模式,到后来的Proxy模式,再到近几年的云模式,DDB服务模式的成长也深刻反映着互联网流行架构的变迁。
Driver模式
Driver模式的特点在于应用通过DDB提供的JDBC Driver来访问DDB,类似与通过MySQL的JDBC驱动访问MySQL。而对于MySQL的驱动connector/J,只需要实现将SQL按照特定协议编码和转码即可。而DDB的驱动为了实现透明的分库分表,需要做很多额外的工作,如下图所示:
DBI Driver内部模块简图
当DDB D]river执行一条SQL时,会经历以下几个步骤:
- 由语法解析器解析SQL,生成抽象语法树parsed tree,并根据是否PreparedStatement决定是否进入PTC(parsed tree cache),PTC保存了SQL模式到语法树的映射,对PreparedStatement SQL,会优先进入PTC中查询语法树
- 根据语法树和启发式规则生成分布式执行计划,这个过程中会涉及到多个步骤的SQL转换和优化,如条件合并,join拆分,limit转化等
- 由SQL执行器按照执行计划和语法树生成下发给每个数据节点的真实SQL,然后通过标准数据库驱动将SQL下发给各个数据节点,这个过程为并发执行。
- 将各个数据节点返回的结果按照执行计划进行合并,并返回上层。具体的合并操作可能在应用调用结果时动态执行。
DBI模块作为DDB提供给应用的JDBC 驱动,包含了完整的透明分库分表逻辑,是DDB最为核心的组件,除此之外,DDB中还有用于元数据管理和同步的master组件,数据库管理工具dbadmin,以及命令行工具isql,DDB的Driver模式整体架构如下图所示: