一个 PHP 大佬,用 C# 手搓了一个分布式数据库 - 张善友

一个 PHP 大佬,用 C# 手搓了一个分布式数据库 - 张善友

💡 原文中文,约3000字,阅读约需8分钟。
📝

内容提要

CamusDB 是 Phalcon 作者用 C# 开发的分布式 SQL 数据库,单人开发五年。默认 Serializable 隔离,支持数据库分支、时间旅行和误删恢复。作者自建混沌工具 Caraxes 注入真实故障,通过银行转账对账发现静默丢数据等 bug,并公开未修复缺陷。目前仍是半成品,bus factor 为 1,性能未知,不建议生产使用,但为 .NET 生态探索了方向,并示范了严谨的工程态度。

🔎

延伸解读

默认 Serializable 的取舍

CamusDB 将 Serializable 设为默认隔离级别,与 PostgreSQL 默认 Read Committed、MySQL 默认 Repeatable Read 形成对比。这降低了应用层因隔离不足导致数据异常的风险,但悲观两阶段锁和范围锁可能在高并发下带来性能开销。文章指出其性能尚无公开 benchmark,因此实际吞吐和延迟仍是未知数。

数据库分支与时间旅行的实用价值

CamusDB 支持通过 SQL 从生产库瞬间创建写时复制分支,以及利用 AS OF SYSTEM TIME 进行时间旅行查询和恢复误删对象。这些能力对测试环境搭建、迁移预演和 AI agent 并行试错有直接帮助,类似 Neon 的商业化方向,但 CamusDB 将其作为内建功能。

混沌工程与对账测试的启示

作者自建混沌工具 Caraxes,注入真实故障如 SIGKILL、网络分区和慢磁盘,并通过银行转账对账验证总余额不变。这种方法曾发现静默丢数据 bug,并促使引擎确立“读不到确定答案必须报错”的原则。对读者而言,这展示了如何用简单对账逻辑暴露复杂分布式系统中的一致性问题。

当前局限与适用场景

CamusDB 仍是单人项目,bus factor 为 1,部分功能处于 alpha,存储格式可能变化,且存在未修复的写丢失缺陷。性能未知,不建议用于核心生产。但其在 .NET 生态中探索了分布式数据库方向,并公开未修复缺陷,为学习分布式系统提供了可试玩的 WebAssembly playground。

❓

Q&A

CamusDB 是什么?谁开发的?

CamusDB 是一个用 C# 编写的分布式 SQL 数据库,由 Andrés Gutiérrez(Phalcon 框架作者)单人开发,项目于 2021 年立项,已持续五年。

CamusDB 有哪些特色功能?

CamusDB 默认使用 Serializable 隔离级别;支持数据库分支(如 CREATE DATABASE staging BRANCH FROM prod),基于写时复制;支持误删恢复,通过 SHOW ORPHAN TABLES 和 RELINK TO 找回;还支持 AS OF SYSTEM TIME 时间旅行查询。

CamusDB 如何进行测试和验证?

作者自建混沌工程工具 Caraxes,注入真实故障(如 SIGKILL、网络分区、慢磁盘),并通过银行转账对账测试验证一致性:所有账户余额总和必须保持不变。这种测试发现了静默丢数据等 bug。

CamusDB 目前有哪些已知缺陷和限制?

CamusDB 仍是半成品,bus factor 为 1,性能未知(无公开 benchmark),存储格式可能随版本变化,升级需逻辑导出导入。存在一条未找到根因的 Raft 层写丢失 bug,且 strict serializable 尚未验证。不建议用于生产环境。

CamusDB 对 .NET 生态有什么意义?

CamusDB 证明了现代 .NET 能够构建分布式数据库这类基础设施,打破了基础设施必须用 Go、Rust、C++ 写的成见。其引擎甚至能编译成 WebAssembly,在浏览器中运行三节点 Raft 集群,供人体验。

CamusDB 的工程态度有什么特别之处?

作者采用严谨的工程态度:先通过混沌工具主动攻击系统,公开所有测试结果,包括已修复和未修复的缺陷,并按照 Jepsen 审计报告格式发布一致性证明文章。这种透明和诚实赢得了认可。

🏷️

标签

➡️

继续阅读