kingshard数据库中间件设计与实现解析
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
14
Biblioteka Baidu
kingshard支持预处理的方案
核心矛盾
➢ prepare状态与会话(连接)绑定 ➢ 连接池机制要求连接复用
简单的方案
➢ 将prepare/deallocate内的所有语句保持在同一个连接上执行 ➢ 缺点:与事务不同,很多程序不执行deallocate,导致连接被占用不放
15
kingshard支持预处理的方案
client
db_slave1
db_master
db_slave2
主从同步
主从同步
3
业务使用MySQL的痛点
业务实现分库分表
➢ 改写SQL语句 ➢ 将SQL路由不同的DB ➢ 聚合结果集
sharding config
业务逻辑 Rewrite SQL
Rewrite SQL
Rewrite SQL
Rewrite SQL
关注度
➢ 开源一周年左右 ➢ Github star:2010,Fork:412,Contributors:20
线上使用情况
➢ 超过20家公司线上使用 ➢ 小米电商、西山居、一亩田、网龙等
开源地址
➢ https://github.com/flike/kingshard
21
Thank You
22
ping
DB_Slave1
DB_Slave2
17
业务使用kingshard的高可用方案
18
kingshard对安全与审计的支持
客户端IP限制
➢ 用户自定义IP白名单列表
SQL黑名单
➢ 用户定义黑名单SQL列表 ➢ 正则匹配方式,例如:delete from mytable,select count(*) from
kingshard支持预处理方案流程图
16
kingshard的后端DB的高可用
方式
➢ 使用独立goroutine检测DB状态 ➢ 定期检测每台DB是否正常,周期和重试次数均可配置
效果
➢ 自动摘除宕机或网络中断的DB ➢ 自动挂载恢复正常的DB
kingshard
node
ping
ping
DB_Master
➢ Cobar
功能简单 基本不维护
➢ MyCat
易用性较低 开始商业化
6
kingshard的设计目标
核心指导思想
➢ 简单有效
核心功能
➢ 读写分离 ➢ 数据分片 ➢ 提升DB的可运维性,减轻DBA负担
7
kingshard的架构设计
整体架构图
8
kingshard的SQL Parser
DB1
DB2
DB3
4
数据库中间件的目标
减轻开发的工作量
➢ 支持SQL读写分离 ➢ 支持数据分片 ➢ 开发更加专注于业务逻辑,提升效率
降低DB的运维与业务的耦合度
➢ DB的上下线业务无感知 ➢ 减轻DBA的工作负担
5
主流MySQL Proxy方案
业务已有方案
➢ Atlas
扩展功能较难 基本不维护
kingshard数据库中间件设计与实现
陈非 github: @flike weibo: @chenfei001
1
Agenda
▪ 业务使用MySQL的痛点 ▪ 主流MySQL Proxy方案 ▪ kingshard的设计与实现 ▪ 总结
2
业务使用MySQL的痛点
业务实现读写分离
➢ 在业务中配置主库、从库的IP和端口 ➢ DB宕机或上下线业务受影响 ➢ 运维协调开发修改业务配置
config
config
shard_key
sub_table
DB
10
kingshard的sharding方案
select * from tab where id = 10
config range hash time
calculate table index
select * from tab_0001 where id = 10
mytable where id < ?
慢SQL记录
➢ 用户自定义慢日志耗时大小
19
kingshard的演进计划
重构SQL Parser
➢ 支持复杂SQL的解析
管理端改造
➢ 以API的方式支持管理命令 ➢ Web界面操作与展示
20
总结
为什么用Golang开发
➢ 开发效率非常高 ➢ 性能并不差,相当于C语言的70%-80% ➢ 便捷的并发编程 ➢ 部署简单
sharding相关概念
➢ 分片方式:Hash,Range和Time_Range ➢ Shard key类型:整型和MySQL标准时间类型 ➢ 子表:分表名+序号,最大支持9999张子表。
例如:table_0001,table_1023 落在不同的DB实例,由配置指定
➢ Shard key到实例采用两级映射方案
SQL Parser的设计与实现
➢ 词法分析器
将SQL切分成token 目的:作为语法分析器的输入
➢ 语法分析器
根据token和MySQL规约法则生成AST(abstract syntax tree) 目的:读写分离、数据分片
SQL
词法分析
语法分析
AST
改写/路 由 SQL
9
kingshard的sharding方案
11
kingshard的连接池设计
目标
➢ 复用连接,降低后端DB压力
方式
➢ 一个DB实例对应一个连接池 ➢ 连接池个数上限可配置,无空闲连接则阻塞
效果
➢ 前端高并发,MySQL负载不会抖动 ➢ 限制连接池个数,保护后端DB不至于宕机
12
kingshard的连接池设计
kingshard
Conn Pool
Conn Pool
DB1 DB2
连接取出时: 重置字符集 重置Database
pop
conn conn ......
push conn
13
kingshard支持预处理的方案
作用
➢ 防SQL注入,参数不做语义解析,只当做字符串 ➢ 提升效率,SQL不再需要重复解析
示例
➢ prepare stmt1 from “SELECT * FROM tbl WHERE id = ?”; ➢ set @a = 100; ➢ execute stmt1 using @a; ➢ deallocate prepare stmt1;
Biblioteka Baidu
kingshard支持预处理的方案
核心矛盾
➢ prepare状态与会话(连接)绑定 ➢ 连接池机制要求连接复用
简单的方案
➢ 将prepare/deallocate内的所有语句保持在同一个连接上执行 ➢ 缺点:与事务不同,很多程序不执行deallocate,导致连接被占用不放
15
kingshard支持预处理的方案
client
db_slave1
db_master
db_slave2
主从同步
主从同步
3
业务使用MySQL的痛点
业务实现分库分表
➢ 改写SQL语句 ➢ 将SQL路由不同的DB ➢ 聚合结果集
sharding config
业务逻辑 Rewrite SQL
Rewrite SQL
Rewrite SQL
Rewrite SQL
关注度
➢ 开源一周年左右 ➢ Github star:2010,Fork:412,Contributors:20
线上使用情况
➢ 超过20家公司线上使用 ➢ 小米电商、西山居、一亩田、网龙等
开源地址
➢ https://github.com/flike/kingshard
21
Thank You
22
ping
DB_Slave1
DB_Slave2
17
业务使用kingshard的高可用方案
18
kingshard对安全与审计的支持
客户端IP限制
➢ 用户自定义IP白名单列表
SQL黑名单
➢ 用户定义黑名单SQL列表 ➢ 正则匹配方式,例如:delete from mytable,select count(*) from
kingshard支持预处理方案流程图
16
kingshard的后端DB的高可用
方式
➢ 使用独立goroutine检测DB状态 ➢ 定期检测每台DB是否正常,周期和重试次数均可配置
效果
➢ 自动摘除宕机或网络中断的DB ➢ 自动挂载恢复正常的DB
kingshard
node
ping
ping
DB_Master
➢ Cobar
功能简单 基本不维护
➢ MyCat
易用性较低 开始商业化
6
kingshard的设计目标
核心指导思想
➢ 简单有效
核心功能
➢ 读写分离 ➢ 数据分片 ➢ 提升DB的可运维性,减轻DBA负担
7
kingshard的架构设计
整体架构图
8
kingshard的SQL Parser
DB1
DB2
DB3
4
数据库中间件的目标
减轻开发的工作量
➢ 支持SQL读写分离 ➢ 支持数据分片 ➢ 开发更加专注于业务逻辑,提升效率
降低DB的运维与业务的耦合度
➢ DB的上下线业务无感知 ➢ 减轻DBA的工作负担
5
主流MySQL Proxy方案
业务已有方案
➢ Atlas
扩展功能较难 基本不维护
kingshard数据库中间件设计与实现
陈非 github: @flike weibo: @chenfei001
1
Agenda
▪ 业务使用MySQL的痛点 ▪ 主流MySQL Proxy方案 ▪ kingshard的设计与实现 ▪ 总结
2
业务使用MySQL的痛点
业务实现读写分离
➢ 在业务中配置主库、从库的IP和端口 ➢ DB宕机或上下线业务受影响 ➢ 运维协调开发修改业务配置
config
config
shard_key
sub_table
DB
10
kingshard的sharding方案
select * from tab where id = 10
config range hash time
calculate table index
select * from tab_0001 where id = 10
mytable where id < ?
慢SQL记录
➢ 用户自定义慢日志耗时大小
19
kingshard的演进计划
重构SQL Parser
➢ 支持复杂SQL的解析
管理端改造
➢ 以API的方式支持管理命令 ➢ Web界面操作与展示
20
总结
为什么用Golang开发
➢ 开发效率非常高 ➢ 性能并不差,相当于C语言的70%-80% ➢ 便捷的并发编程 ➢ 部署简单
sharding相关概念
➢ 分片方式:Hash,Range和Time_Range ➢ Shard key类型:整型和MySQL标准时间类型 ➢ 子表:分表名+序号,最大支持9999张子表。
例如:table_0001,table_1023 落在不同的DB实例,由配置指定
➢ Shard key到实例采用两级映射方案
SQL Parser的设计与实现
➢ 词法分析器
将SQL切分成token 目的:作为语法分析器的输入
➢ 语法分析器
根据token和MySQL规约法则生成AST(abstract syntax tree) 目的:读写分离、数据分片
SQL
词法分析
语法分析
AST
改写/路 由 SQL
9
kingshard的sharding方案
11
kingshard的连接池设计
目标
➢ 复用连接,降低后端DB压力
方式
➢ 一个DB实例对应一个连接池 ➢ 连接池个数上限可配置,无空闲连接则阻塞
效果
➢ 前端高并发,MySQL负载不会抖动 ➢ 限制连接池个数,保护后端DB不至于宕机
12
kingshard的连接池设计
kingshard
Conn Pool
Conn Pool
DB1 DB2
连接取出时: 重置字符集 重置Database
pop
conn conn ......
push conn
13
kingshard支持预处理的方案
作用
➢ 防SQL注入,参数不做语义解析,只当做字符串 ➢ 提升效率,SQL不再需要重复解析
示例
➢ prepare stmt1 from “SELECT * FROM tbl WHERE id = ?”; ➢ set @a = 100; ➢ execute stmt1 using @a; ➢ deallocate prepare stmt1;