NOBTAの気ままにITブログ

Azure全般 / SQL Serverに関する情報を発信していきます。

Logic Apps を使用した Azure SQL Database の 自動スケールアップ方法について (サンプルクエリ)


スポンサーリンク

Azure SQL Database サーバーレス (仮想コア ベース : 汎用目的) の場合、「最大仮想コア」、「最小仮想コア」を指定することが可能になっており、コンピューティング リソースを自動的にスケーリング (スケールアップ、スケールアウト) させることができます。

しかしながら、現時点 (2021年2月) において、ゾーン冗長性がサポートされておらず、ゾーン冗長性が必要な高可用性な環境を構成する場合、選択することが出来ません。

今回、ゾーン冗長性がサポートされている 「仮想コア ベース : Business Critical」、および、ゾーン冗長性は現在はプレビュー中ですが 「仮想コア ベース : 汎用目的」にたいして、Logic Apps を使用し、Azure SQL Database の CPU使用率に応じて、自動スケールアップ (仮想コア数を増加) する方法について、自分の整理も兼ねて、まとめてみようと思います。

 

 

[前提条件]

  • Azure SQL Database (仮想コア ベース : 汎用目的) のデータベースが存在。
  • Azure SQL Database - 「ファイアウォールと仮想ネットワーク」で「Azure サービスおよびリソースにこのサーバーへのアクセスを許可する」を「はい」に設定。

 

[実装内容]

1. ロジック アプリを作成

2. ロジック アプリ デザイナーよりトリガー、ステップを追加

  •   トリガー : 「繰り返し」 (Recurrence : 定期的にスケジュール実行) 
  •   ステップ : 「SQL クエリを実行する (V2)」で Azure SQL Database の自動スケールアップ対象データベースへの接続設定、および、CPUの負荷状況に応じて Azure SQL Database をスケールアップ (仮想CPU) を実行するサンプルクエリを登録

 

Azure SQL Database 自動スケールアップ用 ロジック アプリ (Logic Apps) 作成

1) Azure ポータル - 「ロジック アプリ」を選択します。 

f:id:nobtak:20210221015127p:plain

2) 「+ 追加」-「Consumption」を選択します。

f:id:nobtak:20210221020236p:plain


3) 「ロジック アプリ名」,「リージョン」に任意の値を入力後、「確認および作成」を選択し、ロジック アプリを作成します。 

f:id:nobtak:20210221020725p:plain

4) 3)で作成したロジック アプリ - 開発ツール - 「ロジック アプリ デザイナー」を選択します。 

f:id:nobtak:20210221021204p:plain

5) スケジュールで定期的にロジック アプリを実行させるため、トリガーに「繰り返し」を選択します。

f:id:nobtak:20210221021511p:plain


6) 「間隔」,「頻度」(本例では 5分間隔に設定) および、必要に応じて「タイムゾーン」,「開始時刻」を入力後、「+ 新しいステップ」を選択します。 

f:id:nobtak:20210221021841p:plain

6) 「SQL Server」-「SQL クエリを実行する (V2)」を選択します。 

f:id:nobtak:20210221022343p:plain

7) 「接続名」,「認証の種類」,「SQL サーバー名」,「SQL データベース名」,「ユーザー名」,「パスワード」を入力後、「作成」を選択します。 

f:id:nobtak:20210221022905p:plain

  • 認証の種類 : 「Azure AD Integrated」,「SQL Server 認証」,「Windows 認証」の何れかから選択。
  • SQL サーバー名:Azure SQL Database サーバー名を指定。
  • SQL データベース名 : 自動スケールアップ対象のデータベース名を指定。
  • ユーザー名 :  サーバー レベル プリンシパル ログイン (プロビジョニング プロセスで作成されるログイン), master の dbmanager データベース ロール、該当データベースの db_owerner データベース ロールが付与されたログインを指定。

 

8) 「Query」欄に 「Azure SQL Database 自動スケールアップ用サンプル クエリ」をペースト後、「保存」を選択します。 

f:id:nobtak:20210221024038p:plain

 

 [サンプル クエリ]

1.「sys.dm_db_resource_stats」の「avg_cpu_percent」列の値を過去30分間分取得後、CPU使用率(%)の平均値を取得。

2. CPU使用率(%)の平均値が 98 より大きい場合、ALTER DATABASE コマンドにより、該当データベースの仮想コア数を変更。

 

※ サンプルクエリでは、Azure SQL Database (仮想コア ベース : 汎用目的) のデータベースを使用していることを前提に作成しています。

※ 仮想コア 2個 (GP_Gen5_2) から 4個 (GP_Gen5_4)、4個 (GP_Gen5_4) から 6個 (GP_Gen5_6)、6個 (GP_Gen5_6) から 8個 (GP_Gen5_8) へのスケール アップのみを実装しており、必要に応じてサンプルクエリを修正します。

 

「Azure SQL Database 自動スケールアップ用サンプル クエリ」 : スケールアップ対象のデータベースの過去30分間のCPU使用率(%)が閾値を超えた場合、 仮想コア数を増やす。

DECLARE @dbslo TABLE (DBName nvarchar(50), Edition nvarchar(50), Service_Obj nvarchar(50));
DECLARE @Service_Obj nvarchar(50)
DECLARE @NextEdition nvarchar(50)
DECLARE @NextService_Obj nvarchar(50)
DECLARE @avgcpu int
DECLARE @DBNAME nvarchar(50)
DECLARE @QueryForAlter nvarchar(100)

SELECT @avgcpu = ROUND(AVG(avg_cpu_percent),0)
FROM sys.dm_db_resource_stats
WHERE end_time > dateadd(minute,-30,getdate())

IF @avgcpu > 98
   BEGIN
      INSERT INTO @dbslo
      SELECT db_name(), edition, service_objective from sys.database_service_objectives

      SELECT
         @DBNAME = DBName,
         @Service_Obj = Service_Obj,
         @NextEdition = Edition,
         @NextService_Obj =
            CASE
               WHEN Service_Obj = 'GP_Gen5_2' THEN 'GP_Gen5_4'
               WHEN Service_Obj = 'GP_Gen5_4' THEN 'GP_Gen5_6'
               WHEN Service_Obj = 'GP_Gen5_6' THEN 'GP_Gen5_8'
            ELSE
               Service_Obj
            END
      FROM @dbslo
      IF @Service_Obj <> @NextService_Obj
         BEGIN
            SET @QueryForAlter = N'alter database ' + @DBNAME + N' modify (edition = ''' + @NextEdition + N''', SERVICE_OBJECTIVE = ''' + @NextService_Obj + N''')'
            exec(@QueryForAlter)
         END
   END

 

9) 「実行」を選択し、正常に ロジック アプリが動作することを確認します。 

f:id:nobtak:20210221024459p:plain

※ 今回の設定の場合、ロジック アプリのトリガーに「繰り返し」(Recurrence) を指定しているため、「開始時刻」に指定した日時以降、定期的に今回作成したロジック アプリが動作します。

 

Azure SQL Database 自動スケールアップ 動作確認方法

1) Azure ポータル - 「SQL データベース」を選択し、スケールアップ対象のデータベースの価格レベルが「汎用目的: Gen5、2 仮想コア」になっていることを確認します。

f:id:nobtak:20210221034559p:plain

 

2) SQL Server Management Studio (SSMS) から Azure SQL Database サーバーの該当データベースにログインします。

3) 「新しいクエリ」で以下のクエリを実行し、CPU負荷テスト用ストアドプロシージャ「sp_cpuload」を作成します。

CREATE PROCEDURE [dbo].[sp_cpuload]
AS                            
BEGIN
    SET NOCOUNT ON;
    DECLARE @iCnt bigint;

    WHILE (1=1)
    BEGIN
        SET @iCnt = (SELECT count(*) FROM sys.dm_exec_requests)
    END
END;
GO

 

4) 3) で作成した CPU負荷テスト用ストアドプロシージャ「sp_cpuload」を実行します。 

exec sp_cpuload

 

5) Azure ポータル - 「ロジック アプリ」 - 作成したロジック アプリ -「概要」を選択し、右ペインの「実行の履歴」を確認し、該当のロジック アプリが正常に動作したことを確認します。

f:id:nobtak:20210221034325p:plain

 

6) Azure ポータル - 「SQL データベース」を選択し、スケールアップ対象のデータベースの価格レベルが「汎用目的: Gen5、4 仮想コア」になっていることを確認します。

f:id:nobtak:20210221034749p:plain

※ 検証を実施する場合、一時的に ロジック アプリに登録した サンプル クエリ内容の変更 (CPU使用率の閾値など) 、および 「繰り返し」(Recurrence) の間隔を短くすることで、簡易に検証することが可能になります。

 

まとめ

今回は、 ゾーン冗長性がサポートされている 「仮想コア ベース : Business Critical」、および、現在はプレビュー中ですが 「仮想コア ベース : 汎用目的」にたいして、Logic Apps を使用し、Azure SQL Database の CPU使用率に応じて、自動スケールアップ (仮想コア数を増加) する方法についてまとめてみました。

次回は、Logic Apps + Azure SQL Database + Azure Private Link を使用したプライベート通信で同様の動作を実現することができるか、確認してみようと思います。