当前位置: 首页 > news >正文

StarRocks 怎么让特定的SQL路由到FE master节点的

背景

本文基于 StarRocks 3.1.7
大家都知道对于Starrocks来说 FE 是分 master和follower的,而只有master节点才能对元数据进行写操作。但是为什么呢?哪里有体现呢?
这其中的原因在网上是搜不到的,所以大家只知道只有master节点才能对元数据进行写操作,而哪里有体现呢

结论

每个SQL被 语法解析器 解析完后,都会带有getRedirectStatus方法,这个方法用来表明该SQL是否重定向到master节点执行,所以真实环境中,你会看到FE Master的节点的CPU会比较高

在这里插入图片描述

分析

我们直接定位到StmtExecutor.execute()方法:

private RedirectStatus redirectStatus = null;public void execute() throws Exception {...try (Timer ignored = Tracers.watchScope("Total")) {redirectStatus = parsedStmt.getRedirectStatus();

这里的parsedStmt.getRedirectStatus()方法就是用来表明该SQL是否会重定向到 FE master节点,比如说DML和DDL语句:

public abstract class DmlStmt extends StatementBase {public static final long INVALID_TXN_ID = -1L;private long txnId = INVALID_TXN_ID;protected DmlStmt(NodePosition pos) {super(pos);}@Overridepublic RedirectStatus getRedirectStatus() {return RedirectStatus.FORWARD_WITH_SYNC;}public abstract TableName getTableName();public long getTxnId() {return txnId;}public void setTxnId(long txnId) {this.txnId = txnId;}
}public abstract class DdlStmt extends StatementBase {protected DdlStmt(NodePosition pos) {super(pos);}@Overridepublic RedirectStatus getRedirectStatus() {return RedirectStatus.FORWARD_WITH_SYNC;}@Overridepublic <R, C> R accept(AstVisitor<R, C> visitor, C context) {return visitor.visitDDLStatement(this, context);}}

这些都是RedirectStatus.FORWARD_WITH_SYN,也就是会重定向到FE master节点。比如说一下语句都会重定向到master执行:

truncate table ..
alter table ...
create table ...
drop table ...

而后在后面的执行中会有如下判断:

if (isForwardToLeader()) {context.setIsForward(true);forwardToLeader();return;} else {LOG.debug("no need to transfer to Leader. stmt: {}", context.getStmtId());}

这里的方法 isForwardToLeader调用链如下:

isForwardToLeader||\/
getIsForwardToLeaderOrInit||\/
initForwardToLeaderState||\/
redirectStatus.isForwardToLeader()

这里就会用到getRedirectStatus方法返回的 redirectStatus.

http://www.lryc.cn/news/523799.html

相关文章:

  • 在Windows/Linux/MacOS C++程序中打印崩溃调用栈和局部变量信息
  • 解决npm install安装出现packages are looking for funding run `npm fund` for details问题
  • 豆包MarsCode:小C点菜问题
  • K8S中Pod控制器之CronJob(CJ)控制器
  • FRP内网穿透0.61.1新版教程
  • 亲测解决`data_array` is not of type `MetaTensor, assuming affine to be identity
  • python+pygame+pytmx+map editor开发一个tiled游戏demo 05使用object层初始化player位置
  • Git实用指南:忽略文件、命令别名、版本控制、撤销修改与标签管理
  • wordpress安装完后台无格式解决方法(样式加载不出来)
  • 数据库管理-第285期 Oracle 23ai:深入浅出向量索引(20250117)
  • 日志(elk stack)基础语法学习,零基础学习
  • Mysql InnoDB B+Tree是什么?
  • Java基础(二)
  • 【网络协议】【http】【https】TLS1.3
  • K8S中Pod控制器之Job控制器
  • macOS安装Gradle环境
  • 2024年美赛C题评委文章及O奖论文解读 | AI工具如何影响数学建模?从评委和O奖论文出发-O奖论文做对了什么?
  • LDD3学习9--数据类型和定时器
  • 一文夯实垃圾收集的理论基础
  • OpenWRT Conserver 共享串口服务实现
  • 第12章:Python TDD完善货币加法运算(一)
  • Springboot项目Jackson支持多种接收多种时间格式
  • 两台电脑互PING不通的解决办法
  • No. 34 笔记 | Python知识架构与数据类型相关内容 | 实操
  • 【2024年华为OD机试】 (B卷,100分)- 字符串分割(Java JS PythonC/C++)
  • Pix2Pix :用于图像到图像转换的条件生成对抗网络
  • 基于VSCODE+GDB+GDBSERVER远程单步调试设备篇(可视化界面)
  • CamemBERT:一款出色的法语语言模型
  • 0基础跟德姆(dom)一起学AI 自然语言处理18-解码器部分实现
  • 我的创作纪念日——我与CSDN一起走过的365天