【原创】MySQL Proxy - 脚本

       你可以通过使用嵌入式 Lua 脚本语言对 MySQL Proxy 的行为进行控制,以使得其能够对发送给 MySQL 服务器的 query 和 response 进行操纵。 


下图展现了 MySQL Proxy 中使用的类的总览。 

【原创】MySQL Proxy - 脚本 


       在 MySQL Proxy 和服务器之间的主要交互功能是通过 Lua 脚本定义的一个或者多个函数。根据客户端与一个或者多个 backend MySQL servers 之间通信序列中不同的事件和操作,定义如下一些关键函数: 


connect_server(): 该函数在每次有来自客户端到 MySQL Proxy 的连接发生时被调用。你可以在做负载均衡(load-balancing)功能时使用该函数以拦截原始连接,然后再通过策略决定客户端将要连接的服务器。如果你没有定义一个确定方案,默认情况下,一个简单的轮询(round-robin)类型的分发方式将被采用。 


read_handshake(): 该函数在初始握手信息被服务器返回时被调用。你可以捕获返回的握手信息,然后在授权交换(authorization exchange)发生前提供额外的检查。 


read_auth(): 该函数在授权包(用户名,密码,默认数据库)被客户端提交给服务器用于鉴权时被调用。 


read_auth_result(): 该函数在收到服务器返回的将要发送给客户端表明是否授权成功的授权包时被调用。 


read_query(): 该函数在每次客户端向服务器发送 query 时被调用。可以使用该函数对原始的 query 进行编辑和操纵,包括在原始 query 的前面和后面添加新的 query 。同样可以使用该函数直接返回信息给客户端而不经过(bypassing)服务器,该功能在打算过滤掉不期望的 query 的时候或者 query 的数量超过了已有限制的情况下很有用。 


read_query_result(): 该函数在每次有结果从服务器返回的时候被调用,前提是你手动注入了 query 到 query 队列中。如果你没有显示地在 read_query() 中注入 query ,则该函数不会被触发。可以使用该函数对结果集进行编辑,或者移除、过滤结果集的内容,只要该内容是由于你在 read_query() 中注入的额外的 query 产生的结果。 


下表中列出了 MySQL proxy 和服务器的通信函数,提供的信息,以及当函数被触发时的信息流方向。 


Function              Supplied Information        Direction 
connect_server()          None                       Client to Server 
read_handshake()        None                      Server to Client 
read_auth()                  None                       Client to Server 
read_auth_result()        None                      Server to Client 
read_query()                 Query                     Client to Server 
read_query_result()      Query result           Server to Client 


       默认情况下,所有的函数都会返回结果以表明当前数据是否要传递给客户端或者服务器(取决于被传输的信息的方向)。返回值可以通过显示地返回一个常量的方式进行覆盖,以表明应该发送某个特定的应答。例如,一种可能的情况是,在 read_query() 中手动创建结果集,然后直接返回给客户端,中间不再涉及发送原始 query 到服务器的动作。 


       除了上述这些函数,还有一些内置结构 通过提供针对元素的简化了的接口,例如 query 的列表和结果集的分组,提供了对 MySQL Proxy 如何转发 query 以及返回结果集的控制。