分库分表在项目中只是用到了分表。。。html
前序mysql
TDDL(Taobao Distributed Data Layer)框架,主要用于解决分库分表场景下的访问路由(持久层与数据访问层的配合)以及异构数据库之间的数据同步,它是一个基于集中式配置的JDBC DataSource实现,具备分库分表、Master/Salve、动态数据源配置等功能。
算法
TDDL的体系架构:TDDL其实主要能够划分为3层架构,分别是Matrix层、Group层和Atom层。Matrix层用于实现分库分表逻辑,底层持有多个Group实例。而Group层和Atom共同组成了动态数据源,Group层实现了数据库的Master/Salve模式的写分离逻辑,底层持有多个Atom实例。最后Atom层(TAtomDataSource)实现数据库ip,port,password,connectionProperties 等信息的动态推送,以及持有原子的数据源分离的JBOSS数据源)。
sql
tddl是JDBC或者持久框架层与底层JDBC驱动交互的桥梁,或者也能够称之为中转站数据库
分库分表带来的最直接的影响是数据访问的路由。
路由算法有如下几种:a)固定哈希算法 b)一致性哈希算法 c)虚拟节点
核心是规则引擎架构
实现分库分表并发
主要路径:sql解析 => 规则引擎计算(路由):转发 => 执行 => 合并结果oracle
读写分离框架
权重计算性能
写HA切换
读HA切换
动态新增slave(atom)节点
Atom 层,它面对的是实实在在的每个数据库,更多的工做在与对数据库的链接管理,好比说当数据库的 IP 地址发生改变时,Atom 层要动态感知,以避免链接找不到地址。
单个数据库的抽象;
ip /port /user /passwd /connection 动态修改,动态化jboss数据源
thread count(线程计数):try catch模式,保护业务处理线程
动态阻止某些sql的执行
执行次数的统计和限制
1、执行流程
2、TDDL的工做流程相似上图,client发送一条SQL的执行语句,会优先传递给Matrix层。由Martix 解释 SQL语句,优化,并根据查询条件路由到各个group,转发sql进行查询,各个group根据权重选择其中一个Atom进行查询,各个Atom再将结果返回给Matrix,Matrix将结果合并返回给client。
具体的工做流程的能够拆分红以下图:
整个SQL执行过程
BEGIN(sql+args),输入是sql和参数
sql解析
规则计算
表名替换
选择groupDS执行sql
根据权重选择atomDS
具有重试策略的在atomDS执行sql
读写控制,并发控制,执行sql,返回结果
合并结果集
END(ResultSet),输出是结果集
3、
Matrix层会先执行如下四个过程:
a)Sql的解析。
首先将Sql语句解析成一颗抽象语法树(Abstract Syntax Tree),解析成咱们比较好处理的一个结构
b)规则的匹配与计算。
基于上一步建立的语法树查找匹配的规则,再根据规则去肯定分库分表的结果。这里有一个概念就是规则,规则这里能够简单的看作就是定义数据库怎么进行分库分表,要分红几张库几张表,库名和表名的命名是怎么样的。规则的匹配就是根据SQL的语句肯定,具体查询的子表是哪几张。
c)表名替换。
对于开发人员来讲,它查询的表直接就是select * from A.B limit 10(A为数据库名,B为数据表名)。但底层其实会把这些表名替换成相似select * from A_000.B_001,select * from A_000.B_002,select * from A_001.TABLE_001这样的形式。表名替换就是把总表的名称替换为这些子表的名字。
d)Sql的转发。根据“路由算法”转发
将上一步生成的各个sql语句转发到对应的Group进行执行。这里如上图,我查询的条件是where id = 2 or 3。那么转发给Group0的查询为where id=3,转发给group1的查询为where id =2 。查询的条件也会发生必定修改。
这样四个步骤能够在Matrix层就实现了分库分表的功能,对原始的Sql进行分解,将本来单库单表的查询语句,底层转发到多库多表并行的进行执行,提升了数据库读写的性能。
接下来由Group执行两个过程:
e)根据权重选择AtomDs。
一般会在主节点和副节点上读取数据,只在主节点上写入数据。
f)具备重试的策略地在AtomDs上执行SQL。
这个能够防止单个的AtomDs发生故障,那么会进入读重试,以确保尽量多的数据访问能够在正常数据库中访问。
而后是Atom层执行两个过程:
g)读写数控制、线程并发数控制 。同时会统计线程数、执行次数等信息。
h)执行sql,返回结果集。
Atom底层利用druid进行链接池的管理,具体查询仍是对JDBC作了必定封装。执行完Sql后将结果返回给Matrix。
最后Matrix执行最后一个过程:
i)结果集合并。Matrix将Atom层的返回的各个结果集进行合并Merge,返回给Client端。
2)路由与扩容(固定哈希算法为例)
a)数据库水平拆分路由
支持oracle和mysql
支持主备动态切换
支持带权重的读写分离
支持分库分表
支持主键生成:oracle用sequence来生成,mysql则须要创建一个用于生成id的表
支持单库事务,不支持夸库事务
支持多库多表分页查询,但会随着翻页,性能下降