续上一篇
从零写一个兼容MySQL/Oracle的Proxy中件间(一)
从零写一个兼容MySQL/Oracle的Proxy中件间(二):SQL捕获和改写
从零写一个兼容MySQL/Oracle的Proxy中件间(三):MySQL协议捕获和转发
过去的三个文章实现了以下功能
Oracle登录捕获:捕获了Oracle通信协议中的用户登录包
Oracle用户解析:抓到了用户传用户名和密码的内容(密码是加密串)
SQL请求包:同时通过对比,确定了用户发送SQL请求的通信包
OracleSQL日志:分析这些包,把SQL语句拿出来,记到日志里。
OracleSQL改写:用户发起的SQL 经过中间层改写到了服务端收到的是另一个SQL执行返回结果。
MySQL兼容:增加配置文件,使中间件可以支持两种数据库
MySQL协议解析:将经过proxy的MySQL包里的SQL语句解析出来,记录到日志
在没更新的这几天里我又偷偷完成了配置变更等小功能。现在中件间其实已经在理论上可以发布使用了
在投入使用前,在测试环境对这个半成品的中件间做了些基准测试。
在测试环境上生成了5张表,每张表200万行数据,对其进行直连和proxy模式压测。
以下是测试报告:

结论是:加了Proxy,性能下降了14% ,在情理之中,一般的SQL中间层因为多了层中转,响应时间会降低20ms左右。tps/qps在不做连接池的情况下会下降10%。
分析性能下降的原因:
因为在proxy存把经过的网络包都拆开来分析其中的内容,且把SQL语句存在日志里,这些步骤是比较费资源和时间的。
为了提升Proxy性能,降低中间层的性能影响,我们加了个配置参数
cat /data/proxy/conf/proxy3308.cnf[basic]logfile = data/proxy/log/3308.logdaemon = true[proxy]proxytype = mysqlbind = 0.0.0.0:3308server = 127.0.0.2:3308isssl = falseiscatchquery = false #增加是否“拆包” false时,Proxy进入高性能模式iscatchlogin = falsemaxsquerylsize = 16384
当 `iscatchquery`=false时,Proxy进入高性能模式
if Iscatchquery {#只有iscatchquery为true时才解析包。switch ProxyType {case "mysql":log.Printf("mysql:sqlPipeMySQL\n")sqlPipeMySQL(srcCon, dstCon)case "oracle":log.Printf("oracle:sqlPipeOracle\n")sqlPipeOracle(srcCon, dstCon)}} else {sqlPipeAuto(srcCon, dstCon)}
修改配置,让proxy处于高性能模式,继续压测,结果如下:

结论:在低并发时性能有所下降,在高并发时SQL响应时间会减少,性能超过了直连数据库。(为了确认这个结果,做了7,8次类似的压测,结果一致)
在高性能模式下,Proxy和直连数据库相比性能下降不明显,在SQL日志捕获模式下,Proxy和直连数据库有14%的性能损失。




