博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
TDDL
阅读量:5975 次
发布时间:2019-06-19

本文共 2328 字,大约阅读时间需要 7 分钟。

hot3.png

  1. 互联网当下的数据库拆分过程

对于一个刚上线的互联网项目来说,由于前期活跃用户数量并不多,并发量也相对较小,所以此时企业一般都会选择将所有数据存放在 一个数据库 中进行访问操作。但随着后续的市场推广力度不断加强,用户数量和并发量不断上升,这时如果仅靠一个数据库来支撑所有访问压力,几乎是在 自寻死路 。所以一旦到了这个阶段,大部分Mysql DBA 就会将数据库设置成 读写分离状态 ,也就是一个 Master 节点对应多个Salve 节点。经过 Master/Salve 模式的设计后,完全可以应付单一数据库无法承受的负载压力,并将访问操作分摊至多个 Salve 节点上,实现真正意义上的读写分离。但大家有没有想过,单一的 Master/Salve 模式又能抗得了多久呢?如果用户数量和并发量出现 量级 上升,单一的 Master/Salve 模式照样抗不了多久,毕竟一个 Master 节点的负载还是相对比较高的。为了解决这个难题, Mysql DBA 会在单一的 Master/Salve模式的基础之上进行数据库的 垂直分区 (分库)。所谓垂直分区指的是可以根据业务自身的不同,将原本冗余在一个数据库内的业务表拆散,将数据分别存储在不同的数据库中,同时仍然保持 Master/Salve 模式。经过垂直分区后的 Master/Salve 模式完全可以承受住难以想象的高并发访问操作,但是否可以永远 高枕无忧 了?答案是否定的,一旦业务表中的数据量大了,从维护和性能角度来看,无论是任何的 CRUD 操作,对于数据库而言都是一件极其耗费资源的事情。即便设置了索引, 仍然无法掩盖因为数据量过大从而导致的数据库性能下降的事实 ,因此这个时候 Mysql DBA 或许就该对数据库进行 水平分区 (分表, sharding ),所谓水平分区指的是将一个业务表拆分成多个子表,比如 user_table0 、 user_table1 、 user_table2 。子表之间通过某种契约关联在一起,每一张子表均按段位进行数据存储,比如 user_table0 存储 1-10000 的数据,而 user_table1 存储 10001-20000 的数据,最后 user_table3 存储20001-30000 的数据。经过水平分区设置后的业务表,必然能够将原本一张表维护的海量数据分配给 N 个子表进行存储和维护,这样的设计在国内一流的互联网企业比较常见,如图 1-1 所示:

图 1-1 水平分区

上述笔者简单的讲解了数据库的分库分表原理。接下来请大家认真思考下。原本一个数据库能够完成的访问操作,现在如果按照分库分表模式设计后,将会显得非常麻烦,这种麻烦尤其体现在 访问操作 上。因为持久层需要判断出对应的数据源,以及数据源上的水平分区,这种访问方式我们称之为访问 “ 路由 ” 。按照常理来说,持久层不应该负责数据访问层 (DAL) 的工作,它应该只关心 one to one 的操作形式,所以淘宝的 TDDL 框架诞生也就顺其自然了。

二、TDDL 的架构原型

TDDL 就是淘宝的分布式数据层。主要解决了分库分表对应用的透明化以及异构数据库之间的数据复制(或者说分库分表场景下的访问路由(持久层与数据访问层的配合)以及异构数据库之间的数据同步 ),它是一个基于集中式配置的 jdbc datasource实现,具有主备,读写分离,动态数据库配置等功能。

额外话:就目前而言,许多大厂也在出一些更加优秀和社区支持更广泛的 DAL 层产品,比如Hibernate Shards 、 Ibatis-Sharding 等。

204916_CaN3_1164691.png

淘宝很早就对数据进行过分库的处理, 上层系统连接多个数据库,中间有一个叫做DBRoute的路由来对数据进行统一访问。DBRoute对数据进行多库的操作、数据的整合,让上层系统像操作 一个数据库一样操作多个库。但是随着数据量的增长,对于库表的分法有了更高的要求,例如,你的商品数据到了百亿级别的时候,任何一个库都无法存放了,于是 分成2个、4个、8个、16个、32个……直到1024个、2048个。好,分成这么多,数据能够存放了,那怎么查询它?这时候,数据查询的中间件就要能 够承担这个重任了,它对上层来说,必须像查询一个数据库一样来查询数据,还要像查询一个数据库一样快(每条查询在几毫秒内完成),TDDL就承担了这样一 个工作。在外面有些系统也用DAL(数据访问层) 这个概念来命名这个中间件。

下图展示了一个简单的分库分表数据查询策略:

主要优点:
1.数据库主备和动态切换
2.带权重的读写分离
3.单线程读重试
4.集中式数据源信息管理和动态变更
5.剥离的稳定jboss数据源
6.支持mysql和oracle数据库
7.基于jdbc规范,很容易扩展支持实现jdbc规范的数据源
8.无server,client-jar形式存在,应用直连数据库
9.读写次数,并发度流程控制,动态变更
10.可分析的日志打印,日志流控,动态变更
TDDL必须要依赖diamond配置中心(diamond是淘宝内部使用的一个管理持久配置的系统,目前淘宝内部绝大多数系统的配置,由diamond来进行统一管理,同时diamond也已开源)。
TDDL动态数据源使用示例说明:
diamond简介和快速使用:
TDDL源码: 
TDDL复杂度相对较高。当前公布的文档较少,只开源动态数据源,分表分库部分还未开源,还需要依赖diamond,不推荐使用

转载于:https://my.oschina.net/u/2429470/blog/491822

你可能感兴趣的文章
【github&&git】1、github中的watch、star、fork的作用
查看>>
getLastSql()用法
查看>>
使用java做paypal开发时购买东西支付不成功的原因
查看>>
Java8 Lamdba表达式 002
查看>>
我的2015
查看>>
(个人)Zookeeper集群环境部署
查看>>
一个简单的freemark输入输出的案例(一)
查看>>
Cartographer安装
查看>>
linux命令dmesg查看进程被杀死原因
查看>>
nodejs中的exports和module.exports
查看>>
ulipad install on 64bit win7 has issue
查看>>
产生不重复随机数
查看>>
10 WAYS DEVELOPERS CAN IMPROVE PERFORMANCE OF THEIR APPLICATIONS
查看>>
治病記錄
查看>>
AJAX实用教程——获取博客园博文列表
查看>>
嵌入式开发之davinci--- 8168 电源调试总结
查看>>
grunt学习笔记
查看>>
matlab 学习之常用函数2
查看>>
Properties vs. Attributes
查看>>
sql推断时间
查看>>