前回は、クラスター環境の SQL Server 2008 R2の LooksAlive / IsAlive 投稿しました。
SQL Server 2008 R2 までは、[SELECT @@servername] を実行することで IsAlive の検査が行われていました。
Denali では IsAlive の検査方法が変わっているので今回はその点についてまとめてみたいと思います。
このあたりの情報については Tech Ed North America 2011 の Denali のセッションで解説がされています。
Microsoft SQL Server Code-Named “Denali” AlwaysOn Series,Part 1: Introducing the Next Generation High Availability Solution
■Denali の IsAlive について
Denali ではIsAlive の仕組みが変わっています。
HADR に気を取られていて Tech Ed で解説があるまで気づかなかったのですが、BOL に結構情報があがっているんですよね。
Installing a SQL Server “Denali” Failover Cluster
Before Installing Failover Clustering
Denali では [sp_server_diagnostics] というストアドプロシージャが実行され、IsAlive の検査が行われています。
いままでは、[SELECT @@servername] という単純なクエリを実行することで検査が行われていましたが Denali では柔軟なフェールオーバーポリシー (Flexible Failover Policy) となっています。
検査の内容については Failure Detection in SQL Server Failover Cluster に記載されていますが、以下の 5 点について確認がされているようです。
- system
- resource
- Query process
- io_subsystem
- events
内部的には拡張イベント (XEvent) も使われているようで、この検査の内容は拡張イベントとして SQL Server のリソースを実行しているノードでログに出力がされています。
最大のサイズは 100MB で固定となっているようですが。
How to: View and Read SQL Server Failover Cluster Diagnostics Log
このログは以下のようなクエリで確認をすることが可能です。
# 上記の技術文書のクエリは微妙に誤記があるのでそのままでは実行できなかったりするのですよね。
DECLARE @path varchar (1000) = ‘C:Program FilesMicrosoft SQL ServerMSSQL11.DENALIMSSQLLog’ DECLARE @datafilename varchar (1000) = @path + ‘2008R2-NODE-01_DENALI_SQLDIAG_0_129503626894820000.xel’ DECLARE @metadataname varchar (1000) = @path + ‘2008R2-NODE-01_DENALI_SQLDIAG_0_129503168219450000.xem’ SELECT xml_data.value(‘(event/@name)[1]’,’varchar(max)’)AS ‘Name’ ,xml_data.value(‘(event/@package)[1]’,’varchar(max)’) AS ‘Package’ ,xml_data.value(‘(event/@timestamp)[1]’,’datetime’) AS ‘Time’ ,xml_data.value(‘(event/data[@name=”state”]/value)[1]’,’int’) AS ‘State’ ,xml_data.value(‘(event/data[@name=”state_desc”]/value)[1]’,’varchar(max)’) AS ‘State Description’ ,xml_data.value(‘(event/data[@name=”failure_condition_level”]/value)[1]’,’int’) AS ‘Failure Conditions’ ,xml_data.value(‘(event/data[@name=”node_name”]/value)[1]’,’varchar(max)’) AS ‘Node_Name’ ,xml_data.value(‘(event/data[@name=”instancename”]/value)[1]’,’varchar(max)’) AS ‘Instance Name’ ,xml_data.value(‘(event/data[@name=”creation time”]/value)[1]’,’datetime’) AS ‘Creation Time’ ,xml_data.value(‘(event/data[@name=”component”]/value)[1]’,’varchar(max)’) AS ‘Component’ ,xml_data.value(‘(event/data[@name=”data”]/value)[1]’,’varchar(max)’) AS ‘Data’ ,xml_data.value(‘(event/data[@name=”info”]/value)[1]’,’varchar(max)’) AS ‘Info’ FROM ( SELECT object_name AS ‘event’ ,CONVERT(xml,event_data) AS ‘xml_data’ FROM sys.fn_xe_file_target_read_file( @datafilename , @metadataname , NULL, NULL) ) vIsAlive |
このあたりは通常の拡張イベントのログを確認するときと変わらないですね。
IsAlive の結果は [.xel] [.xem] に出力されますので、これらのファイルを [sys.fn_xe_file_target_read_file] で読み込ませると内容を表示することが可能です。
IsAlive の検査のタイミングでログが出力されますので、レコードは 1 分間隔で出力がされていますね。
実行の状態ですが以下のようなクエリで確認できます。
# SQL Server Profiler ではうまく取得できなかったのですよね。
SET NOCOUNT ON GO DECLARE @i int = 0 DROP TABLE #tmp select * INTO #tmp from sys.dm_exec_requests where 0 = 1 WHILE (@i < 1) BEGIN INSERT INTO #tmp SELECT * FROM sys.dm_exec_requests WHERE session_id = 51 and status <> ‘suspended’ SELECT @i = COUNT(*) FROM #tmp END SELECT? * FROM #tmp |
私が使っていた環境では、[session_id 51] が使用されていましたが他の環境でもこれと同じになるかは試してみないと微妙ですが。
IsAlive に使用されているアカウントに関しては SQL Server 2008 R2 以前と同じでクラスターのサービスアカウントとなるようです。
# 以下の画像は [sys.dm_exec_session] から取得した内容になります。
Denali の WSFC の変更点は以下のようになるようです。
Flexible Failover Policy は今回さわりを書いた内容ですが、SMB をサポートすることにより今まで 26 インスタンスが上限となっていたクラスター上のマルチインスタンス環境も緩和ができるみたいですね。
2008 R2 で通常のインスタンスでは SMB を使用して共有フォルダ上にデータベースのファイルをおくことができるようになっていましたがクラスターでも使えるようになるみたいですね。
データベース管理者向けの SQL Server 2008 R2 3 つの新機能
tempdb のローカルドライブへの配置に関しては SQL Server 2008 でもとあるトレースフラグを使用することで実施できるのですが、Denali では正式にサポートが発表されていますね。
Tech Ed のセッション資料を見て全然情報をキャッチアップできていないことを痛感しました。