OneProxy :: 如何利用中间件了解应用中的事务?抓取慢事务和异常关闭事务?

数据库的事务,能够加快批量处理的速度,但也会因为持久锁的时间变长而影响应用程序并发性能,绝大多数关系数据库的应用都不能脱离事务,对应用事务的了解程度对架构师、研发人员和运维人员掌控应用的运行是极其重要的。OneProxy可以透明地记录应用中事物的信息,包括事务的结构(由哪几条SQL语句构成)、事务的执行时间(事务的持续时间、SQL语句执行时间、DML语句执行时间),可以从内置监控页面(Demo)中一眼看到,让你对应用的运行情况一目了然,OneProxy也可以记录出错的事务,以便于分析死锁问题

在最新版本中,根据用户的反馈和建议,又增加了两个与事务相关的功能,可以帮助分析应用中的异常事务。第一个是记录异常关闭的事务,指的是数据库连接突断断开时还未来得及提交的事务,可以在SQL中运行如下命令:

mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)

mysql> select count(*) from t_binlog;
+----------+
| count(*) |
+----------+
|    10000 |
+----------+
1 row in set (0.08 sec)

mysql> exit;

在MySQL客户端中开启一个事务,不提交也不回滚,直接退出客户端,就可以在OneProxy的日志中,看到这个异常的事务,同时记录了这个事务来自于哪个客户端应用。如下所示:

......: (critical) TrxAbort (127.0.0.1:52780) : tim=18863ms trx=4140989383

第二个功能是可以记录执行超过一定时间的事务,只需要在参数文件中用“proxy-audit-slowtrans”选项设置慢事务的时间阀值即可。下面是将慢事务设为100,即记录超过100ms的事务,在sysbench的测试中就可以抓到慢事务了。如下所示:

……: (critical) TRXAudit (127.0.0.1:52370) : tim=135ms trx=722182069, 19932279, 2293306050, 2257262071, 649295136, 2284185752, 1463411983, 3592829012, 3446540723
……: (critical) TRXAudit (127.0.0.1:52370) : tim=139ms trx=2116936429, 1309444863, 2333124817, 3531297413, 1033236440, 1100562824, 2384787918, 456731074, 549414034

可以根据日志中的SQL Hash值,在OneProxy的监控页面中找出SQL语句(无变量值信息),进行详细的分析,也可以用来记录那些客户端经常会忘记提交事务,也可以开启记录全栈事务(Full Stack)功能,可以记录下事务中执行的最后10条SQL语句,在这里可以看到SQL具体变量的值。如下所示:

......: (critical) TrxAbort (127.0.0.1:53075) : tim=11338ms trx=4140989383
......: (critical) TrxAbort (127.0.0.1:53075) : select count(*) from t_binlog 

开启全栈事务功能,每个连接会需要更多的内存,并且可能会记录大量日志,可能会影响性能,需要慎用。