多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

FerretDB 构建 MongoDB 兼容开发者体验:Vultr 云服务实践与开源替代方案解析

FerretDB 构建 MongoDB 兼容开发者体验:Vultr 云服务实践与开源替代方案解析 后端数据库文档数据库【免费下载链接】FerretDBA truly Open Source MongoDB alternative项目地址https://gitcode.com/gh_mirrors/fe/FerretDB点击查看免费下载FerretDB 是一个基于 PostgreSQL 构建的真正开源 MongoDB 替代方案。本文以 FerretDB 团队与 Vultr 的访谈为主线结合当前仓库源码与官方文档解析云服务商MSP如何借助 FerretDB 的 MongoDB wire protocol 兼容能力构建 MongoDB 兼容的数据库即服务DBaaS并给出从快速体验到生产部署的完整实操路径。读完本文你将理解 FerretDB 的代理架构、兼容性边界、部署方式以及开源 文档数据库这条避免厂商锁定的技术路线。背景MongoDB 许可证变化与开源替代的缺口MongoDB 曾是许多开发者构建应用的利器易用、驱动文档完善让文档型数据库的开发体验非常顺畅。然而随着时间推移MongoDB 放弃了其开源根基将许可证改为 SSPL导致大量开源项目与早期商业项目无法再使用它。正如仓库 README.md 所述Most MongoDB users do not require any advanced features offered by MongoDB; however, they need an easy-to-use open-source document database solution. Recognizing this, FerretDB is here to fill that gap.也就是说绝大多数 MongoDB 用户并不需要其全部高级特性他们真正需要的是一个易用的开源文档数据库。FerretDB 正是为了填补这一缺口而生它是一个真正开源的 MongoDB 替代方案构建在 Postgres 之上允许你无缝使用 MongoDB 驱动同时以 PostgreSQL 作为数据库后端。在 Vultr 的访谈中这一判断得到了印证With MongoDBs recent enterprise nature making it less accessible for independent developers, open-source drop-in replacements such as FerretDB felt like a natural fit to fill this gap.MongoDB 的企业化倾向让独立开发者越来越难以触达开源 drop-in 替代方案如 FerretDB自然成为了填补空白的选项。什么是 VultrMSP 为何需要 MongoDB 兼容能力Vultr 是一家全球云服务商提供行业领先的云 GPU 与云计算服务避免超大规模云厂商的复杂性与成本。它面向全球开发者和企业提供易用性、性价比与全球覆盖。其核心产品线包括Vultr Cloud Compute在遍布全球 32 个云数据中心快速创建和扩缩容高性能 VM 与裸金属服务器搭载最新一代 AMD 和 Intel CPU按需付费。Vultr Cloud GPU基于 Vultr 与 NVIDIA 的合作提供由 NVIDIA 数据中心 GPUHGX H100、A100、L40S、A40、A16加速的大规模高性能计算绕开驱动安装与许可证的常见麻烦。Vultr Kubernetes EngineVKE完全托管的 Kubernetes 服务负责容器编排、控制平面零管理费用并提供最大化资源分配的弹性基础设施。MSP 之所以需要 MongoDB 兼容能力是因为文档型 NoSQL 数据库正是其初始托管数据库产品线未覆盖的领域。FerretDB 的出现恰好填补了这个产品空白Document-based NoSQL databases can be helpful depending on the project, and this is an area our initial Managed Database offerings did not cover.而 FerretDB 采用 PostgreSQL 后端这一特性使其与 Vultr 的托管 PostgreSQL 服务形成了天然的组合FerretDBs use of a PostgreSQL backend made it an exciting pair with our Managed PostgreSQL offering.FerretDB 技术架构wire protocol 转换代理要理解 FerretDB 为什么能成为开箱即用的 MongoDB 替代需要先看它的核心架构。根据 README.md 的定义FerretDB is an open-source alternative to MongoDB. It is a proxy that converts MongoDB 5.0 wire protocol queries to SQL and uses PostgreSQL with DocumentDB extension as a database engine.从架构上看FerretDB 是一个代理proxy应用侧任意应用、任意 MongoDB 驱动通过 MongoDB wire protocolBSON 编码连接 FerretDB存储侧FerretDB 将请求转换为 PostgreSQL 协议SQL写入 PostgreSQL 及 DocumentDB 扩展。任意应用 / 任意 MongoDB 驱动 │ MongoDB protocol (BSON) ▼ FerretDB转换代理 │ PostgreSQL protocol (SQL) ▼ PostgreSQL DocumentDB extension这一架构在源码中有明确的对应实现。仓库的 internal/clientconn/conn.go 实现了 wire protocol 服务端连接建立后循环调用processRequest通过wire.ReadMessage读取 MongoDB 线协议消息交给中间件c.m.Handle(ctx, req)处理再将响应写回客户端// internal/clientconn/conn.go 中的请求处理主循环 reqHeader, reqBody, err : wire.ReadMessage(bufr) if err ! nil { return lazyerrors.Error(err) } req, err : middleware.RequestWire(reqHeader, reqBody) if err ! nil { return lazyerrors.Error(err) } resp : c.m.Handle(ctx, req) if resp nil { return lazyerrors.New(middleware returned nil response) } if err wire.WriteMessage(bufw, resp.WireHeader(), resp.WireBody()); err ! nil { return lazyerrors.Error(err) }在 internal/util/setup/setup.go 中Setup函数负责创建整套组件DocumentDB handler对接 PostgreSQL 的核心、可选 proxy handler、中间件层、wire protocol 监听器、Data API 监听器与 MCP 监听器。从源码结构可以看到FerretDB 不仅支持原生 MongoDB 协议还提供了 HTTP Data API对应 Atlas Data API 兼容接口与 MCPModel Context Protocol服务端。开箱即用的兼容性Vultr 实测体验访谈中Vultr 的工程师谈到了他们在托管产品测试中的真实体验As noted in the official communication from FerretDB, the current state of the software as a drop-in replacement for MongoDB is that it consistently captures the bulk of the most common functionality. While there are certainly edge-case differences, some of which are part of the public roadmap, our experience with FerretDB has been smooth in that it works as a replacement precisely in the way its being advertised. Most of the same commands and protocols work right out of the box, and its been fast and smooth to work with while testing our managed product.要点可以归纳为作为 MongoDB 的 drop-in 替代稳定覆盖了绝大多数最常用功能存在少量边界情况差异其中一部分在公开路线图中大部分相同的命令和协议开箱即用在托管产品测试中表现快速而顺畅与官方宣传一致。这一开箱即用承诺在仓库的 website/docs/migration/compatibility.md 中有系统化的命令兼容性清单。以下是核心分类✅ 表示已支持❌ 表示尚未实现命令类别已支持命令节选尚未实现节选管理命令create、createIndexes、collMod、drop、dropDatabase、listCollections、listDatabases、listIndexes、renameCollection、currentOp、reIndex等cloneCollectionAsCapped、convertToCapped、killOp、logRotate、shutdown聚合命令aggregate、count、distinct—认证命令logout、saslContinue、saslStartauthenticate诊断命令buildInfo、collStats、dbStats、explain、ping、serverStatus、whatsmyuri、getLog等profile、logApplicationMessage查询命令find、insert、update、delete、findAndModify、getMorebulkWrite会话命令endSessions、killSessions、startSession、refreshSessionsabortTransaction、commitTransaction用户管理createUser、dropUser、updateUser、usersInfo、dropAllUsersFromDatabasegrantRolesToUser、revokeRolesFromUser文档同时指出了两个不会解决的已知差异FerretDB 使用与 MongoDB 相同的错误名称和错误码但确切的错误消息文本可能略有不同FerretDB 的集合名必须是合法 UTF-8而 MongoDB 允许非法 UTF-8 序列。除这两点外其余行为差异均被视为需要修复的问题用户可以投票影响公开路线图。这也是访谈中 Vultr 提到预期兼容性会持续增长的底气来源。快速体验一条命令启动 MongoDB 兼容环境对想要评估 FerretDB 的开发者或 MSP 而言最快的路径是使用官方提供的 evaluation 镜像。根据 website/docs/installation/evaluation.md只需一条命令即可同时启动 FerretDB、预打包了 DocumentDB 扩展的 PostgreSQL 以及 MongoDB Shell记得替换username和passworddocker run -d --name ferretdb -p 27017:27017 \ -e POSTGRES_USERusername \ -e POSTGRES_PASSWORDpassword \ -v ./data:/var/lib/postgresql/data \ ghcr.io/ferretdb/ferretdb-eval:2容器启动后即可使用任意 MongoDB 客户端连接mongodb://username:password127.0.0.1:27017/使用 MongoDB Shell 连接mongosh mongodb://username:password127.0.0.1:27017/如果没有本地安装 mongosh可以直接在容器内执行docker exec -it ferretdb mongosh mongodb://username:password127.0.0.1:27017/也可以直接进入 PostgreSQLdocker exec -it ferretdb psql -U username postgres停止容器使用docker stop ferretdb。这一体验路径正是任意 MongoDB 驱动/工具开箱即用的最直观证明开发者完全不需要学习新的 API 或连接方式。生产部署Docker Compose 与 DocumentDB 后端Evaluation 镜像将数据保存在容器内不适合生产。面向生产FerretDB 官方推荐使用生产镜像ghcr.io/ferretdb/ferretdb:2.8.0以当前仓库文档中记录的版本为例并搭配独立的 PostgreSQL DocumentDB 扩展镜像。根据 website/docs/installation/ferretdb/docker.md最小化的 docker-compose 配置如下services: postgres: image: ghcr.io/ferretdb/postgres-documentdb:17-0.108.0-ferretdb-2.8.0 restart: on-failure environment: - POSTGRES_USERusername - POSTGRES_PASSWORDpassword - POSTGRES_DBpostgres volumes: - ./data:/var/lib/postgresql/data ferretdb: image: ghcr.io/ferretdb/ferretdb:2.8.0 restart: on-failure ports: - 27017:27017 environment: - FERRETDB_POSTGRESQL_URLpostgres://username:passwordpostgres:5432/postgres networks: default: name: ferretdb启动后通过docker compose up -d拉起服务用mongodb://username:password127.0.0.1/即可连接。官方文档还建议始终指定完整镜像标签如2.8.0以保证部署一致性升级时先更新 DocumentDB 镜像再更新 FerretDB 镜像通过 TLS 连接 加固传输层并做好备份。配置项速查从 CLI 参数理解部署形态FerretDB 的命令行参数在 cmd/ferretdb/main.go 中定义所有参数都支持FERRETDB_前缀的环境变量形式如FERRETDB_POSTGRESQL_URL。几个关键参数参数默认值说明--postgresql-urlpostgres://127.0.0.1:5432/postgresPostgreSQL 连接 URL必填核心配置--postgresql-url-file空从文件读取 PostgreSQL URL优先级高于--postgresql-url--listen-addr127.0.0.1:27017MongoDB 协议 TCP 监听地址--listen-unix空MongoDB 协议 Unix socket 监听路径--listen-tls空MongoDB 协议 TLS 监听地址需配合证书参数--listen-data-api-addr空HTTP Data API 监听地址--listen-mcp-addr空HTTP MCP 服务器监听地址--proxy-addr空代理转发地址--debug-addr127.0.0.1:8088指标、pprof 等 HTTP handler 监听地址--modenormal操作模式--state-dir.状态目录--authtrue是否启用认证默认开启可用--no-auth关闭--log-levelinfo开发版为debug日志级别debug/info/warn/error--log-formatconsole日志格式console/text/json/mongo--telemetryundecided匿名遥测开关可显式设为true/false值得注意的安全细节源码中的checkFlags会校验参数自洽性——例如当启用认证默认同时又开启了 MCP 监听器时进程会直接报错退出因为 MCP 服务器不支持认证。此外--auth关闭时会有明确警告服务器将接受任何连接。对于嵌入式场景仓库还提供了 ferretdb/ferretdb.go 的 Go 库封装ferretdb.New(Config{...})创建实例Run(ctx)启动监听器MongoDBURI()返回对外暴露的 MongoDB URI。Config结构体包含PostgreSQLURL、ListenAddr、StateDir、LogLevel、LogOutput、Telemetry字段与 CLI 参数保持同步。开源生态视角MSP 为什么押注开源软件访谈中 Vultr 对开源的态度值得所有平台方参考。核心观点包括开源是解锁创新的关键过去 25 年开发者正是借助开源软件完成了我们今天在工作、家庭与日常生活中使用的全部技术开源对客户的收益成本、可靠性、安全性是主要优势。社区驱动的迭代透明且快速企业软件往往难以匹敌开源项目的长寿性也很重要——因为大量组织自身的项目依赖它会持续投入新功能与修复平台的承诺Vultr 致力于为开发者提供单击即用的开源框架与技术让开源基础设施支撑下一个 25 年的创新。在回答FerretDB 未来期待时Vultr 表示FerretDB is off to a solid start as a drop-in replacement for MongoDB. We expect to see feature parity continue to grow going forward.他们认为 FerretDB 作为 MongoDB drop-in 替代已经有了扎实的开局期待功能对等feature parity持续增长并希望公开路线图上的承诺继续兑现。结论可组合的云时代与无锁定文档数据库访谈的最终结论与 FerretDB 的定位高度一致The future of cloud services is compatible. Mix-and-match services from an open source and commercial software ecosystem are critical to giving developers the freedom, choice, and flexibility to build new things and move fast.云服务的未来是兼容的——来自开源与商业软件生态的可组合服务是开发者获得自由、选择与灵活性的关键。借助 FerretDBVultr 得以向其客户提供 NoSQL 数据库即服务的替代选项让开发者继续使用熟悉的工具、避免厂商锁定并降低成本与复杂度。对于任何想要构建 MongoDB 兼容服务的团队来说FerretDB 提供了一条已被验证的路径以 PostgreSQL 为存储后端以 wire protocol 代理维持 MongoDB 驱动的开箱即用体验再用 compatibility.md 中的命令清单对照自己的功能需求。这既是 Vultr 访谈记录的核心启示也是当前仓库源码与文档所支撑的完整技术方案。赞分享后端数据库文档数据库【免费下载链接】FerretDBA truly Open Source MongoDB alternative项目地址https://gitcode.com/gh_mirrors/fe/FerretDB点击查看免费下载相关推荐FerretDB 2.0 发布解读基于 DocumentDB 的全新架构更快、更兼容的 MongoDB 开源替代方案FerretDB 2.0 发布解读基于 DocumentDB 的全新架构更快、更兼容的 MongoDB 开源替代方案 FerretDB 2.0 是 Ferr后端数据库文档数据库FerretDB v0.1.1 发布以 MongoDB 兼容性为核心的开源替代之路FerretDB v0.1.1 发布以 MongoDB 兼容性为核心的开源替代之路 FerretDB 是一个开源的 MongoDB 替代品它作为代理将 Mo后端数据库文档数据库FerretDB技术解析开源MongoDB替代方案入门指南FerretDB技术解析开源MongoDB替代方案入门指南 什么是FerretDB FerretDB是一款开源的MongoDB替代方案它通过将MongoD后端数据库文档数据库创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表