当前位置:
文档之家› 罗立树-数据库中间件架构设计和实现细节
罗立树-数据库中间件架构设计和实现细节
Order by
• Select min(id) as min,max(age),avg(age),sum(age),count(age), name from t_user Group by name Order by min;
1 3
12 15
chen li
5
7
17
22
huang
huang
Order by-解析
Contents
基础知识介绍 开发中间件的目的 实现方案解析 架构设计和实现细节 中间件的未来规划 5分钟完成分库分表 如何接入使用
功能规划
设计的原则
• • • • 模块化 职责分离 支持封装和扩展 …
• 相关课题比较大,可以在下一次分享中讲 述
用户视觉
常用分库分表的方式
schema
相同 不同 相同 不同 相同 不同
数据库中间件架构设计和实现
技术中心· 架构部 罗立树
关于我
• 易宝支付核心开发 • 阿里巴巴商品线(内部统称Offer,基于 Cobar)服务化落地负责人,中文站开放平 架构和团购架构方面的工作
Contents
基础知识介绍 开发中间件的目的 实现方案解析 架构设计和实现细节 中间件的未来规划 5分钟完成分库分表 如何接入使用
id 1
age 12
name chen
6 8 4 2
32 66 19 16
? ? ? ?
32 66 19 16
1 1 1 1
chen huang liu zhang
3
5 7 merge id 2 4 6 8
15
17 22 age 16 19 32 66
li
huang huang name zhang liu chen huang
一些概念
读写分离? HA(高可用性)? 分库分表? 事务和分布式事务? 数据一致性?
数据库性能关键点?
索引 存储 IO、数据 量、算法 CPU、内 存 锁 其他…
线程
CAP理论
Consistency
Partitiontolerance
Availability
带着疑问思考
• 假如你来设计一套中间件你会怎么设计? • 你认知的数据库中间件都有哪些?他们相 对于我们的解决方案都有哪些优点?
huang 1 liu 1
3 Select avg(age) ,name from t_user2 group by name
5 7 id 2 4 6 8
15
17 22 age 16 19 32 66
li
huang huang name zhang liu chen huang
zhang 1
merge
Group by
语句:Select min(id),max(age),avg(age),sum(age),count(age), name from t_user Group by name;
Group by-解析
1 5 3 12 22 15 ? ? ? 12 39 15 1 2 1 chen huang li
实现方式比较
比较项
实现难度 应用代码复杂度 性能 透明性支持 运维健壮性 部署结构复杂度 耦合问题 数据库版本关联 扩展能力 低 高 高 糟糕 很好 轻量级
DAL方式
中 无 高
ORM方式
JDBC客户端方式
高 无 高 良好 很好 轻量级 和jdbc版本耦合 数据库无关 良好 小 难度大 较多 支持 较高 无 中 很好 较弱 较重
分库分表的策略
/** * 常用的方式有: * 1.基于ID段的 * 2.基于hash的 * 3.按日期等 * @author luolishu */ public interface Function { /** * 执行方法返回下标 * @param parameters key为字段名,大写开头,value为字段在sql中的值 * @return namenode的下标 */ int execute(int size, Map<String, Object> parameters); }
表名
不同 不同 相同 相同 不同 不同
实例
相同 相同 不同 不同 不同 不同
路由的方式
ID段(range) Hash(mod) 时间 其他方式……
领域对象
BatchItem 每一条语句的执行当做一个batch项 Function 分库分表路由规则 Interceptor 拦截器 Executor sql执行器 Merger 结果合并处理器 NodeAnalyzer sql语法节点分析器 Transaction 事务抽象 NameNode 分表namenode抽象 DataNode 数据访问节点抽象 …….
merge
2 5
4 7 6 8
16 17
19 22 32 66
zhang huang
liu huang chen huang
Group by
语句:Select min(id),max(age),avg(age),sum(age),count(age), name from t_user Group by name Order by name Limit 5
支持,性能差 支持,性能差 支持,性能差
方案选择
方案选择解析
• • • • • • 没有完美的解决方案,只有适合的方案 公司现状:90%以上应用是java代码 成本考虑:轻量级使用物理成本低 项目进度考虑:有一个快速的实现,逐步完善 系统健壮性考虑:基于代理的方案健壮性差一些 开发难度(人力成本):基于mysql协议的开发难度较大,不 可控 • 集群性能上考虑 • 基于mysql协议的可以引入,但是方案上存在架构中心化 的缺陷
1 5 3 4 2
32 66 15 19 16
22 35 15 19 16
44 105 15 19 16
2 3 1 1 1
chen huang li liu zhang
Group by-使用约束
group by字段需要出现在结果集里
DISTINCT
Distinct=group by 所有result column
并行Query支持
• 支持写入,更新,查询到多个库和表的同 一线程操作
事务支持
• 支持单库事务 • 不支持分布式事务(简单支持)
结果合并
• 单库单表查询的不需要合并 • 不带分库分分表字段:
1. 2. 3. 4. 聚集函数 group by order by …limit having
Join支持
id 1 age 12 name chen
2 4 6 8
16 19 32 66
zhang liu chen huang
3
5 7 id 2 4 6 8
15
17 22 age 16 19 32 66
li
huang huang name zhang liu chen huang
1 3
12 15
chen li
• 语句:Select * from t_user u join t_city c on u.city_id=c.id where user_id=‘luolishu’ • 约束:不支持跨库join,被join的表要保证 所有数据一致性
嵌套查询
• Select * from t_user where t_city_id in(select id from t_city where country=‘china’)
15
17 22 age 16 19 32 66
li
huang huang name zhang liu chen huang
1 5 3
32 66 15
22 35 15
44 105 15
2 3 1
chen huang li
Limit…offset
• Select min(id) as min,max(age),avg(age),sum(age),count(age), username from t_user Group by username Order by min limit 10 offset 100;
??
Contents
基础知识介绍 开发中间件的目的 实现方案解析 架构设计和实现细节 中间件的未来规划 5分钟完成分库分表 如何接入使用
现状
中间件解决的问题
• • • • • • • • 简化开发,降低分库分表复杂度 分库分表透明化 统一配置管理 提供监控 链接管理 HA支持 LoadBlance支持 提供更好的扩展能力
Limit…offset使用建议
• 避免往后翻页比较多的查询
• 涉及到翻页需求,可以考虑走外部索引 (search、cache或者索引表等)
Having…
• Select avg(age) ,name from t_user having avg(age) >30
约束条件: having中的条件字段必须要出现在结果集中
嵌套查询-约束
• 约束:不支持跨库,被子查询的表要保证 所有数据一致性
聚集函数
• Select min(id),max(age),avg(age),sum(age),count(age) from t_user;
SELECT MIN(id), MAX(age), AVG(age), SUM(age), COUNT(age) FROM t_user1 1 22 ? 66 4
Group by,Order by,limit-解析
1 5 3 12 22 15 12 19.5 15 12 39 15 1 2 1 chen huang li