【原创】MySQL Proxy - 脚本

15.7.4. MySQL Proxy Scripting

(下面这些章节能够参考后面的译文)
15.7.4.1. Proxy Scripting Sequence During Query Injection
15.7.4.2. Internal Structures
15.7.4.3. Capturing a Connection with connect_server()
15.7.4.4. Examining the Handshake with read_handshake()
15.7.4.5. Examining the Authentication Credentials with read_auth()
15.7.4.6. Accessing Authentication Information with read_auth_result()
15.7.4.7. Manipulating Queries with read_query()
15.7.4.8. Manipulating Results with read_query_result()


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


下图展示了 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 以及返回结果集的控制。
相关文章
相关标签/搜索