分表

分库分表在项目中只是用到了分表。。。html

前序mysql


1、中间件TDDL

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



2、TDDL层次结构


tddl是JDBC或者持久框架层与底层JDBC驱动交互的桥梁,或者也能够称之为中转站数据库

一、matrix层 :Matrix 分库分表。包括SQL解释、优化和执行等

分库分表带来的最直接的影响是数据访问的路由。
路由算法有如下几种:a)固定哈希算法 b)一致性哈希算法 c)虚拟节点
  • 核心是规则引擎架构

  • 实现分库分表并发

  • 主要路径:sql解析 => 规则引擎计算(路由):转发 => 执行 => 合并结果oracle

二、group层 :Group 层是通过读写分离和主备切换才会出现最底层

  • 读写分离框架

  • 权重计算性能

  • 写HA切换

  • 读HA切换

  • 动态新增slave(atom)节点

三、atom层 :Atom 模块真正和物理数据库交互,提供数据库配置动态修改能力

Atom 层,它面对的是实实在在的每个数据库,更多的工做在与对数据库的链接管理,好比说当数据库的 IP 地址发生改变时,Atom 层要动态感知,以避免链接找不到地址。
  • 单个数据库的抽象;

  • ip /port /user /passwd /connection 动态修改,动态化jboss数据源

  • thread count(线程计数):try catch模式,保护业务处理线程

  • 动态阻止某些sql的执行

  • 执行次数的统计和限制



3、整个执行过程

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)数据库水平拆分路由


四,TDDL其余特性

  • 支持oracle和mysql

  • 支持主备动态切换

  • 支持带权重的读写分离

  • 支持分库分表

  • 支持主键生成:oracle用sequence来生成,mysql则须要创建一个用于生成id的表

  • 支持单库事务,不支持夸库事务

  • 支持多库多表分页查询,但会随着翻页,性能下降

相关文章
相关标签/搜索