練習:保護、監視及調整已遷移的資料庫
您是 AdventureWorks 組織的資料庫開發人員。 AdventureWorks 將自行車與自行車零件直接銷售給終端消費者和經銷商已行之有年。 他們的系統會將資訊儲存在您先前遷移至適用於 PostgreSQL 的 Azure 資料庫的資料庫中。
執行移轉之後,您需要保證系統的執行效能良好。 您決定使用可用的 Azure 工具來監視伺服器。 為了減輕競爭和延遲可能造成的回應時間延長,您決定執行讀取複寫。 您需要監視產生的系統,並將結果與彈性伺服器架構進行比較。
在本教學課程中,您將執行下列工作:
- 為您的適用於 PostgreSQL 的 Azure 資料庫服務設定 Azure 計量。
- 執行可模擬多位使用者查詢資料庫的範例應用程式。
- 檢視計量。
設定環境
在 Azure Cloud Shell 中執行這些 Azure CLI 命令,使用 Adventureworks 資料庫的複本建立適用於 PostgreSQL 的 Azure 資料庫。 最後一個命令會列印伺服器名稱。
SERVERNAME="adventureworks$((10000 + RANDOM % 99999))"
PUBLICIP=$(wget http://ipecho.net/plain -O - -q)
git clone https://github.com/MicrosoftLearning/DP-070-Migrate-Open-Source-Workloads-to-Azure.git workshop
az postgres server create \
--resource-group <rgn>[sandbox resource group name]</rgn> \
--name $SERVERNAME \
--location westus \
--admin-user awadmin \
--admin-password Pa55w.rdDemo \
--version 10 \
--storage-size 5120
az postgres db create \
--name azureadventureworks \
--server-name $SERVERNAME \
--resource-group <rgn>[sandbox resource group name]</rgn>
az postgres server firewall-rule create \
--resource-group <rgn>[sandbox resource group name]</rgn> \
--server $SERVERNAME \
--name AllowMyIP \
--start-ip-address $PUBLICIP --end-ip-address $PUBLICIP
PGPASSWORD=Pa55w.rdDemo psql -h $SERVERNAME.postgres.database.azure.com -U awadmin@$SERVERNAME -d postgres -f workshop/migration_samples/setup/postgresql/adventureworks/create_user.sql
PGPASSWORD=Pa55w.rd psql -h $SERVERNAME.postgres.database.azure.com -U azureuser@$SERVERNAME -d azureadventureworks -f workshop/migration_samples/setup/postgresql/adventureworks/adventureworks.sql 2> /dev/null
echo "Your PostgreSQL server name is:\n"
echo $SERVERNAME.postgres.database.azure.com
為您適用於 PostgreSQL 的 Azure 資料庫服務設定 Azure 計量
使用網頁瀏覽器開啟新的索引標籤,然後瀏覽至 Azure 入口網站。
在 Azure 入口網站中,選取 [所有資源]。
選取以Adventureworks開頭的 [適用於 PostgreSQL 的 Azure 資料庫] 伺服器名稱。
在 [監視] 下,選取 [計量]。
在 [圖表] 頁面上,新增下列計量:
屬性 值 範圍 adventureworks[nnn] 計量命名空間 PostgreSQL 伺服器標準計量 計量 作用中的連線數 彙總 Avg 此計量會顯示每分鐘對伺服器進行的平均連線數目。
選取 [新增計量] ,然後新增下列計量:
屬性 值 範圍 adventureworks[nnn] 計量命名空間 PostgreSQL 伺服器標準計量 計量 CPU 百分比 彙總 Avg 選取 [新增計量] ,然後新增下列計量:
屬性 值 範圍 adventureworks[nnn] 計量命名空間 PostgreSQL 伺服器標準計量 計量 記憶體百分比 彙總 Avg 選取 [新增計量] ,然後新增下列計量:
屬性 值 範圍 adventureworks[nnn] 計量命名空間 PostgreSQL 伺服器標準計量 計量 IO 百分比 彙總 Avg 最後三個計量會顯示測試應用程式如何使用資源。
將時間範圍設為 [過去 30 分鐘]。
選取 [釘選到儀表板],然後選取 [鎖定]。
執行可模擬多位使用者查詢資料庫的範例應用程式
在 Azure 入口網站的 [適用於 PostgreSQL 的 Azure 資料庫] 伺服器頁面上,選取 [設定] 下的 [連接字串]。 將 ADO.NET 連接字串複製到剪貼簿。
移至 ~/workshop/migration_samples/code/postgresql/AdventureWorksSoakTes 資料夾。
cd ~/workshop/migration_samples/code/postgresql/AdventureWorksSoakTest
使用程式碼編輯器開啟 App.config 檔案:
code App.config
將 [資料庫] 的值取代為 azureadventureworks,並將 ConectionString0 取代為剪貼簿中的連接字串。 將 [使用者識別碼] 變更為 azureuser@adventureworks[nnn],並將 [密碼] 設定為 Pa55w.rd。 完成的檔案看起來應類似於下列範例:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <appSettings> <add key="ConnectionString0" value="Server=adventureworks101.postgres.database.azure.com;Database=azureadventureworks;Port=5432;User Id=azureuser@adventureworks101;Password=Pa55w.rd;Ssl Mode=Require;" /> <add key="ConnectionString1" value="INSERT CONNECTION STRING HERE" /> <add key="ConnectionString2" value="INSERT CONNECTION STRING HERE" /> <add key="NumClients" value="100" /> <add key="NumReplicas" value="1"/> </appSettings> </configuration>
注意
目前可忽略 ConnectionString1 和 ConnectionString2 的設定。 稍後會在實驗室中更新這些項目。
儲存變更並關閉編輯器。
在 Cloud Shell 提示字元中,執行下列命令以建立並執行應用程式:
dotnet run
當應用程式啟動時,它會繁衍幾個執行緒,每個執行緒都會模擬一個使用者。 執行緒會執行一連串的查詢來執行迴圈。 您會看到如下所示的訊息,開始出現:
Client 48 : SELECT * FROM purchasing.vendor Response time: 630 ms Client 48 : SELECT * FROM sales.specialoffer Response time: 702 ms Client 43 : SELECT * FROM purchasing.vendor Response time: 190 ms Client 57 : SELECT * FROM sales.salesorderdetail Client 68 : SELECT * FROM production.vproductanddescription Response time: 51960 ms Client 55 : SELECT * FROM production.vproductanddescription Response time: 160212 ms Client 59 : SELECT * FROM person.person Response time: 186026 ms Response time: 2191 ms Client 37 : SELECT * FROM person.person Response time: 168710 ms
當您執行下一個工作時,請保持應用程式繼續執行。
檢視計量
返回 Azure 入口網站。
在左側窗格中,選取[儀表板]。
您應該會看到圖表顯示適用於 PostgreSQL 的 Azure 資料庫服務的計量。
選取圖表,於 [計量] 窗格中開啟。
讓應用程式執行幾分鐘的時間 (執行時間越長越好)。 當執行時間過後,圖表中的計量應該類似於下圖中所示的模式:
此圖表強調下列幾點:
- CPU 是以完整容量執行;使用率很快就會達到 100%。
- 連線數目緩慢上升。 此範例應用程式的設計是為了能快速地連續啟動 101 個用戶端,但是伺服器一次只能處理開啟幾個連線。 在圖表中的每個「步驟」新增的連接數目變得較小,而且「步驟」之間的時間也會增加。 大約 45 分鐘之後,系統只能建立 70 個用戶端連線。
- 記憶體使用率也隨著時間不斷增加。
- I/O 使用率接近零。 用戶端應用程式所需的所有資料目前都快取在記憶體中。
如果讓應用程式的執行時間夠長,您會看到連線失敗,並顯示如下圖所示的錯誤訊息。
在 Cloud Shell 中,按下 Enter 鍵以停止應用程式。
設定伺服器以收集查詢效能資料
在 Azure 入口網站的 [適用於 PostgreSQL 的 Azure 資料庫] 伺服器頁面上,選取 [設定] 下的 [連接字串]。
在 [伺服器參數] 頁面上,將下列參數設定為下表中指定的值。
參數 值 pg_qs.max_query_text_length 6000 pg_qs.query_capture_mode ALL pg_qs.replace_parameter_placeholders ON pg_qs.retention_period_in_days 7 pg_qs.track_utility ON pg_stat_statements.track ALL pgms_wait_sampling.history_period 100 pgms_wait_sampling.query_capture_mode ALL 選取 [儲存]。
使用查詢存放區檢查應用程式所執行的查詢
返回 Cloud Shell,然後重新啟動範例應用程式:
dotnet run
讓應用程式執行約 5 分鐘,然後再繼續。
保持應用程式執行,並切換至 Azure 入口網站
在 [適用於 PostgreSQL 的 Azure 資料庫] 伺服器的頁面上,於 [智慧型效能] 下,選取 [查詢效能深入解析]。
在 [查詢效能深入解析] 頁面的 [長時間執行查詢] 索引標籤上,將[查詢的數目] 設定為 10,將 [選取依據為] 設定為 [平均],並將 [時間週期] 設定為 [過去 6 小時]。
在圖表上方,選取 [放大] (具有「+」符號的放大鏡圖示) 數次,以取得最新的資料。
根據您執行應用程式的時間,您會看到如下所示的圖表。 查詢存放區會每隔 15 分鐘彙總查詢的統計資料,因此每個橫條會顯示每個查詢在 15 分鐘期間內所消耗的相對時間:
將滑鼠停留在每個橫條的上方,以查看該時間週期內查詢的統計資料。 系統執行時間中佔比最高的三個查詢如下:
SELECT * FROM sales.salesorderdetail SELECT * FROM sales.salesorderheader SELECT * FROM person.person
這項資訊適用於監視系統的系統管理員。 深入瞭解使用者和應用程式所執行的查詢,可讓您瞭解正在執行的工作負載,而且可向應用程式開發人員提出建議,以改善其程式碼。 例如,應用程式是否有必要從 salesorderdetail 資料表中取出所有 121,000+ 筆資料列?
使用查詢存放區檢查發生的任何等候
選取 [等候統計資料] 索引標籤。
將 [時間週期] 設定為 [過去 6 小時],將 [群組依據] 設定為 [事件],並將 [群組的最大數目] 設定為 5。
如同 [長時間執行查詢] 索引標籤,資料會每隔 15 分鐘彙總一次。 圖表下方的表格顯示系統已成為兩種等候事件的對象:
- 用戶端:ClientWrite。 當伺服器將資料 (結果) 寫回用戶端時,就會產生這個等候事件。 此事件不會指出寫入資料庫時所產生的等候。
- 用戶端: ClineRead。 當伺服器正在等候讀取來自用戶端的資料 (查詢要求或其他命令) 時,就會產生這個等候事件。 此事件無關於從資料庫讀取所花費的時間。
注意
資料庫的讀取和寫入是 I/O 事件,而非用戶端事件。 範例應用程式在第一次讀取之後,所需的所有資料便已快取至記憶體中,因此不會產生任何 I/O 等候。 如果計量顯示記憶體不足,則可能會開始產生 I/O 等候事件。
返回 Cloud Shell,然後按下 Enter 鍵以停止範例應用程式。
將複本新增至適用於 PostgreSQL 的 Azure 資料庫服務
在 Azure 入口網站的 [適用於 PostgreSQL 的 Azure 資料庫] 伺服器頁面上,選取 [設定] 下的 [複寫]。
在 [複寫] 頁面上,選取 [+ 新增複本]。
在 [PostgreSQL 伺服器] 頁面的 [伺服器名稱] 方塊中,輸入 adventureworks [nnn]-Replica1,然後選取 [確定]。
建立第一個複本時 (需要幾分鐘的時間),請重複上一個步驟,並新增另一個名為 adventureworks [nnn]-replica2 的複本。
等候兩個複本的狀態從 [部署] 變更為 [可用],然後再繼續。
設定複本以啟用用戶端存取
- 選取 adventureworks [nnn]-replica1 複本的名稱。 您將會進入此複本的 [適用於 PostgreSQL 的 Azure 資料庫] 頁面。
- 在 [設定] 下,選取 [連線安全性]。
- 在 [連線安全性] 頁面上,將 [允許存取 Azure 服務] 設定為 [是],然後選取 [儲存]。 此設定可讓您使用 Cloud Shell 執行的應用程式存取伺服器。
- 儲存設定之後,請重複上述步驟,並允許 Azure 服務存取 adventureworks [nnn]-replica2 複本。
重新啟動每部伺服器
注意
設定複寫並不需要重新啟動伺服器。 這項工作的目的是要清除每一部伺服器的記憶體和任何無關的連線,如此一來,再次執行應用程式時所收集到的計量也會很「乾淨」。
- 移至 adventureworks [nnn] 伺服器的頁面。
- 在 [概觀] 頁面上,選取 [重新啟動]。
- 在 [重新啟動伺服器] 對話方塊中,選取 [是]。
- 等候伺服器重新啟動,然後再繼續。
- 遵循相同的流程,重新啟動 adventureworks [nnn]-replica1 和 adventureworks [nnn]-replica2 伺服器。
重新設定範例應用程式以使用複本
在 Cloud Shell 中,編輯 App.config 檔。
code App.config
新增 ConnectionString1 和 ConnectionString2 設定的連接字串。 這些值應與 ConnectionString0 的值相同,但在 [伺服器] 和 [使用者識別碼] 的元素中,以 adventureworks [nnn]-replica1 和 adventureworks [nnn]-replica2 取代了文字 adventureworks [nnn]。
將 NumReplicas 設定設為 3。
完成的 App.config 檔案應類似:
<configuration> <appSettings> <add key="ConnectionString0" value="Server=adventureworks101.postgres.database.azure.com;Database=azureadventureworks;Port=5432;User Id=azureuser@adventureworks101;Password=Pa55w.rd;Ssl Mode=Require;" /> <add key="ConnectionString1" value="Server=adventureworks101-replica1.postgres.database.azure.com;Database=azureadventureworks;Port=5432;User Id=azureuser@adventureworks101-replica1;Password=Pa55w.rd;Ssl Mode=Require;" /> <add key="ConnectionString2" value="Server=adventureworks101-replica2.postgres.database.azure.com;Database=azureadventureworks;Port=5432;User Id=azureuser@adventureworks101-replica2;Password=Pa55w.rd;Ssl Mode=Require;" /> <add key="NumClients" value="100" /> <add key="NumReplicas" value="3"/> </appSettings> </configuration>
儲存檔案並關閉編輯器。
再次啟動應用程式執行:
dotnet run
此應用程式會像先前一樣運作。 不過,這次會將要求分散到三部伺服器。
等待應用程式執行幾分鐘後,再繼續進行。
監視應用程式並觀察效能計量的差異
保持應用程式執行,並返回至 Azure 入口網站。
在左側窗格中,選取[儀表板]。
選取圖表,於 [計量] 窗格中開啟。
請記住,此圖表會顯示 adventureworks*[nnn]* 伺服器的計量,而不會顯示覆本的計量。 每個複本的負載應該大致相同。
此範例圖表說明從啟動開始的 30 分鐘內為應用程式收集的計量。 此圖表顯示 CPU 使用率仍然很高,但記憶體使用率較低。 此外,大約 25 分鐘之後,系統已經建立超過 30 個連線。 此表現似乎沒有優於先前的設定,先前設定在 45 分鐘後支援 70 個連線。 但是,現在工作負載分佈於三部伺服器上,這些伺服器全都在相同層級執行,而且所有的 101 個連線都已建立。 此外,系統也可以繼續執行,而不會報告任何連線失敗。
您可以藉由增加更多的 CPU 核心擴充定價層,來解決 CPU 使用率的問題。 此實驗室中使用的範例系統使用具有 2 個核心的基本定價層來執行。 變更為一般用途的定價層最多可提供您 64 個核心。
返回 Cloud Shell,然後按下 Enter 鍵以停止範例應用程式。
您現在已瞭解如何使用 Azure 入口網站中提供的工具來監視伺服器活動。 您也已經瞭解如何設定複寫,以及瞭解建立唯讀複本,如何在需要大量讀取的資料案例中分散工作負載。