罗立树-数据库中间件架构设计和实现细节课件
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
??
Contents
基础知识介绍 开发中间件的目的 实现方案解析 架构设计和实现细节 中间件的未来规划 5分钟完成分库分表 如何接入使用
现状
中间件解决的问题
• • • • • • • • 简化开发,降低分库分表复杂度 分库分表透明化 统一配置管理 提供监控 链接管理 HA支持 LoadBlance支持 提供更好的扩展能力
嵌套查询-约束
• 约束:不支持跨库,被子查询的表要保证 所有数据一致性
聚集函数
• 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
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
Group by,Order by,limit-解析
1 5 3 12 22 15 12 19.5 15 12 39 15 1 2 1 chen huang li
id 1
age 12
name chen
6 8 4
32 66 19
32 66 19
32 66 19
1 1 1
chen huang liu
3
5 7 merge id 2 4 6 8
表名
不同 不同 相同 相同 不同 不同
实例
相同 相同 不同 不同 不同 不同
路由的方式
ID段(range) Hash(mod) 时间 其他方式……
领域对象
BatchItem 每一条语句的执行当做一个batch项 Function 分库分表路由规则 Interceptor 拦截器 Executor sql执行器 Merger 结果合并处理器 NodeAnalyzer sql语法节点分析器 Transaction 事务抽象 NameNode 分表namenode抽象 DataNode 数据访问节点抽象 …….
Contents
基础知识介绍 开发中间件的目的 实现方案解析 架构设计和实现细节 中间件的未来规划 5分钟完成分库分表 如何接入使用
功能规划
设计的原则
• • • • 模块化 职责分离 支持封装和扩展 …
• 相关课题比较大,可以在下一次分享中讲 述
用户视觉
常用分库分表的方式
schema
相同 不同 相同 不同 相同 不同
• 语句: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’)
中间件解决的问题
Contents
基础知识介绍 开发中间件的目的 实现方案解析 架构设计和实现细节 中间件的未来规划 5分钟完成分库分表 如何接入使用
实现方式
• • • • 应用硬编码实现 DAL封装(或者ORM封装) JDBC 基于Mysql客户端协议
基于客户端的访问模式
Mysql协议访问模式
22 35 15 19 16 chen huang li liu zhang 2 3 1 1 1 44 105 15 19 16
having
35
huang
使用约束总结
• • • • • • 避免join 避免子查询 避免跨库 不使用分布式事务,尽量强调最终一致性 分页不要取offset较大的值 Group,order by,having等条件必须要出现 在结果集里
Group by,Order by,limit-解析
? ? ? chen 1 12 39 15 huang 2 li 1
Select avg(age) ,name from t_user1 group by name id 1 age 12 name chen
32 66 19 16
chen
1
32 66 19 16
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
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
分库分表的策略
/** * 常用的方式有: * 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); }
并行Query支持
• 支持写入,更新,查询到多个库和表的同 一线程操作
事务支持
• 支持单库事务 • 不支持分布式事务(简单支持)
结果合并
• 单库单表查询的不需要合并 • 不带分库分分表字段:
1. 2. 3. 4. 聚集函数 group by order by …limit having
Join支持
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
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
Limit…offset使用建议
• 避免往后翻页比较多的查询
• 涉及到翻页需求,可以考虑走外部索引 (search、cache或者索引表等)
Having…
• Select avg(age) ,name from t_user having avg(age) >30
约束条件: having中的条件字段必须要出现在结果集中
15
17 22 age 16 19 32 66
li
huang huang name zhang liu chen huang
Avg(age)=sum(age)/count(age)
聚集函数-使用约束
• 目前仅仅支持min,max,avg,count,sum • Group by中用到聚集函数,需要在结果中出 现(今后可以考虑自动补全)
支持,性能差 支持,性能差 支持,性能差
方案选择
方案选择解析
• • • • • • 没有完美的解决方案,只有适合的方案 公司现状:90%以上应用是java代码 成本考虑:轻量级使用物理成本低 项目进度考虑:有一个快速的实现,逐步完善 系统健壮性考虑:基于代理的方案健壮性差一些 开发难度(人力成本):基于mysql协议的开发难度较大,不 可控 • 集群性能上考虑 • 基于mysql协议的可以引入,但是方案上存在架构中心化 的缺陷
一些概念
读写分离? HA(高可用性)? 分库分表? 事务和分布式事务? 数据一致性?
数据库性能关键点?
索引 存储 IO、数据 量、算法 CPU、内 存 锁 其他…
线程
CAP理论
Consistency
Partitiontolerance
Availability
带着疑问思考
• 假如你来设计一套中间件你会怎么设计? • 你认知的数据库中间件都有哪些?他们相 对于我们的解决方案都有哪些优点?
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
mysql协议方式
良好 很好 轻量级
和业务代码耦 和框架耦合 合 数据库无关 较复杂 数据库无关 良好 小 难度大 较多 支持
和mysql客户端交互协议版本耦合,数据库&协 议升级问题 仅局限mysql 良好 大 容易 较少 不支持 不支持
线上修改影响范围 小 跨语言支持 难度大
数据库服务器连接 较多 单库事务支持 分布式事务 支持
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;
实现方式比较
比较项
实现难度 应用代码复杂度 性能 透明性支持 运维健壮性 部署结构复杂度 耦合问题 数据库版本关联 扩展能力 低 高 高 糟糕 很好 轻量级
DAL方式
中 无 高
ORM方式
JDBC客户端方式
高 无 高 良好 很好 轻量级 和jdbc版本耦合 数据库无关 良好 小 难度大 较多 支持 较高 无 中 很好 较弱 较重
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-解析
聚集函数-解析
id 1 age 12 name chen
3
SELECT MIN(id), MAX(age), AVG(age), SUM(age), COUNT(age) FROM t_user2 2 66 ? 133 merge 4 5 7 id 2 4 6 1 66 24.8750 199 8 8
Contents
基础知识介绍 开发中间件的目的 实现方案解析 架构设计和实现细节 中间件的未来规划 5分钟完成分库分表 如何接入使用
GO语言+Mysql C++ lib
数据层访问虚拟化
• 支持redis,mongodb,文件等存储方式
数据库中间件架构设计和实现
技术中心· 架构部 罗立树
关于我
• 易宝支付核心开发 • 阿里巴巴商品线(内部统称Offer,基于 Cobar)服务化落地负责人,中文站开放平 台负责人 • 京东网站交易部架构师 • 百度高级开发工程师,负责LBS地图商户中 心架构和团购架构方面的工作
Contents
基础知识介绍 开发中间件的目的 实现方案解析 架构设计和实现细节 中间件的未来规划 5分钟完成分库分表 如何接入使用