文章转载自:https://www.cnblogs.com/f-ck-need-u/p/9372447.html

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 = ?','');

ProxySQL(12):禁止多路路由的更多相关文章

  1. MySQL中间件之ProxySQL(12):禁止多路路由

    返回ProxySQL系列文章:http://www.cnblogs.com/f-ck-need-u/p/7586194.html 1.multiplexing multiplexing,作用是将语句分 ...

  2. Directx11教程(12) 禁止alt+enter全屏窗口

    原文:Directx11教程(12) 禁止alt+enter全屏窗口        在D3D11应用程序中,我们按下alt+enter键,会切换到全屏模式.有时候,我们在WM_SIZE中有一些代码,全 ...

  3. MySQL/MariaDB系列文章目录

    以下是本系列文章的大纲,此页博文完全原创,花费了作者本人的极大心血,如转载,请务必标明原文链接. 如果觉得文章不错,还请帮忙点下"推荐",各位的支持,能激发和鼓励我更大的写作热情. ...

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

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

  5. 9.12 Django路由

    2018-9-12 12:14:29 路由就是根据具体业务需求写的! 有的业务多,路由多,然后就需要细化 然后根据需求该! 怎么方便怎么来! 越努力,越幸运! 贴上笔记! 路由url根据需要可用修改, ...

  6. ProxySQL(7):详述ProxySQL的路由规则

    文章转载自:https://www.cnblogs.com/f-ck-need-u/p/9300829.html 关于ProxySQL路由的简述 当ProxySQL收到前端app发送的SQL语句后,它 ...

  7. MySQL ProxySQL读写分离实践

    目的 在上一篇文章MySQL ProxySQL读写分离使用初探里初步介绍了ProxySQL的使用,本文继续介绍它的一些特点和DBProxy的性能差异.深入一些去了解ProxySQL,通过测试来说明Pr ...

  8. ProxySQL 配置详解及读写分离(+GTID)等功能说明 (完整篇)

    ProxySQL是灵活强大的MySQL代理层, 是一个能实实在在用在生产环境的MySQL中间件,可以实现读写分离,支持 Query 路由功能,支持动态指定某个 SQL 进行 cache,支持动态加载配 ...

  9. Centos7.5部署MySQL5.7基于GTID主从复制+并行复制+半同步复制+读写分离(ProxySQL) 环境- 运维笔记 (完整版)

    之前已经详细介绍了Mysql基于GTID主从复制的概念,原理和配置,下面整体记录下MySQL5.7基于GTID主从复制+并行复制+增强半同步复制+读写分离环境的实现过程,以便加深对mysql新特性GT ...

随机推荐

  1. P2599 [ZJOI2009]取石子游戏 做题感想

    题目链接 前言 发现自己三岁时的题目都不会做. 我发现我真的是菜得真实. 正文 神仙构造,分讨题. 不敢说有构造,但是分讨我只服这道题. 看上去像是一个类似 \(Nim\) 游戏的变种,经过不断猜测结 ...

  2. 霍普菲尔得神经网络(Hopfield Neural Network)

    设计一个反馈网络存储下列目标平衡点: T = [ 1  -1; -1  1 ]; 并用6组任意随机初始列矢量,包括一组在目标平衡点连线的垂直平分线上的一点作为输入矢量对所设计的网络的平衡点进行测试,观 ...

  3. JDBCTools 第一个版本

    JDBCToolV1: package com.dgd.test; import com.alibaba.druid.pool.DruidDataSourceFactory; import javax ...

  4. java--方法/debug

    一.方法的定义 1.什么是方法 方法是将具体独立功能的代码块组织称为一个整体,使其具有特殊功能的代码集 注意: 方法必须先创建后使用,该过程为方法定义: 方法创建后并不是直接运行的,需要手动十一后执行 ...

  5. JAVA解压.Z及.ZIP文件

    <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-compress --> <dependency ...

  6. 2022-07-13 第六组 润土 Java01学习笔记

    1.数据类型: 基本数据类型: 整型: byte 字节型 -128-127 1个字节 short 短整型 2个字节 int 整型 4个字节 long 长整型 8个字节 浮点型: float 单精度 4 ...

  7. 005_面试题 Java_传递方式

    面试题: 问:java是值传递还是引用传递? 答:java只有值传递,基本类型传递的是具体的数,引用类型传递的是具体的地址

  8. 企业运维实践-还不会部署高可用的kubernetes集群?使用kubeadm方式安装高可用k8s集群v1.23.7

    关注「WeiyiGeek」公众号 设为「特别关注」每天带你玩转网络安全运维.应用开发.物联网IOT学习! 希望各位看友[关注.点赞.评论.收藏.投币],助力每一个梦想. 文章目录: 0x00 前言简述 ...

  9. TFrecord写入与读取

    Protocol buffers are Google's language-neutral, platform-neutral, extensible mechanism for serializi ...

  10. 20220724-Java的继承

    目录 含义 代码示例 使用方法和注意事项 个人理解 含义 继承Extends 面向对象最显著的一个特性,继承是从已有的类中派生出新的类,新的类能吸收已有类的性和方法,并能扩展新的能力. 代码示例 cl ...