練習:保護、監視及調整已遷移的資料庫

已完成

您是 AdventureWorks 組織的資料庫開發人員。 AdventureWorks 將自行車與自行車零件直接銷售給終端消費者和經銷商已行之有年。 他們的系統會將資訊儲存在您先前遷移至適用於 PostgreSQL 的 Azure 資料庫的資料庫中。

執行移轉之後,您需要保證系統的執行效能良好。 您決定使用可用的 Azure 工具來監視伺服器。 為了減輕競爭和延遲可能造成的回應時間延長,您決定執行讀取複寫。 您需要監視產生的系統,並將結果與彈性伺服器架構進行比較。

在本教學課程中,您將執行下列工作:

  1. 為您的適用於 PostgreSQL 的 Azure 資料庫服務設定 Azure 計量。
  2. 執行可模擬多位使用者查詢資料庫的範例應用程式。
  3. 檢視計量。

設定環境

在 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 計量

  1. 使用網頁瀏覽器開啟新的索引標籤,然後瀏覽至 Azure 入口網站

  2. 在 Azure 入口網站中,選取 [所有資源]

  3. 選取以Adventureworks開頭的 [適用於 PostgreSQL 的 Azure 資料庫] 伺服器名稱。

  4. 在 [監視] 下,選取 [計量]。

  5. 在 [圖表] 頁面上,新增下列計量:

    屬性
    範圍 adventureworks[nnn]
    計量命名空間 PostgreSQL 伺服器標準計量
    計量 作用中的連線數
    彙總 Avg

    此計量會顯示每分鐘對伺服器進行的平均連線數目。

  6. 選取 [新增計量] ,然後新增下列計量:

    屬性
    範圍 adventureworks[nnn]
    計量命名空間 PostgreSQL 伺服器標準計量
    計量 CPU 百分比
    彙總 Avg
  7. 選取 [新增計量] ,然後新增下列計量:

    屬性
    範圍 adventureworks[nnn]
    計量命名空間 PostgreSQL 伺服器標準計量
    計量 記憶體百分比
    彙總 Avg
  8. 選取 [新增計量] ,然後新增下列計量:

    屬性
    範圍 adventureworks[nnn]
    計量命名空間 PostgreSQL 伺服器標準計量
    計量 IO 百分比
    彙總 Avg

    最後三個計量會顯示測試應用程式如何使用資源。

  9. 將時間範圍設為 [過去 30 分鐘]

  10. 選取 [釘選到儀表板],然後選取 [鎖定]

執行可模擬多位使用者查詢資料庫的範例應用程式

  1. 在 Azure 入口網站的 [適用於 PostgreSQL 的 Azure 資料庫] 伺服器頁面上,選取 [設定] 下的 [連接字串]。 將 ADO.NET 連接字串複製到剪貼簿。

  2. 移至 ~/workshop/migration_samples/code/postgresql/AdventureWorksSoakTes 資料夾。

    cd ~/workshop/migration_samples/code/postgresql/AdventureWorksSoakTest
    
  3. 使用程式碼編輯器開啟 App.config 檔案:

    code App.config
    
  4. 將 [資料庫] 的值取代為 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>
    

    注意

    目前可忽略 ConnectionString1ConnectionString2 的設定。 稍後會在實驗室中更新這些項目。

  5. 儲存變更並關閉編輯器。

  6. 在 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
    

    當您執行下一個工作時,請保持應用程式繼續執行。

檢視計量

  1. 返回 Azure 入口網站。

  2. 在左側窗格中,選取[儀表板]

    您應該會看到圖表顯示適用於 PostgreSQL 的 Azure 資料庫服務的計量。

  3. 選取圖表,於 [計量] 窗格中開啟。

  4. 讓應用程式執行幾分鐘的時間 (執行時間越長越好)。 當執行時間過後,圖表中的計量應該類似於下圖中所示的模式:

    Image showing the metrics gathered while the sample app is running

    此圖表強調下列幾點:

    • CPU 是以完整容量執行;使用率很快就會達到 100%。
    • 連線數目緩慢上升。 此範例應用程式的設計是為了能快速地連續啟動 101 個用戶端,但是伺服器一次只能處理開啟幾個連線。 在圖表中的每個「步驟」新增的連接數目變得較小,而且「步驟」之間的時間也會增加。 大約 45 分鐘之後,系統只能建立 70 個用戶端連線。
    • 記憶體使用率也隨著時間不斷增加。
    • I/O 使用率接近零。 用戶端應用程式所需的所有資料目前都快取在記憶體中。

    如果讓應用程式的執行時間夠長,您會看到連線失敗,並顯示如下圖所示的錯誤訊息。

    Image showing the connection errors that can occur when the server has insufficient resources available

  5. 在 Cloud Shell 中,按下 Enter 鍵以停止應用程式。

設定伺服器以收集查詢效能資料

  1. 在 Azure 入口網站的 [適用於 PostgreSQL 的 Azure 資料庫] 伺服器頁面上,選取 [設定] 下的 [連接字串]

  2. 在 [伺服器參數] 頁面上,將下列參數設定為下表中指定的值。

    參數
    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
  3. 選取 [儲存]。

使用查詢存放區檢查應用程式所執行的查詢

  1. 返回 Cloud Shell,然後重新啟動範例應用程式:

    dotnet run
    

    讓應用程式執行約 5 分鐘,然後再繼續。

  2. 保持應用程式執行,並切換至 Azure 入口網站

  3. 在 [適用於 PostgreSQL 的 Azure 資料庫] 伺服器的頁面上,於 [智慧型效能] 下,選取 [查詢效能深入解析]

  4. 在 [查詢效能深入解析] 頁面的 [長時間執行查詢] 索引標籤上,將[查詢的數目] 設定為 10,將 [選取依據為] 設定為 [平均],並將 [時間週期] 設定為 [過去 6 小時]

  5. 在圖表上方,選取 [放大] (具有「+」符號的放大鏡圖示) 數次,以取得最新的資料。

    根據您執行應用程式的時間,您會看到如下所示的圖表。 查詢存放區會每隔 15 分鐘彙總查詢的統計資料,因此每個橫條會顯示每個查詢在 15 分鐘期間內所消耗的相對時間:

    Image showing the statistics for long running queries captured by using Query Store

  6. 將滑鼠停留在每個橫條的上方,以查看該時間週期內查詢的統計資料。 系統執行時間中佔比最高的三個查詢如下:

    SELECT * FROM sales.salesorderdetail
    SELECT * FROM sales.salesorderheader
    SELECT * FROM person.person
    

    這項資訊適用於監視系統的系統管理員。 深入瞭解使用者和應用程式所執行的查詢,可讓您瞭解正在執行的工作負載,而且可向應用程式開發人員提出建議,以改善其程式碼。 例如,應用程式是否有必要從 salesorderdetail 資料表中取出所有 121,000+ 筆資料列?

使用查詢存放區檢查發生的任何等候

  1. 選取 [等候統計資料] 索引標籤。

  2. 將 [時間週期] 設定為 [過去 6 小時],將 [群組依據] 設定為 [事件],並將 [群組的最大數目] 設定為 5

    如同 [長時間執行查詢] 索引標籤,資料會每隔 15 分鐘彙總一次。 圖表下方的表格顯示系統已成為兩種等候事件的對象:

    • 用戶端:ClientWrite。 當伺服器將資料 (結果) 寫回用戶端時,就會產生這個等候事件。 此事件不會指出寫入資料庫時所產生的等候。
    • 用戶端: ClineRead。 當伺服器正在等候讀取來自用戶端的資料 (查詢要求或其他命令) 時,就會產生這個等候事件。 此事件關於從資料庫讀取所花費的時間。

    Image showing the wait statistics captured by using Query Store

    注意

    資料庫的讀取和寫入是 I/O 事件,而非用戶端事件。 範例應用程式在第一次讀取之後,所需的所有資料便已快取至記憶體中,因此不會產生任何 I/O 等候。 如果計量顯示記憶體不足,則可能會開始產生 I/O 等候事件。

  3. 返回 Cloud Shell,然後按下 Enter 鍵以停止範例應用程式。

將複本新增至適用於 PostgreSQL 的 Azure 資料庫服務

  1. 在 Azure 入口網站的 [適用於 PostgreSQL 的 Azure 資料庫] 伺服器頁面上,選取 [設定] 下的 [複寫]

  2. 在 [複寫] 頁面上,選取 [+ 新增複本]

  3. 在 [PostgreSQL 伺服器] 頁面的 [伺服器名稱] 方塊中,輸入 adventureworks [nnn]-Replica1,然後選取 [確定]

  4. 建立第一個複本時 (需要幾分鐘的時間),請重複上一個步驟,並新增另一個名為 adventureworks [nnn]-replica2 的複本。

  5. 等候兩個複本的狀態從 [部署] 變更為 [可用],然後再繼續。

    Image showing the Replication page for Azure Database for PostgreSQL. Two replicas have been added.

設定複本以啟用用戶端存取

  1. 選取 adventureworks [nnn]-replica1 複本的名稱。 您將會進入此複本的 [適用於 PostgreSQL 的 Azure 資料庫] 頁面。
  2. 在 [設定] 下,選取 [連線安全性]
  3. 在 [連線安全性] 頁面上,將 [允許存取 Azure 服務] 設定為 [是],然後選取 [儲存]。 此設定可讓您使用 Cloud Shell 執行的應用程式存取伺服器。
  4. 儲存設定之後,請重複上述步驟,並允許 Azure 服務存取 adventureworks [nnn]-replica2 複本。

重新啟動每部伺服器

注意

設定複寫並不需要重新啟動伺服器。 這項工作的目的是要清除每一部伺服器的記憶體和任何無關的連線,如此一來,再次執行應用程式時所收集到的計量也會很「乾淨」

  1. 移至 adventureworks [nnn] 伺服器的頁面。
  2. 在 [概觀] 頁面上,選取 [重新啟動]
  3. 在 [重新啟動伺服器] 對話方塊中,選取 [是]
  4. 等候伺服器重新啟動,然後再繼續。
  5. 遵循相同的流程,重新啟動 adventureworks [nnn]-replica1adventureworks [nnn]-replica2 伺服器。

重新設定範例應用程式以使用複本

  1. 在 Cloud Shell 中,編輯 App.config 檔。

    code App.config
    
  2. 新增 ConnectionString1ConnectionString2 設定的連接字串。 這些值應與 ConnectionString0 的值相同,但在 [伺服器] 和 [使用者識別碼] 的元素中,以 adventureworks [nnn]-replica1adventureworks [nnn]-replica2 取代了文字 adventureworks [nnn]

  3. 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>
    
  4. 儲存檔案並關閉編輯器。

  5. 再次啟動應用程式執行:

    dotnet run
    

    此應用程式會像先前一樣運作。 不過,這次會將要求分散到三部伺服器。

  6. 等待應用程式執行幾分鐘後,再繼續進行。

監視應用程式並觀察效能計量的差異

  1. 保持應用程式執行,並返回至 Azure 入口網站。

  2. 在左側窗格中,選取[儀表板]

  3. 選取圖表,於 [計量] 窗格中開啟。

    請記住,此圖表會顯示 adventureworks*[nnn]* 伺服器的計量,而不會顯示覆本的計量。 每個複本的負載應該大致相同。

    此範例圖表說明從啟動開始的 30 分鐘內為應用程式收集的計量。 此圖表顯示 CPU 使用率仍然很高,但記憶體使用率較低。 此外,大約 25 分鐘之後,系統已經建立超過 30 個連線。 此表現似乎沒有優於先前的設定,先前設定在 45 分鐘後支援 70 個連線。 但是,現在工作負載分佈於三部伺服器上,這些伺服器全都在相同層級執行,而且所有的 101 個連線都已建立。 此外,系統也可以繼續執行,而不會報告任何連線失敗。

    Image showing the metrics for the Azure Database for PostgreSQL server while running the application, after replication was configured

    您可以藉由增加更多的 CPU 核心擴充定價層,來解決 CPU 使用率的問題。 此實驗室中使用的範例系統使用具有 2 個核心的基本定價層來執行。 變更為一般用途的定價層最多可提供您 64 個核心。

  4. 返回 Cloud Shell,然後按下 Enter 鍵以停止範例應用程式。

您現在已瞭解如何使用 Azure 入口網站中提供的工具來監視伺服器活動。 您也已經瞭解如何設定複寫,以及瞭解建立唯讀複本,如何在需要大量讀取的資料案例中分散工作負載。