MySQL中间件之ProxySQL(11):链式规则( flagIN 和 flagOUT )
返回ProxySQL系列文章:http://www.cnblogs.com/f-ck-need-u/p/7586194.html
?
1.理解鏈?zhǔn)揭?guī)則
在mysql_query_rules表中,有兩個(gè)特殊字段"flagIN"和"flagOUT",它們分別用來(lái)定義規(guī)則的入口和出口,從而實(shí)現(xiàn)鏈?zhǔn)揭?guī)則(chains of rules)。
鏈?zhǔn)揭?guī)則的實(shí)現(xiàn)方式如下:
通過(guò)下面兩張圖,應(yīng)該很容易理解鏈?zhǔn)揭?guī)則的生效方式。
必須注意,規(guī)則是按照rule_id的大小順序進(jìn)行的。且并非只有apply=1時(shí)才會(huì)應(yīng)用規(guī)則,當(dāng)無(wú)規(guī)則可匹配,或者某規(guī)則的flagIN和flagOUT值相同,都會(huì)應(yīng)用最后一次被評(píng)估的規(guī)則。
以下幾個(gè)示例,可以解釋生效規(guī)則:
# 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 生效,因?yàn)槠ヅ渫阹ule_id=2后,還打著flagOUT=23標(biāo)記 +---------+-------+--------+---------+ | rule_id | apply | flagIN | flagOUT | +---------+-------+--------+---------+ | 1 | 0 | 0 | 23 | | 2 | 0 | 23 | NULL | | 3 | 1 | 24 | NULL | +---------+-------+--------+---------+# rule_id=3 生效,因?yàn)槠ヅ渫阹ule_id=2后,還打著flagOUT=23標(biāo)記 +---------+-------+--------+---------+ | rule_id | apply | flagIN | flagOUT | +---------+-------+--------+---------+ | 1 | 0 | 0 | 23 | | 2 | 0 | 23 | NULL | | 3 | 1 | 23 | NULL | +---------+-------+--------+---------+2.鏈?zhǔn)揭?guī)則示例
有了普通規(guī)則匹配方式,為什么還要設(shè)計(jì)鏈?zhǔn)揭?guī)則呢?雖然ProxySQL通過(guò)正則表達(dá)式實(shí)現(xiàn)了很靈活的規(guī)則匹配模式,但需求總是千變?nèi)f化的,有時(shí)候僅通過(guò)一條正則匹配規(guī)則和替換規(guī)則很難實(shí)現(xiàn)比較復(fù)雜的要求,例如sharding時(shí)。
鏈?zhǔn)揭?guī)則除了常用的多次替換,還可巧用于多次匹配。
本文簡(jiǎn)單演示一下鏈?zhǔn)揭?guī)則,不具有實(shí)際意義,只為后面ProxySQL實(shí)現(xiàn)sharding的文章做基礎(chǔ)知識(shí)鋪墊。
2個(gè)測(cè)試庫(kù),共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 | +--------------------+現(xiàn)在借用鏈?zhǔn)揭?guī)則,一步一步地將對(duì)test1.t1表的查詢路由到test2.t2表的查詢。再次聲明,此處示例毫無(wú)實(shí)際意義,僅為演示鏈?zhǔn)揭?guī)則的基本用法。
大致鏈?zhǔn)狡ヅ涞倪^(guò)程為:
test1.t1 --> test1.t2 --> test2.t1 --> test2.t2以下是具體插入的規(guī)則:
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表,測(cè)試結(jié)果。
[root@xuexi ~]# mysql -uroot -pP@ssword1! -h127.0.0.1 -P6033 -e "select * from test1.t1;" +--------------------+ | name | +--------------------+ | test2_t2_xiaofang1 | <-- 查詢返回結(jié)果為test2.t2內(nèi)容 | test2_t2_xiaofang2 | | test2_t2_xiaofang3 | +--------------------+admin> select * from stats_mysql_query_rules; +---------+------+ | rule_id | hits | +---------+------+ | 1 | 1 | <-- 3條規(guī)則全都命中 | 2 | 1 | | 3 | 1 | +---------+------+admin> select hostgroup,digest_text from stats_mysql_query_digest; +-----------+----------------------------------+ | hostgroup | digest_text | +-----------+----------------------------------+ | 30 | select * from test2.t2 | <-- 路由目標(biāo)hg=30 +-----------+----------------------------------+顯然,已經(jīng)按照預(yù)想中的方式進(jìn)行匹配、替換、路由。
一個(gè)問(wèn)題:如果查詢的是test1.t2表或test2.t1表,會(huì)進(jìn)行鏈?zhǔn)狡ヅ鋯?#xff1f;
答案是不會(huì),因?yàn)閞ule_id=2和rule_id=3這兩個(gè)規(guī)則的flagIN都是非0值,而每個(gè)SQL語(yǔ)句初始時(shí)只進(jìn)入flagIN=0的規(guī)則。
此外還需注意,當(dāng)某語(yǔ)句未按照我們的期望途經(jīng)所有的鏈?zhǔn)揭?guī)則,則可能會(huì)根據(jù)destination_hostgroup字段的值直接路由出去,即使沒(méi)有指定該字段值,還有用戶的默認(rèn)路由目標(biāo)組,或者基于端口的路由目標(biāo)。所以,在寫鏈?zhǔn)揭?guī)則時(shí),應(yīng)當(dāng)盡可能地針對(duì)某一類型的語(yǔ)句進(jìn)行完完整整的定制,保證這類語(yǔ)句能途經(jīng)我們所期望的所有規(guī)則。
總結(jié)
以上是生活随笔為你收集整理的MySQL中间件之ProxySQL(11):链式规则( flagIN 和 flagOUT )的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: springboot使用restTemp
- 下一篇: springboot日志笔记