本文承接上一篇[Doris核心原理] -- FE启动过程原理分析2 -- 启动类PaloFe.java,
从上一篇中, 我们了解了Doris Fe启动类的运行过程, 本篇主要讲解Doris Fe启动时是如何初始化Catalog.java这个类的.
Catalog.java是Doris Fe的一个核心类, 主要负责以下功能(包括但不限于)
启动类PaloFe.java是通过调用下面的代码进行初始化的.
// init catalog and wait it be ready
Catalog.getCurrentCatalog().initialize(args);
Catalog.getCurrentCatalog().waitForReady();
接下来, 我们主要讲解Catalog.getCurrentCatalog().initialize(args)的初始化过程.
1. 初始化配置的元数据目录信息. 元数据目录需要事先创建, 如果不创建启动会报错, 然后进程退出. bdb目录、image目录如果不存在则会创建.
2. 处理当前Fe启动时的host、port, 启动时设置的helper节点地址
3. 初始化插件管理器
4. 初始化审计日志处理器.
审计日志处理器是在AuditEventProcessor.java中实现的, 代码结构如下:
public class AuditEventProcessor {
private static final Logger LOG = LogManager.getLogger(AuditEventProcessor.class);
private static final long UPDATE_PLUGIN_INTERVAL_MS = 60 * 1000; // 1min
private PluginMgr pluginMgr;
private List<Plugin> auditPlugins;
private long lastUpdateTime = 0;
private BlockingQueue<AuditEvent> eventQueue = Queues.newLinkedBlockingDeque(10000);
private Thread workerThread;
private volatile boolean isStopped = false;
public AuditEventProcessor(PluginMgr pluginMgr) {
}
public void start() {
}
public void stop() {
}
public void handleAuditEvent(AuditEvent auditEvent) {
}
public class Worker implements Runnable {
}
}
下面我们介绍这段代码中的核心字段和方法.
5. 初始化当前Fe的角色、版本. 实现方式是: getClusterIdAndRole().
这里会根据角色文件、版本文件关系决定是否从helper节点中拉取image数据. 也就是新启动了一个follower的非master节点, 此时需要从master同步image信息, image中包含了全部的元数据信息.
这个方法个人感觉代码结构比较混乱, 有待apache孵化优化.
6. 初始化editLog, 并加载image和回放editLog日志. 代码如下:
this.editLog = new EditLog(nodeName);
loadImage(this.imageDir); // load image file
editLog.open(); // open bdb env
this.globalTransactionMgr.setEditLog(editLog);
this.idGenerator.setEditLog(editLog);
7. 清理load、export任务的元信息.
createLabelCleaner();
Fe默认不会全部的load、export任务信息都保存, 比如load任务信息默认保存3天, 然后就内存删除了, 由于没有落盘, 删除后将永远不可见.
8. 清理过期的事物信息. 事物包含创建库、表, drop库表,load数据等, 都是一个事物, 要么成功要么失败. 但是Doris不会允许一个事物无限期的执行, 比如stream load默认600s超时.
createTxnCleaner();
9. 初始化Fe角色变化监听器. Fe的角色选举是通过bdb来实现的, 当bdb发现有新加节点或者有新节点下线后, 会重新选举新的master Fe节点, 选成功后通过状态变化通知其他Fe节点.
该监听器就是监听当前Fe角色变化的, 一旦角色变化则立即做出角色改变. 比如转化为master后, 调用transferToMaster()方法, 启动一系列的master后台线程服务, 代码上继承MasterDaemon.java类的都是. transferToMaster()的核心功能如下:
在这些步骤执行完成后, 会Doris Fe启动类会调用Catalog.getCurrentCatalog().waitForReady()方法, 直到本地的editlog都回放完成后, 再继续执行之后的逻辑.
下一篇将主要介绍Fe中的三个服务: Qe服务、Fe服务、Http服务, 分别为Fe提供了jdbc协议接入、thrift RPC接入、Http接入和监控.