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);
    }

    @Override
    public 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);
    }

    @Override
    public RedirectStatus getRedirectStatus() {
        return RedirectStatus.FORWARD_WITH_SYNC;
    }

    @Override
    public <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.

相关推荐
EQUINOX16 小时前
【论文精读】| CLIP精读
大数据·人工智能
微三云 - 廖会灵 (私域系统开发)8 小时前
消费即资产:积分增值异业联盟商业模式完整拆解(附落地逻辑、合规方案与盈利模型)
大数据·人工智能
老白说数智化升级8 小时前
从一次改善到持续进化,AI如何沉淀制造现场的运营知识?
大数据·人工智能·制造
小也说互联网9 小时前
2026年|正规靠谱外贸独立站建站渠道全景解析
大数据·外贸独立站·独立站搭建·谷歌seo优化·外贸建站·谷歌建站服务商推荐·外贸出海企业必看
只说证事9 小时前
电子商务专业考证能找到哪些工作
大数据
建筑工程企业管理系统9 小时前
erp工程项目管理系统落地价值:实现工程多项目成本精细化核算与管控
大数据·数据库·人工智能
万岳科技系统开发9 小时前
校园跑腿外卖搭建助力高校周边商家拓展线上业务
大数据·人工智能·小程序
理想家小杨总11 小时前
2026年|知名谷歌推广平台甄选:外贸独立站建站深度测评
大数据·独立站搭建·谷歌建站·国内外贸建站服务商推荐·外贸出海建站·谷歌独立站搭建·谷歌建站服务商
就是一顿骚操作11 小时前
全球 AI 大事件新闻汇总 2026-08-01
大数据·人工智能
xqqxqxxq14 小时前
DQL 数据查询 select
sql