第 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 章 · 十二大核心技术挑战