dbproxy 支持 in 查询, 当in 中的字段 属于不同的分表时, QPS约为 5000左右, 如果为 等值查询,  qps的30000左右

主要原因是 对于in操作,会产生多个不同分表的sql, 这些sql的发送完全是顺序的, 发送第二个sql, 要完全等到 第一个SQL结果的返回,

src/network-mysqld.c

void network_mysqld_con_handle(int event_fd, short events, void *user_data) {
switch (con->state) {
case CON_STATE_INIT:
//执行NETWORK_MYSQLD_PLUGIN_PROTO(proxy_init)
plugin_call(srv, con, con->state);
break; case CON_STATE_CONNECT_SERVER:
//执行NETWORK_MYSQLD_PLUGIN_PROTO(proxy_connect_server)
//准备发给client的随机挑战数
plugin_call(srv, con, con->state);
break; case CON_STATE_SEND_HANDSHAKE:
//向client发送挑战随机数
network_mysqld_write(srv, con->client); //此处没有对应的函数指针, 只是设置下state 为 CON_STATE_READ_AUTH;
plugin_call(srv, con, con->state);
break; case CON_STATE_READ_AUTH:
//读取client返回数据
network_mysqld_read(srv, recv_sock); //NETWORK_MYSQLD_PLUGIN_PROTO(proxy_read_auth) 设置状态为CON_STATE_SEND_AUTH_RESULT
plugin_call(srv, con, con->state); case CON_STATE_SEND_AUTH_RESULT:
//向client写验证返回数据
network_mysqld_write(srv, con->client); //没有对应的函数指针, 设置状态为 CON_STATE_READ_QUERY, 在这里开始 读取client 发送来的sql
plugin_call(srv, con, con->state);
break; case CON_STATE_READ_QUERY:
network_socket *recv_sock = con->client;
network_mysqld_read(srv, recv_sock); //执行NETWORK_MYSQLD_PLUGIN_PROTO(proxy_read_query), 读取用户sql, 设置状态为CON_STATE_SEND_QUERY
plugin_call(srv, con, con->state);
break; case CON_STATE_SEND_QUERY:
//发送到server
network_mysqld_write(srv, con->server); //设置状态 CON_STATE_READ_QUERY_RESULT
break; case CON_STATE_READ_QUERY_RESULT:
//读取server返回数据
network_mysqld_read(srv, recv_sock); //执行NETWORK_MYSQLD_PLUGIN_PROTO(proxy_read_query_result), 设置状态为CON_STATE_SEND_QUERY_RESULT
plugin_call(srv, con, con->state);
break; case CON_STATE_SEND_QUERY_RESULT:
//先发送给client
network_mysqld_write(srv, con->client); //执行NETWORK_MYSQLD_PLUGIN_PROTO(proxy_send_query_result)
////如果st->injected.queries队列中无数据, 设置状态为CON_STATE_READ_QUERY, 读取client 的新sql
//否则, 继续向server发送队列中的sql
plugin_call(srv, con, con->state)
break;
}
}

plugins/proxy/proxy-plugin.c

//初始化
NETWORK_MYSQLD_PLUGIN_PROTO(proxy_init) {
network_mysqld_con_lua_t *st = con->plugin_con_state;
st = network_mysqld_con_lua_new();
con->plugin_con_state = st;
con->state = CON_STATE_CONNECT_SERVER;
return NETWORK_SOCKET_SUCCESS;
} //连接backend, 就是准备些随机挑战数, 用于连接real mysql 用
NETWORK_MYSQLD_PLUGIN_PROTO(proxy_connect_server) {
con->state = CON_STATE_SEND_HANDSHAKE;
} //读取client发来的验证信息
NETWORK_MYSQLD_PLUGIN_PROTO(proxy_read_auth) {
con->state = CON_STATE_SEND_AUTH_RESULT;
} NETWORK_MYSQLD_PLUGIN_PROTO(proxy_read_query) {
network_injection_queue_reset(st->injected.queries);
sqls = sql_parse(con, tokens);
for (i = ; i < sqls->len; ++i) {
inj = injection_new(id, sqls->pdata[i]);
inj->resultset_is_needed = TRUE;
g_queue_push_tail(st->injected.queries, inj);
} inj = g_queue_peek_head(st->injected.queries);
network_mysqld_queue_reset(send_sock);
network_mysqld_queue_append(send_sock, send_sock->send_queue, S(inj->query)); con->state = CON_STATE_SEND_QUERY;
} NETWORK_MYSQLD_PLUGIN_PROTO(proxy_read_query_result) {
if ( != st->injected.queries->length) {
//在读取server返回数据时, 弹出st->injected.queries的头元素
inj = g_queue_pop_head(st->injected.queries); con->state = CON_STATE_READ_QUERY;
}
} //如果st->injected.queries队列中无数据, 设置状态为CON_STATE_READ_QUERY, 读取client 的新sql
//否则, 继续向server发送队列中的sql
NETWORK_MYSQLD_PLUGIN_PROTO(proxy_send_query_result) {
if (st->injected.queries->length == ) {
con->state = CON_STATE_READ_QUERY;
return NETWORK_SOCKET_SUCCESS;
}
//发送给client后, 将st->injected.queries的头元素 放到send_queue中
inj = g_queue_peek_head(st->injected.queries);
network_mysqld_queue_reset(send_sock);
network_mysqld_queue_append(send_sock, send_sock->send_queue, S(inj->query));
con->state = CON_STATE_SEND_QUERY;
return NETWORK_SOCKET_SUCCESS;
}
network_mysqld_con_lua_t *network_mysqld_con_lua_new() {
network_mysqld_con_lua_t *st;
st = g_new0(network_mysqld_con_lua_t, );
st->injected.queries = network_injection_queue_new();
return st;
}

dbporxy-mysql 协议流转图的更多相关文章

  1. mysql协议分析2---认证包

    主人看到navicat和mysql在那嘻嘻哈哈,眉来眼去的,好不快乐,忽然也想自己写个程序,直接去访问Mysql,虽然现在已经有很多现成的中间件可以直接拿来用了,程序只要负责写sql语句就行了,但是主 ...

  2. MySql轻松入门系列————第一站 从源码角度轻松认识mysql整体框架图

    一:背景 1. 讲故事 最近看各大技术社区,不管是知乎,掘金,博客园,csdn基本上看不到有小伙伴分享sqlserver类的文章,看样子这些年sqlserver没落了,已经后继无人了,再写sqlser ...

  3. Mysql 逻辑架构图及日志系统

    我们经常能看到如下的逻辑架构图,但是往往不能进行很好的记忆,看过就忘记了,也不知道它的实现方式.今天通过简单的画图来简单了解一下mysql到底是如何执行一个select语句,如何update一条语句. ...

  4. 基于MySQL协议的数据库中间层项目Atlas - 360团队

    一.简介 Atlas是由 Qihoo 360公司Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目.它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基础上,修改了 ...

  5. MySQL协议分析

    MySQL协议分析 标签: mysql 2015-02-27 10:22 1807人阅读 评论(1) 收藏 举报  分类: 数据库(19)    目录(?)[+]   1 交互过程 MySQL客户端与 ...

  6. TiDB:支持 MySQL 协议的分布式数据库解决方案

    [编者按]TiDB 是国内 PingCAP 团队开发的一个分布式 SQL 数据库.其灵感来自于 Google 的 F1,TiDB 支持包括传统 RDBMS 和 NoSQL 的特性.在国内 ITOM 管 ...

  7. MySQL协议分析2

    MySQL协议分析 议程 协议头 协议类型 网络协议相关函数 NET缓冲 VIO缓冲 MySQL API 协议头 ● 数据变成在网络里传输的数据,需要额外的在头部添加4 个字节的包头. . packe ...

  8. MySQL协议学习(1):准备工作

    MySQL Client/Server协议 准确的说应该是MySQL Client/Server协议,另一个叫X Protocol的暂不涉及.地址如下:MySQL Client/Server Prot ...

  9. mixer: mysql协议分析

    综述 要实现一个mysql proxy,首先需要做的就是理解并实现mysql通讯协议.这样才能通过proxy架起client到server之间的桥梁. mixer的mysql协议实现主要参考mysql ...

随机推荐

  1. 电脑清缓存(C盘占空间)

    电脑缓存目录: 1.取消文件隐藏 2.找到C:\Users\lwx351192\AppData\Local\Temp目录下的三个子文件夹local,locallow,roaming里面的文件都可删除, ...

  2. android listView布局等分列

    android listView布局4等分列. 必须要加上<RelativeLayout 在外层,不然等分不起作用 <RelativeLayout xmlns:android=" ...

  3. 阿里云专属推荐码nuyxa6

    申请成功!您的推荐码为nuyxa6 恭喜您获得阿里云专属推荐码,推荐码有效期至2017-03-04 14:43:49. 我们会在到期日前两周以站内信的方式通知您新的有效期.

  4. Python中ndarray数组切片问题a[-n -x:-y]

    先看看如下代码: >>a=np.arange(10)>>a array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])>>a[-7:] array( ...

  5. Hello_Motion_Tracking 任务一:Project Tango采集运动追踪数据

    我们来看一下中的几个基本的例子 (区域描述.深度感知.运动追踪.视频4个) 参考:Google Tango初学者教程 1. hello_motion_tracking package com.proj ...

  6. Window vista 以上制作自定义证书并为端口配置ssl

    此处的关键在于证书需要分两步,不然在配置ssl时总会有错误.也许makecert命令也会有些玄机,但是管他呢,请按以下步骤和命令配置,几分钟就可成功: 证书制作: 1,  在开始/所有程序(或其他地方 ...

  7. 解决PL/SQL Developer连接数据库时出现 “ORA-12541:TNS:无监听程序”错误

    在用PL/SQL Developer连接数据库时出现“ORA-12541:TNS:无监听程序”错误. 1.检查listener.log日志发现下面错误:TNSLSNR for 32-bit Windo ...

  8. Hook ptrace 调试加入了ptrace函数的程序

    Hook ptrace 调试加入了ptrace函数的程序 #import <substrate.h> #if !defined(PT_DENY_ATTACH)#define PT_DENY ...

  9. Objective-C 学习笔记(五) 快速枚举

    Objective-C 快速枚举 快速枚举是一个Objective-C的功能,有助于列举一个集合. 快速枚举语法 for (classType variable in collectionObject ...

  10. java项目 远程debug

    AVA项目无法像PHP那样可以随时修改文件内容进行调试,调试可以借助eclipse,本地代码的话很容易在本地debug,但如果代码已经打包部署在linux上呢?可以进行远程debug   很简单,只需 ...