美文网首页
Doris 源码分析 (二) 代码结构分析

Doris 源码分析 (二) 代码结构分析

作者: 走在成长的道路上 | 来源:发表于2021-09-30 12:14 被阅读0次

    主交互逻辑

    主交互架构

    内部调用逻辑图

    正如上图所示,FE 端主要是 PaloFe 开启的服务入口, 后端为 doris_main 开启的服务入口,前后端交互主要靠 thrift rpc 进行调用。FE 中主从选举及元数据操作日志同步等均依托 bdbje 主从方案来实现。

    元数据分发流程

    元数据变更日志主要靠 bdbje 的主从复制来完成如下图:

    数据流

    元数据的数据流具体过程如上图所示,步骤如下:

    1. 只有 leader FE 可以对元数据进行写操作。写操作在修改 leader 的内存后,会序列化为一条log,按照 key-value 的形式写入 bdbje。其中 key 为连续的整型,作为 log id,value 即为序列化后的操作日志。

    2. 日志写入 bdbje 后,bdbje 会根据策略(写多数/全写),将日志复制到其他 non-leader 的 FE 节点。non-leader FE 节点通过对日志回放,修改自身的元数据内存镜像,完成与 leader 节点的元数据同步。

    3. leader 节点的日志条数达到阈值后(默认 10w 条),会启动 checkpoint 线程。checkpoint 会读取已有的 image 文件,和其之后的日志,重新在内存中回放出一份新的元数据镜像副本。然后将该副本写入到磁盘,形成一个新的 image。之所以是重新生成一份镜像副本,而不是将已有镜像写成 image,主要是考虑写 image 加读锁期间,会阻塞写操作。所以每次 checkpoint 会占用双倍内存空间。

    4. image 文件生成后,leader 节点会通知其他 non-leader 节点新的 image 已生成。non-leader 主动通过 http 拉取最新的 image 文件,来更换本地的旧文件。

    5. bdbje 中的日志,在 image 做完后,会定期删除旧的日志。

    代码目录结构

    ├── be                  // BE 代码目录
    ├── bin                 // FE/BE 的启停脚本
    ├── build_plugin.sh     // FE 插件编译脚本
    ├── build.sh            // Doris 编译脚本
    ├── build-support       // 编译用辅助脚本
    ├── CODE_OF_CONDUCT.md  // 贡献者代码行为准则
    ├── conf                // FE/BE 的配置文件
    ├── contrib             // 第三方贡献代码,如 udf
    ├── CONTRIBUTING_CN.md  
    ├── CONTRIBUTING.md
    ├── DISCLAIMER
    ├── docker              // Doris 开发镜像的 Dockerfile
    ├── docs                // 文档目录
    ├── env.sh
    ├── extension           // 扩展功能代码,如 flink connector 等
    ├── fe                  // FE 代码目录
    ├── fe_plugins          // FE 插件目录
    ├── fs_brokers          // Broker 代码目录
    ├── gensrc              // thrift/protobuf 等代码生成目录
    ├── LICENSE.txt
    ├── NOTICE.txt
    ├── README.md
    ├── run-be-ut.sh        // BE 单元测试运行脚本
    ├── run-fe-ut.sh        // FE 单元测试运行脚本
    ├── samples             // 示例代码目录
    ├── thirdparty          // 第三方依赖库目录
    ├── tools               // 一些辅助工具
    ├── tsan_suppressions
    ├── ui                  // FE 前端代码目录
    └── webroot             // 一些静态网页相关代码
    

    BE 代码结构

    ├── agent                   // FE 下发的 agent task 相关处理类
    ├── common                  // 通用类
    ├── env                     // 文件系统操作类
    ├── exec                    // 执行算子相关代码
    ├── exprs                   // 表达式、函数计算相关代码
    ├── geo                     // 地理位置函数相关代码
    ├── glibc-compatibility     // GLIBC 兼容代码
    ├── gutil                   // Google gutil 相关代码
    ├── http                    // BE 端 http server 相关代码
    ├── olap                    // 存储层代码
    ├── plugin                  // BE 插件管理相关代码
    ├── runtime                 // 查询层运行时相关代码
    ├── service                 // BE 对外服务接口相关代码, 主入口 doris_main 也在该包下
    ├── testutil                // 单元测试辅助类
    ├── tools                   // 辅助工具相关代码
    ├── udf                     // 用户自定义函数相关代码
    └── util                    // 一些工具类
    

    FE 代码结构

    ├── alter       // 表结构变更操作相关的代码。包括表结构变更,物化视图等。
    ├── analysis    // 包含所有SQL语法的java实例类
    ├── backup      // 备份恢复操作相关的代码
    ├── blockrule   // SQL 黑名单相关代码
    ├── catalog     // 包含元数据操作的主类和各种数据库、表、分区的元数据实例类(基于 MetaReader/MetaWriter 进行元数据存储等)
    ├── clone       // 数据副本修复和均衡相关的代码
    ├── cluster     // 已废弃
    ├── common      // 一些工具类和通用定义
    ├── consistency // 数据一致性校验相关的代码
    ├── deploy      // 部署相关代码
    ├── external    // Doris on Elasticsearch相关的代码
    ├── ha          // 元数据高可用相关的代码 (BDB 副本配置主从结构逻辑代码)
    ├── http        // http v1 代码(Netty 版本)
    ├── httpv2      // http v2 代码(Spring 版本,逐步替换v1)
    ├── journal     // 元数据日志相关的代码(BDB 元数据日志数据读写操作)
    ├── ldap        // LDAP 认证相关代码
    ├── load        // 导入作业相关代码
    ├── master      // FE Master角色相关的操作代码,如元数据Checkpoint,BE任务汇报的处理等。
    ├── metric      // FE 监控指标相关的代码
    ├── monitor     // JVM 监控相关代码
    ├── mysql       // MySQL协议层相关代码
    ├── PaloFe.java // Main函数入口
    ├── persist     // 元数据持久化相关的代码
    ├── planner     // 查询优化器相关的代码
    ├── plugin      // Frontend端插件管理相关代码
    ├── qe          // 用于处理各类SQL请求相关的代码。如查询请求的处理类、DDL请求的处理类等
    ├── resource    // 资源标签相关的代码
    ├── rewrite     // 查询优化器重写规则相关的代码
    ├── rpc         // Frontend和Backend之间RPC协议相关的代码
    ├── service     // Frontend侧各种服务器端代码
    ├── system      // 集群节点的实例类和集群节点管理相关的代码
    ├── task        // Frontend发往Backend的各类任务相关的代码
    └── transaction // 导入事务相关代码
    

    相关文章

      网友评论

          本文标题:Doris 源码分析 (二) 代码结构分析

          本文链接:https://www.haomeiwen.com/subject/aqwjnltx.html