链式规则理解
在mysql_query_rules表中,有两个特殊字段"flagIN"和"flagOUT",它们分别用来定义规则的入口和出口,从而实现链式规则。
链式规则实现方法:
1、proxysql查找到flagIN=0的字段的规则,开始进入链式规则模式,该字段默认为0
2、当语句规则完全匹配match_pattern字段时,记下当前规则的flagOUT值,如果flagOUT值非空,那么为该语句标记flagOUT值,并且该规则的apply字段不为1,将继续向下匹配
3、查找下一条规则的flagIN值,如果第一条规则的flagOUT不等于该条规则的flagIN值,则跳过该规则,继续向下匹配,直到匹配到flagOUT=flagIN的规则
4、匹配到apply为1,或者flagOUT字段为NULL,或者flagOUT=flagIN时,那么停止匹配,以该条规则为生效规则进行执行语句,不向下匹配
链式规则示例
搭建好主从,准备好mysql_server表mysql_users表的各项字段
三个测试库,共三种表:
mysql> select * from lxfish.game_prop;
±------±-----------±-----±--------±-----±-----±-------------------------------------------------------------+
| id | name | type | diamond | give | gold | desc |
±------±-----------±-----±--------±-----±-----±-------------------------------------------------------------+
| 2000 | 冰冻 | 1 | 2 | 1 | -1 | 随机冰冻一些鱼 |
| 2001 | 锁定 | 1 | 2 | 1 | -1 | 使?后在效果期间可锁定任意?条鱼,持续20s |
| 2002 | 召唤 | 1 | 2 | 1 | -1 | 召唤鱼 |
| 2003 | 1级狂暴 | 1 | 5 | 1 | -1 | 双倍消耗双倍获得 |
| 2004 | 2级狂暴 | 1 | 5 | 1 | -1 | 三倍消耗三倍获得 |
| 12000 | 冰冻 | 1 | 2 | -1 | -1 | 通过好友赠送获得的道具 |
| 12001 | 锁定 | 1 | 2 | -1 | -1 | 通过好友赠送获得的道具 |
| 12002 | 召唤 | 1 | 2 | -1 | -1 | 通过好友赠送获得的道具 |
| 12003 | 1级狂暴 | 1 | 5 | -1 | -1 | 通过好友赠送获得的道具 |
| 12004 | 2级狂暴 | 1 | 5 | -1 | -1 | 通过好友赠送获得的道具 |
±------±-----------±-----±--------±-----±-----±-------------------------------------------------------------+
10 rows in set (0.00 sec)
mysql> select * from test.game_prop;
Empty set (0.01 sec)
mysql> select * from zuihou.game_prop;
Empty set (0.00 sec)
大致匹配过程:
lxfish.game_prop–>test.game_prop–>zuihou.game_prop
插入具体规则:
mysql> select rule_id,apply,flagIN,flagOUT,match_pattern,replace_pattern,destination_hostgroup from mysql_query_rules;
±--------±------±-------±--------±------------------±-----------------±----------------------+
| rule_id | apply | flagIN | flagOUT | match_pattern | replace_pattern | destination_hostgroup |
±--------±------±-------±--------±------------------±-----------------±----------------------+
| 1 | 0 | 0 | 30 | lxfish.game_prop | test.game_prop | |
| 2 | 1 | 30 | 30 | test.game_prop | zuihou.game_prop | 2 |
±--------±------±-------±--------±------------------±-----------------±----------------------+
查询数据:
mysql -ufailover -p123456 -P 6033 -h 127.0.0.1 -e “select * from lxfish.game_prop;”
返回:
[root@localhost proxysql]# mysql -ufailover -p123456 -P 6033 -h 127.0.0.1 -e “select * from lxfish.game_prop;”
mysql: [Warning] Using a password on the command line interface can be insecure.
查看链式规则是否生效:
mysql> select * from stats_mysql_query_rules;
±--------±-----+
| rule_id | hits |
±--------±-----+
| 1 | 2 |
| 2 | 2 |
±--------±-----+
2 rows in set (0.01 sec)
mysql> select hostgroup,digest_text,count_star from stats_mysql_query_digest;
±----------±---------------------------------±-----------+
| hostgroup | digest_text | count_star |
±----------±---------------------------------±-----------+
| 0 | select * from test.game_prop | 1 |
| 2 | select * from zuihou.game_prop | 5 |
| 1 | select @@version_comment limit ? | 6 |
±----------±---------------------------------±-----------+
3 rows in set (0.00 sec)
已经按照规则进行匹配。
值得注意的是,链式规则在第二条规则以后的规则中是不能配置username和schemaname字段的,否则不会进行匹配