Meituan-DBProxy

基于 MySQL 的数据库中间件
授权协议 GPL-2.0
开发语言 C/C++
所属分类 数据库相关、 数据库调整和优化
软件类型 开源软件
地区 不详
投 递 者 邰英毅
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

奇虎360公司开源的Atlas是优秀的数据库中间件,美团点评DBA团队针对公司内部需求,在其上做了很多改进工作,形成了新的高可靠、高可用企业级数据库中间件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挂掉的问题

  • 新增参数 backend-max-thread-running用于指定每个MySQL后台的最大thread running数 thread-running-sleep-delay用于指定在thread running数超过backend-max-thread-running时,客户端连接等待的时间 添加到黑名单中需要满足两个条件:SQL执行的时间和频率 提供了查看、修改、添加、删除黑名单的功能 黑

  • DBProxy/USER_GUIDE.md at master · Meituan-Dianping/DBProxy   https://github.com/Meituan-Dianping/DBProxy/blob/master/doc/USER_GUIDE.md#1

  • https://github.com/Meituan-Dianping/DBProxy/blob/master/doc/USER_GUIDE.md#1.2.2 https://github.com/Meituan-Dianping/DBProxy/blob/master/doc/QUICK_START.md 1 总体信息         1.1 关于本手册         1.2 DBProxy概

  • 源码从代码仓库下载到本地 git clone git@github.com:Meituan-Dianping/DBProxy.git 编译源码并安装(添加新文件和修改版本的时候需要运行autogen.sh,注意docker centos:6.6 image下运行autogen.sh会失败) sh autogen.sh sh bootstrap.sh make && make install 执行s

  • 1. DBProxy安装 1.1 安装依赖项 CentOS yum install -y Percona-Server-devel-55.x86_64 Percona-Server-client-55.x86_64 Percona-Server-shared-55 jemalloc jemalloc-devel libevent libevent-devel openssl openssl-dev

  • dbproxy安装需要注意以下几点: 1,需要glib-2.42 有可能需要自行下载安装,本人使用2.42.1 2,编译的时候如果报错 需要设置 export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig dbproxy只支持mysql(percona)5.5, 5,6 下载dbproxy wget https://codeload.github.com/Mei

  • 介绍 奇虎360公司开源的Atlas是优秀的数据库中间件,美团点评DBA团队针对公司内部需求,在其上做了很多改进工作,形成了新的高可靠、高可用企业级数据库中间件DBProxy,已在公司内部生产环境广泛使用,较为成熟、稳定。 DBProxy的优点  支持多语言MySQL客户端 读写分离 负载均衡 Slave故障感知与摘除(Master需要MHA等其他联动) 后端连接池 自定义SQL拦截与过滤 流量分

  • yum install -y Percona-Server-devel-55.x86_64 Percona-Server-client-55.x86_64 Percona-Server-shared-55 jemalloc jemalloc-devel libevent libevent-devel openssl openssl-devel lua lua-devel bison flex li

  • 本参考手册仅针对美团点评内部目前使用的 DBProxy v0.2.0 版本功能和使用方法进行介绍,意在使用户更快速的掌握DBProxy v0.2.0 版本提供的各种功能,以及更便捷的针对线上使用DBProxy v0.2.0 出现的故障进行排错。 DBProxy 的前身是由 Qihoo 360公司Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目Atlas。Atlas是在MyS

  • 【参考文献】 https://github.com/Meituan-Dianping/DBProxy/blob/master/doc/USER_GUIDE.md 【他人分析篇】 https://mp.weixin.qq.com/s?__biz=MzUxNzQ0MDU1MA==&mid=2247483903&idx=1&sn=bb2b0b517057ae1d957bc2d12205d464&chks

 相关资料
  • 本文向大家介绍基于Docker的PHP调用基于Docker的Mysql数据库,包括了基于Docker的PHP调用基于Docker的Mysql数据库的使用技巧和注意事项,需要的朋友参考一下 docker简介: Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不

  • 问题内容: 我知道有三种不同的,流行的非SQL数据库类型。 键/值:Redis,Tokyo Cabinet,Memcached ColumnFamily:Cassandra,HBase 文件:MongoDB,CouchDB 我已经读了很长的博客,但对它的了解却很少。 我知道关系数据库,并且在MongoDB / CouchDB等基于文档的数据库中徘徊。 谁能告诉我这些和清单上的两个前者之间的主要区别

  • 问题内容: 是否有任何库在Java中创建使用文件作为数据库的程序,而不必在要使用它的计算机上安装数据库服务? 问题答案: Derby和Hypersonic SQL均可在内存和服务器模式下运行。

  • 1.15.1 MySQL简介 Mysql是最流行的RDBMS(Relational Database Management System:关系数据库管理系统),特别是在WEB应用方面。 数据库(Database)是按照数据结构来组织、存储和管理数据的仓库, 每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据。 所谓的关系型数据库,是建立在关系模型基础上的数据库,借助于

  • 我试图写一个过程,它从存储在数据库中的一组记录中读取cron表达式,并运行一个作业(如果该表达式在接下来的一个小时内触发,则执行一个程序)。数据库中带有cron表达式的记录可以有不同的触发时间(如星期五或每小时等)。 带有cron表达式的表示例。 用户可以更新表中的crons。 设计这种应用程序的最佳方式是什么? 我在这里看到的主要问题如下:假设我每1小时运行一次工作,并在接下来的一个小时内记录计

  • 基于FMDB的数据库增删改查Demo。其中包括 statusBar 上显示Log的用法。仅支持ARC。比较适合新手。 [Code4App.com]