MySQL Proxy处于客户端应用程序和MySQL服务器之间,通过截断、改变并转发客户端和后端数据库之间的通信来实现其功能,这和WinGate之类的网络代理服务器的基本思想是一样的。代理服务器是和TCP/IP协议打交道,而要理解MySQL Proxy的工作机制,同样要清楚MySQL客户端和服务器之间的通信协议,MySQL Protocol包括认证和查询两个基本过程:
认证过程包括:
- 客户端向服务器发起连接请求
- 服务器向客户端发送握手信息
- 客户端向服务器发送认证请求
- 服务器向客户端发送认证结果
如果认证通过,则进入查询过程:
- 客户端向服务器发起查询请求
- 服务器向客户端返回查询结果
当然,这只是一个粗略的描述,每个过程中发送的包都是有固定格式的,想详细了解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脚本,真是创意无限啊。
博主的思想的确比错,不过写lua脚本毕竟比较麻烦。
其实国内有人开发了一套类似mysql proxy的软件:
amoeba for mysql
google 上面查询 amoeba mysql都是这些文章
不仅仅支持水平切分、垂直切分
读写分离
负载均衡
故障恢复功能
而且配置相当方便
这个是国内软件,请大家支持一把。我也是刚刚使用
[...] Amoeba是一个类似MySQL Proxy的分布式数据库中间代理层软件,是由陈思儒开发的一个开源的项目。其主要功能包括读写分离,垂直分库,水平分库等,经过测试,发现其功能和稳定性都非常的不错,如果需要构架分布式数据库环境,采用Amoeba是一个不错的方案。目前Amoeba一共包括For aladdin,For MySQL和For Oracle三个版本,本文主要关注For MySQL版本的一个读写分离实现。实际上垂直切分和水平切分的架构也相差不大,改动几个配置就可以轻松实现。 [...]
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又将其转给客户端,此时登录流程结束。
@Joshua Zhu,谢谢你的补充。
1.这个lua脚本说简单高效可能有一定道理,但说实话lua是比较冷门的语言,不如amoeba采用xml配置可能更容易被人接受些。wormhole作为一种存储引擎,确实不是在MySQL Proxy中,所以我说的是MySQL Proxy采用了wormhole引擎,而不是说wormhole在MySQL Proxy中独有的。
2.我这句话描述的是进入查询过程的情况,可能没有说明清楚这一点。你描述的是认证过程,呵呵
谢谢NinGoo的回复
Amoeba是个比较实用的工具,确实可以有效的解决一些切实存在的问题。不过我更看好MySQL Proxy,因为后者更灵活和强大。至于说Lua比较冷门,要看你怎么看啦,呵呵(http://www.javaeye.com/news/1161,这个地址排名18)。另外我有个疑问,我读过MySQL Proxy的代码,没在里面发现wormhole引擎的代码,NinGoo兄是在哪里获知MySQL Proxy采用了wormhole的?
欢迎交流
但是效率到底如何呢?