返回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. php thrift 报错,thrift安装遇到的问题以及解决方法(必看篇)
  2. iOS培训objective-c——实例化对象
  3. 学习笔记99—word 如何增加底纹
  4. 线性表实现一元多项式的表示及相加(C语言实现)【线性表】
  5. linux日志队列长度,Linux 消息队列长度处理
  6. mysql 密码字段加密_phpmyadmin密码字段加密方法
  7. 科大星云诗社动态20210228
  8. 《博德之门 3》究竟有多「DnD」?
  9. android开发(13) 尝试在流布局中移动控件
  10. 研究生科研必备!!!2015-2020年各类国际会议基于图像的三维重建论文综述(1)——总览
  11. 软件过程与项目管理第二周作业
  12. SQLite数据库存储数据
  13. NIOS ii 实战篇 --- 按键控制LED
  14. 这么简单的道理,猩猩都懂,我们却忘了
  15. java imageio_Java使用imageio 读写图像
  16. 华为虚拟服务器密码忘记怎么办,登录云服务器密码忘记了怎么办
  17. unity动态修改标准材质自发光(Emission)
  18. MATLAB 数据及基本运算 --持续更新
  19. nginx和openresty配置静态资源时,样式错乱
  20. python 字典代码_python中的字典用法大全的代码

热门文章

  1. 北航计算机梅澜,水江澜-北京航空航天大学材料科学与工程学院
  2. 如何取回服务器上的文件网页设计,毕业设计(论文)-基于内容中心网络开发平台的文件分享精选.docx...
  3. java word 在线编辑图片_java开发实现word在线编辑及流转
  4. 组合筛选vue_Vue 3 组合式API介绍
  5. 小程序mysql+php测试,分享微信小程序的一些常见辅助测试功能:chance
  6. arrays中copyof_为什么阿里巴巴开发手册明确说明 Arrays.asList() 不能使用其修改方法?...
  7. antd tree搜索并定位_自动驾驶定位思考
  8. java 继承 模型_java – 画布形状模型的继承与组合?
  9. linux中sed的基本用法,linux sed用法
  10. python getattr函数_[转]Python中的getattr()函数详解