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

1.理解链式规则

在mysql_query_rules表中,有两个特殊字段"flagIN"和"flagOUT",它们分别用来定义规则的入口和出口,从而实现链式规则(chains of rules)。

链式规则的实现方式如下:

  1. 当入口值flagIN设置为0时,表示开始进入链式规则。如未显式指定规则的flagIN值,则默认都为0。
  2. 当语句匹配完当前规则后,将记下当前规则的flagOUT值,如果flagOUT值非空(NOT NULL),则为该语句打上flagOUT标记。如果该规则的apply字段值不是1,则继续向下匹配。
  3. 如果语句的flagOUT标记和下一条规则的flagIN值不同,则跳过该规则,继续向下匹配。直到匹配到flagOUT=flagIN的规则,则匹配该规则。该规则是链式规则中的另一条规则。
  4. 直到某规则的apply字段设置为1,或者已经匹配完所有规则,则最后一次被评估的规则将直接生效,不再继续向下匹配。

通过下面两张图,应该很容易理解链式规则的生效方式。

必须注意,规则是按照rule_id的大小顺序进行的。且并非只有apply=1时才会应用规则,当无规则可匹配,或者某规则的flagIN和flagOUT值相同,都会应用最后一次被评估的规则

以下几个示例,可以解释生效规则:

# rule_id=3 生效
+---------+-------+--------+---------+
| rule_id | apply | flagIN | flagOUT |
+---------+-------+--------+---------+
| 1       | 0     | 0      | 23      |
| 2       | 0     | 23     | 23      |
| 3       | 0     | 23     | NULL    |
+---------+-------+--------+---------+# rule_id=2 生效
+---------+-------+--------+---------+
| rule_id | apply | flagIN | flagOUT |
+---------+-------+--------+---------+
| 1       | 0     | 0      | 23      |
| 2       | 0     | 23     | 23      |
| 3       | 0     | 24     | NULL    |
+---------+-------+--------+---------+# rule_id=2 生效,因为匹配完rule_id=2后,还打着flagOUT=23标记
+---------+-------+--------+---------+
| rule_id | apply | flagIN | flagOUT |
+---------+-------+--------+---------+
| 1       | 0     | 0      | 23      |
| 2       | 0     | 23     | NULL    |
| 3       | 1     | 24     | NULL    |
+---------+-------+--------+---------+# rule_id=3 生效,因为匹配完rule_id=2后,还打着flagOUT=23标记
+---------+-------+--------+---------+
| rule_id | apply | flagIN | flagOUT |
+---------+-------+--------+---------+
| 1       | 0     | 0      | 23      |
| 2       | 0     | 23     | NULL    |
| 3       | 1     | 23     | NULL    |
+---------+-------+--------+---------+

2.链式规则示例

有了普通规则匹配方式,为什么还要设计链式规则呢?虽然ProxySQL通过正则表达式实现了很灵活的规则匹配模式,但需求总是千变万化的,有时候仅通过一条正则匹配规则和替换规则很难实现比较复杂的要求,例如sharding时。

链式规则除了常用的多次替换,还可巧用于多次匹配

本文简单演示一下链式规则,不具有实际意义,只为后面ProxySQL实现sharding的文章做基础知识铺垫。

2个测试库,共4张表test{1,2}.t{1,2}。

mysql> select * from test1.t1;
+------------------+
| name             |
+------------------+
| test1_t1_malong1 |
| test1_t1_malong2 |
| test1_t1_malong3 |
+------------------+mysql> select * from test1.t2;
+------------------+
| name             |
+------------------+
| test1_t2_malong1 |
| test1_t2_malong2 |
| test1_t2_malong3 |
+------------------+mysql> select * from test2.t1;
+--------------------+
| name               |
+--------------------+
| test2_t1_xiaofang1 |
| test2_t1_xiaofang2 |
| test2_t1_xiaofang3 |
+--------------------+mysql> select * from test2.t2;
+--------------------+
| name               |
+--------------------+
| test2_t2_xiaofang1 |
| test2_t2_xiaofang2 |
| test2_t2_xiaofang3 |
+--------------------+

现在借用链式规则,一步一步地将对test1.t1表的查询路由到test2.t2表的查询。再次声明,此处示例毫无实际意义,仅为演示链式规则的基本用法。

大致链式匹配的过程为:

test1.t1 --> test1.t2 --> test2.t1 --> test2.t2

以下是具体插入的规则:

delete from mysql_query_rules;
select * from stats_mysql_query_digest_reset where 1=0;insert into mysql_query_rules
(rule_id,active,apply,flagIN,flagOUT,match_pattern,replace_pattern) values
(1,1,0,0,23,"test1\.t1","test1.t2");insert into mysql_query_rules
(rule_id,active,apply,flagIN,flagOUT,match_pattern,replace_pattern) values
(2,1,0,23,24,"test1\.t2","test2.t1");insert into mysql_query_rules
(rule_id,active,apply,flagIN,flagOUT,match_pattern,replace_pattern,destination_hostgroup) values
(3,1,1,24,NULL,"test2\.t1","test2.t2",30);load mysql query rules to runtime;
save mysql query rules to disk;admin> select rule_id,apply,flagIN,flagOUT,match_pattern,replace_pattern,destination_hostgroup DHfrom mysql_query_rules;
+---------+-------+--------+---------+---------------+-----------------+------+
| rule_id | apply | flagIN | flagOUT | match_pattern | replace_pattern | DH   |
+---------+-------+--------+---------+---------------+-----------------+------+
| 1       | 0     | 0      | 23      | test1\.t1     | test1.t2        | NULL |
| 2       | 0     | 23     | 24      | test1\.t2     | test2.t1        | NULL |
| 3       | 1     | 24     | NULL    | test2\.t1     | test2.t2        | 30   |
+---------+-------+--------+---------+---------------+-----------------+------+

查询test1.t1表,测试结果。

[root@xuexi ~]# mysql -uroot -pP@ssword1! -h127.0.0.1 -P6033 -e "select * from test1.t1;"
+--------------------+
| name               |
+--------------------+
| test2_t2_xiaofang1 |  <-- 查询返回结果为test2.t2内容
| test2_t2_xiaofang2 |
| test2_t2_xiaofang3 |
+--------------------+admin> select * from stats_mysql_query_rules;
+---------+------+
| rule_id | hits |
+---------+------+
| 1       | 1    |  <-- 3条规则全都命中
| 2       | 1    |
| 3       | 1    |
+---------+------+admin> select hostgroup,digest_text from stats_mysql_query_digest;
+-----------+----------------------------------+
| hostgroup | digest_text                      |
+-----------+----------------------------------+
| 30        | select * from test2.t2           |  <-- 路由目标hg=30
+-----------+----------------------------------+

显然,已经按照预想中的方式进行匹配、替换、路由。

一个问题:如果查询的是test1.t2表或test2.t1表,会进行链式匹配吗?
答案是不会,因为rule_id=2rule_id=3这两个规则的flagIN都是非0值,而每个SQL语句初始时只进入flagIN=0的规则。

此外还需注意,当某语句未按照我们的期望途经所有的链式规则,则可能会根据destination_hostgroup字段的值直接路由出去,即使没有指定该字段值,还有用户的默认路由目标组,或者基于端口的路由目标。所以,在写链式规则时,应当尽可能地针对某一类型的语句进行完完整整的定制,保证这类语句能途经我们所期望的所有规则。

MySQL中间件之ProxySQL(11):链式规则( flagIN 和 flagOUT )相关推荐

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

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

  2. MySQL中间件之ProxySQL(13):ProxySQL集群

    返回ProxySQL系列文章:http://www.cnblogs.com/f-ck-need-u/p/7586194.html ProxySQL有原生的集群功能,但是这个原生的集群功能还正在试验阶段 ...

  3. 谈下mysql中间件(问题域、业内组件)

    这段时间团队在梳理mysql使用上的一些痛点(分库分表.读写分离.权限控制.监控告警.日志审计等),也调研了业内一些mysql中间件的实现,这里把对问题域的思考,以及常见中间件整理沉淀一下 一.问题域 ...

  4. 从 PHP、Promise、Android 和 iOS 代码看如何链式编程

    链式编程或者链式写法,是将多个方法 (函数) 通过点号 (.) 或者 (->)等符号链接在一起成为一句代码,这样不仅可以增强代码的可读性,而且每次链接,都是对对象的属性和状态进行一次操作和变化. ...

  5. docker配置mysql 中间件 ProxySQL

    之前我们配置了mysql 一主二从模式,本文将利用mysql中间件ProxySQL 实现读写分离. 首先下载镜像 docker pull proxysql/proxysql 在home目录下创建pro ...

  6. 大话PHP设计模式:类自动载入、PSR-0规范、链式操作、11种面向对象设计模式实现和使用、OOP的基本原则和自动加载配置...

    一.类自动载入 SPL函数 (standard php librarys) 类自动载入,尽管 __autoload() 函数也能自动加载类和接口,但更建议使用 spl_autoload_registe ...

  7. MySQL链式复制加速神器: MaxScale Binlog Server(附视频)

    本文根据DBAplus社群第83期线上分享整理而成 讲师介绍 贺春旸 普惠金融MySQL专家 <MySQL管理之道>第一版.第二版作者,曾任职于中国移动飞信.机锋安卓市场,拥有丰富的数据库 ...

  8. python mysql l链式查询_使用python flask sqlacalchemy orm在PostgreSQL中联接查询

    如果您喜欢编写常规的SQL语句,那么为什么不使用SQLAlchemy来完成这项工作呢?你不需要使用像这样的链式方法 join , filter_by 等来查询数据库. 为了回答这个问题,我需要对你的 ...

  9. BP算法双向传_链式求导最缠绵(深度学习入门系列之八)

    摘要: 说到BP(Back Propagation)算法,人们通常强调的是反向传播,其实它是一个双向算法:正向传播输入信号,反向传播误差信息.接下来,你将看到的,可能是史上最为通俗易懂的BP图文讲解, ...

最新文章

  1. Android WindowManager和WindowManager.LayoutParams的使用以及实现悬浮窗口的方法
  2. JS之Number的toString方法
  3. Java整数类的compareTo()方法和示例
  4. Exception异常处理
  5. body签名json序列号乱序,null参数问题
  6. 机械设计参考CAD零件图纸常用素材资料(300张)
  7. 基于QT的网络五子棋游戏程序的设计与实现
  8. DM 源码阅读系列文章(七)定制化数据同步功能的实现
  9. 如何使用高德地图 API 做一个路线规划应用,展示自定义路线
  10. 写口算用计算机作文600字,口算考试作文600字
  11. 【视频相关】视频中常出现的参数解释——2018年6月16日
  12. 科技对金融业的告白信,有百融云创的落款
  13. 对360沙盒的驱动的一点逆向分析
  14. Entity Relation Fusion for Real-Time One-Stage Referring Expression Comprehension 2021
  15. python使用tkinter库,封装操作excel为GUI程序
  16. vscode远程连接调试
  17. socket用法linux,linux下socket用法
  18. 管理学总论之新古典管理理论和现代管理理论
  19. 各个JDK版本的新特性
  20. [乐意黎转载]从零开始学习jQuery (十一) 实战表单验证与自动完成提示插件

热门文章

  1. 选购商用计算机任务书,计算机网络综合实习任务书-.doc
  2. java ant 安装成功_Ant学习---第一节:Ant安装和简单使用
  3. python高维向量的可视化_Tensorboard教程:高维向量可视化
  4. php数组循环0到32,通过数组php循环
  5. 【视频课】深度学习入门必修,子欲学算法,必先搞数据!
  6. 【完结】给新手的12大深度学习开源框架快速入门项目
  7. 2022版全球及中国应急装备市场格局分析与投资策略建议报告
  8. 全球及中国模块化塑料带行业供需调查及产销形势预测报告2021-2027年版
  9. 中国棉纺织工业发展状况及未来竞争格局报告2022-2028年
  10. 配置IIS服务器提供APP文件下载