分布式SQLite十二年演变史
Twelve Years of Distributed SQLite
2014年,我发布了rqlite,将Raft共识协议与SQLite结合,开创了开源分布式SQLite的先河。十二年来,这一领域从无人问津发展到涌现出dqlite、Litestream、Turso等多个项目。有人选择共识协议实现强一致性,有人转向WAL流式备份,也有人通过CRDTs实现无领导者架构。尽管rqlite、dqlite和Litestream仍保持开源免费,但资本最终流向了将技术封装为付费服务的平台。如今,rqlite依然坚守初心,为需要自建、可控且免费的关系型存储提供可靠方案。
核心思路是正确的:SQLite作为存储引擎,外加外部复制机制,已被至少八个团队以不同需求和协议重新发明,却无人找到停止它的理由。
HN 评论区
54- gregsadetsky
我觉得应该有一张对比表,列出所有这些引擎,并比较它们的外部依赖、是否支持单领导节点或任意节点写入、形态(嵌入式库 vs 服务器)等。
在我看来,对事务的支持是一个相当重要的分水岭。有些引擎支持完整的 SQLite 事务,而另一些——比如 rqlite——并不正式支持 BEGIN/COMMIT [0],如果你依赖多语句事务,这点就很重要。
一位朋友/同事正在为 dqlite [1] 构建 Python 绑定(DB-API 和 SQLAlchemy),这可能会引起这里一些人的兴趣。dqlite 完全支持事务,并且像 rqlite 一样,不需要任何外部依赖(不需要 S3,也不需要 Consul)。
并非要贬低 rqlite 或其他任何引擎——dqlite 也有自己的问题 [2]。
[0] https://rqlite.io/docs/faq/#does-rqlite-support-transactions
[1] https://github.com/letsdiscodev/python-dqlite-dbapi
[2] https://github.com/canonical/dqlite/issues/882 由我的朋友提出,https://github.com/canonical/dqlite/issues/908,https://github.com/canonical/dqlite/issues/912 由我提出
- piterrro
在生产环境中使用过 D1 后,我发现它不太可靠。HN 上有一位 D1 开发者的评论 [1] 提到,D1 实际上是建立在 Durable Objects 之上的 SQL 封装,模拟了 SQLite 的分布式特性。
> 我告诉你们一个有点“见不得光”的秘密:
几乎总是建议使用 Durable Objects 存储,而不是 D1。即使你只需要一个全局数据库,将其实现为单个 Durable Object 也比使用 D1 更好。因为 D1 本质上就是那样:一个暴露 SQLite 数据库 API 的单个 Durable Object。它仅仅是一个封装层。
- vikrantrathore
这很有趣。当我阅读 Part-time Parliament 论文(Paxos)时,同时在学习 Zig 和 Odin 语言,我编写了一个纯 Paxos 库,然后用它构建的第一个应用就是多主 SQLite。我采取的两种方法截然不同:在 Zig 中,我构建了 zaxonlite(https://github.com/insanai/zaxonlite),并包含了一个与 rqlite 的基准测试。它使用 WAL 复制作为策略。第二次尝试是在 Odin 中进行的 sqlodin(https://github.com/insanai/sqlodin),在这个系统中,不使用 WAL,而是在每个节点上运行 SQL 查询,结果是 SQLite 中部分 SQL 查询子集不被支持。
- mmnfrdmcx
作为一个热爱 SQLite 及其简洁性的人,事实是,有了代理(agents),我发现管理 Postgres 变得极其容易,而且拥有 Postgres 的所有 SQL 功能真的很棒——SQLite 在很多 SQL 功能上相当受限。所以,如果你正在考虑远程 SQLite 之类的方案,现在比以往任何时候都更适合直接使用数据库服务器。
当然,SQLite 对于本地工具等来说依然非常出色。
- AgentME
各种项目之间的对比很有趣,包括 rqlite 和 Litestream 之间的对比。(rqlite 在节点间使用共识算法来保持同步并允许切换主节点,而 Litestream 只是将自己同步到 S3,这样另一个节点就可以从那里接管数据。)
我完全预期文章很快就会谈到 D1,并提及 Cloudflare Durable Objects(D1 基于此)与 celld(Cloudflare Durable Objects 的开源重写,写入 S3)之间大致相同的关系。但随后文章对 D1 表现出一种突然的、带有讽刺意味的漠不关心,而最后部分则显得非常尴尬地为 rqlite 辩护,且充满失败主义情绪。