【Part3:DNNリスナー構成編】Azure VM上のSQL ServerにAlways On可用性グループを構成してみた

こんにちは。「Azure VM上のSQL ServerにAlwaysOn可用性グループを構成してみた」第三部 リスナー構成編です。

それではさっそくまいります。

前回の記事:事前準備編

今回の記事は、以下の記事で実施した事前準備が完了している前提なので、まだであればちょっと時間はかかりますが、Part1から辿っていただければと思います。

リスナーの構成ステップ

前回までのステップで、可用性グループ内のレプリカが同期できるようになりましたが、リスナーが存在しないのでまだ外部から接続することはできません。

というわけでこの記事では、このリスナーを構成していきます。

Windowsファイアウォールでリスナー用ポートを許可

チュートリアル: サブネットが 1 つの可用性グループの前提条件 – SQL Server on Azure VMs | Microsoft Docs

上の手順と同様の方法で、リスナー用ポートを開放します。上の手順では、リスナーにVNN+Azure Load Balancerを利用する想定で59999ポートを開放していますが、今回は下の通りDNNリスナーを構成してみるため、DNNリスナー用にチュートリアルに沿った6789ポートを開放しなおします。

なお、このステップは、sqlserver-0およびsqlserver-1の両方で行っておく必要があります。

Windows Defender Firewall with Advanced Securityから6789ポートを許可するInboundルールを追加。

リスナーの追加

チュートリアル:SQL Server Always On 可用性グループを構成する – SQL Server on Azure VMs | Microsoft Docs

次にリスナーの追加です。

Azure VM上のSQL Serverにおけるリスナーの構成方法ですが、SQL Server/Windows Serverのバージョンによって対応しているものが異なるようです。

  • SQL Server 2019 / Windows Server 2016よりも前のバージョンの場合:Azure Load BalancerとVNNリスナーを構成する必要がある
  • SQL Server 2019 / Windows Server 2016以降の場合:DNN(分散ネットワーク名)リスナーを構成すればよい

DNNとVNNの違いについては、以下のブログに分かりやすい説明がありました。

SQL Server on Azure VM の AlwaysOn 可用性グループで DNN がサポートされました at SE の雑記 (engineer-memo.com)

今回はSQL Server 2019 / Windows Server 2016で試しているので、DNNリスナーを構成する方法を試してみたいと思います。

チュートリアルの通り、sql server-0にInstallユーザでログインした状態で、以下のPowerShellスクリプトをadd_dnn_listener.ps1 という名前で保存し、実行します。

このとき、PowerShellのプロンプトは管理者権限で実行しないと権限不足とのエラーが出るので注意。

param (
   [Parameter(Mandatory=$true)][string]$Ag,
   [Parameter(Mandatory=$true)][string]$Dns,
   [Parameter(Mandatory=$true)][string]$Port
)

Write-Host "Add a DNN listener for availability group $Ag with DNS name $Dns and port $Port"

$ErrorActionPreference = "Stop"

# create the DNN resource with the port as the resource name
Add-ClusterResource -Name $Port -ResourceType "Distributed Network Name" -Group $Ag 

# set the DNS name of the DNN resource
Get-ClusterResource -Name $Port | Set-ClusterParameter -Name DnsName -Value $Dns 

# start the DNN resource
Start-ClusterResource -Name $Port


$Dep = Get-ClusterResourceDependency -Resource $Ag
if ( $Dep.DependencyExpression -match '\s*\((.*)\)\s*' )
{
$DepStr = "$($Matches.1) or [$Port]"
}
else
{
$DepStr = "[$Port]"
}

Write-Host "$DepStr"

# add the Dependency from availability group resource to the DNN resource
Set-ClusterResourceDependency -Resource $Ag -Dependency "$DepStr"


#bounce the AG resource
Stop-ClusterResource -Name $Ag
Start-ClusterResource -Name $Ag
# 実行コマンド
.\add_dnn_listener.ps1 ag1 dnnlsnr 6789

SSMSから、リスナーが正常に作成されたことが確認できます。

DMVからも確認できます。is_distributed_network_nameが”1″になっていることからDNNリスナーであることがわかりますね。

SELECT * FROM SYS.AVAILABILITY_GROUP_LISTENERS

接続をテストする

可用性グループの DNN リスナーの構成 – SQL Server on Azure VMs | Microsoft Docs

まず、DNNリスナーに接続します。これまではSSMSから、レプリカを直接して接続していたと思いますが、実はリスナーを指定した接続もできるようですね。

上のチュートリアルの通り、接続時に、DNNリスナー名、ポート(6789)、およびMultiSubnetFailver=Trueオプションを追加して接続すればOKです。

この状態で以下コマンドで現在の接続先を確認します。

SELECT @@SERVERNAME

続いて手動でフェールオーバーさせます。SSMSで、可用性グループAG1を右クリック>Failoverメニューから、手動でのフェールオーバーを構成できます。

フェールオーバーは数秒ほどで完了しました。

フェールオーバー後、sqlserver-0はセカンダリに変わっていることが確認できます。

ここで、DNNリスナー経由で、先ほどと同じコマンドを再度実行してみます。すると、接続先がちゃんと新しいプライマリレプリカであるsqlserver-1の方に変わりました!

SELECT @@SERVERNAME

アプリケーションからの接続

ここまでのステップでDNNリスナーの構成と動作確認ができました。

実際にアプリケーションからAlwaysOn可用性グループを構成したデータベースに接続する際には、上で試した接続文字列をアプリケーション側から指定してやればOKとのことです。

可用性グループの DNN リスナーの構成 – SQL Server on Azure VMs | Microsoft Docs

以上、AlwaysOn可用性グループ構成の最終ステップ、リスナー構成編でした。

少しでも参考になりましたら幸いです。

おしまい

この記事を気に入っていただけたらシェアをお願いします!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

ABOUT US
Yuu113
初めまして。ゆうたろうと申します。 兵庫県出身、東京でシステムエンジニアをしております。現在は主にデータ分析、機械学習を活用してビジネスモデリングに取り組んでいます。 日々学んだことや経験したことを整理していきたいと思い、ブログを始めました。旅行、カメラ、IT技術、江戸文化が大好きですので、これらについても記事にしていきたいと思っています。