【原创】MySQL Proxy - 核心篇

核心层篇(Core)   

      Network Core 构建于 socket 处理实现的基础之上,将 client connection 和 server connection 关联到一起。    

【Connection Life Cycle】   

connection 可处于下面 4 种协议基本 phase 之一:   

  • connect
  • authentification
  • query
  • disconnect

       通过对 plugin 功能的定制实现,可以改变 network core 的默认工作方式,进而获得如下三种基本 plugin 功能中的一个:   

  1. plugin-admin 只实现了 listen 方面的功能
  2. client plugins 只实现了 connection 方面的功能
  3. plugin-proxy 实现了上述两方面的功能

    
【Scripting】   

       源码中所提供的 plugin 都实现了相应的 callback 功能函数,并将其暴露给了 scripting 层。   就目前而言,scripting 层的功能是由 Lua 语言提供的 -- 这是一种简单、快速和便于嵌入的脚本语言。   
      我们通过将大部分内部数据暴露给 scripting 层的方式,令相应模块函数可以对传进 scripting 层的数据进行操作。   

【Network Core Layer】   

       MySQL Proxy 的网络引擎的设计目标是同时处理数以千计的 connection ,并打算将其用于 load-balancing 和 fail-over 处理,所以其必须能够在同时存在很多 MySQL backend server 的情况下,对 connection 进行优雅地处理。目标锁定在了 5k 到 10k 的 connection 数量上。   

       一直到 MySQL Proxy 0.7 版本,MySQL Proxy 使用都是纯粹的事件驱动、非阻塞网络模型。   

      基于事件驱动的设计决定了 MySQL Proxy 对 idling connection 仅会保存少量必要信息:即仅仅保存 connection 的状态,然后让其等待事件的到来。   

【Threaded Scripting】   

       通常脚本都是精巧的,并只被用于做一些简单的决策处理,而把大部分工作交由网络层处理。   
       在未来的 0.9 版本中,将会利用脚本层中所支持的多线程模型,从而达到以线程池形式呈现的多脚本线程同时运行的效果。   
         如此,脚本层就可以调用阻塞或者慢函数,而不需要打断其他 connection 的执行。   

       对全局 plugin mutex 的 lift,意味着我们将必须以不同的方式对全局结构进行访问。由于大多数的访问出现在 connection level 上(也就是 event-threading 的那层),故只有对类似 "proxy.global.*" 的全局结构进行访问时才需要保持同步。基于这方面的需求,我们将研究如何在各个独立的 Lua-states 之间相互发送数据。   

时间: 2024-12-08 16:10:17

【原创】MySQL Proxy - 核心篇的相关文章

原创】MySQL Proxy - 架构篇

架构篇(architecture)         MySQL Proxy 的定位是存在于 mysql client 和 mysql server 之间的一个简单的程序,能够对从其上通过的数据进行检查.转换和直接进行相应操作.  应用范围包括:  负载均衡(load balancing) 故障处理(fail over) 查询追踪(query tracking) 查询分析(query analysis) (...)        内部实现上讲,MySQL Proxy 是这样的一个协议栈:  (应该

【原创】MySQL Proxy - 底层实现篇

底层实现篇(chassis)     [ Configfile and Commandline Options]           glib2 提供了 config-file 解析和 command-line option 解析功能. 其提供了将 option 以相同方式暴露给调用者的方法,以及从 Configfile 和 Commandline 获取 option 的功能.    所有 option 的解析过程都可以分为三步: 1. 提取   command-line 上的 basic op

【原创】MySQL Proxy - 内部结构

        在 MySQL Proxy 的脚本元素中有一些基本的内部结构需要知道.其中最主要的结构就是 proxy ,其提供了访问贯穿脚本中的许多公共结构的接口,例如连接列表和配置的 backend server .其他结构,例如来自客户端的包和返回的结果集等,只有在具体的脚本函数的上下文环境中才是可以访问的.  下表中描述了 MySQL proxy 脚本元素的公共属性.  Attribute Description connection A structure containing the

【原创】MySQL Proxy中socketpair的使用

      学习 MySQL Proxy 0.8.3 的源码后可知,其全部事件处理线程均对全局 socketpair 的读端进行了监听,以实现通知管道的功能:threads->event_notify_fds[0] .  ? 1 2 3 4 5 6 7 8 9 10 11 12 13 int chassis_event_threads_init_thread(chassis_event_threads_t *threads, chassis_event_thread_t *event_threa

【原创】MySQL Proxy - query注入动作中的脚本序列

    下图展示了一个如何使用 proxy 将客户端发送过来的 query 注入到 query 队列的例子.因为 proxy 位于客户端和 MySQL 服务器之间,所以经由 proxy 发送到服务器,以及由 proxy 最终返回给客户端的信息,不需要做到完全匹配或者关联.一旦客户端连接到了 proxy ,下图中展现的由客户端发送每一个单独的 query 引起的命令序列将会发生.           当客户端向 proxy 提交了一个 query 的时候,proxy 内部的 read_query(

【原创】MySQL Proxy - 脚本

       你可以通过使用嵌入式 Lua 脚本语言对 MySQL Proxy 的行为进行控制,以使得其能够对发送给 MySQL 服务器的 query 和 response 进行操纵.  下图展现了 MySQL Proxy 中使用的类的总览.           在 MySQL Proxy 和服务器之间的主要交互功能是通过 Lua 脚本定义的一个或者多个函数.根据客户端与一个或者多个 backend MySQL servers 之间通信序列中不同的事件和操作,定义如下一些关键函数:  conne

【原创】MySQL Proxy - 使用

       存在许多种使用 MySQL Proxy 的不同方法.采用最基本用法,你可以允许 MySQL Proxy 将来自客户端的 query 透传到后端的一个服务器.如果打算让 MySQL Proxy 在这种模式下工作,你只需要在命令行上指定 proxy 打算连接的 backend server 的信息:  ? 1 shell> mysql-proxy --proxy-backend-addresses=sakila:3306        如果你指定了多个后端 MySQL 服务器,prox

【原创】MySQL Proxy - 概况

       MySQL Proxy 是一种在网络上使用 MySQL 网络协议进行通信的应用,提供了一或多个 MySQL server 与一或多个 MySQL client 之间的通信功能.由于 MySQL Proxy 使用的是 MySQL 网络协议,故其可以在不做任何修改的情况下,配合任何符合该协议的且与 MySQL 兼容的客户端一起使用.这其中也包括 MySQL 的命令行客户端,任何使用了 MySQL 客户端库的客户端,以及任何支持 MySQL 网络协议的连接器(connector).   

【原创】MySQL Proxy - 命令行选项

       直接从命令行上启动 MySQL Proxy :  ? 1 shell> mysql-proxy        在大多数情况下,你至少应该确定 MySQL Proxy 应该将 query 转发到哪个 backend MySQL server ,即需要指定其 host 名或地址,以及端口号信息.         可以在命令行中直接指定选项,也可以在配置文件中指定,同时使用 --defaults-file 命令行参数指定配置文件的位置.         如果你采用了配置文件的方式,其格式