关于MYSQL透传技术,一般指两种
第一种是指把代理接收到的SQL ,不做任何修改的, 发送到后端数据库,语境上一般指SQL字符串,更深入一点,可能是指客户端发送到代理的报文.
第二种是指代理接收到的后端数据库的响应,不做任何修改的,从代理转发到客户端.
先复习一下MySQL报文格式
数据库代理的整体交互逻辑
报文响应阶段的状态变换
结果集各个报文
第一个问题
要解决这个问题,其实只需判断响应接收的报文是报文响应阶段的状态变换最后一个报文,而且它接收就可以了.
也就是判断最后一个ROW报文后是OK包就可以了,把此前的报文写入前端socket就可以了.这里需要注意的是,它是需要解析packet层次的,得出payload,然后再根据payload的类型判断是否row还是ok包.
但是这个并不是本文章的主题,本文要讨论的是在此基础上实现结果集透传.
有人会问,不就是把结果集的ResultSetRow报文报文接收完整,写入前端就可以了?我们假设这个场景,结果集是ResultSetRow报文是比较大的,比如1mb,那么是否也要把结果集接收完整再处理.
这里我们有一个优化点,就是结果集行透传技术,它无需把结果集行报文接收完整,就把把结果集行报文写入前端socket.
解析流程
解析层次
一般来说,解析会有两个层次,一个是组包,在mysql中,小于等于16为一个packet,,packet承载的内容就是payload,pakcet包含payload的长度,以及校验的序号.而透传技术的解析中,在同一个解析器就同时解析两个层次,到达在能判断payload是什么内容类型(元数据还是行数据)的情况下,尽量把packet级别的数据往前端socket的传递,从而达到内存开销小的优势,但是它与完整解析packet的逻辑相比,有额外的解析,在极端情况下,网速极快快,内存非常充足的情况下,传递报文性能不一定有优势.
参考[MySQL报文解析状态机]