SQL Server on Linux の可用性グループのフェールオーバーの制御が多少分かったので軽くまとめておきたいと思います。
仮想 IP 経由の接続はできているのですが、読み取りセカンダリへのアクセスがうまく制御できていません。。。。
Always On Availability Group for SQL Server on Linux に、
Read-only routing SQL Server routes incoming connections to an availability group listener to a secondary replica that is configured to allow read-only workloads.
と記載されているので、できそうなのですが、久しぶりに設定したので設定方法を間違っているというオチかもしれませんが…。
SQL Server on Linux の場合、WSFC のクラスターリソースによる制御ができないため、「Pacemaker」と各プラットフォームのクラスタ管理ソフトを組み合わせる必要があります。
私の場合は、Ubuntu を使用しているため、「Pacemaker + Corosync」の組み合わせとなります。
手順については、Configure Ubuntu Cluster for SQL Server Availability Group に記載されている手順を実施することになりますが、いくつか足りなさそうな手順がありそうでした。
クラスター用リソースのインストール
可用性グループの制御には「ocf:mssql:ag」が使用されているのですが、上記の手順では、インストールのステップが抜けているかと。
sudo apt-get install -y mssql-server-ha
を実行して、OCF のリソースを追加しておく必要があります。
Corosync のコンフィグの設定
手順の中で「sudo pcs cluster destroy
」を実行していますが、これを実行したタイミングで「/etc/corosync/corosync.conf」が削除されます。
「pcs cluster setup」を実行したタイミングで、パラメーターに指定したもので生成されますが、私の環境では、totem にインタフェースの情報が設定されていなくて、corosync を起動することができない状態となっていましたので、以下のようにインタフェースの情報を追加しました。
totem { version: 2 secauth: off cluster_name: SoLCL transport: udpu interface { bindnetaddr: 10.0.40.0 } }
可用性グループの接続権限の付与
GRANT ALTER, CONNECT, VIEW DEFINITION ON AVAILABILITY GROUP::ag1 TO pacemakerLogin
を実行する手順になっていますが、「CONNECT」の権限が付与できなかったので、
GRANT ALTER, VIEW DEFINITION ON AVAILABILITY GROUP::ag1 TO pacemakerLogin
を実行しています。
Pacemaker の自動起動
systemctl enable pacemaker
を実行すると、
Synchronizing state of pacemaker.service with SysV init with /lib/systemd/systemd-sysv-install... Executing /lib/systemd/systemd-sysv-install enable pacemaker update-rc.d: error: pacemaker Default-Start contains no runlevels, aborting.
となりましたが、自動起動する設定は行われていそうな感じなのでとりあえずスルーしました…。
後は手順通りで大丈夫かと。
手順の中では仮想 IP をつけているので、仮想 IP と可用性グループのリソースがオンラインの状態になるかと。
# うまく接続できない箇所があったので、登録を一部 IP にしたので、警告出ていますが…。。
正常にリソースの監視ができていると、以下のように「monitor-ag_cluster」というアプリケーション名から「pacemakerLogin」で接続をし、「EXEC sp_server_diagnostics」が実行されていることが確認できるかと。
# CTP 1.3 だと、可用性グループを設定しても「AlwaysOn_health」の拡張イベントが有効にならないみたいですね。
Pacemaker で定義した「virtualip」での接続もできますので、この IP に対して接続を行うことで、可用性グループリスナーのような等価的なプライマリへの接続も可能です。
ADD LISTENER で手動でリスナーを登録してもフェールオーバーすると登録が消えてしまい、指定した IP アドレスがプライマリレプリカに付与されるということもないようなので、この辺の動作はクラスタ管理ソフトに任せる必要がありそうです。
Manually failover the availability group with pcs. Do not initiate failover with Transact-SQL.
の記載があるため、Pacemaker を使用した場合、クラスターの制御は Pacemaker 側に任せることになるようで、T-SQL によるフェールオーバーは実施しないようにする必要があるようです。
v.Next の AlwaysOn では、WSFC を使用しない可用性グループの構築が可能ですが、WSFC を使用しない場合は、他の方法によるリソースの制御が必要になる構成なのかもしれないですね。