犀牛鸟 2026 研究笔记 estelledc.github.io

第 13 章:犀牛鸟 2026 实战指南——从学习到贡献

结论先行:犀牛鸟 2026 的分布式数据库赛道,核心是向 OpenTenBase 做出有意义的开源贡献。本章把前 12 章的知识转化为行动计划——从环境搭建、源码阅读、找到切入点、到提交第一个 PR 的完整路径。


竞赛速查(P1 竞赛速通者先看这里) ### 调研元信息 | 项目 | 值 | |------|-----| | 调研时间 | 2026-06-24 | | 目标项目 | OpenTenBase(基于 PostgreSQL 的分布式数据库) | | 主要语言 | C | | 竞赛形式 | 开源贡献(提交 PR) | ### 环境矩阵 | 环境 | 能做什么 | 不能做什么 / 注意 | |------|---------|-------------------| | Linux (推荐) | 完整编译 + 集群部署 + perf 调优 + 全部功能 | — | | Mac | 代码阅读 + 部分编译(PG 内核可能失败) | 无法跑多节点集群 / 无 perf | | 云服务器 (2C4G+) | 同 Linux + 多节点部署测试 | 费用;建议用免费 tier | ### 贡献路径分级 | 级别 | 方向 | 预估工时 | 竞赛价值 | |------|------|---------|---------| | L1 零门槛 | 文档翻译 / typo / 注释补全 | 2-3 天 | 低(热身) | | L2 低门槛 | 小 bug 修复(grep `TODO` / `FIXME`) | 1 周 | 中 | | L3 中门槛 | GTM 性能优化 / 查询优化器改进 | 2-3 周 | 中高 | | L4 高门槛 | 向量搜索支持 / 分布式事务优化 | 4+ 周 | 高 | ### 第一周行动清单 | 天 | 目标 | 产出 | |----|------|------| | Day 1 | Clone + 编译通过 | `make install` 成功 | | Day 2 | 启动最小集群(1 GTM + 1 Coord + 2 DN)| `psql` 连接成功 | | Day 3 | 精读 `src/gtm/` 入口 + grep `__OPENTENBASE__` | 手绘模块依赖图 | | Day 4 | 跑 `EXPLAIN` 理解查询路径 + 找一个小 issue | 确定第一个 PR 方向 | | Day 5 | 提交第一个 PR(文档/typo/小修复) | 破冰 + 熟悉 review 流程 | ### 已知风险与边界 | 风险 | 应对 | |------|------| | C 语言 + PG 内核门槛高 | 先花 2 天读 PG 开发者文档(SPI/Catalog/Executor) | | 编译环境问题(Mac 不完整) | 直接用 Linux VM 或云服务器 | | 一上来就挑大 feature | 先做 L1-L2 建立信任再进 L3 | | 无测试习惯 | 每个 PR 附带回归测试(`regress/`) | ### 读完你应能 - [ ] 在 Linux 上编译并启动 OpenTenBase 最小集群 - [ ] 说清楚 GTM / Coordinator / Datanode 三者的职责 - [ ] 找到至少一个可以贡献的 TODO/FIXME/小 bug - [ ] 写出符合项目规范的 commit message 和 PR description

参赛全局视角

犀牛鸟竞赛的本质

犀牛鸟开源人才培养计划是腾讯与高校合作的开源贡献项目。评审看的不是你写了多少行代码,而是:

评审关注点:

1. 理解深度
   你是否真正理解了项目的架构和设计哲学?
   你的贡献是否解决了真实的问题?

2. 贡献质量
   代码是否符合项目的编码规范?
   是否有完善的测试?
   PR 的描述是否清晰?

3. 社区参与
   你是否在 Issue 区有建设性的讨论?
   你是否帮助回答了其他社区成员的问题?

4. 学习成长
   你的技术认知是否有明显提升?
   你是否能用自己的话解释你做了什么以及为什么?

OpenTenBase 作为候选项目的优势

对比其他项目:

  TiDB(41K Star):
    PR 竞争激烈,reviewers 忙
    好做的 issue 早被抢了
    
  CockroachDB(32K Star):
    英文社区,代码量巨大
    对新手不太友好
    
  OpenTenBase(2K Star):
    社区小 → 贡献可见度高
    中文环境 → 沟通无障碍
    代码量适中(~3000 C 文件)→ 入门友好
    有明确的优化方向 → 容易找到切入点
    腾讯出品 → 与犀牛鸟竞赛天然契合

从零到第一个 PR 的路径

阶段一:建立基础(第 1-2 周)

目标:能在本地编译运行 OpenTenBase,理解整体架构

Day 1-3:环境搭建
  1. Clone OpenTenBase 仓库
     git clone https://github.com/OpenTenBase/OpenTenBase.git
  
  2. 阅读 README 和构建文档
  
  3. 在本地编译并启动一个最小集群
     (1 GTM + 1 Coordinator + 2 Datanode)
  
  4. 用 psql 连接 Coordinator,执行基本 SQL

Day 4-7:架构理解
  1. 重读本导读的第 3、10 章
     理解 Coordinator-Datanode-GTM 架构
  
  2. 浏览源码目录结构
     重点关注 src/gtm/、src/backend/pgxc/
  
  3. grep __OPENTENBASE__ 查看增量改动分布
  
  4. 运行一些查询,用 EXPLAIN 查看分布式执行计划

Day 8-14:选择方向
  根据第 10 章的贡献方向分析
  选择你最感兴趣且能力匹配的方向

阶段二:深入方向(第 3-4 周)

根据你选择的方向,深入阅读相关代码。

如果选择 GTM 性能优化

阅读路径:
  1. src/gtm/main/gtm_txn.c
     理解事务 ID 分配的完整流程
     找到锁竞争的热点
  
  2. src/gtm/proxy/
     理解 GTM Proxy 的批量聚合机制
     思考还有哪些可以批量化
  
  3. 用 perf 或类似工具 profile GTM 的 CPU 使用
     确认性能瓶颈在哪里
  
  4. 写一个简单的基准测试
     测量当前 GTM 的事务 ID 分配吞吐量

参考学习:
  TiDB 的 PD(TSO) 如何做批量时间戳分配
  → 这是一个成熟的工业级方案,可以参考其设计

如果选择查询优化器增强

阅读路径:
  1. src/backend/optimizer/util/pgxcship.c
     理解当前的可下推判断逻辑
     找到"保守判断"的地方(理论上可下推但被判为不可下推)
  
  2. src/backend/pgxc/plan/planner.c
     理解分布式查询计划的生成流程
  
  3. 构造一些查询用例
     看看哪些查询被正确下推
     哪些没有被下推但理论上可以
  
  4. 阅读 Citus 的 planner/README.md
     学习五层渐进式规划的设计思想

参考学习:
  Citus 的 Fast-path Router 如何判断单分片查询
  → 对比 OpenTenBase 的 pgxcship 逻辑

如果选择向量搜索增强

阅读路径:
  1. contrib/pgvector/
     了解当前的向量搜索集成状态
  
  2. 原版 pgvector 项目(github.com/pgvector/pgvector)
     对比 OpenTenBase 集成版和原版的差异
  
  3. 思考分布式环境下的向量搜索挑战
     索引如何分片?
     近似最近邻搜索如何跨节点聚合?
  
  4. YugabyteDB 的 src/yb/vector_index/
     参考另一个分布式 PG 系统的做法

阶段三:动手贡献(第 5-8 周)

第一个 PR 的选择策略:

  好的第一个 PR:
  ├── 修复文档中的错误或遗漏
  ├── 添加缺失的测试用例
  ├── 修复简单的 bug(搜索 issue 标签 good-first-issue)
  └── 改进错误信息(让报错更有用)

  不建议作为第一个 PR:
  ├── 大规模重构
  ├── 核心组件的重新设计
  └── 没有 issue 支撑的"改进"

PR 的标准流程:
  1. 先开 Issue 讨论你的想法
  2. 在 Issue 上得到 maintainer 的认可
  3. Fork 仓库,创建分支
  4. 写代码 + 测试
  5. 提交 PR,描述清楚做了什么、为什么、怎么测的
  6. 响应 Code Review 反馈
  7. 合并

学习路径与本导读的对应关系

路径 A:概念驱动(推荐新手)

Week 1:建立全景
  读 ch01(为什么需要分布式数据库)
  读 ch02(三条阅读路径)
  读 ch03(五种架构模式)
  → 能画出六个项目的架构谱系图

Week 2:深入核心概念
  读 ch04(共识与复制)
  读 ch05(分片与再均衡)
  读 ch06(查询优化)
  → 理解分布式数据库的三大支柱

Week 3:了解具体项目
  读 ch10(OpenTenBase 深度解读)← 最重要
  读 ch11(跨项目对比)
  → 理解 OpenTenBase 的设计决策和 trade-off

Week 4:动手准备
  读 ch12(技术挑战)
  读 ch13(本章)
  → 选择贡献方向,开始搭建环境

路径 B:项目驱动(有数据库基础)

Week 1:
  读 ch10(OpenTenBase)→ ch03(架构模式)→ ch11(对比)
  同时搭建 OpenTenBase 本地环境

Week 2:
  根据选择的方向读对应章节
  GTM 方向 → ch04(共识与复制)
  查询方向 → ch06(查询优化)+ ch07(Citus)

Week 3-4:
  开始源码阅读 + 基准测试 + 提交第一个 PR

路径 C:对比驱动(想全面了解领域)

按项目配对阅读:
  ch07(Citus vs Vitess)→ ch08(TiDB vs CockroachDB)→ ch09(YugabyteDB)→ ch10(OpenTenBase)
  
然后读:
  ch11(全景对比)→ ch12(技术挑战)→ ch13(竞赛指南)

源码阅读技巧

技巧一:从查询流程入手

一条 SQL 在 OpenTenBase 中的完整旅程:

  psql: SELECT * FROM orders WHERE user_id = 123;
  
  1. Coordinator 收到 SQL
     入口:src/backend/tcop/postgres.c → exec_simple_query()
     
  2. Parser 解析
     标准 PostgreSQL Parser(src/backend/parser/)
     
  3. pgxcship 判断是否可下推
     src/backend/optimizer/util/pgxcship.c
     "user_id 是分片键,可以下推到单个 Datanode!"
     
  4. 路由到目标 Datanode
     src/backend/pgxc/locator/locator.c
     hash(123) % node_count → Datanode 2
     
  5. execRemote 发送查询
     src/backend/pgxc/pool/execRemote.c
     发送原始 SQL 到 Datanode 2
     
  6. Datanode 2 执行
     标准 PostgreSQL 执行器
     
  7. 结果返回 Coordinator
     Coordinator 直接转发给客户端

追踪一条 SQL 的完整路径,比从头到尾读代码更高效。

技巧二:用 #ifdef __OPENTENBASE__ 导航

# 统计每个目录的 OpenTenBase 改动量
grep -r "__OPENTENBASE__" src/ | \
  sed 's|/[^/]*$||' | \
  sort | uniq -c | sort -rn | head -20

# 查看特定文件中的改动
grep -n "__OPENTENBASE__" src/backend/optimizer/util/pgxcship.c

技巧三:用 EXPLAIN 理解执行计划

-- 连接 Coordinator
psql -h coordinator_host -p 5432 -d testdb

-- 查看分布式执行计划
EXPLAIN (VERBOSE, COSTS) 
SELECT * FROM orders WHERE user_id = 123;

-- 查看跨节点查询的计划
EXPLAIN (VERBOSE, COSTS)
SELECT u.name, COUNT(o.order_id)
FROM users u JOIN orders o ON u.id = o.user_id
GROUP BY u.name;

技巧四:对比阅读

理解 OpenTenBase 的 pgxcship.c(可下推判断):
  → 同时读 Citus 的 planner/README.md(五层规划)
  → 对比两者的判断逻辑,找到 OpenTenBase 保守的地方

理解 OpenTenBase 的 GTM:
  → 同时读 TiDB 的 PD(TSO) 设计文档
  → 对比中心化时间戳分配的不同实现

常见陷阱与应对

陷阱一:一上来就想做大事

错误路径:
  "我要重新设计 GTM,让它支持多分片!"
  → 工作量巨大,没有前期信任基础
  → maintainer 不太可能接受这样的 PR

正确路径:
  先修几个小 bug → 建立信任
  → 提一个改进提案(RFC/Issue)→ 讨论
  → 得到认可后分步实现
  → 每步一个 PR,每个 PR 可独立 review

陷阱二:只写代码不写测试

没有测试的 PR 很难被接受。

OpenTenBase 的测试框架:
  src/test/regress/   → 回归测试(SQL 级别)
  src/test/isolation/  → 隔离级别测试
  
  添加测试的方式:
  1. 在 regress/ 目录下添加 .sql 测试文件
  2. 运行 make check 确认通过
  3. 测试用例要覆盖正常路径和边界情况

陷阱三:不与社区沟通

错误做法:
  闷头写代码两个月 → 提一个巨大的 PR → 被拒绝

正确做法:
  1. 先在 GitHub Issue 中描述你的计划
  2. 等 maintainer 回复
  3. 按照建议调整方向
  4. 小步快跑,频繁提交
  5. 在 PR 描述中解释设计决策

陷阱四:忽视 PostgreSQL 基础

OpenTenBase 的代码大量依赖 PostgreSQL 内核知识。
如果你连 PG 的基本概念都不熟悉,读 OpenTenBase 源码会很痛苦。

建议先了解:
  - PG 的进程模型(每连接一个进程)
  - PG 的查询处理流程(Parser → Analyzer → Planner → Executor)
  - PG 的 MVCC 实现(xmin/xmax)
  - PG 的 Hook 机制(Extension 如何拦截查询处理)
  
推荐资源:
  "The Internals of PostgreSQL" 在线书籍
  PostgreSQL 官方文档的 "Developer FAQ"

竞赛时间线建议

假设参赛周期 = 8 周:

  Week 1-2:基础建设期
  ├── 搭建开发环境
  ├── 阅读导读(重点 ch10, ch03, ch06)
  ├── 浏览源码目录结构
  └── 选择贡献方向

  Week 3-4:深入期
  ├── 深入阅读选定方向的源码
  ├── 写基准测试(量化当前性能)
  ├── 提交第一个小 PR(文档修复或小 bug)
  └── 在 Issue 中讨论你的改进想法

  Week 5-6:核心贡献期
  ├── 实现核心改进
  ├── 写完善的测试
  ├── 提交 PR
  └── 响应 Code Review

  Week 7-8:收尾期
  ├── 完善文档和测试
  ├── 处理 Review 反馈
  ├── 整理竞赛报告
  └── 准备答辩/展示

技术写作建议

竞赛报告和 PR 描述都需要清晰的技术写作能力。

PR 描述的结构:

  ## 问题
  一句话描述你要解决什么问题。
  链接相关的 Issue。

  ## 解决方案
  你选择了什么方案?为什么选这个方案而不是其他?
  方案的 trade-off 是什么?

  ## 改动
  具体改了哪些文件?每个改动的作用是什么?

  ## 测试
  怎么测试的?测试覆盖了哪些场景?
  附上测试结果。

  ## 基准测试(如果涉及性能改进)
  改动前后的性能对比数据。
  测试环境说明。

从竞赛到长期收益

参加犀牛鸟不只是为了竞赛本身。通过这个过程你获得的:

技术能力:
  - 阅读大型 C 项目的能力
  - 理解分布式系统设计的 trade-off
  - PostgreSQL 内核知识
  - 性能分析和优化经验

工程能力:
  - 开源协作流程(Issue → PR → Review → Merge)
  - 技术写作和沟通能力
  - 从零理解一个复杂系统的方法论

职业价值:
  - 开源贡献记录(GitHub Profile)
  - 分布式数据库领域的入门经验
  - 与腾讯技术团队的接触机会

常见误区

误区一:”我需要读完所有源码才能开始贡献” → 正确理解:没有人读完了 OpenTenBase 的所有代码。你只需要深入理解你要改动的那部分——通常是几个关键文件。先建立全局理解(本导读帮你做这件事),然后深入一个具体方向。

误区二:”好的贡献一定是大的贡献” → 正确理解:一个修复了真实 bug 的 10 行 PR,比一个没有测试的 1000 行重构更有价值。评审看的是你解决问题的能力和代码质量,不是代码量。

误区三:”我 C 语言不够好,做不了” → 正确理解:OpenTenBase 的 C 代码主要是 PostgreSQL 风格的——有大量的宏、结构体和函数指针,但不涉及复杂的指针算术或手动内存管理。阅读 PostgreSQL 风格的 C 代码是一个可以快速学习的技能。


读完全部导读你能做什么

回顾你从第 1 章到第 13 章学到的一切:

知识体系:
  ✓ 为什么需要分布式数据库(第 1 章)
  ✓ 五种架构模式的 trade-off(第 3 章)
  ✓ 共识协议、复制、全局时钟(第 4 章)
  ✓ 分片策略和在线再均衡(第 5 章)
  ✓ 查询优化的四种范式(第 6 章)
  ✓ 不改内核的分布式方案(第 7 章)
  ✓ 原生分布式的两条路(第 8 章)
  ✓ 双协议兼容的方案(第 9 章)
  ✓ OpenTenBase 的完整架构和贡献方向(第 10 章)
  ✓ 六个项目的全景对比(第 11 章)
  ✓ 12 个核心技术挑战(第 12 章)

行动能力:
  ✓ 在本地搭建 OpenTenBase 开发环境
  ✓ 追踪一条 SQL 在 OpenTenBase 中的完整路径
  ✓ 用 #ifdef __OPENTENBASE__ 定位增量改动
  ✓ 评估贡献方向的难度和影响力
  ✓ 提交符合规范的 PR

最后一句话

分布式数据库是计算机科学中最复杂的工程领域之一。你不需要一次理解所有东西——事实上没有人能。重要的是找到一个切入点,深入下去,做出一些真实的改变。犀牛鸟竞赛给了你一个绝佳的机会——一个有明确目标、有社区支持、有成果衡量的学习框架。

从第一行 git clone 开始,一步一步来。


导读目录:README.md 上一章:第 12 章 · 十二大核心技术挑战