我是proxysql的新手,这是我的环境: Centos 7的proxysql-1.4.13。我定义了2个主机组ID:主机组ID 2用于可写的mysql服务器,主机组ID 3用于可读取的mysql服务器。
所有以插入,更新,删除,更改开头的查询都应路由到主机组ID 2。
所有以select开头的查询都应路由到主机组ID 3。 所以这是我的规则:
Admin> select rule_id,active,digest,match_digest,destination_hostgroup,flagIN,flagOUT,next_query_flagIN,sticky_conn,apply from mysql_query_rules;
+---------+--------+--------------------+--------------+-----------------------+--------+---------+-------------------+-------------+-------+
| rule_id | active | digest | match_digest | destination_hostgroup | flagIN | flagOUT | next_query_flagIN | sticky_conn | apply |
+---------+--------+--------------------+--------------+-----------------------+--------+---------+-------------------+-------------+-------+
| 101 | 1 | NULL | ^insert | 2 | 0 | NULL | NULL | NULL | 1 |
| 102 | 1 | NULL | ^update | 2 | 0 | NULL | NULL | NULL | 1 |
| 103 | 1 | NULL | ^delete | 2 | 0 | NULL | NULL | NULL | 1 |
| 104 | 1 | NULL | ^alter | 2 | 0 | NULL | NULL | NULL | 1 |
| 105 | 1 | NULL | ^select | 3 | 0 | NULL | NULL | NULL | 1 |
+---------+--------+--------------------+--------------+-----------------------+--------+---------+-------------------+-------------+-------+
它们工作正常。顺便说一句,这些规则还可以吗?我应该将match_digest替换为match_pattern吗?
但是,我的应用程序具有1个功能,可以将数据插入表中(创建预订),然后(几乎立即)从该表中选择新数据。 因此,如果选择查询失败(因为尚未将新数据复制到主机组ID 3),则应用程序功能将运行错误。
我想在插入查询之后立即将选择查询路由到主机组ID 2,以便它将成功获取新数据。
我阅读了proxysql文档https://github.com/sysown/proxysql/wiki/Main-(runtime)#mysql_query_rules和此讨论https://github.com/sysown/proxysql/pull/825,我认为这对我来说是解决方案,不是吗?我仍然不十分了解这些flagIN,flagOUT,next_query_flagIN,sticky_conn东西,但我会尝试一下。
我知道插入查询摘要为0xCDD6DB677604AFA7
选择查询摘要为0x0DCD2E8ADF6A66CB 然后添加2条新规则:
Admin> select rule_id,active,digest,match_digest,destination_hostgroup,flagIN,flagOUT,next_query_flagIN,sticky_conn,apply from mysql_query_rules;
+---------+--------+--------------------+--------------+-----------------------+--------+---------+-------------------+-------------+-------+
| rule_id | active | digest | match_digest | destination_hostgroup | flagIN | flagOUT | next_query_flagIN | sticky_conn | apply |
+---------+--------+--------------------+--------------+-----------------------+--------+---------+-------------------+-------------+-------+
| 1 | 1 | 0xCDD6DB677604AFA7 | NULL | 2 | 0 | NULL | 1 | 1 | 1 |
| 2 | 1 | 0x0DCD2E8ADF6A66CB | NULL | 2 | 1 | NULL | NULL | NULL | 1 |
| 101 | 1 | NULL | ^insert | 2 | 0 | NULL | NULL | NULL | 1 |
| 102 | 1 | NULL | ^update | 2 | 0 | NULL | NULL | NULL | 1 |
| 103 | 1 | NULL | ^delete | 2 | 0 | NULL | NULL | NULL | 1 |
| 104 | 1 | NULL | ^alter | 2 | 0 | NULL | NULL | NULL | 1 |
| 105 | 1 | NULL | ^select | 3 | 0 | NULL | NULL | NULL | 1 |
+---------+--------+--------------------+--------------+-----------------------+--------+---------+-------------------+-------------+-------+
它们工作正常,插入查询后的选择查询将路由到主机组ID 2,因此它成功获取新数据并且应用程序功能正常运行。
但是我做对了吗? 我很困惑,因为stats_mysql_query_rules结果: 在运行应用程序功能之前:
Admin> select * from stats_mysql_query_rules;
+---------+------+
| rule_id | hits |
+---------+------+
| 1 | 20 |
| 2 | 20 |
| 101 | 33 |
| 102 | 0 |
| 103 | 2 |
| 104 | 0 |
| 105 | 903 |
+---------+------+
运行应用程序功能后(10个预订):
Admin> select * from stats_mysql_query_rules;
+---------+------+
| rule_id | hits |
+---------+------+
| 1 | 30 |
| 2 | 30 |
| 101 | 43 |
| 102 | 0 |
| 103 | 2 |
| 104 | 0 |
| 105 | 1313 |
+---------+------+
为什么rule_id 101的命中率从33-> 43增加?那么rule_id 101(match_digest ^ insert)是否也匹配应用程序功能中的插入查询?这是否表示我做错了?