建 MongoDB 兼容開發(fā)者體驗(yàn):Vultr 云服務(wù)實(shí)踐與開源替代方案解析)
后端數(shù)據(jù)庫文檔數(shù)據(jù)庫【免費(fèi)下載鏈接】FerretDBA truly Open Source MongoDB alternative項(xiàng)目地址https://gitcode.com/gh_mirrors/fe/FerretDB點(diǎn)擊查看免費(fèi)下載FerretDB 是一個(gè)基于 PostgreSQL 構(gòu)建的真正開源 MongoDB 替代方案。本文以 FerretDB 團(tuán)隊(duì)與 Vultr 的訪談為主線結(jié)合當(dāng)前倉庫源碼與官方文檔解析云服務(wù)商MSP如何借助 FerretDB 的 MongoDB wire protocol 兼容能力構(gòu)建 MongoDB 兼容的數(shù)據(jù)庫即服務(wù)DBaaS并給出從快速體驗(yàn)到生產(chǎn)部署的完整實(shí)操路徑。讀完本文你將理解 FerretDB 的代理架構(gòu)、兼容性邊界、部署方式以及開源 文檔數(shù)據(jù)庫這條避免廠商鎖定的技術(shù)路線。背景MongoDB 許可證變化與開源替代的缺口MongoDB 曾是許多開發(fā)者構(gòu)建應(yīng)用的利器易用、驅(qū)動文檔完善讓文檔型數(shù)據(jù)庫的開發(fā)體驗(yàn)非常順暢。然而隨著時(shí)間推移MongoDB 放棄了其開源根基將許可證改為 SSPL導(dǎo)致大量開源項(xiàng)目與早期商業(yè)項(xiàng)目無法再使用它。正如倉庫 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.也就是說絕大多數(shù) MongoDB 用戶并不需要其全部高級特性他們真正需要的是一個(gè)易用的開源文檔數(shù)據(jù)庫。FerretDB 正是為了填補(bǔ)這一缺口而生它是一個(gè)真正開源的 MongoDB 替代方案構(gòu)建在 Postgres 之上允許你無縫使用 MongoDB 驅(qū)動同時(shí)以 PostgreSQL 作為數(shù)據(jù)庫后端。在 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 的企業(yè)化傾向讓獨(dú)立開發(fā)者越來越難以觸達(dá)開源 drop-in 替代方案如 FerretDB自然成為了填補(bǔ)空白的選項(xiàng)。什么是 VultrMSP 為何需要 MongoDB 兼容能力Vultr 是一家全球云服務(wù)商提供行業(yè)領(lǐng)先的云 GPU 與云計(jì)算服務(wù)避免超大規(guī)模云廠商的復(fù)雜性與成本。它面向全球開發(fā)者和企業(yè)提供易用性、性價(jià)比與全球覆蓋。其核心產(chǎn)品線包括Vultr Cloud Compute在遍布全球 32 個(gè)云數(shù)據(jù)中心快速創(chuàng)建和擴(kuò)縮容高性能 VM 與裸金屬服務(wù)器搭載最新一代 AMD 和 Intel CPU按需付費(fèi)。Vultr Cloud GPU基于 Vultr 與 NVIDIA 的合作提供由 NVIDIA 數(shù)據(jù)中心 GPUHGX H100、A100、L40S、A40、A16加速的大規(guī)模高性能計(jì)算繞開驅(qū)動安裝與許可證的常見麻煩。Vultr Kubernetes EngineVKE完全托管的 Kubernetes 服務(wù)負(fù)責(zé)容器編排、控制平面零管理費(fèi)用并提供最大化資源分配的彈性基礎(chǔ)設(shè)施。MSP 之所以需要 MongoDB 兼容能力是因?yàn)槲臋n型 NoSQL 數(shù)據(jù)庫正是其初始托管數(shù)據(jù)庫產(chǎn)品線未覆蓋的領(lǐng)域。FerretDB 的出現(xiàn)恰好填補(bǔ)了這個(gè)產(chǎn)品空白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 服務(wù)形成了天然的組合FerretDBs use of a PostgreSQL backend made it an exciting pair with our Managed PostgreSQL offering.FerretDB 技術(shù)架構(gòu)wire protocol 轉(zhuǎn)換代理要理解 FerretDB 為什么能成為開箱即用的 MongoDB 替代需要先看它的核心架構(gòu)。根據(jù) 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.從架構(gòu)上看FerretDB 是一個(gè)代理proxy應(yīng)用側(cè)任意應(yīng)用、任意 MongoDB 驅(qū)動通過 MongoDB wire protocolBSON 編碼連接 FerretDB存儲側(cè)FerretDB 將請求轉(zhuǎn)換為 PostgreSQL 協(xié)議SQL寫入 PostgreSQL 及 DocumentDB 擴(kuò)展。任意應(yīng)用 / 任意 MongoDB 驅(qū)動 │ MongoDB protocol (BSON) ▼ FerretDB轉(zhuǎn)換代理 │ PostgreSQL protocol (SQL) ▼ PostgreSQL DocumentDB extension這一架構(gòu)在源碼中有明確的對應(yīng)實(shí)現(xiàn)。倉庫的 internal/clientconn/conn.go 實(shí)現(xiàn)了 wire protocol 服務(wù)端連接建立后循環(huán)調(diào)用processRequest通過wire.ReadMessage讀取 MongoDB 線協(xié)議消息交給中間件c.m.Handle(ctx, req)處理再將響應(yīng)寫回客戶端// internal/clientconn/conn.go 中的請求處理主循環(huán) 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函數(shù)負(fù)責(zé)創(chuàng)建整套組件DocumentDB handler對接 PostgreSQL 的核心、可選 proxy handler、中間件層、wire protocol 監(jiān)聽器、Data API 監(jiān)聽器與 MCP 監(jiān)聽器。從源碼結(jié)構(gòu)可以看到FerretDB 不僅支持原生 MongoDB 協(xié)議還提供了 HTTP Data API對應(yīng) Atlas Data API 兼容接口與 MCPModel Context Protocol服務(wù)端。開箱即用的兼容性Vultr 實(shí)測體驗(yàn)訪談中Vultr 的工程師談到了他們在托管產(chǎn)品測試中的真實(shí)體驗(yàn)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.要點(diǎn)可以歸納為作為 MongoDB 的 drop-in 替代穩(wěn)定覆蓋了絕大多數(shù)最常用功能存在少量邊界情況差異其中一部分在公開路線圖中大部分相同的命令和協(xié)議開箱即用在托管產(chǎn)品測試中表現(xiàn)快速而順暢與官方宣傳一致。這一開箱即用承諾在倉庫的 website/docs/migration/compatibility.md 中有系統(tǒng)化的命令兼容性清單。以下是核心分類? 表示已支持? 表示尚未實(shí)現(xiàn)命令類別已支持命令節(jié)選尚未實(shí)現(xiàn)節(jié)選管理命令create、createIndexes、collMod、drop、dropDatabase、listCollections、listDatabases、listIndexes、renameCollection、currentOp、reIndex等cloneCollectionAsCapped、convertToCapped、killOp、logRotate、shutdown聚合命令aggregate、count、distinct—認(rèn)證命令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文檔同時(shí)指出了兩個(gè)不會解決的已知差異FerretDB 使用與 MongoDB 相同的錯(cuò)誤名稱和錯(cuò)誤碼但確切的錯(cuò)誤消息文本可能略有不同F(xiàn)erretDB 的集合名必須是合法 UTF-8而 MongoDB 允許非法 UTF-8 序列。除這兩點(diǎn)外其余行為差異均被視為需要修復(fù)的問題用戶可以投票影響公開路線圖。這也是訪談中 Vultr 提到預(yù)期兼容性會持續(xù)增長的底氣來源??焖袤w驗(yàn)一條命令啟動 MongoDB 兼容環(huán)境對想要評估 FerretDB 的開發(fā)者或 MSP 而言最快的路徑是使用官方提供的 evaluation 鏡像。根據(jù) website/docs/installation/evaluation.md只需一條命令即可同時(shí)啟動 FerretDB、預(yù)打包了 DocumentDB 擴(kuò)展的 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可以直接在容器內(nèi)執(zhí)行docker exec -it ferretdb mongosh mongodb://username:password127.0.0.1:27017/也可以直接進(jìn)入 PostgreSQLdocker exec -it ferretdb psql -U username postgres停止容器使用docker stop ferretdb。這一體驗(yàn)路徑正是任意 MongoDB 驅(qū)動/工具開箱即用的最直觀證明開發(fā)者完全不需要學(xué)習(xí)新的 API 或連接方式。生產(chǎn)部署Docker Compose 與 DocumentDB 后端Evaluation 鏡像將數(shù)據(jù)保存在容器內(nèi)不適合生產(chǎn)。面向生產(chǎn)FerretDB 官方推薦使用生產(chǎn)鏡像ghcr.io/ferretdb/ferretdb:2.8.0以當(dāng)前倉庫文檔中記錄的版本為例并搭配獨(dú)立的 PostgreSQL DocumentDB 擴(kuò)展鏡像。根據(jù) 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拉起服務(wù)用mongodb://username:password127.0.0.1/即可連接。官方文檔還建議始終指定完整鏡像標(biāo)簽如2.8.0以保證部署一致性升級時(shí)先更新 DocumentDB 鏡像再更新 FerretDB 鏡像通過 TLS 連接 加固傳輸層并做好備份。配置項(xiàng)速查從 CLI 參數(shù)理解部署形態(tài)FerretDB 的命令行參數(shù)在 cmd/ferretdb/main.go 中定義所有參數(shù)都支持FERRETDB_前綴的環(huán)境變量形式如FERRETDB_POSTGRESQL_URL。幾個(gè)關(guān)鍵參數(shù)參數(shù)默認(rèn)值說明--postgresql-urlpostgres://127.0.0.1:5432/postgresPostgreSQL 連接 URL必填核心配置--postgresql-url-file空從文件讀取 PostgreSQL URL優(yōu)先級高于--postgresql-url--listen-addr127.0.0.1:27017MongoDB 協(xié)議 TCP 監(jiān)聽地址--listen-unix空MongoDB 協(xié)議 Unix socket 監(jiān)聽路徑--listen-tls空MongoDB 協(xié)議 TLS 監(jiān)聽地址需配合證書參數(shù)--listen-data-api-addr空HTTP Data API 監(jiān)聽地址--listen-mcp-addr空HTTP MCP 服務(wù)器監(jiān)聽地址--proxy-addr空代理轉(zhuǎn)發(fā)地址--debug-addr127.0.0.1:8088指標(biāo)、pprof 等 HTTP handler 監(jiān)聽地址--modenormal操作模式--state-dir.狀態(tài)目錄--authtrue是否啟用認(rèn)證默認(rèn)開啟可用--no-auth關(guān)閉--log-levelinfo開發(fā)版為debug日志級別debug/info/warn/error--log-formatconsole日志格式console/text/json/mongo--telemetryundecided匿名遙測開關(guān)可顯式設(shè)為true/false值得注意的安全細(xì)節(jié)源碼中的checkFlags會校驗(yàn)參數(shù)自洽性——例如當(dāng)啟用認(rèn)證默認(rèn)同時(shí)又開啟了 MCP 監(jiān)聽器時(shí)進(jìn)程會直接報(bào)錯(cuò)退出因?yàn)?MCP 服務(wù)器不支持認(rèn)證。此外--auth關(guān)閉時(shí)會有明確警告服務(wù)器將接受任何連接。對于嵌入式場景倉庫還提供了 ferretdb/ferretdb.go 的 Go 庫封裝ferretdb.New(Config{...})創(chuàng)建實(shí)例Run(ctx)啟動監(jiān)聽器MongoDBURI()返回對外暴露的 MongoDB URI。Config結(jié)構(gòu)體包含PostgreSQLURL、ListenAddr、StateDir、LogLevel、LogOutput、Telemetry字段與 CLI 參數(shù)保持同步。開源生態(tài)視角MSP 為什么押注開源軟件訪談中 Vultr 對開源的態(tài)度值得所有平臺方參考。核心觀點(diǎn)包括開源是解鎖創(chuàng)新的關(guān)鍵過去 25 年開發(fā)者正是借助開源軟件完成了我們今天在工作、家庭與日常生活中使用的全部技術(shù)開源對客戶的收益成本、可靠性、安全性是主要優(yōu)勢。社區(qū)驅(qū)動的迭代透明且快速企業(yè)軟件往往難以匹敵開源項(xiàng)目的長壽性也很重要——因?yàn)榇罅拷M織自身的項(xiàng)目依賴它會持續(xù)投入新功能與修復(fù)平臺的承諾Vultr 致力于為開發(fā)者提供單擊即用的開源框架與技術(shù)讓開源基礎(chǔ)設(shè)施支撐下一個(gè) 25 年的創(chuàng)新。在回答FerretDB 未來期待時(shí)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.他們認(rèn)為 FerretDB 作為 MongoDB drop-in 替代已經(jīng)有了扎實(shí)的開局期待功能對等feature parity持續(xù)增長并希望公開路線圖上的承諾繼續(xù)兌現(xiàn)。結(jié)論可組合的云時(shí)代與無鎖定文檔數(shù)據(jù)庫訪談的最終結(jié)論與 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.云服務(wù)的未來是兼容的——來自開源與商業(yè)軟件生態(tài)的可組合服務(wù)是開發(fā)者獲得自由、選擇與靈活性的關(guān)鍵。借助 FerretDBVultr 得以向其客戶提供 NoSQL 數(shù)據(jù)庫即服務(wù)的替代選項(xiàng)讓開發(fā)者繼續(xù)使用熟悉的工具、避免廠商鎖定并降低成本與復(fù)雜度。對于任何想要構(gòu)建 MongoDB 兼容服務(wù)的團(tuán)隊(duì)來說FerretDB 提供了一條已被驗(yàn)證的路徑以 PostgreSQL 為存儲后端以 wire protocol 代理維持 MongoDB 驅(qū)動的開箱即用體驗(yàn)再用 compatibility.md 中的命令清單對照自己的功能需求。這既是 Vultr 訪談記錄的核心啟示也是當(dāng)前倉庫源碼與文檔所支撐的完整技術(shù)方案。贊分享后端數(shù)據(jù)庫文檔數(shù)據(jù)庫【免費(fèi)下載鏈接】FerretDBA truly Open Source MongoDB alternative項(xiàng)目地址https://gitcode.com/gh_mirrors/fe/FerretDB點(diǎn)擊查看免費(fèi)下載相關(guān)推薦FerretDB 2.0 發(fā)布解讀基于 DocumentDB 的全新架構(gòu)更快、更兼容的 MongoDB 開源替代方案FerretDB 2.0 發(fā)布解讀基于 DocumentDB 的全新架構(gòu)更快、更兼容的 MongoDB 開源替代方案 FerretDB 2.0 是 Ferr后端數(shù)據(jù)庫文檔數(shù)據(jù)庫FerretDB v0.1.1 發(fā)布以 MongoDB 兼容性為核心的開源替代之路FerretDB v0.1.1 發(fā)布以 MongoDB 兼容性為核心的開源替代之路 FerretDB 是一個(gè)開源的 MongoDB 替代品它作為代理將 Mo后端數(shù)據(jù)庫文檔數(shù)據(jù)庫FerretDB技術(shù)解析開源MongoDB替代方案入門指南FerretDB技術(shù)解析開源MongoDB替代方案入門指南 什么是FerretDB FerretDB是一款開源的MongoDB替代方案它通過將MongoD后端數(shù)據(jù)庫文檔數(shù)據(jù)庫創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考