【 TiDB 使用环境】生产环境
【 TiDB 版本】V6.5.2
【遇到的问题:问题现象及影响】
前提:查询语句一致,使用HAproxy,TiFlash2副本
使用HA的xx.xx.xx.42:13390登录数据库并查询时,默认走TiFlash
使用TiDB的其中一个节点xx.xx.xx.38:4000登录数据库并查询时,默认走TiKV
!请问,为什么会产生这种现象?有哪些可能的因素?
HAproxy 做的 4 层转发吧,跟它没啥关系
对,是4层传输层
mode tcp # HAProxy
这个有影响吗。可以把两种不同方式查询的执行计划发一下。
业务环境,无法复现,已知是单表查询,查询前使用HA节点创建的TIFLASH 2副本
前面是怎么发现走ha时是读tiflash , 走tidb时读tikv? 方便贴sql吗,执行计划可以从dashboard SQL分析里找下。 每个tidb都是这样吗? 可能原因有: 每个tidb的 tidb_isolation_read_engines 不一样或者程序设置了会话变量; plan cache影响;可能spm也有影响。
tidb_isolation_read_engines参数默认没加
这个是执行SQL时发现很慢,然后explain analyze看了下执行计划,比较了一下,发现一个是走tikv一个是走tiflash的,但语句都一样,具体语句记不清了,生产环境要查语句还要走变更流程,很麻烦
这个是咋实现的?HA和tiflash应该没有关联性吧?还是通过HA访问tidb节点时关联PD时走了tiflash
肯定和haproxy没什么关系。4层控制不了这个。不建议在这个方向上浪费时间。
这个问题看上去和执行计划,session变量设置有关系。
建议往这两个方向查一查。
这个参数如果不设置的话,默认是三个都可以走吧?
isolation-read.engines:
- tikv
- tidb
- tiflash
这个存储隔离有优化语句的作用么?
除了这个,还有一些mpp相关的参数,也会导致只走tiflash。
tidb_allow_mpp ,tidb_enforce_mpp.
tidb会根据sql,自动选择走行存还是列存。
sql会自动根据执行计划,选择是走tikv还是tiflash
感觉你的表可能统计信息不准
没办法稳定复现的话,估计和参数没关系,估计是优化器把走 tikv 的 走 tiflash 的cost 预估的很近,所以执行计划选的不稳定, 具体你可以通过 session set tidb_isolation_read_engines 的情况下 ,分别看下 explain analyze format=verbose + sql 的结果
使用haproxy 也是走到某一tidb实例上
有实际SQL的执行计划吗?可以发出来看看
每个tidb上都执行下analyze table
看看是不是网络负载均衡出了问题。
HAProxy是否配置了基于URL或特定请求头的路由规则,比如查询包含某些特定的标记或路径?