Ismaël Mejía:PostgreSQL上的MongoDB:使用pglayers-azure的DocumentDB

💡 原文英文,约800词,阅读约需3分钟。
📝

内容提要

本文介绍如何在PostgreSQL上运行MongoDB兼容的DocumentDB,通过pglayers-azure镜像启动容器,创建MongoDB用户并连接客户端。重点包括:使用PG 18镜像、通过CREATE ROLE创建用户(避免create_user()的密码哈希问题)、用mongosh或pymongo连接,并支持SQL混合查询。生产环境需自定义TLS证书和配置。

🔎

延伸解读

密码哈希陷阱与解决路径

文章指出,在默认配置下使用 documentdb_api.create_user() 创建用户会因密码哈希问题失败,因为服务器采用 scram-sha-256 加密,而 DocumentDB 的检查钩子期望明文密码。解决方法是直接使用 CREATE ROLE 并指定明文密码,同时授予内置角色。这一细节提醒用户,在类似集成环境中,官方提供的辅助函数未必适配所有配置,需理解底层认证机制。

多协议访问的架构优势

DocumentDB 基于 PostgreSQL 实现,因此同一份数据既能通过 MongoDB 客户端(如 mongosh、pymongo)访问,也能用 SQL 查询。这种混合访问模式允许开发者在文档模型和关系模型之间灵活切换,例如用 MongoDB API 处理文档操作,用 SQL 进行复杂聚合或关联查询。但需注意,SQL 访问需通过 documentdb_api 等函数,并非直接映射到表。

生产环境部署注意事项

文章强调,开发环境使用的 tlsAllowInvalidCertificates=true 仅适用于自签名证书,生产环境必须挂载自定义证书并配置 gateway_config.json。此外,DocumentDB 仅支持 PostgreSQL 17 和 18,不支持 19,版本选择需谨慎。镜像会自动创建扩展,但可通过 PGLAYERS_CREATE_EXTENSIONS=none 关闭,这为需要精细控制扩展安装的场景提供了灵活性。

Q&A

如何在PostgreSQL上运行MongoDB兼容的DocumentDB?

使用pglayers-azure镜像启动容器,暴露5432和10260端口,设置POSTGRES_PASSWORD环境变量,然后通过SQL创建MongoDB用户,最后用MongoDB客户端连接。

为什么使用documentdb_api.create_user()创建用户会失败?

因为服务器配置了password_encryption = scram-sha-256,create_user()会预哈希密码,但DocumentDB的check_password钩子需要明文密码来构建SCRAM验证器,两者不兼容导致错误。

如何正确创建DocumentDB的MongoDB用户?

使用CREATE ROLE命令,直接指定明文密码,并授予documentdb_admin_role和documentdb_readonly_role角色,例如:CREATE ROLE mongoadmin WITH LOGIN INHERIT PASSWORD 'Secret_123' IN ROLE documentdb_admin_role, documentdb_readonly_role;

如何从MongoDB客户端连接到DocumentDB?

使用连接字符串:mongodb://用户名:密码@localhost:10260/?tls=true&tlsAllowInvalidCertificates=true&authMechanism=SCRAM-SHA-256,支持mongosh、pymongo和Node.js驱动。

DocumentDB支持哪些MongoDB操作?

支持插入、查询、聚合等CRUD操作,例如insertMany、find、aggregate等,同时数据也可通过SQL查询,实现文档和关系型数据的混合使用。

生产环境使用DocumentDB需要注意什么?

需要自定义TLS证书和网关配置文件,避免使用tlsAllowInvalidCertificates=true;使用PostgreSQL 17或18版本,因为DocumentDB不支持19;可以设置PGLAYERS_CREATE_EXTENSIONS=none来禁用自动创建扩展。

🏷️

标签

➡️

继续阅读