返回ProxySQL系列文章:http://www.cnblogs.com/f-ck-need-u/p/7586194.html

1.multiplexing

multiplexing,作用是将语句分多路路由。开启了multiplexing开关,读/写分离、按规则路由才能进行。但有时候,有些语句要求路由到同一个主机组,甚至是同一个主机组中的同一个节点上。这时会自动禁用multiplexing。禁用multiplexing后,语句会根据同一个连接进行路由。

也就是说,在禁用multiplexing情况下,会将语句路由到同一个主机组中的同一个节点上。

什么情况下会禁用多路路由(disable multiplexing)?

  • 激活事务时

当某连接中激活了一个事务,则在该事务提交或回滚之前,multiplexing将一直被禁用。

  • 表被锁

当执行了LOCK TABLE, LOCK TABLES 或 FLUSH TABLES WITH READ LOCK 时,将一直禁用multiplexing,直到执行UNLOCK TABLES。

  • 使用GET_LOCK()时

如果执行了GET_LOCK(),将一直禁用multiplexing,且永不再次启用。

  • 使用某些特定的会话/用户(session/user)变量

所有查询的query_digest部分包含了@的都将禁用multiplexing,且永不再次启用。

下面的命令是类似的情况,都会禁用multiplexing且不再次启用:

  • SET SQL_SAFE_UPDATES=?,SQL_SELECT_LIMIT=?,MAX_JOIN_SIZE=? (mysql --safe-updates)
  • SET FOREIGN_KEY_CHECKS
  • SET UNIQUE_CHECKS
  • SET AUTO_INCREMENT_INCREMENT (v 1.4.4+)
  • SET AUTO_INCREMENT_OFFSET (v 1.4.4+)
  • SET GROUP_CONCAT_MAX_LEN (v 1.4.4+)

但下面两个语句是例外,因为它们被硬编码为不禁用multiplexing:

  • SELECT @@tx_isolation
  • SELECT @@version

之所以要硬编码这两个例外,是因为很多应用程序在每个连接中都会执行这两个语句。

  • 使用SQL_CALC_FOUND_ROWS

如果查询语句中包含了SQL_CALC_FOUND_ROWS,那么该连接上将禁用multiplexing且不再启用。

  • 临时表

如果执行了CREATE TEMPORARY TABLE,那么该连接上将禁用multiplexing且不再启用。

  • 使用PREPARE

如果执行PREPARE语句(该语句使用文本协议准备好语句,而不是二进制协议),将禁用multiplexing且不再启用。

  • SQL_LOG_BIN设置为0时,即禁用binlog

如果SQL_LOG_BIN设置为0,则multiplexing将被禁用直到SQL_LOG_BIN开启。

Not handled session variables

大多数会话变量都不会自动进行处理。

例如,如果客户端发出了SET TX_ISOLATION=?,将不会禁用multiplexing。

当有不同客户端使用了不同的tx_isolation时,这将是一个bug,但一般所有客户端都使用默认的tx_isolation(绝大多数情况都如此)。

Ad-hoc enable/disable of multiplexing

mysql_query_rules.multiplexing允许基于匹配标准来启用/禁用multiplexing。当前该字段可接受的值有:

  • 0 : 禁用multiplexing
  • 1 : 启用multiplexing
  • 2 : 对于包含了@的查询语句不禁用multiplexing(默认包含了@的语句会禁用multiplexing)

例如,如果你的应用程序中使用了SET SQL_SELECT_LIMIT,你可以创建下面两条规则来启用multiplexing:

INSERT INTO mysql_query_rules (active,match_digest,multiplex) VALUES
('1','^SET SQL_SELECT_LIMIT=?',0), (1,'^SET SQL_SELECT_LIMIT=DEFAULT,1);

如果你的应用程序中使用了类似于SELECT @@max_allowed_packet的语句,为了避免默认情况下这样的语句禁用multiplexing,可以创建如下规则:

INSERT INTO mysql_query_rules (active,match_digest,multiplex) VALUES
('1','^SELECT @@max_allowed_packet',2);

... 还可以将此进行缓存:

INSERT INTO mysql_query_rules (active,match_digest,multiplex,cache_ttl) VALUES
('1','^SELECT @@max_allowed_packet',2,60000);

如果你的应用程序尝试要设置一个变量,而这可能会禁用multiplexing,如果这个设置语句能够写规则来匹配,可以创建一个筛选条件返回OK而无需去执行查询,这样就不会修改multiplexing当前的策略:

INSERT INTO mysql_query_rules (active,match_digest,OK_msg) VALUES
('1','^SET @@wait_timeout = ?','');

MySQL中间件之ProxySQL(12):禁止多路路由的更多相关文章

  1. MySQL中间件之ProxySQL(1):简介和安装

    返回ProxySQL系列文章:http://www.cnblogs.com/f-ck-need-u/p/7586194.html 1.ProxySQL简介 之前的文章里,介绍了一个MySQL的中间件: ...

  2. ProxySQL(12):禁止多路路由

    文章转载自:https://www.cnblogs.com/f-ck-need-u/p/9372447.html multiplexing multiplexing,作用是将语句分多路路由.开启了mu ...

  3. MySQL中间件之ProxySQL(7):详述ProxySQL的路由规则

    返回ProxySQL系列文章:http://www.cnblogs.com/f-ck-need-u/p/7586194.html 1.关于ProxySQL路由的简述 当ProxySQL收到前端app发 ...

  4. MySQL中间件之ProxySQL(2):初试读写分离

    返回ProxySQL系列文章:http://www.cnblogs.com/f-ck-need-u/p/7586194.html 1.实现一个简单的读写分离 这里通过一个简单的示例实现ProxySQL ...

  5. MySQL中间件之ProxySQL(5):线程、线程池、连接池

    返回ProxySQL系列文章:http://www.cnblogs.com/f-ck-need-u/p/7586194.html 1.ProxySQL的线程 ProxySQL由多个模块组成,是一个多线 ...

  6. MySQL中间件之ProxySQL(6):管理后端节点

    返回ProxySQL系列文章:http://www.cnblogs.com/f-ck-need-u/p/7586194.html 1.配置后端节点前的说明 为了让ProxySQL能够找到后端的MySQ ...

  7. MySQL中间件之ProxySQL(14):ProxySQL+PXC

    返回ProxySQL系列文章:http://www.cnblogs.com/f-ck-need-u/p/7586194.html 1.ProxySQL+PXC 本文演示ProxySQL代理PXC(Pe ...

  8. MySQL中间件之ProxySQL(10):读写分离方法论

    返回ProxySQL系列文章:http://www.cnblogs.com/f-ck-need-u/p/7586194.html 1.不同类型的读写分离 数据库中间件最基本的功能就是实现读写分离,Pr ...

  9. MySQL中间件之ProxySQL(3):Admin管理接口

    返回ProxySQL系列文章:http://www.cnblogs.com/f-ck-need-u/p/7586194.html 1.ProxySQL的Admin管理接口 当ProxySQL启动后,将 ...

随机推荐

  1. 用idea部署maven-web项目

    项目部署时,需要加一步: 我们需要添加一个archetypeCatalog=internal.这个参数的意义是让这个maven项目的骨架不要到远程下载而是本地获取.如果你没加这个参数,那么项目创建可能 ...

  2. LoRa与NB-IoT对比(转载)

    物联网的基本架构包括三个层面:感知层.网络层和应用层. 物联网架构图 感知层通过传感器采集某些数据(声.光.电等),基于网络层的终端模组,对接到网络层的基站,实现数据采集后的传输. 网络层负责将感知层 ...

  3. Vue两种组件类型介绍:递归组件和动态组件

    一递归组件 递归组件的特性就是可以在自己的template模板中调用自己本身.值得注意的它必须设置name属性. // 递归组件 recursive.vue <template> < ...

  4. MacOS使用Charles抓去HTTPS数据

    1.安装Charles,示例版本为4.0.1 2.Proxy->Proxy Settings 3.MacOS->Terminal->ifconfig 获取本机IP地址,如192.16 ...

  5. Openvswitch手册(2): OpenFlow Controller

         我们这一节主要来看Controller Controller有两种: Primary Controller: 真正控制vswitch的flow table,vswitch会保持和contro ...

  6. Openvswitch手册(5): VLAN and Bonding

    我们这一节来看Port 一般来说一个Port就是一个Interface,当然也有一个Port对应多个Interface的情况,成为Bond VLAN Configuration Port的一个重要的方 ...

  7. Android JNI 学习(五):References Api

    1. NewGlobalRef(创建全局引用) jobjectNewGlobalRef(JNIEnv *env, jobject obj); 创建 obj 参数所引用对象的新全局引用.obj 参数既可 ...

  8. Android 9.0/P 版本推荐使用 HttpURLConnection

    早在几年前,谷歌就推荐在Android2.3版本以上使用HttpURLConnection,而在即将正式发布的 Android P 版本中,谷歌彻底取消了对Apache HTTPClient的支持,针 ...

  9. Javascript高级编程学习笔记(33)—— 客户端检测(2)怪癖检测

    怪癖检测 和能力检测类似,但其目标不同 能力检测的目的是判断浏览器支不支持某种能力 而怪癖检测的目的是判断浏览器是否存在某些缺陷 这种时候需要我们执行一段代码来判断浏览器是否有这样的缺陷 或者说是怪癖 ...

  10. 移动端video标签默认置顶的解决方案

    概述 在移动端上面,比如说微信上面打开一个页面,如果有video标签的话,常常会出现video标签默认置顶的情况,一般的解决方案是在不需要看见它的时候给它加一个display:none进行隐藏.今天在 ...