阿里云云数据库MongoDB版对接使用全攻略:从开通到生产级实践
1. 云数据库MongoDB版概述与架构选型
云数据库MongoDB版是阿里云基于MongoDB协议打造的一款完全兼容的文档型数据库服务。它继承了MongoDB灵活的数据模型、强大的聚合框架以及水平扩展能力,同时由阿里云提供底层的运维保障、自动备份、高可用切换等企业级特性。在开始对接之前,理解其三种部署架构的差异,是做出正确技术选型的第一步。
单节点架构仅提供一个StandAlone节点用于读写数据,适用于开发、测试、培训学习等非核心业务场景,性价比最高。副本集架构提供一个可读写的Primary节点、一个或多个Secondary节点以及一个隐藏的Hidden节点,Secondary节点可分担读压力并提供高可用保障,适用于读多写少或有临时活动的生产业务。分片集群架构由Mongos、Shard、ConfigServer三个组件构成,支持水平扩展存储空间与计算性能,适用于高并发读写、数据量巨大的核心业务场景。选择架构时,需综合考虑数据量预期、并发规模、可用性要求与成本预算。对于大多数中小型生产项目,副本集架构是性价比较高的起点。
2. 开通服务与创建实例
使用云数据库MongoDB版的第一步是开通服务并创建实例。首先需要注册并登录阿里云账号。对于新用户,阿里云提供了副本集实例的免费试用活动,企业认证用户可访问阿里云免费试用页面申请资格。
创建实例的具体操作如下:进入MongoDB管理控制台,点击创建实例。以创建按量付费的MongoDB 8.0版副本集实例为例,需要配置以下核心参数:地域与可用区选择靠近业务服务器的位置以降低延迟;数据库版本建议选择较新稳定版本,MongoDB 8.0相比7.0版本在读取性能上提升20%至36%,写入性能提升35%至58%;主备节点数通常选择三节点以实现高可用;存储引擎固定为WiredTiger;存储类型可选ESSD云盘等;网络类型固定为专有网络,若后续通过ECS访问,推荐选择与ECS相同的VPC以实现内网互通;规格与存储空间根据业务预估选择,用户名固定为root,密码可在创建时立即设置或后续重置。创建完成后,在实例列表中即可查看新建的实例,状态变为运行中后即可进行后续操作。
此外,阿里云也支持通过Terraform以基础设施即代码的方式创建MongoDB实例。创建一个工作目录并在其中编写main.tf配置文件,通过Terraform即可在指定地域创建VPC、交换机及MongoDB副本集实例。
需要先登录阿里云控制台,点击:阿里云控制台
3. 设置IP白名单——安全访问的第一道防线
为保障MongoDB数据库的安全稳定,系统默认任何设备均无法访问云数据库MongoDB实例(默认IP地址为127.0.0.1)。在使用实例前,必须将客户端的IP地址添加到白名单中。
设置白名单的步骤如下:在MongoDB控制台的目标实例详情页,点击左侧导航栏的“数据安全性”或“白名单设置”。可以修改默认白名单分组,也可以新建白名单分组。将需要访问实例的客户端IP地址(如ECS内网IP、本地公网IP)添加进去。如果需要通过DMS管理数据库,还需将DMS服务器的IP地址加入白名单。IP地址支持指定单个IP(如192.168.0.1)或IP段(如192.168.0.0/24),多个IP用英文逗号隔开。单个实例最多添加1000个IP地址或IP段。
需要特别注意的是,在生产环境中切勿将白名单设置为0.0.0.0/0,这相当于允许所有IP访问,存在极大的安全风险。正确使用白名单可以使云数据库MongoDB得到高级别的安全保护,建议定期维护白名单。若应用部署在Serverless应用引擎SAE中,需获取SAE应用的VPC和vSwitch的IPv4网段并添加到白名单中。不同VPC和不同地域之间逻辑上完全隔离,若需跨VPC或跨地域访问,可通过VPC对等连接或公网NAT网关实现。
4. 连接数据库的多种方式
云数据库MongoDB版支持私网和公网两种连接方式,不同网络环境需使用不同的连接地址。您可以登录MongoDB管理控制台,在数据库连接页面查看云数据库MongoDB实例的连接地址。本文以私网连接-专有网络的ConnectionStringURI高可用连接地址为例。
4.1 通过DMS登录
在MongoDB控制台的目标实例页面右上方,单击登录数据库。副本集实例选择Primary节点后跳转至DMS控制台,分片集群实例选择任一节点后跳转。在DMS控制台弹出的登录实例对话框中,输入数据库账号和数据库密码即可登录。DMS在查询数据时,对单个document长度限制为512KB,不支持调整。若需查询更大的数据,可使用MongoDB Shell。
4.2 通过MongoDB Shell连接
MongoDB提供了MongoDB Shell(mongosh)和mongo Shell两个命令行工具,mongo Shell为早期版本的客户端工具,MongoDB Shell为升级后的工具。获取ConnectionStringURI高可用连接地址后,在客户端上执行以下命令连接MongoDB:
mongosh "mongodb://root:密码@dds-实例ID.mongodb.rds.aliyuncs.com:3717,dds-实例ID.mongodb.rds.aliyuncs.com:3717/admin?replicaSet=mgset-副本集ID"如果密码中包含特殊字符,需要在连接串中对特殊字符进行转义处理。例如密码为ab@#c时,转义后为ab%40%23c。
4.3 高可用连接地址的重要性
云数据库MongoDB版提供了ConnectionStringURI高可用地址,该地址包含实例所有节点的地址。MongoDB副本集实例的主节点不是固定的某个节点,当出现异常时,系统会触发主备切换。如果使用主节点的直连地址,一旦发生主备切换,客户端将无法执行写操作。而ConnectionStringURI地址在发生主备切换后,写请求会被自动路由到新的主节点上。为实现高可用,建议生产环境的应用程序都通过ConnectionStringURI地址连接实例。
4.4 读写分离配置
ConnectionStringURI高可用地址提供了readPreference和readPreferenceTags参数。readPreference参数可实现读写分离和负载均衡;readPreferenceTags可以将读请求优先发送到标签对应的节点。通过在ConnectionStringURI地址后添加readPreference参数,即可灵活控制读请求的路由策略。
5. 多语言程序代码连接与操作
云数据库MongoDB版完全兼容MongoDB协议,所有官方Driver都支持通过ConnectionStringURI地址连接MongoDB。以下提供Python、Node.js、Java三种语言的完整连接与操作代码示例。
5.1 Python连接示例
首先安装pymongo驱动:
pip install pymongoPython连接与操作示例代码:
from pymongo import MongoClient
# 建议使用副本集高可用地址,确保高可用
# 如果密码中包含特殊字符,请进行转义处理
url = "mongodb://root:密码@dds-实例ID.mongodb.rds.aliyuncs.com:3717,dds-实例ID.mongodb.rds.aliyuncs.com:3717/admin?replicaSet=mgset-副本集ID"
# 创建MongoDB客户端,设置连接池大小为50
client = MongoClient(url, maxPoolSize=50)
# 选择数据库和集合
db = client["test"]
collection = db["testColl"]
# 插入一条记录
doc = {"DEMO": "Python For Demo", "MESG": "Hello AliCloudDB For MongoDB"}
result = collection.insert_one(doc)
print(f"Inserted document with _id: {result.inserted_id}")
# 查询数据
for doc in collection.find({"DEMO": "Python For Demo"}):
print(doc)
# 关闭连接
client.close()5.2 Node.js连接示例
安装mongodb驱动包:
npm install mongodbNode.js连接与操作示例代码:
const MongoClient = require('mongodb').MongoClient;
// 库名称和集合名称
const demoDb = "test";
const demoColl = "testColl";
// 建议使用副本集高可用地址,确保高可用
// 如果密码中包含特殊字符,请进行转义处理
const url = "mongodb://root:密码@dds-实例ID.mongodb.rds.aliyuncs.com:3717,dds-实例ID.mongodb.rds.aliyuncs.com:3717/admin?replicaSet=mgset-副本集ID";
console.info("url:", url);
const client = new MongoClient(url);
async function run() {
try {
// 连接实例
await client.connect();
// 取得数据库句柄
const database = client.db(demoDb);
// 取得集合句柄
const collection = database.collection(demoColl);
// 组装记录
const demoName = "Node For Demo";
const doc = { "DEMO": demoName, "MESG": "Hello AliCloudDB For MongoDB" };
console.info("ready insert document: ", doc);
// 插入一条记录
const result = await collection.insertOne(doc);
console.log(`A document was inserted with the _id: ${result.insertedId}`);
// 读取数据
const filter = { "DEMO": demoName };
const findResult = await collection.find(filter);
await findResult.forEach(console.dir);
} finally {
// 关闭连接
await client.close();
}
}
run().catch(console.dir);5.3 Java连接示例
Maven依赖中添加mongodb-driver-sync:
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver-sync</artifactId>
<version>4.11.0</version>
</dependency>Java连接与操作示例代码:
import com.mongodb.ConnectionString;
import com.mongodb.MongoClientSettings;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;
public class MongoDBDemo {
public static void main(String[] args) {
// 建议使用副本集高可用地址,确保高可用
// 如果密码中包含特殊字符,请进行转义处理
String connectionString = "mongodb://root:密码@dds-实例ID.mongodb.rds.aliyuncs.com:3717,dds-实例ID.mongodb.rds.aliyuncs.com:3717/admin?replicaSet=mgset-副本集ID";
ConnectionString connString = new ConnectionString(connectionString);
MongoClientSettings settings = MongoClientSettings.builder()
.applyConnectionString(connString)
.build();
try (MongoClient mongoClient = MongoClients.create(settings)) {
MongoDatabase database = mongoClient.getDatabase("test");
MongoCollection<Document> collection = database.getCollection("testColl");
// 插入一条记录
Document doc = new Document("DEMO", "Java For Demo")
.append("MESG", "Hello AliCloudDB For MongoDB");
collection.insertOne(doc);
System.out.println("Inserted document: " + doc.toJson());
// 查询数据
for (Document result : collection.find(new Document("DEMO", "Java For Demo"))) {
System.out.println(result.toJson());
}
}
}
}6. 数据库账号管理
当实例创建完成后,云数据库MongoDB版默认为用户在admin数据库中创建了一个root账号。通过root账号登录数据库后,您可以根据业务需求,创建用户并分配权限。不建议在生产环境中直接使用root账号连接实例,您可以创建其他数据库账号并添加权限连接实例。
通过DMS创建数据库账号的操作如下:在DMS左侧的数据库实例列表中,右键单击目标实例,在弹出的列表中选择数据库账号管理。单击创建数据库账号,配置用户信息。也可以在DMS的SQL Console页面中执行命令创建账号:
db.createUser({user: "test", pwd: "123456Aa", roles:[{role: "read", db: "admin"}]})返回结果中ok取值为1.0时表示创建成功。数据库账号创建后不支持在云数据库MongoDB控制台的账号管理页面查询。
此外,还可以通过访问控制RAM将MongoDB的管理权限授权给RAM用户(子账号),使用RAM用户管理MongoDB实例。创建RAM用户时,支持设置控制台访问和使用永久AccessKey访问两种访问方式。
7. 数据备份与恢复
云数据库MongoDB版提供容灾、备份、恢复、监控和告警等全套数据库解决方案。云数据库MongoDB版生成的备份文件存储在阿里云对象存储服务OSS中,不会占用MongoDB实例的存储空间。
自动备份支持用户自行设置备份周期和备份开始时间,可根据业务低峰灵活配置。备份系统支持用户自定义备份策略的自动备份和手动备份。对于云盘版4.2及以上版本,支持自定义设置手动备份的过期策略,保留时间范围为7至730天。
云数据库MongoDB版还提供了高频备份功能,您可以根据需求设置分钟级别或者小时级别的高频备份。设置高频备份保留的天数,取值范围为1至7天。您可以基于备份文件或按实例运行的时间点进行数据恢复。
8. 监控与报警
云数据库MongoDB版提供多达20种的性能指标监控及报警功能。监控平台提供CPU利用率、IOPS、连接数、磁盘空间等实例信息实时监控及报警。管理控制平台对实例重启、备份、数据恢复等高频高危操作可便捷地进行一键式操作。
设置报警规则的操作如下:在目标实例页面的左侧导航栏,单击报警规则。单击设置报警规则,跳转至云监控控制台。在云监控控制台的报警规则页面,单击创建报警规则,设置报警规则相关参数。云数据库MongoDB支持为实例的重要监控项设置阈值报警规则,当监控项的值不在设置的阈值范围内时,系统会自动发出报警通知。报警服务支持电话、短信、邮件和Webhook地址等多种通知方式。
9. 性能优化
9.1 索引优化
阿里云MongoDB推出了索引推荐功能,帮助您发现漏加索引或者使用不恰当索引导致的慢查询,并为这些慢查询提供相应的最优索引。MongoDB索引优化主要是为了降低集合的扫描量,所以主要关注慢日志中的DocsExamined和KeysExamined指标。DocsExamined表示该条查询扫描的文档个数,如果数量很大,说明索引使用不当。降低索引的数量也可以减少WiredTiger存储引擎层维护的磁盘文件,有助于缓解实例卡顿或异常问题。索引优化的一些基本原则包括:避免无用索引,查询根本不会访问到的字段,索引也自然不会命中,属于无用索引,可以删除。
9.2 分片集群优化
对于分片集群实例,MongoDB按照片键的值的范围将数据拆分为不同的块(chunk),每个块包含了一段范围内的数据。对集合所在的数据库启用分片功能后,mongos可以快速定位请求需要的数据,并将请求转发到相应的Shard节点上。需要对片键的字段建立索引。合理选择片键是分片集群性能优化的关键,应选择具有较高基数、能够均匀分布数据的字段作为片键。
9.3 MongoDB 8.0性能提升
阿里云在国内独家发布MongoDB 8.0版本,该版本性能全面提升。读操作性能较7.0提升20%至36%,写操作性能提升35%至58%。新版本推出升级版TCMalloc,使用每个CPU的缓存而不是每个线程的缓存,以减少内存碎片并使数据库更能适应高压力工作负载。新版本还优化了复制性能、reshard性能,并在分片、日志、聚合、安全性等方面进行了增强优化。reshardCollection性能改进,支持通过此命令改变集合的分片键并改变数据的分布。
9.4 连接池配置
通过Connection String URI连接数据库时,在URI末尾加上maxPoolSize参数即可设置连接池的连接数。通常MongoClient使用默认100的连接池都没问题,当访问同一个Mongod的源比较多时,则需要合理的规划连接池大小。连接池大小应根据业务并发量和数据库规格合理配置,避免连接数过多导致数据库压力过大或连接数不足导致请求排队。
10. 数据迁移——使用DTS平滑上云
数据传输服务DTS支持将自建MongoDB数据库迁移至云数据库MongoDB中。DTS支持全量数据迁移和增量数据迁移,同时选择这两种迁移类型可以实现在不停服的情况下,平滑地完成数据库的迁移。
迁移操作步骤如下:登录数据传输控制台,在左侧导航栏单击数据迁移。在迁移任务列表页面顶部选择阿里云MongoDB实例所属地域,单击创建迁移任务。配置迁移任务的源库及目标库信息。建议在业务低峰期执行数据迁移,否则全量数据迁移时DTS占用源和目标库一定读写资源,可能会导致数据库的负载上升。
使用DTS迁移时需要注意:建议云数据库MongoDB的存储空间比自建MongoDB数据库占用的存储空间大10%。不支持数据库admin和local作为源和目标库。由于DTS写入数据的逻辑为并发写入,会导致目标端占用的存储空间比源端大5%至10%。请确保目标端MongoDB没有与源端相同的主键(默认为_id),否则会导致数据丢失。全量数据迁移不收费,增量数据迁移收费。
11. 安全加固
11.1 透明数据加密TDE
云数据库MongoDB版支持KMS加密,您可以通过控制台启用透明数据加密TDE对数据文件执行实时I/O加密和解密。TDE让数据在写入磁盘之前进行加密,从磁盘读入内存时进行解密。通过使用自定义密钥为MongoDB设置TDE,可以满足企业对数据存储安全的合规性要求,同时确保加密过程对业务透明且高效。开启TDE后,备份文件同样会被加密。TDE在实例级别加密,仅适用于集合。
11.2 审计日志
开通审计日志后,系统将记录写操作的审计信息。审计日志功能帮助定位数据修改的操作者身份或时间点等信息,识别是否存在滥用权限、执行非合规命令等内部风险。开通审计日志后,实例版本在6.0及以上时可能会造成15%至20%的性能损失。新版审计日志引入了冷热分层存储能力。
开通审计日志的操作:在目标实例页面的左侧导航栏选择数据安全 > 审计日志,点击开通审计日志即可。系统默认在对应地区创建一个名为nosql-阿里云账号ID-地区ID的Project,以及名为mongo_audit_log_standard和mongo_slow_run_log的专属LogStore。
12. 小结
本文系统梳理了阿里云云数据库MongoDB版从开通服务、架构选型、创建实例、设置白名单、多种方式连接数据库、多语言程序代码操作示例、账号管理、备份恢复、监控报警、性能优化、数据迁移到安全加固的完整对接使用流程。云数据库MongoDB版完全兼容MongoDB协议,提供了稳定可靠、弹性伸缩的数据库服务。通过合理运用ConnectionStringURI高可用地址实现高可用与读写分离,通过索引优化和连接池配置提升性能,通过白名单、TDE加密和审计日志保障数据安全,通过DTS实现不停服平滑迁移,开发者可以快速将MongoDB能力集成到业务系统中,构建高可用、高性能、高安全的生产级应用。
常见问题解答
问1:云数据库MongoDB版支持哪些部署架构?如何选择?
答:支持单节点、副本集和分片集群三种架构。单节点适用于开发测试环境;副本集提供高可用和读扩展能力,适合大多数中小型生产项目;分片集群支持水平扩展,适用于高并发、海量数据的核心业务场景。
问2:连接MongoDB实例时密码中的特殊字符如何处理?
答:需要在连接串中对特殊字符进行URL转义。例如!转义为%21,@转义为%40,#转义为%23,$转义为%24。密码ab@#c转义后为ab%40%23c。
问3:如何实现MongoDB副本集的高可用和读写分离?
答:使用ConnectionStringURI高可用地址连接实例。该地址包含所有节点地址,主备切换后写请求自动路由到新主节点。通过在URI后添加readPreference参数可实现读写分离,如readPreference=secondaryPreferred优先读从节点。
问4:如何优化MongoDB的查询性能?
答:主要关注慢日志中的DocsExamined和KeysExamined指标。通过索引推荐功能发现缺失或不恰当的索引。避免创建无用索引。对于分片集群,合理选择片键并建立索引。升级到MongoDB 8.0可获得20%至36%的读性能提升和35%至58%的写性能提升。
问5:如何将自建MongoDB迁移到阿里云MongoDB版?
答:使用数据传输服务DTS。DTS支持全量迁移和增量迁移,可实现不停服平滑迁移。在DTS控制台创建迁移任务,配置源库和目标库信息即可。建议在业务低峰期执行迁移。
问6:MongoDB实例如何保证数据安全?
答:设置IP白名单限制访问来源,避免设置为0.0.0.0/0。使用RAM子账号进行最小权限管理。启用透明数据加密TDE对数据文件加密。开通审计日志记录所有写操作。定期自动备份数据。


