nginx现象
<html>
<head><title>504 Gateway Time-outtitle>head>
<body bgcolor="white">
<center><h1>504 Gateway Time-outh1>center>
<hr><center>nginxcenter>
body>
html>
在分层定位问题前需要先知道Doris的整体部署结构, 方便定位问题. 部署结构如下:
由错误信息可以做如下猜测:
通过排查,
具体朝3的方向分析
确认isTimeout数来源: 查找TransactionState构造函数的依赖关系, 可以找到如下代码截图: 按照标号顺序看:
说明: FrontendServiceImpl.java是fe提供的RPC服务接口. 提供库、表、事物等的基本操作服务.
到这里貌似就知道地方RPC请求了loadTxnBegin()方法, 什么地方调用的不清楚. 是broker ? be ? 猜测是be
stream load我们知道是http请求, 从源码包中我们查到到如下代码:
翻看代码, 通古注册的url可以知道stream load是LoadAction.java这个类处理的. 请求是如何被转到这里处理的, 下回再分解.
public static void registerAction(ActionController controller) throws IllegalArgException {
ExecuteEnv execEnv = ExecuteEnv.getInstance();
LoadAction action = new LoadAction(controller, execEnv);
controller.registerHandler(HttpMethod.PUT,
"/api/{" + DB_KEY + "}/{" + TABLE_KEY + "}/_load", action);
controller.registerHandler(HttpMethod.PUT,
"/api/{" + DB_KEY + "}/{" + TABLE_KEY + "}/_stream_load",
new LoadAction(controller, execEnv, true));
}
executeWithoutPassword()这个方法是当有stream load请求到fe时, 请求会被转发到这个方法处理, 代码核心如下:
TNetworkAddress redirectAddr;
if (!isStreamLoad && !Strings.isNullOrEmpty(request.getSingleParameter(SUB_LABEL_NAME_PARAM))) {
...
} else {
...
redirectAddr = new TNetworkAddress(backend.getHost(), backend.getHttpPort());
}
LOG.info("redirect load action to destination={}, stream: {}, db: {}, tbl: {}, label: {}",
redirectAddr.toString(), isStreamLoad, dbName, tableName, label);
redirectTo(request, response, redirectAddr);
这个核心代码逻辑比较简单, fe会把stream load的请求redirect到一个be节点处理, 这个be节点称为Coordinator节点. 这个be节点会负责和fe通信生成导入执行计划, 处理导入事物等. 下面我们再细说.
那我们看看be是如何处理fe转发过来的stream load请求的.
欢迎添加微信,互相学习↑↑↑ -_-
白老虎
programming is not only to solve problems, ways to think
grafana 级连 菜单 templating (variables) 配置
rocketmq 集群搭建 (2master + 2slave + 2namesrv)
AI 机器人 抓取 微信 聊天中的 百度网盘 分享地址和密码