Meituan-DBProxy 介绍
奇虎360公司开源的Atlas是优秀的数据库中间件,美团点评DBA团队针对公司内部需求,在其上做了很多改进工作,形成了新的高可靠、高可用企业级数据库中间件DBProxy,已在公司内部生产环境广泛使用,较为成熟、稳定。
DBProxy的优点
DBProxy对Atlas的改进
-
新增功能点
-
新增参数
-
thread-running-sleep-delay用于指定在thread running数超过backend-max-thread-running时,客户端连接等待的时间
-
在手动添加黑名单时,只需要将用户的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上下线 -
支持对于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万
-
sql log动态配置
-
改进autocommit为false时频繁连接主库的问题
-
-
normal:等待所有当前事务结束后退出
① KILL -SIGTERM pid of MysqL-proxy; ② admin 命令: shutdown
[normal],其中等待过程有超时机制 -
immediate:不等待当前事务结束直接退出
① KILL -SIGINT pid of MysqL-proxy; ② admin 命令: shutdown immediate -
配置参数shutdown_timeout: 在normal方式下,等待shutdown_timeout时间后退出,单位是s, 默认值是600
-
Bugs修复
-
解决了绑定后端连接断开时,客户端连接未及时断开的问题
-
解决在分表情况下,返回值有 NULL 的情况下,查询超时的问题
此问题是DBProxy在多个分表merge结果的过程中未处理 NULL
值,导致结果集返回不对,而JDBC接口会认为此种情况下是未收到结果,会处于一直等待状态,触发超时 -
解决连接断开的内存泄露问题
在连接的结构体的释放接口中,lock 的成员变量未释放,导致在连接断开,回收连接对象时会泄漏24个字节 -
取消admin操作中不必要的日志
-
去掉了在连接 admin 时报”[admin] we only handle text-based queries (COM_QUERY)”的信息,此信息属于无用的信息
-
去掉了在set backend offline/online时的返回值信息,此信息是无用信息
-
解决客户端发送空串导致DBProxy挂掉的问题
Meituan-DBProxy 官网
https://github.com/Meituan-Dianping/DBProxy
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。