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

文章详情

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

在 Tembo 托管 Postgres 上运行 FerretDB:部署 MongoDB 工作负载的完整指南

在 Tembo 托管 Postgres 上运行 FerretDB:部署 MongoDB 工作负载的完整指南 后端数据库文档数据库【免费下载链接】FerretDBA truly Open Source MongoDB alternative项目地址https://gitcode.com/gh_mirrors/fe/FerretDB点击查看免费下载FerretDB 是一个真正开源的 MongoDB 替代方案它把 MongoDB 兼容层叠加在 PostgreSQL以及 SQLite等关系型数据库之上Tembo 则是一个以 PostgreSQL 为核心的托管开发平台提供开箱即用的预配置栈。本文将以仓库中的官方博客《How to Run MongoDB Workloads with FerretDB on Tembo》为骨架完整演示如何在 Tembo 上创建 Mongo Alternative on Postgres 实例、获取 TLS 连接串、用mongoimport导入 JSON 数据并通过mongosh执行真实的 MongoDB 查询与聚合工作负载。读完本文你将掌握一套从零开始、可直接用于生产环境的托管 Postgres MongoDB 兼容部署方案并理解其底层认证与 TLS 机制。为什么是 FerretDB TemboFerretDB 是一个可嵌入的 MongoDB 兼容实现客户端使用 MongoDB 协议与它通信而它把文档操作翻译为 PostgreSQL 查询存储层完全由 PostgreSQL 承载。从源码看它的核心配置Config 结构体只要求提供PostgreSQLURL、监听地址ListenAddr与状态目录StateDir即可启动默认通过:27017端口对外提供 MongoDB 协议服务见 监听地址配置。Tembo 的价值在于把托管 Postgres FerretDB 容器打包成了按需创建的服务它提供预构建的 Stacks栈开发者不需要自行构建、安装 Docker 或维护额外的基础设施团队就能获得一个经过调优的文档存储实例。在 Tembo 上FerretDB 以容器形式与你的数据库并置部署在同一网络内从而降低访问延迟。前置条件开始之前请准备好以下环境Tembo 账号用于创建托管实例参考 Tembo 官方 Getting Started 指南完成注册。mongoshMongoDB Shell用于连接和操作 FerretDB 实例也是下面所有示例的执行工具。psqlPostgreSQL 命令行客户端用于在需要时直接检查底层 PostgreSQL 数据或创建用户。了解 Tembo 上的 FerretDB 栈Tembo 中的 Stack栈是一套为特定用途预构建、面向企业场景调优的 Postgres 配置集合。对于 MongoDB 用户Tembo 提供了名为Mongo Alternative on Postgres的栈针对文档存储document store工作负载进行了专门优化栈内组件仍然可调整并且可以利用 Tembo 上丰富的 Postgres 扩展体系进一步扩展能力Tembo 不仅托管你的 Postgres 实例还会在数据库旁边以容器方式运行 FerretDB减少客户端访问 FerretDB 时的网络跳数。对于正在评估 MongoDB 迁移、又希望继续使用成熟 PostgreSQL 生态的团队来说这种几秒钟创建、即开即用的部署方式可以显著降低引入新数据库的管理成本。在 Tembo 上创建 FerretDB 实例登录 Tembo 控制台后创建 FerretDB 实例的步骤如下在创建实例页面选择Mongo Alternative on Postgres栈如上图所示。按需配置云服务商cloud provider、实例规格instance type、存储大小storage size和地域region。点击Create实例预配通常需要几分钟时间。实例就绪后在实例详情页可以查看到连接信息包括连接串connection string、用户名username、密码password和主机host连接串格式与根证书Tembo 上 FerretDB 实例的连接串遵循以下格式mongodb://USERNAME:PASSWORDHOST:27017/ferretdb?authMechanismPLAINtlstruetlsCaFile$(pwd)/ca.crt逐段拆解参数含义mongodb://USERNAME:PASSWORDHOST:27017/ferretdbMongoDB 协议地址、端口27017与目标数据库ferretdbauthMechanismPLAIN认证机制由 Tembo 连接详情生成配合 Tembo 侧的用户体系使用tlstrue启用 TLS 加密连接客户端与服务端之间的流量将被加密tlsCaFile$(pwd)/ca.crt指定 SSL 根证书的本地路径$(pwd)表示当前工作目录你需要先从连接详情面板下载根 SSL 证书root CA certificate。如果证书不放在当前目录请把$(pwd)替换为证书实际路径例如mongodb://USERNAME:PASSWORDHOST:27017/ferretdb?authMechanismPLAINtlstruetlsCaFile/your/certificate/path/ca.crtTLS 配置并不是 Tembo 独有FerretDB 自身同样支持通过FERRETDB_LISTEN_TLS等环境变量开启 TLS 监听客户端侧使用tlstrue与tlsCAFile参数建立加密连接完整说明见 TLS 连接文档。用 mongoimport 向 FerretDB 导入 JSON 数据从下载好的证书所在目录执行mongoimport可以把一个包含采购记录supply records的 JSON 文件导入ferretdb数据库的supply集合中mongoimport --urimongodb-connection-string --db ferretdb --collection supply --file /path/to/exportedFile.json使用时请将mongodb-connection-string替换为上面获取到的完整连接串/path/to/exportedFile.json替换为 JSON 文件的真实路径。mongoimport是 MongoDB 官方工具链的一部分FerretDB 对这类原生工具保持兼容在仓库的 数据迁移指南 中同样推荐使用mongoexport/mongoimport以及mongodump/mongorestore在 MongoDB 与 FerretDB 之间迁移数据命令格式与 MongoDB 完全一致。通过 mongosh 连接并运行 MongoDB 工作负载导入成功后在包含根证书的目录中用mongosh直接连接实例mongosh mongodb-connection-string连接建立后即可执行标准的 MongoDB 操作。下面以supply集合为例展示三类典型工作负载。示例 1查看单条采购记录先通过findOne()了解supply集合中文档的结构与字段类型db.supply.findOne()结果response { _id: ObjectId(65c0d6d5cfba3092d3958fbf), transaction_id: 10004, customer_name: Jorge Lopez, customer_location: Madrid, Spain, product_category: Sports Equipment, transaction_time: ISODate(2023-07-10T10:00:00.000Z), product_name: Adidas Running Shoes, price: 75, quantity: 2, payment_method: Bank Transfer }可以看到每条记录包含交易编号、客户、品类、时间、商品、价格、数量与支付方式等字段_id由 MongoDB 风格的 ObjectId 自动生成。示例 2按日期范围查询数据分析某段促销周期内的销售影响时可以用$gte/$lte限定transaction_time的取值区间db.supply.find({ transaction_time: { $gte: ISODate(2023-07-01T00:00:00.000Z), $lte: ISODate(2023-07-03T23:59:59.000Z) } })结果节选response [ { _id: ObjectId(65c0d6d5cfba3092d3958fdb), transaction_id: 10032, customer_name: Emma Olsen, customer_location: Bergen, Norway, product_category: Electronics, transaction_time: ISODate(2023-07-01T14:00:00.000Z), product_name: Amazon Echo, price: 99, quantity: 1, payment_method: Bank Transfer }, { _id: ObjectId(65c0d6d5cfba3092d3958fdc), transaction_id: 10033, customer_name: Jens Petersen, customer_location: Copenhagen, Denmark, product_category: Fashion, transaction_time: ISODate(2023-07-02T15:00:00.000Z), product_name: Fossil Watch, price: 150, quantity: 1, payment_method: MobilePay }, { _id: ObjectId(65c0d6d5cfba3092d3958fea), transaction_id: 10047, customer_name: Sarah Johnson, customer_location: Sydney, Australia, product_category: Electronics, transaction_time: ISODate(2023-07-03T13:00:00.000Z), product_name: Dell Laptop, price: 1200, quantity: 1, payment_method: Credit Card }, { _id: ObjectId(65c0d6d5cfba3092d3958feb), transaction_id: 10048, customer_name: Mehmet Yilmaz, customer_location: Istanbul, Turkey, product_category: Fashion, transaction_time: ISODate(2023-07-03T14:00:00.000Z), product_name: Handmade Bag, price: 80, quantity: 1, payment_method: Debit Card } ]该查询只保留 2023 年 7 月 1 日至 3 日之间发生的交易可用于促销活动效果的对比分析。示例 3聚合找出销量最高的商品借助聚合管道可以按商品名分组并汇总销售数量从而识别最热销的商品db.supply.aggregate([ { $group: { _id: $product_name, totalQuantity: { $sum: $quantity } } }, { $sort: { totalQuantity: -1 } }, { $limit: 1 } ])结果response [{ _id: The Alchemist, totalQuantity: 5 }]这个操作先把记录按product_name分组用$sum累加各商品的quantity再按totalQuantity降序排序并只取第一名最终得到销量最高的商品。以上只是几个代表性格例findOne/find覆盖了文档查询聚合管道覆盖了$group、$sort、$limit等常用阶段。FerretDB 对这些 MongoDB 语义都有对应的实现与集成测试支撑例如查询类命令可参考 integration/query 目录下的测试聚合类命令可参考 aggregation 集成测试你可以在自己的实例上继续尝试insert、update、delete、索引等更多操作。底层机制认证与 TLS 如何工作在 Tembo 上运行的连接串看似简单背后是 FerretDB 与 PostgreSQL 深度集成的结果。理解这些机制有助于你在自建环境中复现同样的部署认证转发给 PostgreSQLFerretDB 自身不保存用户名与密码而是把凭据转发给 PostgreSQL 校验。仓库的 认证文档 明确指出客户端侧目前支持SCRAM-SHA-256机制用户在 PostgreSQL 中创建后即可通过mongodb://user:passwordhost:27017/访问 FerretDB。认证流程在服务端由saslStart/saslContinue命令实现入口见 msg_saslstart.go 中的 msgSASLStart。TLS 加密tlstrue与tlsCaFile是标准 MongoDB URI 参数。FerretDB 在服务端通过--listen-tlsFERRETDB_LISTEN_TLS、证书文件与 CA 文件三个配置项开启 TLS 监听详见 TLS 连接文档Tembo 托管实例则在连接详情中直接生成了带这些参数的连接串省去了手工拼接。端口约定MongoDB 协议默认监听27017端口FerretDB 默认值为127.0.0.1:27017Docker 场景为:27017见 flags.md因此 Tembo 的连接串也统一使用该端口。下一步通过本文的流程你可以在几分钟内获得一个高可用、可扩展的托管 Postgres MongoDB 兼容层组合Tembo 负责实例运维与扩展生态FerretDB 负责把 MongoDB 工作负载翻译并落到 PostgreSQL 上期间无需自行搭建 Docker 环境或维护复杂构建。如果你的目标是从 MongoDB 迁移到开源方案并且希望工作负载运行在托管 Postgres 服务之上那么基于 Tembo 的 FerretDB 栈是一个值得评估的起点。你也可以参考仓库中的 FerretDB 安装文档 与 认证配置在自有基础设施上复现同样的架构。赞分享后端数据库文档数据库【免费下载链接】FerretDBA truly Open Source MongoDB alternative项目地址https://gitcode.com/gh_mirrors/fe/FerretDB点击查看免费下载相关推荐在 Taikun CloudWorks 上运行托管 FerretDB 实例迁移 MongoDB 工作负载的完整实战指南在 Taikun CloudWorks 上运行托管 FerretDB 实例迁移 MongoDB 工作负载的完整实战指南 本文以 FerretDB 官方博客指南后端数据库文档数据库使用 FerretDB 在 Aiven for PostgreSQL 上运行 MongoDB 工作负载云上部署实战指南使用 FerretDB 在 Aiven for PostgreSQL 上运行 MongoDB 工作负载云上部署实战指南 本指南将带你完整走一遍以 Aiven后端数据库文档数据库在 Kubernetes 上使用 CyberTec Postgres Operator 部署 FerretDB开源 MongoDB 替代方案的完整实操指南在 Kubernetes 上使用 CyberTec Postgres Operator 部署 FerretDB开源 MongoDB 替代方案的完整实操指南 本后端数据库文档数据库创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表