数据库中间件设计与实现
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
慢SQL记录
用户自定义慢日志耗时大小
19
总结
普遍存在的两大问题
性能效率问题:采用代理的方式,有性能损耗,跨库查询性能更差。是否 有其它更高效方式?
功能问题:不支持分布式事务。为什么不支持?如何实现分布式事务?
2ble
DB
11
数据分片
select * from tab where id = 10
config range hash time
calculate table index
select * from tab_0001 where id = 10
12
SQL路由
路由概念
SQL路由是根据分片规则配置,将SQL定位至真正的数据源
效果
自动摘除宕机或网络中断的DB 自动挂载恢复正常的DB
middleware
select 1
select 1 select 1
DB_Slave1
DB_Master
DB_Slave2
17
高可用方案
18
安全与审计
客户端IP限制
用户自定义IP白名单列表
SQL黑名单
用户定义黑名单SQL列表
5
主流MySQL Proxy方案
主要解决方案
DBProxy
Mysql官方产品,但只出到Beta 0.8,基本不维护 BUG多、扩展功能较难 C语言开发 国内衍生:360 Atlas、Meituan DBProxy、Sohu DBProxy...
Cobar
功能简单 基本不维护 JAVA开发 阿里内部已发展为TDDL(非代理模式),并在阿里云DRDS中大量使用 国内衍生:MyCat
数据库中间件设计与实现1纲要?mysql存在的问题?主流mysqlproxy方案?中间件的设计与实现?总结2mysql存在的问题?读写分离?在客户端中配置所有db信息并实现读写分离?db上下线业务受影响?运维跟开发需同步调整配置3clientdbmasterdbslave主从同步mysql存在的问题?分库分表?客户端改写sql语句?客户端将sql路由不同的db?客户端聚合结果sqlmergeresult4db1db3db2sql1sql2sql3中间件的目标?减轻开发工作量?支持sql读写分离?支持数据分库分表?减轻运维工作量?无需与开发同步高可用减少运维工作5?高可用减少运维工作主流mysqlproxy方案?主要解决方案?dbproxy?mysql官方产品但只出到beta08基本不维护?bug多扩展功能较难?c语言开发?国内衍生
13
结果归并
归并概念
结果归并包括4类:普通遍历类、排序类、聚合类和分组类。每种类型都会 先根据分页结果跳过不需要的数据。
普通遍历类最为简单,只需按顺序遍历ResultSet的集合即可 排序类结果将结果先排序再输出,因为各分片结果均按照各自条件完成排
序,所以采用归并排序算法整合最终结果 分组类最为复杂,需要将所有的ResultSet结果放入内存,使用map-reduce
15
连接池设计
middleware
Conn Pool
Conn Pool
DB1 DB2
连接取出时: 重置字符集 重置Database
pop
conn conn ......
push conn
16
后端DB的高可用方案
方式
使用独立线程检测DB状态 定期检测每台DB是否正常,周期和重试次数均可配置
db_slave
3
MySQL存在的问题
分库分表
客户端改写SQL语句 客户端将SQL路由不同的DB 客户端聚合结果
merge result
sql
sql1
sql2
sql3
db1
db2
db3
4
中间件的目标
减轻开发工作量
支持SQL读写分离 支持数据分库分表
减轻运维工作量
无需与开发同步 高可用减少运维工作
Vitess
Youtube开源的数据库扩展及高可用方案,已经用于生产环境 功能强大,但是构架复杂,部署及运维成本较高 GOLANG开发 国内GO开发:Kingshard
6
中间件核心功能
读写分离 数据分库分表
平滑上下线DB
7
中间件实现
SQL Parser 数据分片 SQL路由 结果归并 连接池设计 后端DB的高可用方案 高可用方案 安全审计
8
架构设计
整体架构图
9
SQL Parser
SQL Parser的设计与实现
词法分析器
将SQL切分
语法分析器
根据词法分析器结果和MySQL语法规则生成AST(abstract syntax tree)
相关产品 目前常见的SQL解析器主要有fdb/jsqlparser和Druid
算法分组,最后根据排序和聚合条件做相关处理。最消耗内存,最损失性 能的部分即是
14
连接池设计
目标
复用连接,降低后端DB压力
方式
一个DB实例对应一个连接池 连接池个数上限可配置,无空闲连接则阻塞
效果
前端高并发,MySQL负载不会抖动 限制连接池个数,保护后端DB不至于宕机
SQL
词法分析
语法分析
AST
根据分片规则 生成新 SQL
10
数据分片
分片概念
逻辑:将数据落在不同的DB实例中的不同子表中 分片方式:Hash、Range、Time_Range等 Shard key类型:整型、MySQL标准时间类型等 数据到实例采用两级映射方案
data
shard_key
数据库中间件设计与实现
1
纲要
MySQL存在的问题 主流MySQL Proxy方案 中间件的设计与实现 总结
2
MySQL存在的问题
读写分离
在客户端中配置所有DB信息,并实现读写分离 DB上下线业务受影响 运维跟开发需同步调整配置
client
db_master
主从同步
用户自定义慢日志耗时大小
19
总结
普遍存在的两大问题
性能效率问题:采用代理的方式,有性能损耗,跨库查询性能更差。是否 有其它更高效方式?
功能问题:不支持分布式事务。为什么不支持?如何实现分布式事务?
2ble
DB
11
数据分片
select * from tab where id = 10
config range hash time
calculate table index
select * from tab_0001 where id = 10
12
SQL路由
路由概念
SQL路由是根据分片规则配置,将SQL定位至真正的数据源
效果
自动摘除宕机或网络中断的DB 自动挂载恢复正常的DB
middleware
select 1
select 1 select 1
DB_Slave1
DB_Master
DB_Slave2
17
高可用方案
18
安全与审计
客户端IP限制
用户自定义IP白名单列表
SQL黑名单
用户定义黑名单SQL列表
5
主流MySQL Proxy方案
主要解决方案
DBProxy
Mysql官方产品,但只出到Beta 0.8,基本不维护 BUG多、扩展功能较难 C语言开发 国内衍生:360 Atlas、Meituan DBProxy、Sohu DBProxy...
Cobar
功能简单 基本不维护 JAVA开发 阿里内部已发展为TDDL(非代理模式),并在阿里云DRDS中大量使用 国内衍生:MyCat
数据库中间件设计与实现1纲要?mysql存在的问题?主流mysqlproxy方案?中间件的设计与实现?总结2mysql存在的问题?读写分离?在客户端中配置所有db信息并实现读写分离?db上下线业务受影响?运维跟开发需同步调整配置3clientdbmasterdbslave主从同步mysql存在的问题?分库分表?客户端改写sql语句?客户端将sql路由不同的db?客户端聚合结果sqlmergeresult4db1db3db2sql1sql2sql3中间件的目标?减轻开发工作量?支持sql读写分离?支持数据分库分表?减轻运维工作量?无需与开发同步高可用减少运维工作5?高可用减少运维工作主流mysqlproxy方案?主要解决方案?dbproxy?mysql官方产品但只出到beta08基本不维护?bug多扩展功能较难?c语言开发?国内衍生
13
结果归并
归并概念
结果归并包括4类:普通遍历类、排序类、聚合类和分组类。每种类型都会 先根据分页结果跳过不需要的数据。
普通遍历类最为简单,只需按顺序遍历ResultSet的集合即可 排序类结果将结果先排序再输出,因为各分片结果均按照各自条件完成排
序,所以采用归并排序算法整合最终结果 分组类最为复杂,需要将所有的ResultSet结果放入内存,使用map-reduce
15
连接池设计
middleware
Conn Pool
Conn Pool
DB1 DB2
连接取出时: 重置字符集 重置Database
pop
conn conn ......
push conn
16
后端DB的高可用方案
方式
使用独立线程检测DB状态 定期检测每台DB是否正常,周期和重试次数均可配置
db_slave
3
MySQL存在的问题
分库分表
客户端改写SQL语句 客户端将SQL路由不同的DB 客户端聚合结果
merge result
sql
sql1
sql2
sql3
db1
db2
db3
4
中间件的目标
减轻开发工作量
支持SQL读写分离 支持数据分库分表
减轻运维工作量
无需与开发同步 高可用减少运维工作
Vitess
Youtube开源的数据库扩展及高可用方案,已经用于生产环境 功能强大,但是构架复杂,部署及运维成本较高 GOLANG开发 国内GO开发:Kingshard
6
中间件核心功能
读写分离 数据分库分表
平滑上下线DB
7
中间件实现
SQL Parser 数据分片 SQL路由 结果归并 连接池设计 后端DB的高可用方案 高可用方案 安全审计
8
架构设计
整体架构图
9
SQL Parser
SQL Parser的设计与实现
词法分析器
将SQL切分
语法分析器
根据词法分析器结果和MySQL语法规则生成AST(abstract syntax tree)
相关产品 目前常见的SQL解析器主要有fdb/jsqlparser和Druid
算法分组,最后根据排序和聚合条件做相关处理。最消耗内存,最损失性 能的部分即是
14
连接池设计
目标
复用连接,降低后端DB压力
方式
一个DB实例对应一个连接池 连接池个数上限可配置,无空闲连接则阻塞
效果
前端高并发,MySQL负载不会抖动 限制连接池个数,保护后端DB不至于宕机
SQL
词法分析
语法分析
AST
根据分片规则 生成新 SQL
10
数据分片
分片概念
逻辑:将数据落在不同的DB实例中的不同子表中 分片方式:Hash、Range、Time_Range等 Shard key类型:整型、MySQL标准时间类型等 数据到实例采用两级映射方案
data
shard_key
数据库中间件设计与实现
1
纲要
MySQL存在的问题 主流MySQL Proxy方案 中间件的设计与实现 总结
2
MySQL存在的问题
读写分离
在客户端中配置所有DB信息,并实现读写分离 DB上下线业务受影响 运维跟开发需同步调整配置
client
db_master
主从同步