- 快召唤伙伴们来围观吧
- 微博 QQ QQ空间 贴吧
- 视频嵌入链接 文档嵌入链接
- 复制
- 微信扫一扫分享
- 已成功复制到剪贴板
《 Apache Doris 源码阅读与解析——第六讲:Doris 的节点管理和内部流程》
《 Apache Doris 源码阅读与解析》系列直播活动旨在帮助 Apache Doris 社区的开发者或者有意向参与 Apache Doris 社区建设的小伙伴们,可以更快熟悉 Apache Doris 代码的组织结构和一些主要流程的实现原理以及代码位置,以便于各位小伙伴们能够快速上手,参与到开发工作中来。
本期内容为《第六讲 —— Doris 的节点管理和各种内部流程》,这一讲我们主要介绍 Doris 里的一些内部逻辑:
FE、BE、Broker 节点管理逻辑
心跳服务、AgentTask 以及 BE 的汇报机制
展开查看详情
1 .Apache Doris 源码阅读与解析 第六讲:节点管理和各种内部流程 陈明雨
2 .课程大纲 • 节点管理的设计原则 • FE、BE、Broker 节点的管理流程详解 • 各节点之间的内部信息交换 • DeployManager的自动服务发现
3 .课程收获 • 了解节点之间的管理和交互逻辑的设计原理。 • 集群节点状态不再是“黑盒”,集群管理更加轻松自如。 • 通过DeployManager构建节点自动发现
4 .Doris中的节点 • Frontend(FE) • Backend(BE) • Broker(略)
5 .为什么需要节点管理 • 最初的节点管理方式的问题 • 随意测试、误操作、拓扑结构不可控 • 目的是对节点进行认证 • 实现一个节点发现和认证机制
6 . 01 FE 节点管理-新增FE
7 .FE节点管理 • FE 节点的角色 • Follower 和 Observer • Master 是一种特殊的 Follower • 为什么需要两种角色 • Follower 保证元数据写高可靠 • Observer 保证元数据读的扩展性
8 .FE启动流程 • Catalog.initialize() • 1. 确定元数据目录 • 2. 获取节点信息和Helper信息 • 3. 获取集群信息和角色 • 4. 加载元数据 • 5. 启动状态监听
9 .FE 启动流程 – 元数据目录结构 • bdb:BDBJE的数据目录 • BDBJE:分布式嵌入式kv数据库, • Doris 元数据的元数据 • Image • Image.2858:元数据镜像文件 • ROLE:记录角色信息 • VERSION:记录集群信息
10 .FE 启动流程 – 获取节点信息和Helper信息 • Catalog.getSelfHostPort() • IP + PORT 唯一确定一个 FE 节点 • Catalog.getHelperNode() • sh start_fe.sh –helper ip:port • HelperNode: • 指向任一已存在的Follower
11 .FE 启动流程 – 获取集群和角色信息 • Catalog.getClusterIdAndRole() • 根据本地信息启动 • 生成或本地获取ROLE文件 • 生成或本地获取VERSION文件
12 .FE 启动流程 – 获取集群和角色信息 • Catalog.getClusterIdAndRole() • 从Helper获取信息 • 进行节点认证 • 比对 cluster id 和 token • 拉取最新image文件
13 .FE 启动流程 – 加载元数据 • Catalog.initialize() • 加载Image • 加载元数据日志 • 第九讲中详细介绍
14 .FE 启动流程 – 启动状态监听 • Catalog.createStateListener() • 第九讲中详细介绍
15 .FE 启动流程 – 流程回顾
16 .FE 新节点加入流程
17 .FE 启动流程 – 节点认证 • 如何防止错误的节点加入集群 • 新节点的 IP:PORT 必须在元数据中显式注册。 • 双向认证: • Master FE只会发送心跳给已注册的FE节点,防止未注册的节点被错误加入。 • 新增FE会校验Master FE发送的心跳信息中的FE信息,防止接收到其他FE发送的错误心跳。 • role、cluster_id、token
18 .FE 启动流程 – 节点认证 • org.apache.doris.httpv2.meta.MetaService.java • /role?host=ip&port=9030 • 检查指定的[ip:port]是否已经注册,并返回对应的角色(Follower / Observer) • /version • 返回 VERSION 文件 • /check • 返回 cluster_id 和 token 用于对端校验
19 . 02 FE 节点管理-删除FE
20 .FE 节点删除流程 • 执行删除命令 • ALTER SYSTEM DROP FOLLOWER “ip:port” • ALTER SYSTEM DROP OBSERVER “ip:port” • Catalog.dropFrontend() • 从元信息中删除 • 如果是Follower,从可选举组中删除 • 记录元数据日志
21 .FE 节点删除流程 • 其他FE会同步这个“删除FE节点”的元数据操作 • EditLog.loadJournal() • 如果发现删除的是自己,直接退出。
22 . 03 BE 节点管理-新增BE
23 .新增BE节点流程
24 .新增BE节点流程 • 注册BE节点信息 • ALTER SYSTEM ADD BACKEND ”ip:port”; • org.apache.doris.system.SystemInfoService.addBackend()
25 .新增BE节点流程 • Master FE 向 BE 发送心跳 • org.apache.doris.system.HeartbeatMgr.java#BackendHeartbeatHandler • 心跳信息: gensrc/thrift/HeartbeatService.thrift#TMasterInfo
26 .新增BE节点流程 • BE 处理并存储心跳信息 • src/agent/heartbeat_server.cpp • 验证IP • 验证 cluster id • cluster_id 文件 • 验证 epoch • 验证 token
27 .BE 启动流程 – 节点认证 • 如何防止错误的节点加入集群 • 新节点的 IP:PORT 必须在元数据中显式注册。 • 双向认证: • FE只会发送心跳给已注册的BE节点,防止未注册的节点被错误加入。 • BE会校验FE发送的心跳信息中的FE信息,防止接收到其他FE发送的错误心跳。 • FEIP、epoch、cluster_id、token
28 . 04 BE 节点管理-删除BE
29 .BE 节点删除 • DROP 和 DECOMMISSION • ALTER SYSTEM DROP BACKEND:直接删除 • org.apache.doris.system.SystemInfoService.dropBackend() • ALTER SYSTEM DECOMMISSION BACKEND:数据迁移后删除 • Org.apache.doris.alter.SystemHandler.process() • 标记副本为“下线”状态,触发副本修复逻辑。全部数据迁移完成后,会自动 DROP BACKEND • FE 配置:drop_backend_after_decommission • 为什么 FE 节点不需要 DECOMMISSION?