練習:將 MongoDB 工作負載遷移至 Cosmos DB
您任職於具有收集溫度數據的IoT感測器的公用程式公司。 溫度會記錄在 MongoDB 資料庫中,以及時間戳。 每個裝置都有唯一標識碼。 您將執行 MongoDB 應用程式來模擬這些裝置,並將資料儲存在資料庫中。 您也會使用第二個應用程式,讓用戶查詢每個裝置的統計數據。 將資料庫從 MongoDB 移轉至 Cosmos DB 之後,您會將這兩個應用程式設定為連線到 Cosmos DB,並確認它們仍然正常運作。
在此練習中,您將採用現有的 MongoDB 資料庫,並將其遷移至 Cosmos DB。 您將使用 Azure 資料庫移轉服務。 您也會瞭解如何重新設定使用 MongoDB 資料庫連線到 Cosmos DB 資料庫的現有應用程式。
這很重要
免費的 Azure 沙箱環境不支援 Azure 資料移轉服務。 您可以在自己的訂用帳戶中執行這些步驟,或是遵循以了解如何遷移資料庫。
在 Azure 上建立 MongoDB 資料庫
首先,您將建立 MongoDB 資料庫,以存放從溫度裝置擷取的數據。
建立資源群組和虛擬網路
使用網頁瀏覽器,開啟新的索引標籤並流覽至 Azure 入口網站。
在 Azure 入口網站中,選取 [資源群組],然後選取 [+新增]。
在 [ 建立資源群組] 頁面上,輸入下列詳細數據:
財產 價值 訂閱 <your-subscription> 資源群組 mongodbrg 區域 選取最接近您的位置 選取 [檢閱 + 建立],然後選取 [建立]。 等候建立資源群組。
在 Azure 入口網站的功能表中,選取 [+ 建立資源]。
在 [ 新增 ] 頁面上的 [ 搜尋 Marketplace ] 方塊中,輸入 虛擬網络,然後按 Enter。
在 [ 虛擬網络] 頁面上,選取 [ 建立]。
在 [建立虛擬網络] 頁面上,輸入下列詳細數據,然後選取 [下一步:IP 位址]:
財產 價值 資源群組 mongodbrg 名稱 databasevnet 區域 選取您為資源群組指定的相同位置 在 [ IP 位址] 頁面上,將 IPv4 位址空間 設定為 10.0.0.0/24。
選取預設子網,然後選取 [移除子網]。
選取 [+ 新增子網路]。 在 [ 新增子網 ] 窗格中,將 [ 子網名稱 ] 設定為 預設值,將 [子網位址範圍 ] 設定為 10.0.0.0/28,然後選取 [ 新增]。
在 [ IP 位址] 頁面上,選取 [ 下一步:安全性]。
在 [ 安全性] 頁面上,確認 Azure DDoS 網络保護 已設定為 [停用],並將 [防火牆 ] 設定為 [ 停用]。 選取 [檢閱 + 建立]。
在 [ 建立虛擬網络] 頁面上,選取 [ 建立]。 等候建立虛擬網路,再繼續進行。
建立 MongoDB 資料庫伺服器
在 Azure 入口網站的功能表中,選取 [+ 建立資源]。
在 [ 搜尋 Marketplace] 方塊中,輸入 Ubuntu,然後按 Enter。
在 [ Marketplace] 頁面上,選取 [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。 您只需要執行此動作,因為此環境中的安全性條件約束。 您通常會使用預設的 MongoDB 連接埠 27017。
安裝 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>在提示字元中,輸入 yes 以繼續連線。
輸入密碼 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.0。
找出 埠 設定,並將其設定為 8080。
若要儲存組態檔,請按 Esc ,然後按 CTRL + X。按 y ,然後按 Enter 儲存修改過的緩衝區。
若要重新啟動 MongoDB 服務並套用您的變更,請輸入下列命令:
sudo service mongodb restart若要連線到 MongoDB 服務,請輸入下列命令:
mongo --host 127.0.0.1:8080在 > 提示字元中,若要切換至 系統管理 資料庫,請執行此命令:
use admin;若要建立名為 administrator 的新使用者,請執行下列命令。 您可以在一行或多行之間輸入命令,以提升可讀性。 當
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 殼層:
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使用程式 代碼 編輯器來檢查 TemperatureDevice.cs 檔案:
code TemperatureDevice.cs此檔案中的程式代碼包含名為 TemperatureDevice 的類別,其會模擬溫度裝置擷取數據,並將其儲存在 MongoDB 資料庫中。 它會使用適用於 .NET Framework 的 MongoDB 連結庫。 TemperatureDevice 建構函式會使用儲存在應用程式組態檔中的設定連接到資料庫。 RecordTemperatures 方法會產生讀取並將它寫入資料庫。
關閉程式代碼編輯器,然後開啟 ThermometerReading.cs 檔案:
code ThermometerReading.cs此檔案顯示應用程式儲存在資料庫中的檔案結構。 每個檔案都包含下列欄位:
- 物件標識碼。 是 MongoDB 所產生的「_id」字段,可唯一識別每個檔。
- 裝置標識碼。 每個裝置都有一個數位,其前置詞為 “Device”。
- 裝置記錄的溫度。
- 記錄溫度的日期和時間。
關閉程式代碼編輯器,然後開啟 App.config 檔案:
code App.config此檔案包含連線到 MongoDB 資料庫的設定。
將位址索引鍵的值設定為您稍早記錄的 MongoDB 伺服器 IP 位址。
將應用程式所使用的埠變更為 8080。
儲存盤案,並使用 CTRL + s 關閉編輯器,然後按 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此資料夾包含另一個應用程式,可用來分析每個裝置所擷取的數據。
使用程式 代碼 編輯器來檢查 Program.cs 檔案:
code Program.cs應用程式會連線到資料庫(使用檔案底部的 ConnectToDatabase 方法),然後提示使用者輸入裝置號碼。 應用程式會使用適用於 .NET Framework 的 MongoDB 連結庫來建立和執行匯總管線,以計算指定裝置的下列統計數據:
- 記錄的讀數數目。
- 記錄的平均溫度。
- 最低讀數。
- 最高讀數。
- 最新的閱讀。
關閉程式代碼編輯器,然後開啟 App.config 檔案:
code App.config將位址索引鍵的值設定為您稍早記錄的 MongoDB 伺服器 IP 位址。
將應用程式所使用的埠變更為 8080。
儲存盤案,並使用 CTRL + s 關閉編輯器,然後按 CTRL + q。
建置並執行應用程式:
dotnet build dotnet run在 [ 輸入裝置號碼 ] 提示字元中,輸入介於 0 到 99 之間的值。 應用程式會查詢資料庫、計算統計數據,以及顯示結果。 按 Q 以結束應用程式。
將 MongoDB 資料庫遷移至 Cosmos DB
下一個步驟是採用 MongoDB 資料庫,並將其傳輸至 Cosmos DB。
建立 Cosmos 帳戶和資料庫
返回 Azure 入口網站。
在功能表中,選取 [+ 建立資源]。
在 [ 新增 ] 頁面上的 [ 搜尋 Marketplace ] 方塊中,輸入 *Azure Cosmos DB,最後按 Enter 鍵。
在 [Azure Cosmos DB] 頁面上,選取 [ 建立]。
在 [ 建立 Azure Cosmos DB 帳戶 ] 頁面上,輸入下列設定:
財產 價值 資源群組 mongodbrg 帳戶名稱 mongodb*nnn*,其中 nnn 是您選取的隨機數 API 適用於 MongoDB 的 Azure Cosmos DB API Notebooks 關閉 地點 指定您用於 MongoDB 伺服器和虛擬網路的相同位置 容量模式 預配置吞吐量 套用免費層折扣 套用 帳戶類型 非生產 版本 3.6 異地備援 禁用 多重區域寫入 禁用 可用性區域 禁用 選取 [檢閱 + 建立]。
在驗證頁面上,選取 [ 建立],並等候部署 Cosmos DB 帳戶。
在 Azure 入口網站的功能表中,選取 [ 所有資源],然後選取新的 Cosmos DB 帳戶 (mongodbnnn)。
在 mongodbnnn 頁面上,選取 [數據總管]。
在 [ 數據總管] 窗格中,選取 [新增集合]。
在 [ 新增集合 ] 窗格中,指定下列設定:
財產 價值 資料庫識別碼 選取 [新建],然後輸入 DeviceData 布建資料庫輸送量 選取 吞吐量 10000 集合識別碼 溫度 儲存容量 無限 分區金鑰 deviceID 我的分區索引鍵大於 100 個字節 保留已取消選取 在所有欄位上建立通配符索引 保留已取消選取 分析存放區 關閉 選取 [確定]。
建立資料庫移轉服務
切換回到 Azure 入口網站。
按一下 [所有服務],按一下 [訂閱],再按一下您的訂閱。
在您的訂閱頁面上,於 [設定] 下方按一下 [資源提供者]。
在 [ 依名稱篩選] 方塊中,輸入 DataMigration,然後按兩下 [Microsoft.DataMigration]。
若尚未註冊 [Microsoft.DataMigration],按一下 [註冊],等待 [狀態] 變更為 [已註冊]。 可能需要按一下 [重新整理] 來查看狀態是否變更。
在 Azure 入口網站的功能表中,選取 [+ 建立資源]。
在 [ 新增 ] 頁面上的 [ 搜尋 Marketplace ] 方塊中,輸入 Azure 資料庫移轉服務,然後按 Enter。
在 [Azure 資料庫移轉服務] 頁面上,選取 [建立]。
在 [ 建立移轉服務 ] 頁面上,輸入下列設定:
財產 價值 資源群組 mongodbrg 服務名稱 MongoDBMigration 地點 選取您先前使用的相同位置 服務模式 天藍色 定價層 標準:1 個虛擬核心 選取 [下一步:網络]。
在 [ 網络] 頁面上,選取 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-migration,然後選取 [ 開始移轉]。
在 mongodb-migration 頁面上,按下 重新整理,每隔 30 秒,直到移轉完成為止。 請注意已處理的檔數目。
確認移轉成功
在 Azure 入口網站的功能表中,選取 [所有資源]。
在 [ 所有資源] 頁面上,選取 [mongodbnnn]。
在 mongodb*nnn 頁面上,選取 [數據總管]。
在 [ 數據總管] 窗格中,展開 DeviceData 資料庫、展開 Temperatures 集合,然後選取 [ 檔]。
在 [ 檔案] 窗格中,捲動檔案清單。 您應該會看到每個文件的文件識別碼 (_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"})此命令會擷取並顯示裝置 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 連接字串] 頁面的 [主機] 港口 [mongodbnnn 連接字串] 頁面的 [連接埠] 用戶名稱 [mongodbnnn 連接字串] 頁面的 [使用者名稱] 密碼 [mongodbnnn 連接字串] 頁面的 [主要密碼] 已完成的檔案看起來應該如下所示:
<?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 資料庫、展開 Temperatures 集合,然後選取 [ 設定]。
選取 [編製索引原則]。
在 _id 底下新增一個索引,於 定義 輸入 deviceID,並為 類型 選擇 單一欄位。
選取 [儲存 ] 以新增索引。
返回 Cloud Shell 以再次嘗試您的查詢,並記下應用程式中改善的回應。
使用其他裝置號碼測試應用程式。 輸入 Q 以完成。
您已成功將 MongoDB 資料庫移轉至 Cosmos DB,並重新設定現有的 MongoDB 應用程式以連線到新的 Cosmos DB 資料庫。
清除已建立的資源
這很重要
若是在自己的個人訂閱中執行這些步驟,您即可個別刪除資源,或是刪除資源群組來刪除整組資源。 未停止運行的資源可能會產生費用。
使用 Cloud Shell 執行下列命令以刪除資源群組:
az group delete --name mongodbrg