练习:将 MongoDB 工作负载迁移到 Cosmos DB
你适用于具有收集温度数据的 IoT 传感器的公用事业公司。 温度记录在 MongoDB 数据库中,以及时间戳。 每个设备都有唯一 ID。 你将运行一个 MongoDB 应用程序来模拟这些设备,并将数据存储在数据库中。 你还将使用第二个应用程序,使用户能够查询有关每个设备的统计信息。 将数据库从 MongoDB 迁移到 Cosmos DB 后,将两个应用程序配置为连接到 Cosmos DB,并验证它们是否仍然正常运行。
在本练习中,你将获取现有的 MongoDB 数据库并将其迁移到 Cosmos DB。 你将使用 Azure 数据库迁移服务。 你还将了解如何重新配置使用 MongoDB 数据库连接到 Cosmos DB 数据库的现有应用程序。
重要
免费的 Azure 沙盒环境不支持 Azure 数据迁移服务。 你可在自己的个人订阅中执行下列步骤,也可按照步骤了解如何迁移数据库。
在 Azure 上创建 MongoDB 数据库
首先,创建 MongoDB 数据库用于保存从温度设备捕获的数据。
创建资源组和虚拟网络
使用 Web 浏览器打开新的标签页,然后导航到 Azure 门户。
在 Azure 门户中,选择 资源组,然后选择 +添加。
在 创建资源组页中,输入以下详细信息:
财产 价值 订阅 <订阅> 资源组 mongodbrg 区域 选择最近的位置 选择“查看 + 创建”,然后选择“创建”。 等待创建资源组。
在 Azure 门户的菜单中,选择 + 创建资源。
在 “新建”页上的“搜索市场 框中,键入 虚拟网络,然后按 Enter。
在“虚拟网络”页上选择“创建”。
在“创建虚拟网络”页上,输入以下详细信息,然后选择“下一步”:IP 地址:
财产 价值 资源组 mongodbrg 名字 databasevnet 区域 选择为资源组指定的相同位置 在 IP 地址 页上,将 IPv4 地址空间 设置为 10.0.0.0/24。
选择默认子网,然后选择 删除子网。
选择 + 添加子网。 在“添加子网 窗格中,将 子网名称 设置为默认 ,将 子网地址范围 设置为 10.0.0.0/28,然后选择 添加。
在 IP 地址 页上,选择“下一步:安全性”。
在“安全”页上,验证 Azure DDoS 网络保护 是否设置为“禁用”,防火墙 设置为“禁用”。 选择 审阅 + 创建。
在“创建虚拟网络”页面上,选择“创建”。 等待创建虚拟网络,然后再继续。
创建 MongoDB 数据库服务器
在 Azure 门户的菜单中,选择 + 创建资源。
在“搜索市场 框中,键入 Ubuntu,然后按 Enter。
在 市场 页上,选择 Ubuntu Server 18.04 LTS。
在 Ubuntu Server 18.04 LTS 页上,选择 创建。
在 创建虚拟机 页上,输入以下详细信息:
财产 价值 资源组 mongodbrg 虚拟机名称 mongodbserver 区域 选择为资源组指定的相同位置 可用性选项 没有所需的基础结构冗余 图像 Ubuntu Server 18.04 LTS - Gen1 Azure Spot 实例 未选中 大小 标准A1_v2 身份验证类型 密码 用户名 azureuser 密码 Pa55w.rdPa55w.rd 确认密码 Pa55w.rdPa55w.rd 公共入站端口 “允许选定的端口” 选择入站端口 SSH (22) 选择“下一步:磁盘>”。
在 磁盘 页上,保留默认设置,然后选择“下一步”:网络 >。
在 网络 页上,输入以下详细信息:
财产 价值 虚拟网络 databasevnet 子网 default (10.0.0.0/28) 公共 IP (new) mongodbserver-ip NIC 网络安全组 高级 配置网络安全组 (new) mongodbserver-nsg 加速网络 未选中 负载均衡 未选中 选择 审阅 + 创建 >。
在验证页上,选择 创建。
等待虚拟机部署,然后再继续
在 Azure 门户的菜单中,选择 所有资源。
在 所有资源 页上,选择 mongodbserver-nsg。
在 mongodbserver-nsg 页上,在 设置下,选择 入站安全规则。
在 mongodbserver-nsg - 入站安全规则 页上,选择 + 添加。
在“添加入站安全规则”窗格中,输入以下详细信息:
财产 价值 来源 任意 源端口范围 * 目的地 任意 目标端口范围 8080 协议 任意 行动 允许 优先权 1030 名字 Mongodb-port 说明 客户端用于连接到 MongoDB 的端口 选择 并添加。
注释
在本练习中,你将配置 MongoDB 以使用端口 8080。 由于此环境中的安全约束,只需执行此作。 通常使用 27017的默认 MongoDB 端口。
安装 MongoDB
在 Azure 门户的菜单中,选择 所有资源。
在 所有资源 页上,选择 mongodbserver-ip。
在 mongodbserver-ip 页上,记下 IP 地址。
在 Azure 门户顶部的工具栏中,选择 Cloud Shell。
如果出现 未装载存储 消息框,请选择 创建存储。
Cloud Shell 启动时,在 Cloud Shell 窗口上方的下拉列表中,选择 Bash。
在 Cloud Shell 中,输入以下命令以连接到 mongodbserver 虚拟机。 将 <ip 地址> 替换为 mongodbserver-ip IP 地址的值:
ssh azureuser@<ip address>
在提示符下,键入“是”, 继续连接。
输入密码 Pa55w.rdPa55w.rd。
若要重新加载包数据库,请输入以下命令:
sudo apt-get update
若要安装 MongoDB,请输入以下命令:
sudo apt-get install -y mongodb
安装应继续显示有关安装、准备和解压缩包的消息。 安装可能需要几分钟才能完成。
配置 MongoDB 数据库
默认情况下,Mongo DB 实例配置为在没有身份验证的情况下运行。 在此任务中,你将配置 MongoDB 以绑定到本地网络接口,以便它可以接受来自其他计算机的连接。 你还将启用身份验证并创建执行迁移所需的用户帐户。 最后,你将添加测试应用程序可用于查询数据库的帐户。
若要打开 MongoDB 配置文件,请运行以下命令:
sudo nano /etc/mongodb.conf
在文件中,找到 bind_ip 设置,并将其设置为 0.0.0.0。
找到 端口 设置,并将其设置为 8080。
若要保存配置文件,请按 Esc,然后按 ctrl + X 。按 y,然后 Enter 保存修改后的缓冲区。
若要重启 MongoDB 服务并应用更改,请输入以下命令:
sudo service mongodb restart
若要连接到 MongoDB 服务,请输入以下命令:
mongo --host 127.0.0.1:8080
在 > 提示符下,若要切换到 管理员 数据库,请运行以下命令:
use admin;
若要创建名为 管理员的新用户,请运行以下命令。 可以在一行或多行之间输入该命令,以提高可读性。 当
mongo
程序达到分号时,将执行该命令:db.createUser( { user: "administrator", pwd: "Pa55w.rd", roles: [ { role: "userAdminAnyDatabase", db: "admin" }, { role: "clusterMonitor", db:"admin" }, "readWriteAnyDatabase" ] } );
若要退出
mongo
程序,请输入以下命令;exit;
若要使用新管理员的帐户连接到 MongoDB,请运行以下命令:
mongo admin -u "administrator" -p "Pa55w.rd" --host 127.0.0.1:8080
若要切换到 DeviceData 数据库,请执行以下命令:
use DeviceData;
若要创建名为 deviceadmin的用户,应用将使用该用户连接到数据库,请运行以下命令:
db.createUser( { user: "deviceadmin", pwd: "Pa55w.rd", roles: [ { role: "readWrite", db: "DeviceData" } ] } );
若要退出
mongo
程序,请输入以下命令;exit;
运行以下命令重启 mongodb 服务。 验证服务是否重新启动而不显示任何错误消息:
sudo service mongodb restart
运行以下命令,验证现在可以以 deviceadmin 用户身份登录到 mongodb:
mongo DeviceData -u "deviceadmin" -p "Pa55w.rd" --host 127.0.0.1:8080
在 > 提示符下,运行以下命令退出 mongo shell:
exit;
在 bash 提示符下,运行以下命令以断开与 MongoDB 服务器的连接并返回到 Cloud Shell:
exit
填充和查询 MongoDB 数据库
现已创建 MongoDB 服务器和数据库。 下一步是演示示例应用程序,这些应用程序可以填充和查询此数据库中的数据。
生成并运行应用以填充 MongoDB 数据库
在 Azure Cloud Shell 中运行以下命令,下载示例代码:
git clone https://github.com/MicrosoftLearning/DP-060T00A-Migrating-your-Database-to-Cosmos-DB migration-workshop-apps
移动到 migration-workshop-apps/MongoDeviceDataCapture/MongoDeviceCapture 文件夹:
cd ~/migration-workshop-apps/MongoDeviceDataCapture/MongoDeviceDataCapture
使用 Code 编辑器检查 TemperatureDevice.cs 文件:
code TemperatureDevice.cs
此文件中的代码包含一个名为 TemperatureDevice 的类,该类模拟温度设备捕获数据并将其保存在 MongoDB 数据库中。 它使用用于 .NET Framework 的 MongoDB 库。 TemperatureDevice 构造函数使用应用程序配置文件中存储的设置连接到数据库。 RecordTemperatures 方法生成读取并将其写入数据库。
关闭代码编辑器,然后打开 ThermometerReading.cs 文件:
code ThermometerReading.cs
此文件显示应用程序存储在数据库中的文档的结构。 每个文档包含以下字段:
- 对象 ID。 这是 MongoDB 生成的“_id”字段,用于唯一标识每个文档。
- 设备 ID。 每个设备都有一个前缀为“Device”的数字。
- 设备记录的温度。
- 记录温度的日期和时间。
关闭代码编辑器,然后打开 App.config 文件:
code App.config
此文件包含用于连接到 MongoDB 数据库的设置。
将 地址 密钥的值设置为前面记录的 MongoDB 服务器的 IP 地址。
更改应用用于 8080的端口。
保存文件并使用 ctrl + 关闭编辑器,然后 CTRL + q。
运行以下命令以重新生成应用程序:
dotnet build
这可能需要大约 5 分钟的时间。
运行应用程序:
dotnet run
应用程序模拟同时运行的 100 台设备。 允许应用程序运行几分钟,然后按 Enter 将其停止。
生成并运行另一个应用以查询 MongoDB 数据库
移动到 DP160T00A-Migrating-your-Database-to-Cosmos-DB/MongoDeviceDataCapture/DeviceDataQuery 文件夹:
cd ~/migration-workshop-apps/MongoDeviceDataCapture/DeviceDataQuery
此文件夹包含另一个应用程序,可用于分析每个设备捕获的数据。
使用 Code 编辑器检查 Program.cs 文件:
code Program.cs
应用程序连接到数据库(使用文件底部的 ConnectToDatabase 方法),然后提示用户输入设备编号。 应用程序使用 .NET Framework 的 MongoDB 库来创建并运行聚合管道,该管道计算指定设备的以下统计信息:
- 记录的读取数。
- 记录的平均温度。
- 最低读数。
- 最高读数。
- 最新阅读。
关闭代码编辑器,然后打开 App.config 文件:
code App.config
将 地址 密钥的值设置为前面记录的 MongoDB 服务器的 IP 地址。
更改应用用于 8080的端口。
保存文件并使用 ctrl + 关闭编辑器,然后 CTRL + q。
生成并运行应用程序:
dotnet build dotnet run
在 输入设备号码 提示符处,输入介于 0 和 99 之间的值。 应用程序将查询数据库、计算统计信息并显示结果。 按 Q 退出应用程序。
将 MongoDB 数据库迁移到 Cosmos DB
下一步是获取 MongoDB 数据库并将其传输到 Cosmos DB。
创建 Cosmos 帐户和数据库
返回到 Azure 门户。
在菜单中,选择 + 创建资源。
在 “新建”页上的“搜索市场”框中,键入 *Azure Cosmos DB,最后按 Enter。
在“Azure Cosmos DB”页上,选择“创建”。
在 创建 Azure Cosmos DB 帐户 页上,输入以下设置:
财产 价值 资源组 mongodbrg 客户名称 mongodb*nnn*,其中 nnn 是你选择的随机数 应用程序编程接口 (API) 用于 MongoDB API 的 Azure Cosmos DB 笔记本电脑 关闭 位置 指定用于 MongoDB 服务器和虚拟网络的相同位置 容量模式 预配的吞吐量 应用免费层折扣 应用 帐户类型 非生产 版本 3.6 异地冗余 禁用 多区域写入 禁用 可用性区域 禁用 选择 审阅 + 创建。
在验证页上,选择 创建,并等待部署 Cosmos DB 帐户。
在 Azure 门户的菜单中,选择 所有资源,然后选择新的 Cosmos DB 帐户(mongodbnnn)。
在 mongodbnnn 页上,选择 数据资源管理器。
在 数据资源管理器 窗格中,选择“新建集合”。
在“添加集合 窗格中,指定以下设置:
财产 价值 数据库 ID 选择 创建新,然后键入 DeviceData 预配数据库吞吐量 选中 吞吐量 10000 采集 ID 温度 存储容量 不受限制 分片键 deviceID 我的分片键大于 100 个字节 离开已取消选中状态 在所有字段上创建通配符索引 离开已取消选中状态 分析存储 关闭 选择“确定”。
创建数据库迁移服务
切换回 Azure 门户。
依次单击“所有服务”和“订阅”,然后单击你的订阅。
在“订阅”页面的“设置”下,单击“资源提供程序”。
在“按名称筛选”框中,键入“DataMigration”,然后单击“Microsoft.DataMigration”。
如果未注册“Microsoft.DataMigration”,请单击“注册”,然后等待“状态”更改为“已注册”。 可能需要单击“刷新”才能看到状态更改。
在 Azure 门户的菜单中,选择 + 创建资源。
在 “新建”页上的“搜索市场”框中,键入 Azure 数据库迁移服务,然后按 Enter。
在“Azure 数据库迁移服务”页上,选择“创建”。
在 创建迁移服务 页上,输入以下设置:
财产 价值 资源组 mongodbrg 服务名称 MongoDBMigration 位置 选择前面使用的同一位置 服务模式 天蓝色 定价层 标准:1 个 vCore 选择“下一页:网络”。
在 网络 页上,选择 databasevnet/default,然后选择 查看 + 创建。
选择 创建,并等待服务部署,然后再继续。 此作可能需要大约 10 分钟。
创建并运行新的迁移项目
在 Azure 门户的菜单中,选择 资源组。
在 资源组 窗口中,选择 mongodbrg。
在 mongodbrg 窗口中,选择 MongoDBMigration。
在 MongoDBMigration 页上,选择 + 新建迁移项目。
在 “新建迁移项目”页上,输入以下设置:
财产 价值 项目名称 MigrateTemperatureData 源服务器类型 MongoDB 目标服务器类型 Cosmos DB (MongoDB API) 选择活动类型 脱机数据迁移 选择“创建并运行活动”。
迁移向导 启动时,在 源详细信息 页上,输入以下详细信息:
财产 价值 模式 标准模式 源服务器名称 指定前面记录的 mongodbserver-ip IP 地址的值 服务器端口 8080 用户名 管理员 密码 Pa55w.rd 需要 SSL 已取消选择 选择“下一步”:选择目标。
在 “选择目标”页上,输入以下详细信息:
财产 价值 模式 选择 Cosmos DB 目标 选择 Comos DB 名称 mongodb*nnn* 连接字符串 接受为 Cosmos DB 帐户生成的连接字符串 选择“下一步 :数据库设置。
在 数据库设置 页上,输入以下详细信息:
财产 价值 源数据库 DeviceData 目标数据库 DeviceData 吞吐量(RU/秒) 1000 清理集合 清除此框 选择“下一步 :集合设置。
在 集合设置 页上,按 DeviceData 数据库选择下拉箭头,输入以下详细信息:
财产 价值 名字 温度 目标集合 温度 吞吐量(RU/秒) 1000 分片键 deviceID 独特 保留空白 选择 “下一步:迁移摘要”。
在 迁移摘要 页上,在 活动名称 字段中,输入 mongodb 迁移,然后选择 开始迁移。
在 mongodb 迁移 页上,选择每 30 秒 刷新,直到迁移完成。 请注意已处理的文档数。
验证迁移是否成功
在 Azure 门户的菜单中,选择“所有资源”。
在 所有资源 页上,选择 mongodbnnn。
在 mongodb*nnn 页上,选择 数据资源管理器。
在 数据资源管理器 窗格中,展开 DeviceData 数据库,展开 温度 集合,然后选择 文档。
在“文档” 窗格中,滚动浏览文档列表。 应看到每个文档的文档 ID(_id)和分片键(/deviceID)。
选择任何文档。 应会看到显示的文档的详细信息。 典型的文档如下所示:
{ "_id" : ObjectId("5ce8104bf56e8a04a2d0929a"), "deviceID" : "Device 83", "temperature" : 19.65268837271849, "time" : 636943091952553500 }
在 文档资源管理器 窗格中的工具栏中,选择“新建 Shell”。
在“Shell 1”窗格中的 > 提示符下,输入以下命令,然后按 Enter:
db.Temperatures.count()
此命令显示 Temperatures 集合中的文档数。 它应与迁移向导报告的数字匹配。
输入以下命令,然后按 Enter:
db.Temperatures.find({deviceID: "Device 99"})
此命令提取并显示 Device 99 的文档。
重新配置并运行现有应用程序以使用 Cosmos DB
最后一步是重新配置现有的 MongoDB 应用程序以连接到 Cosmos DB,并验证它们是否仍然有效。 这要求修改应用程序连接到数据库的方式,但应用程序的逻辑应保持不变。
在“mongodbnnn”窗格中的“设置”下,选择 连接字符串。
在 mongodbnnn 连接字符串 页上,记下以下设置:
- 主机
- 用户名
- 主密码
返回到 Cloud Shell 窗口(如果会话已超时),并移动到 migration-workshop-apps/MongoDeviceDataCapture/DeviceDataQuery 文件夹:
cd ~/migration-workshop-apps/MongoDeviceDataCapture/DeviceDataQuery
在代码编辑器中打开 App.config 文件:
code App.config
在文件的 “MongoDB 设置” 部分中,注释掉现有设置。
取消注释 Cosmos DB Mongo API 部分中 设置中的设置,并设置这些设置的值,如下所示:
设置 价值 地址 mongodbnnn 连接字符串 页中的 HOST 港口 mongodbnnn 连接字符串 页中的 端口 用户名 mongodbnnn 连接字符串 页中的 USERNAME 密码 mongodbnnn 连接字符串 页中的 PRIMARY PASSWORD 完成的文件应如下所示:
<?xml version="1.0" encoding="utf-8"?> <configuration> <appSettings> <add key="Database" value="DeviceData" /> <add key="Collection" value="Temperatures" /> <!-- Settings for MongoDB <add key="Address" value="nn.nn.nn.nn" /> <add key="Port" value="27017" /> <add key="Username" value="deviceadmin" /> <add key="Password" value="Pa55w.rd" /> End of settings for MongoDB --> <!-- Settings for CosmosDB Mongo API --> <add key="Address" value="mongodbnnn.documents.azure.com"/> <add key="Port" value="10255"/> <add key="Username" value="mongodbnnn"/> <add key="Password" value="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=="/> <!-- End of settings for CosmosDB Mongo API --> </appSettings> </configuration>
保存文件,然后关闭代码编辑器。
使用代码编辑器打开Program.cs文件:
code Program.cs
向下滚动到 ConnectToDatabase 方法。
注释掉设置用于连接到 MongoDB 的凭据的行,并取消注释指定用于连接到 Cosmos DB 的凭据的语句。 代码应如下所示:
// Connect to the MongoDB database MongoClient client = new MongoClient(new MongoClientSettings { Server = new MongoServerAddress(address, port), ServerSelectionTimeout = TimeSpan.FromSeconds(10), // // Credential settings for MongoDB // // Credential = MongoCredential.CreateCredential(database, azureLogin.UserName, azureLogin.SecurePassword), // // Credential settings for CosmosDB Mongo API // UseTls = true, Credential = new MongoCredential("SCRAM-SHA-1", new MongoInternalIdentity(database, azureLogin.UserName), new PasswordEvidence(azureLogin.SecurePassword)) // End of Mongo API settings });
这些更改是必需的,因为原始 MongoDB 数据库未使用 SSL 连接。 Cosmos DB 始终使用 SSL。
保存文件,然后关闭代码编辑器。
重新生成并运行应用程序:
dotnet build dotnet run
在 输入设备编号 提示符下,输入介于 0 和 99 之间的设备编号。 应用程序应像以前一样运行,但这次使用 Cosmos DB 数据库中保存的数据除外。
提高 Cosmos DB 中的查询性能
Cosmos DB 允许添加更多索引以提高查询性能。 由于我们正在聚合 deviceID,添加该字段作为索引将加快查询速度。
切换回 Azure 门户。
在左侧,选择 数据资源管理器。
在 数据资源管理器 窗格中,展开 DeviceData 数据库,展开 温度 集合,然后选择 设置。
选择 索引策略。
在 _id 添加新索引下,输入 定义的 deviceID,并为 类型选择 单字段。
选择 保存 以添加新索引。
返回到 Cloud Shell 再次尝试查询,并记下应用程序中改进的响应。
使用其他设备编号测试应用程序。 输入 Q 以完成。
已成功将 MongoDB 数据库迁移到 Cosmos DB,并重新配置了现有的 MongoDB 应用程序以连接到新的 Cosmos DB 数据库。
清理已创建的资源
重要
如果你已在自己的个人订阅中执行了这些步骤,则可以分别删除资源或删除资源组以删除整个资源集。 剩余运行的资源可能会花费你钱。
使用 Cloud Shell 运行此命令,以删除资源组:
az group delete --name mongodbrg