美团点评数据库中间件DBProxy开源

介绍

随着数据量的不断增大,传统的直连数据库对数据进行访问的方式已经无法满足一般公司的需求。通过数据库中间件,可以对数据库进行水平扩展,由原来单台数据库扩展到多台数据库,数据库中间件通过路由规则将数据的访问请求路由到其中一台数据库上,从而大大降低了数据访问的瓶颈和单台数据库的压力。通过数据库中间件还可以将DBA和研发进行解耦,提升DBA运维效率。

奇虎360公司开源的Atlas是优秀的数据库中间件,美团点评DBA团队针对公司内部需求,在其上做了很多改进工作,形成了新的高可靠、高可用企业级数据库中间件DBProxy,已在公司内部生产环境广泛使用,较为成熟、稳定。相关工作的详细介绍可以参考之前的博客文章《美团点评的Atlas实践》

现在,我们非常高兴地将DBProxy开源,希望与业内有类似需求的团队,一起打造一款优秀的企业级数据库中间件产品。项目的Github地址是https://github.com/Meituan-Dianping/DBProxy

DBProxy的优点

  1. 支持多语言MySQL客户端
  2. 读写分离
  3. 负载均衡
  4. Slave故障感知与摘除(Master需要MHA等其他联动)
  5. 后端连接池
  6. 自定义SQL拦截与过滤
  7. 流量分组与控制
  8. 丰富的监控状态
  9. 支持分表(分库版本正在内测中)
  10. Client IP限制

DBProxy对Atlas的改进

  • 新增功能点
    • 新增参数
    • backend-max-thread-running用于指定每个MySQL后台的最大thread running数
    • thread-running-sleep-delay用于指定在thread running数超过backend-max-thread-running时,客户端连接等待的时间
    • 添加到黑名单中需要满足两个条件:SQL执行的时间和频率
    • 提供了查看、修改、添加、删除黑名单的功能
    • 黑名单管理提供了将黑名单保存到文件以及从文件中Load到内存中的功能
    • 在手动添加黑名单时,只需要将用户的SQL语句输入,在内部自动转化成过滤条件,手动添加时是否生效由参数 manual-filter-flag 来控制,OFF:不生效,ON:立即生效
    • 手动添加与自动添加两种情况下的过滤条件是否生效是分别由不同参数控制,这个要区分清楚。另外,也可以使用 admin 的命令来设置是否开启/关闭某个过滤条件
    • SQL执行的时间 由参数 query-filter-time-threshold 来指定,如果SQL执行时间超过此值,则满足条件
    • SQL执行频率 由参数 query-filter-frequent-threshold 来指定,如果SQL执行频率超过此值,则满足条件 频率就是在时间窗口内执行的次数。时间窗口则是由频率阈值和最小执行次数来计算出来的,当时间窗口小于60s时,扩展到60s 参数 access-num-per-time-window 用来指定在时间窗口内的最小执行次数,添加此参数是考虑到执行时间长的SQL在计算频率时同时参考其执行的次数,只有执行一定次数时才去计算其频率。当执行时间与执行频率都满足时条件时,会自动将查询作为过滤项放到黑名单中,加入到黑名单中是否生效由参数 auto-filter-flag 来控制,OFF:不生效,ON:立即生效
    • 黑名单的管理
    • 从库流量配置 指定查询发送到某个从库
    • 参数动态设置(完善show proxy status/variables) 支持save config,动态增加、删除分表
    • 响应时间percentile统计 统计最近时间段DBProxy的响应时间
    • kill session 支持DBProxy的admin接口kill session操作
    • backend平滑上下线 支持平滑的backend上下线
    • DBProxy非root用户启动 使用非root用户启动
    • admin账号的安全限制 admin账号密码的动态修改及host限制
    • 增加异步刷日志的功能 增加日志线程、异步刷日志,提高响应时间
    • 支持DBProxy平滑重启功能
    • 支持SQL过滤的黑名单功能
    • 支持对于MySQL后台的thread running限制功能 该功能通过在DBProxy内限制每个后台MySQL的并发查询,来控制对应MySQL的thread running数 当发向某个MySQL后台的的并发查询超过某个阈值时,会进行超时等待,直到有可用的连接,其中阈值与超时等待的时间都已经参数化,可以动态配置
    • set backend offline不再显示节点状态
    • 支持set transaction isolation level
    • 支持use db
    • 支持set option语句
    • 支持set session级系统变量
    • 支持建立连接时指定连接属性
    • 改进连接池的连接管理,增加超时释放机制。当连接池中的空闲连接闲置超过一定时间后,自动释放连接。由参数 db-connection-idle-timeout 控制
    • 增加客户端连接的keepalive机制,避免网络异常后释放已断开的连接
    • 完善管理日志,增加了管理命令日志、错误语句日志以及详细的错误日志
    • 完善SQL日志信息,包含了详细的连接信息,并包含了DBProxy内部执行的隐式SQL语句。隐式SQL语句主要是连接重用时切换database、字符集的语句
    • 增加SQL日志rotate机制,可设置日志文件最大大小和日志文件最大个数,自动清理早期的SQL日志。分别由参数sql-log-file-size和sql-log-file-num控制
    • 增加后台MySQL版本号设置,主要影响MySQL连接协议中的server版本,客户端驱动可能依赖于server版本处理机制有所不同。由参数mysql-version控制
    • 性能改进,将SQL词法分析从串行方式改进为并发方式;其次,在每次执行SQL前如果database相同时,不再需要执行COM_INIT_DB命令。根据测试结果,在特定环境下sysbench的QPS从7万提升至22万
    • 增加监控统计信息,包括连接状态、QPS、响应时间、网络等统计
    • sql log动态配置
    • 改进autocommit为false时频繁连接主库的问题
    1. normal:等待所有当前事务结束后退出 ① KILL -SIGTERM `pid of mysql-proxy`; ② admin 命令: shutdown [normal],其中等待过程有超时机制
    2. immediate:不等待当前事务结束直接退出 ① KILL -SIGINT `pid of mysql-proxy`; ② admin 命令: shutdown immediate
    3. 配置参数shutdown_timeout: 在normal方式下,等待shutdown_timeout时间后退出,单位是s, 默认值是600
  • Bugs修复
    • DBProxy建立连向MySQL连接时,新建的socket添加keepalive和非阻塞的属性
    • rpm安装时,创建conf目录并创建默认的配置文件的功能
    • rpm安装时,需要手动修改mysql-proxyd文件中的proxy-dir, 现在直接在rpm安装后就修改好
    • 解决了绑定后端连接断开时,客户端连接未及时断开的问题
    • 屏蔽了KILL语句,避免在后端MySQL可能误KILL的问题
    • 修改了事务内语句执行错误时,DBProxy未保留后台连接导致rollback发送到其它结点的问题
    • 修复分表查询结果合并时列字符集错误的问题,该问题可能会导致结果乱码
    • 解决在分表情况下,返回值有 NULL 的情况下,查询超时的问题 此问题是DBProxy在多个分表merge结果的过程中未处理 NULL 值,导致结果集返回不对,而JDBC接口会认为此种情况下是未收到结果,会处于一直等待状态,触发超时
    • 解决在分表情况下, IN 子句中分表列只支持 int32,不支持int64 的问题
    • 解决连接断开的内存泄露问题 在连接的结构体的释放接口中,lock 的成员变量未释放,导致在连接断开,回收连接对象时会泄漏24个字节
    • 取消admin操作中不必要的日志
    • 去掉了在连接 admin 时报"[admin] we only handle text-based queries (COM_QUERY)"的信息,此信息属于无用的信息
    • 去掉了在set backend offline/online时的返回值信息,此信息是无用信息
    • 解决用户权限不足、DBProxy用户名密码配置错误等导致使用错误用户的问题
    • 解决SQL_CALC_FOUND_ROWS之后SQL语句发往主库的问题
    • 解决SQL语句中有注释时语句分析不正确的问题
    • 解决客户端发送空串导致DBProxy挂掉的问题

新功能和Bug修复描述,详见release notes

DBProxy的github地址

DBProxy手册

  1. DBProxy快速入门教程
  2. DBProxy用户使用手册
  3. DBProxy开发手册
  4. DBProxy架构和实践
  5. DBProxy release notes
  6. DBProxy 测试手册
  7. FAQ
  8. DBProxy开发规范

原文发布于微信公众号 - 美团点评技术团队(meituantech)

原文发表时间:2017-01-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java技术分享

Dubbo详细介绍与安装使用过程

随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进。

4665
来自专栏杨建荣的学习笔记

oracle的TAF浅析 (r6笔记第37天)

在使用rac的时候,有几个很闪亮的使用特性,一个就是load balance,这块毋庸置疑,确实做了很大的改进,从10g版本开始的多个vip地址的load b...

2605
来自专栏Java技术分享

Dubbo详细介绍与安装使用过程

1 Dubbo介绍 1.1 dubbox简介 随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟...

2948
来自专栏散尽浮华

Heartbeat使用梳理

在日常的集群系统架构中,一般用到Heartbeat的主要就2种: 1)高可用(High Availability)HA集群, 使用Heartbeat实现,也称为...

2007
来自专栏北京马哥教育

优化存储性能?你需要关注这些Linux I/O调度程序选项

要优化Linux性能,IT团队应该检查当前正在使用的I/O调度程序,并评估诸如deadline和完全公平队列(Completely Fair Queuing)这...

2734
来自专栏后端技术探索

解决nginx负载均衡的session共享问题

查了一些资料,看了一些别人写的文档,总结如下,实现nginx session的共享

681
来自专栏性能与架构

什么是Session共享及实现的方法

image.png 当网站业务规模和访问量的逐步增大,原本由单台服务器、单个域名组成的网站架构可能已经无法满足发展需要 此时会购买更多的服务器,并且以频道化的...

3255
来自专栏aoho求索

consul配置与实战

上一篇提到,项目用的分布式服务发现与注册组件是consul,这篇文章主要来讲下consul组件在项目中的应用以及相关介绍。本文以官方文档为主要参考consul文...

3405
来自专栏杨建荣的学习笔记

数据库日常运维中的几个操作建议(r9笔记第33天)

如果你去看其他DBA的操作的时候,如果要判断他们水平的高低,我想就是通过一些操作的差别来看了,而水平高低就体现于此。细节决定成败,越是看起来简单的操作越...

2613
来自专栏开发与安全

linux环境常用的性能监控和协助开发调试工具

linux有诸多优秀的工具帮助我们分析服务器各项性能指标和协助开发调试工作。下面只列举比较基础的命令,且一般是集成在linux环境中而不需再次安装的...

3061

扫描关注云+社区