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

主交互逻辑

主交互架构

内部调用逻辑图

正如上图所示,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 // 导入事务相关代码
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,602评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,442评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,878评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,306评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,330评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,071评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,382评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,006评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,512评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,965评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,094评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,732评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,283评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,286评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,512评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,536评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,828评论 2 345

推荐阅读更多精彩内容