腾讯高级工程师 郑寒 - TDSQL Proxy的设计和实现
2020-02-27 2212浏览
- 1.TDSQLPROXY:金融级数据库中间件 郑寒 @腾讯 计费平台部
- 2.目录 CONTENTS 01 背景 02 分区方案 03 兼容性 04 分布式事务 05 丰富的功能
- 3.01 背景
- 4.背景 单机数据库满足不了海量的业务数据 解决方案: ü业务分库分表 üNOSQL üNEWSQL ü中间件
- 5.TDSQL总体架构 Proxy: ü 维护路由 ü 解析转换SQL ü 分发SQL ü 聚合计算结果 ü 应答用户 CLIENT Proxy Proxy … Proxy Scheduler Zookeeper SET_1 主 SET_2 主 MySQL + Agent 备 备
- 6.业务场景 TDSQL是针对金融联机交易场景的高一致性数据库集群 •专有云 •腾讯云 众慧保险 厦门国际金融
- 7.02 分区方案
- 8.分区方案 • 均衡数据分布和访问 • 快速扩容 • 相关表的JOIN • 快速删除流水数据 ü 自定义HASH函数+LIST ü Groupshard+Global表 ü 二级分区
- 9.分区 node1 H(id)(0-31) A A_p0,A_p1 create table A..shardkey=id CLIENT Proxy B B_p0,B_p1 /*!50100 PARTITION BY LIST (murmurHashCodeAndMod(`id`,64)) (PARTITION p0 VALUES IN (0) ENGINE = InnoDB, PARTITION p1 VALUES IN (1) ENGINE = InnoDB, 归一一级… 分区规则, 通过分表实现二级分区 使用mysql原生的分区功能 create table B..shardkey=uid H(id)(32-63) A B A_p0,A_p1 B_p0,B_p1 node2
- 10.扩容 CLIENT H(id)(0-15) A B node1 1. 主备同步全量数据 2. 源设置只读,修改路由:影响业务 3. 删除多余的数据 HP(riodxy)(16-31) A B node3 A_p0,A_p1 B_p0,B_p1 A_p0,A_p1 B_p0,B_p1 H(id)(32-63) A B A_p0,A_p1 B_p0,B_p1 node2
- 11.增删数据 H(id)(0-15) A B CLIENT HP(roidx)y(16-31) A B H(id)(32-63) A B node1 A_p0,A_p1 B_p0,B_p1, 1. 修改路由 node32. 删除分表 A_p0,A_p1 B_p0,B_p1 A_p0,A_p1 B_p0,B_p1 node2
- 12.03 兼容性
- 13.语法 • 基于mysql语法文件 ü 在proxy层拒绝有问题的sql ü 增加定制化的规制 ü 基于语法树改写sql select a,count(a) from shard where sk in(1,2,3) and b>1 group by a ; 740 486 44 357 40 486 41 454 486 884 486 508 40 625 44 625 44 625 41 273 486 470 625 468 304 486 417 改写sql 路由信息AST:command item_list table_list where group_list order_list … SELECT select_expr [, select_expr ...] [FROM table_references [WHERE where_condition] [GROUP BY {col_name expr position} [ASC DESC], ... [WITH ROLLUP]] [HAVING where_condition] [ORDER BY {col_name expr position} [ASC DESC], ...] [LIMIT {[offset,] row_count
- 14.协议 • 连接协议兼容MYSQL ü 客户端不需修改连接流程 • 支持预编译,复制协议 ü Proxy实现文本协议和二进制协议的转换 • 权限 ü 支持IP白名单 ü 通过IP透传提供和mysql一样的权限控制 应用 MySQL Client 10.10.A1P0I.100 Proxy 192.168.1.100 10.10M.Y1S0.Q1L00
- 15.功能 • 聚合函数:sum,max,min,count,avg,distinct,group by,order by,limit • 全局唯一序列 ü 基于zookeeper实现分布式唯一 • 子表 ü 改写结果集,用户透明 • JOIN ü shardkey相同:各个set内单独聚合,proxy层汇总 ü global表 select A.a,avg(A.b) from A join B on A.sk=B.sk where A.hired=20160203 group by A.a sql改写 结果集聚合 select A.a,avg(A.b),sum(A.b),count(A.b) from ((select * from test.A_TDSQL_SUBp1) A join (select * from test.B_TDSQL_SUBp1) B on((A.sk = B.sk))) group by A.a order by A.a
- 16.04 分布式事务
- 17.原理:两阶段提交 • Proxy作为TM,后端数据库作为RM • 用数据库存储日志用于故障恢复
- 18.例子: client begin; insert into t1 values(1,2000); insert into t1 values(3,4000); commit; set_1 set_2 XA START 'xa-gtid-1'; insert into t1 values(1,2000); XA START 'xa-gtid-1' xa end 'xa-gtid-1'; xa prepare 'xa-gtid-1'; insert into xa.commit_log values('xa-gtid-1'); xa commit 'xa-gtid-1'; insert into t1 values(3,4000); xa end 'xa-gtid-1'; xa prepare 'xa-gtid-1'; xa commit 'xa-gtid-1';
- 19.特性 • 实现了分布式事务两阶段提交的全部的功能和错误处理 • 使用层面对用户透明 • 单set的操作自动退化为单机事务 • 存储日志流程异步化 • 无法保证MVCC select快照一致性 • 最终一致性
- 20.05 丰富的功能
- 21.丰富的功能 • 灵活的读写分离 ü 多种模式:hint,sql解析,只读账号 • 动态升级 ü 核心功能so话,升级不影响已有连接 • 流控 ü 根据后端状态实时控制sql速度 • 控制指令 ü 状态查询,配置修改 ü sql透传 • 断连优化 ü 后端断连尽量不影响用户 ü 识别是否在事务中
- 22.Q&A