暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

从零写一个兼容MySQL/Oracle的Proxy中件间(四):性能测试和改进

数据库工作笔记 2022-01-18
598

续上一篇

从零写一个兼容MySQL/Oracle的Proxy中件间(一)

从零写一个兼容MySQL/Oracle的Proxy中件间(二):SQL捕获和改写

从零写一个兼容MySQL/Oracle的Proxy中件间(三):MySQL协议捕获和转发


过去的三个文章实现了以下功能

  1. Oracle登录捕获:捕获了Oracle通信协议中的用户登录包

  2. Oracle用户解析:抓到了用户传用户名和密码的内容(密码是加密串)

  3. SQL请求包:同时通过对比,确定了用户发送SQL请求的通信包

  4. OracleSQL日志:分析这些包,把SQL语句拿出来,记到日志里。 

  5. OracleSQL改写:用户发起的SQL 经过中间层改写到了服务端收到的是另一个SQL执行返回结果。

  6. MySQL兼容:增加配置文件,使中间件可以支持两种数据库

  7. 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%的性能损失。

      文章转载自数据库工作笔记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

      评论