我是 proxysql 的新手,这是我的环境: Centos 7 , proxysql-1.4.13 。我定义了 2 个主机组 id:主机组 id 2 用于可写入的 mysql 服务器,主机组 id 3 用于可读取的 mysql 服务器。
所有以 insert、update、delete、alter 开头的查询都应该路由到主机组 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_pattern 替换 match_digest 吗?
但是,我的应用程序有 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) 也匹配应用程序功能中的插入查询?这是否意味着我做错了?