TDDL动态数据源主要分为2层,每一层都实现了jdbc规范,以方便地集成到各种orm框架或者直接使用.每一层都各司其职.
整体结构如上图,TGroupDataSource(tddlgroupds)默认情况下依赖TAtomDataSource(tddlatomds),但是可以扩展依赖普通数据源.这一层主要的职责是解决读写分离以及主备切换的问题,当然是在线执行这些动作,无需重启.一个TGroupDataSource底下会挂多个TAtomDataSource,每个TAtomDataSource都有相对应的读写权重.
TAtomDataSource(tddlatomds)这一层并没有实现真正的数据源逻辑,而是依赖了一个近似第三方的包-我们从jboss剥离出来的datasource,这一层的职责主要是将单个数据源的配置放置到diamond服务器中,实现数据源配置的集中管理和动态变更.减少运维成本.TAtomDataSource实际对应了一个真正的数据源.
Tddl动态数据源暂时支持mysql和oracle,但是因为每一层都是jdbc的实现,所以很容易扩展支持其他实现jdbc规范的数据源.
基本功能
(1)主备数据库动态容灾切换
支持进行主备的对调切换,状态对调后备库变为主库,主库变为备库
(2)相同数据分片读写分离
针对mysqlreplication机制进行的数据主备复制,可以直接使用groupdatasource来支持读写分离。读写分离支持权重设置,允许对不同库使用不同的权重。
(3)读重试
一台数据库挂掉后,如果是个fatalexception(有定义),那么会进入读重试,以确保尽可能多的数据访问可以在正常数据库中访问。
(4)数据库挂掉排除,单线程重试
使用try�Clock机制来进行线程保护,在第一次捕捉到fatalexception以后,只允许一个线程进入数据库进行数据访问,直到数据库可以正常的工作为止
(5)流量控制,数据库保护
延展性功能
(1)指定数据库访问(ThreadLocal)
一组对等数据库中,写库一般只配置一个,其余数据库都为备库,因为通过复制机制,所以主备主键有延迟,对于各种类型的读(实时读和延迟读),可以使用GroupDataSourceRouteHelper.executeByGroupDataSourceIndex(intdataSourceIndex)指定需要访问的数据库.
(2)指定数据库访问(Hint)
这是指定数据库访问的另外一种方式.这种方式是在sql之前加注释,告知tddl动态数据源该选择第几个数据库.类似:/*+TDDL_GROUP({groupIndex:0})*/select*fromnormaltbl_0001wherepk=?变幻groupIndex的数字即可指定具体的第几个库,从0开始.
基本功能
(1)数据源配置集中管控
(2)定期密码变更
(3)Jboss数据源连接池的配置管理和推送
延展性功能
(1)动态创建,添加,减少数据源
(2)数据库R,W,NA状态通知,以及读写访问控制,如置为NA则数据库所有访问会直接抛出SQLException
(3)数据库保护
Tddl的动态数据源配置都放置在diamond配置中心,而一条diamond配置包括一个全局唯一的dataId和GROUP,tddl的配置数据也不例外,以下主要说明tddl动态数据源的dataId拼写以及每一个dataId下数据的内容.(详细示例请参考示例使用说明文档)
1.TGroupDataSource的配置
Group中的配置主要是配置一组对等的数据的读写权重
dataId组成规范:“com.taobao.tddl.jdbc.group_V2.4.1_”+dbGroupKey
配置内容(示例):tddl_sample_0:r10w10p0,tddl_sample_0_bac:r10w0p0
其中tddl_sample_0和tddl_sample_0_bak就是下一层需要的dbKey,后面r为读权重,w为写权重
2.TAtomDataSource的配置
atomds中的配置分为了3部分(global,app,user),配置内容全部为java的properties格式
Global
dataId组成规范:“com.taobao.tddl.atom.global.”+dbKey
配置内容:
属性key | 说明 |
ip | 数据实例的ip |
port | 数据实例的端口 |
dbname | 数据库名称 |
dbType | MYSQL,ORACLE |
dbStatus | RW,NA |
App
dataId组成规范:“com.taobao.tddl.atom.app.”+appName+”.”+dbKey
配置内容:
属性key | 说明 |
username | 该应用使用的用户名 |
oracleConType | oci,thin,如果db为mysql,则不用理会 |
minPoolSize | 最小连接池 |
maxPoolSize | 最大连接池 |
idleTimeout | 连接的最大空闲时间 |
blockingTimeout | 等待连接的最大时间 |
preparedStatementCacheSize | Oracle专用 |
writeRestrictTimes | 单位timeSliceInMillis写限制,默认空不限制 |
readRestrictTimes | 单位timeSliceInMillis读限制,默认空不限制 |
threadCountRestrict | 并发线程限制,默认空不限制 |
timeSliceInMillis | 限制的时间单位 |
connectionProperties | 连接参数 |
User
dataId组成规范:“com.taobao.tddl.atom.passwd.”+dbName+”.”+dbType+”.”+userName
配置内容:
属性key | 说明 |
encPasswd | 密码 |
encKey | 密钥 |