ProxySQL的缓存,给我们的查询带来的问题

1、问题描述:

最近,在线上环境上,使用ProxySQL中间件做为MySQL读写分离负载均衡工具时,出现以下问题。

在ProxySQL中间件上设置缓存后,之前没有查询出的数据,再次写入后,再次查询依然没有数据。这个问题耗费我一下下午的进行去排查。

先说一下我公司的环境:

  • 基础环境:SpringBoot2.2.1,SpringCloud-Hoxton.SR4
  • 分布式事务:Seata1.5.0(2020.04版本)
  • 服务注册发现:Nacos1.2.1
  • 数据库主从:MySql5.7
  • 主从分离+负载均衡:ProxySQL2.4.3
  • 其他不相关:略

2、Bug问题流程图

ProxySQL的配置

为了增加查询性能,所有定义了一个rule_id最小的查询缓存,根据ProxySQL的配置规则,rule_id最小的先进行查询匹配,如果匹配上了,且apply=0,则再继续向后匹配。以下截图,省略了其他查询配置

字段说明:

  • rule_id 查询匹配id,越小优先级越高。
  • username即对哪一个用户设置查询规则。
  • cache_ttl 查询缓存时间(秒)
  • active是否启用。
  • Match_digest匹配规则,注意最后一行^SELECT与^SELECT.*功能相同,因为ProxySQL源代码中使用的find而不是match函数。
  • destination_hostgroup 相关查询命中的主机组。
  • 注意,没有配置的将命中当前用户的默认主机组,即mysql_user.default_hostgroup。

1、查询规则路由表:

select rule_id,username,active,apply,cache_ttl,match_digest,destination_hostgroup from mysql_query_rules

用户表

字段说明:

  • transaction_persistent 默认值为0,请设置为1,1为在同一个事务内,将由同一个主机给当前用户提供服务。
  • default_hostgroup当前用户的默认主机组。

select username,password,active,default_hostgroup,default_schema,transaction_persistent

-> from mysql_users

问题修改

删除ProxySQL的查询缓存,或设置active=0后,可查询出结果数据。

Admin > update mysql_query_rules set active=0 where rule_id=10;

Admin> Load mysql query rules to runtime;

Admin> save mysql query rules to disk;

设置为active=0,或删除此记录后,此缓存将不再生效。

再次执行查询,问题解决:

每一个小的细节,都是技术能力的提升,努力吧。

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章