MySQL Proxy工作机制浅析

MySQL Proxy处于客户端应用程序和MySQL服务器之间,通过截断、改变并转发客户端和后端数据库之间的通信来实现其功能,这和WinGate之类的网络代理服务器的基本思想是一样的。代理服务器是和TCP/IP协议打交道,而要理解MySQL Proxy的工作机制,同样要清楚MySQL客户端和服务器之间的通信协议,MySQL Protocol包括认证和查询两个基本过程:

认证过程包括:

  1. 客户端向服务器发起连接请求
  2. 服务器向客户端发送握手信息
  3. 客户端向服务器发送认证请求
  4. 服务器向客户端发送认证结果

如果认证通过,则进入查询过程:

  1. 客户端向服务器发起查询请求
  2. 服务器向客户端返回查询结果

当然,这只是一个粗略的描述,每个过程中发送的包都是有固定格式的,想详细了解MySQL Protocol的同学,可以去这里看看。MySQL Proxy要做的,就是介入协议的各个过程。首先MySQL Proxy以服务器的身份接受客户端请求,根据配置对这些请求进行分析处理,然后以客户端的身份转发给相应的后端数据库服务器,再接受服务器的信息,返回给客户端。所以MySQL Proxy需要同时实现客户端和服务器的协议。由于要对客户端发送过来的SQL语句进行分析,还需要包含一个SQL解析器。可以说MySQL Proxy相当于一个轻量级的MySQL了,实际上,MySQL Proxy的admin server是可以接受SQL来查询状态信息的。

MySQL Proxy通过lua脚本来控制连接转发的机制。主要的函数都是配合MySQL Protocol各个过程的,这一点从函数名上就能看出来:

  • connect_server()
  • read_handshake()
  • read_auth()
  • read_auth_result()
  • read_query()
  • read_query_result()

至于为什么采用lua脚本语言,我想这是因为MySQL Proxy中采用了wormhole存储引擎的关系吧,这个虫洞存储引擎很有意思,数据的存储格式就是一段lua脚本,真是创意无限啊。



无觅相关文章插件,快速提升流量

17条评论

  • At 2008.06.24 09:46, mysql+dba said:

    博主的思想的确比错,不过写lua脚本毕竟比较麻烦。

    其实国内有人开发了一套类似mysql proxy的软件:
    amoeba for mysql

    google 上面查询 amoeba mysql都是这些文章

    不仅仅支持水平切分、垂直切分
    读写分离
    负载均衡
    故障恢复功能
    而且配置相当方便

    这个是国内软件,请大家支持一把。我也是刚刚使用

    • At 2013.03.11 11:37, jason said:

      请问 amoeba 支持innodb 存储引擎吧。

    • […] Amoeba是一个类似MySQL Proxy的分布式数据库中间代理层软件,是由陈思儒开发的一个开源的项目。其主要功能包括读写分离,垂直分库,水平分库等,经过测试,发现其功能和稳定性都非常的不错,如果需要构架分布式数据库环境,采用Amoeba是一个不错的方案。目前Amoeba一共包括For aladdin,For MySQL和For Oracle三个版本,本文主要关注For MySQL版本的一个读写分离实现。实际上垂直切分和水平切分的架构也相差不大,改动几个配置就可以轻松实现。 […]

      • At 2011.07.07 16:32, 黄兵 said:

        您适用过Amoeba这个不? 效果怎么样? 对于高访问呢?

      • At 2009.02.08 01:16, Joshua Zhu said:

        NinGoo,

        1) MySQL Proxy使用Lua作为脚本的原因是因为它简单,高效。并且wormhole存储引擎不是在MySQL Proxy中,而是像MyISAM/InnoDB一样,是MySQL的存储引擎之一。

        2) “首先MySQL Proxy以服务器的身份接受客户端请求,根据配置对这些请求进行分析处理,然后以客户端的身份转发给相应的后端数据库服务器,再接受服务器的信息,返回给客户端。” ——这个描述有误。通常的流程是MySQL Proxy接受客户端的连接,然后连接后端数据库服务器;服务器发送握手消息给MySQL Proxy,MySQL Proxy将其转发给客户端;之后客户端发来认证消息给MySQL Proxy,MySQL Proxy将之转发给后端服务器;后端MySQL验证认证消息是否有效,把结果传递给MySQL Proxy,MySQL Proxy又将其转给客户端,此时登录流程结束。

        • At 2009.02.11 22:36, NinGoo said:

          @Joshua Zhu,谢谢你的补充。
          1.这个lua脚本说简单高效可能有一定道理,但说实话lua是比较冷门的语言,不如amoeba采用xml配置可能更容易被人接受些。wormhole作为一种存储引擎,确实不是在MySQL Proxy中,所以我说的是MySQL Proxy采用了wormhole引擎,而不是说wormhole在MySQL Proxy中独有的。

          2.我这句话描述的是进入查询过程的情况,可能没有说明清楚这一点。你描述的是认证过程,呵呵

          • At 2009.02.12 14:18, Joshua Zhu said:

            谢谢NinGoo的回复 :-)

            Amoeba是个比较实用的工具,确实可以有效的解决一些切实存在的问题。不过我更看好MySQL Proxy,因为后者更灵活和强大。至于说Lua比较冷门,要看你怎么看啦,呵呵(http://www.javaeye.com/news/1161,这个地址排名18)。另外我有个疑问,我读过MySQL Proxy的代码,没在里面发现wormhole引擎的代码,NinGoo兄是在哪里获知MySQL Proxy采用了wormhole的?

            欢迎交流 😀

            • At 2009.04.22 10:17, 布里斯班 said:

              但是效率到底如何呢?

              • At 2011.03.07 19:25, longxibendi said:

                有人说mysql proxy不支持事物,请问mysql proxy与事物有关系吗?觉得是否支持事物得看存储引擎吧?

                • […] Amoeba是一个类似MySQL Proxy 的 分布式数据库中间代理层软件,是由陈思儒开发的一个开源的java项目。其主要功能包括读写分离,垂直分库,水平分库等,经过测试,发现其功能和稳定性都 非常的不错,如果需要构架分布式数据库环境,采用Amoeba是一个不错的方案。目前Amoeba一共包括For aladdin,For MySQL和For Oracle三个版本,本文主要关注For MySQL版本的一个读写分离实现。实际上垂直切分和水平切分的架构也相差不大,改动几个配置就可以轻松实现。 […]

                  • At 2011.07.12 18:20, NinGoo said:

                    08年的时候小规模用过,后来淘宝有了自己的中间层服务,就没再用了。

                    • […] Amoeba是一个类似MySQL Proxy的分布式数据库中间代理层软件,是由陈思儒开发的一个开源的java项目。其主要功能包括读写分离,垂直分库,水平分库等,经过测试,发现其功能和稳定性都非常的不错,如果需要构架分布式数据库环境,采用Amoeba是一个不错的方案。目前Amoeba一共包括For aladdin,For MySQL和For Oracle三个版本,本文主要关注For MySQL版本的一个读写分离实现。实际上垂直切分和水平切分的架构也相差不大,改动几个配置就可以轻松实现。 […]

                      • […] Amoeba是一个类似MySQL Proxy的 分布式数据库中间代理层软件,是由陈思儒开发的一个开源的java项目。其主要功能包括读写分离,垂直分库,水平分库等,经过测试,发现其功能和稳定性都 非常的不错,如果需要构架分布式数据库环境,采用Amoeba是一个不错的方案。目前Amoeba一共包括For aladdin,For MySQL和For Oracle三个版本,本文主要关注For MySQL版本的一个读写分离实现。实际上垂直切分和水平切分的架构也相差不大,改动几个配置就可以轻松实现。 […]

                        • At 2012.03.09 11:41, DBA_MYSQL_LINUX_Perl » Amoeba said:

                          […] Amoeba是一个类似MySQL Proxy的分布式数据库中间代理层软件,是由陈思儒开发的一个开源的java项目。其主要功能包括读写分离,垂直分库,水平分库等,经过测试,发现其功能和稳定性都非常的不错,如果需要构架分布式数据库环境,采用Amoeba是一个不错的方案。目前Amoeba一共包括For aladdin,For MySQL和For Oracle三个版本,本文主要关注For MySQL版本的一个读写分离实现。实际上垂直切分和水平切分的架构也相差不大,改动几个配置就可以轻松实现 […]

                          • […] 来源:http://www.ningoo.net/html/2008/how_mysql_proxy_works.html 未分类之间, 协议, 发送, 存储, 客户端, 服务器, 查询, 认证, 请求, 过程 ← 23个经典JDK设计模式 MySQL Proxy 安装和测试 → 发表评论?0 条评论。 […]

                            • At 2015.02.05 09:51, 神仙 said:

                              现在还有地方找到有 wormhole engine 的版本么?

                              • At 2017.06.18 23:25, 凯迪的博客 said:

                                […] Amoeba是一个类似MySQL Proxy的分布式数据库中间代理层软件。 是由陈思儒开发的一个开源的java项目。 其主要功能包括读写分离,垂直分库,水平分库等,经过测试,发现其功能和稳定性都非常的不错,如果需要构架分布式数据库环境,采用Amoeba是一个不错的方案。 […]


                                (Required)
                                (Required, will not be published)