续: 从零写一个兼容MySQL/Oracle的Proxy中件间(一)《初识Oracle的通信协议》 从零写一个兼容MySQL/Oracle的Proxy中件间(二):SQL捕获和改写 从零写一个兼容MySQL/Oracle的Proxy中件间(三):MySQL协议捕获和转发
1.过去的三个文章我们实现了以下功能]
- 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.log
daemon = true
[proxy]
proxytype = mysql
bind = 0.0.0.0:3308
server = 127.0.0.2:3308
isssl = false
iscatchquery = false #增加是否“拆包” false时,Proxy进入高性能模式
iscatchlogin = false
maxsquerylsize = 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%的性能损失。
>> Home