こんにちは。「Azure VM上のSQL ServerにAlwaysOn可用性グループを構成してみた」第三部 リスナー構成編です。
それではさっそくまいります。
Contents
前回の記事:事前準備編
今回の記事は、以下の記事で実施した事前準備が完了している前提なので、まだであればちょっと時間はかかりますが、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可用性グループ構成の最終ステップ、リスナー構成編でした。
少しでも参考になりましたら幸いです。
おしまい
コメントを残す