Tableau Server の監視〜通報〜復旧を自動化する

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

本日は、Tableau Server の状態監視と、障害通知や自動復旧についてご説明します。

Tableau Serverは社内の情報分析のみならず、DMPサービスの提供プラットフォームとして導入が進んでいます。利用者にサービスを継続して提供するために欠かせないのが監視〜通報〜復旧の自動化です。

はじめに

Tableau Server の状態監視ついて以下の3つの方法と、それぞれの目的と方法についてご説明します。

1. tabadminコマンドによるサービス
2. httpによるURL監視
3. systeminfoによる状態監視

1. tabadminコマンドによるサービス監視

Tableau Serverでは tabadmin というサーバー管理者向けのコマンドが提供されています。Linux の service コマンドや systemctl コマンドのように start / stop / restart / status に利用できます。

tabadmin コマンドで状態(status)を確認して、動いていない(RUNNINGではない)場合を障害発生と判定します。この方式は、内部コマンドによるサービスのプロセス/サービスの状態を監視することが目的です。

下の2つのコメント行は、サービス停止と判定した場合に、アラートメールの送信とサービスの再起動するコードをインクルードします。詳細は後ほど解説します。

service-statuscheck.ps1

$CMD="C:\Program Files\Tableau\Tableau Server\8.3\bin\tabadmin.exe"

$isFailed = $True
$ret = &$cmd "status"
if ($ret -eq 'Status: RUNNING') {
  Write-Host "Succeed."
  $isFailed = $False
} else {
  Write-Host "Failed."
} 

#. C:\Users\Administrator\Desktop\alert-mail.ps1
#. C:\Users\Administrator\Desktop\auto-regression.ps1

2. httpによるURL監視

この方式は、URLにHTTP要求を送り、200番台応答が返る事ができるかを判定することで、L7レベルの稼働状態を監視します。

監視の対象として、Tableau Server に対して直接 HTTP 要求を送る場合と、Tableau Server のフロントにあるロードバランサ(ELB)に対して HTTP 要求を送る場合では目的が異なります。前者は各サーバー毎の稼働状態の監視、後者はロードバランサを含めたサービスの監視となります。

以下のような URL に対して HTTP 要求を送ります。(外部からは HTTPS で確認するのが一般的です)

http://<domain-name>/auth

url-statuscheck.ps1

$CMD="C:\Program Files\Tableau\Tableau Server\8.3\bin\tabadmin.exe"

$isFailed = $True
try {
  $result = Invoke-WebRequest -Uri http://localhost/auth -MaximumRedirection 0 -TimeoutSec 10 
  if ($result.StatusCode -eq 200) {
    Write-Host "Succeed."
    $isFailed = $False
  } else {
    Write-Host "Failed. StatusCode=$result.StatusCode"
  }
} catch {
    Write-Host "Failed. Could not connect to remote server"
}

#. C:\Users\Administrator\Desktop\alert-mail.ps1
#. C:\Users\Administrator\Desktop\auto-regression.ps1

3. systeminfo による状態監視

Tableau Server では、指定した URL に HTTP 要求を送ると稼働状況をXML形式で情報を取得できます。この方式では各サーバー毎のより詳細な稼働状態を監視することが目的です。

情報を取得するには、以下のような URL に対して HTTP 要求を送ります。(外部からは HTTPS で確認するのが一般的です)

http://<domain-name>/admin/systeminfo

MonitoringServer_Primary

systeminfoによる状態取得の設定

デフォルトではこのURLへの接続を受け付けません。このURLに対するリクエストを許可するIPアドレスを追加するには、次の操作を行います。

手順1 リクエストを許可するIPアドレスを追加

以下の例では、内部からの状態取得を想定しているので、"127.0.0.1" を登録します。

PS C:\Users\Administrator> cd "C:\Program Files\Tableau\Tableau Server\8.3\bin"
PS C:\Users\Administrator> ./tabadmin set wgserver.systeminfo.allow_referrer_ips 127.0.0.1

手順2 設定の反映

PS C:\Program Files\Tableau\Tableau Server\8.3\bin> ./tabadmin config
===== Wrote configuration files to C:/ProgramData/Tableau/Tableau Server/data/tabsvc/config

手順3 Tableau Server の再起動

PS C:\Users\Administrator> ./tabadmin restart
===== Stopping service...
   -- Service stopped successfully
===== Starting service...
   -- Service was started successfully

確認

Tableau Server 上の Web ブラウザからhttp://localhost/admin/systeminfo にアクセスします。

MonitoringServer_Standalone

この構成では1台構成のローカル認証の場合は上記の情報が表示されます。

以下の例では、server の status 属性のみ監視していますが、更に各 worker の状態(OKやBUSY)を取得できますので、増強計画にも役立てるのではないかと考えられます。

systeminfo-statuscheck.ps1

$CMD="C:\Program Files\Tableau\Tableau Server\8.3\bin\tabadmin.exe"
$SYSTEMINFO_URL="http://localhost/admin/systeminfo"

$isFailed = $True
try {
  $result = Invoke-WebRequest -Uri $SYSTEMINFO_URL -MaximumRedirection 0 -TimeoutSec 10 
  if ($result.StatusCode -eq 200) {
    $xmlDoc = $result.Content
    $statusCord = $xmlDoc.systeminfo.service.status
    if ($statusCord -eq 'OK') {
      Write-Host "Succeed."
      $isFailed = $False
    } else {
      Write-Host "Failed."
    }
  } else {
    Write-Host "Failed."
  }
} catch {
  Write-Host "Failed. Could not connect to remote server"
}

#. C:\Users\Administrator\Desktop\alert-mail.ps1
#. C:\Users\Administrator\Desktop\auto-regression.ps1

アラートメールの送信

サービスが停止している場合(isFailed)は、アラートメールの送信します。以下の例ではSNSのパブリッシュ(メール送信)に AccessKey と SecretKey を指定していますが、IAMRole で EC2 インスタンスにSNS の権限が付与されている場合は不要です。

なお、この機能を有効にするためには、各スクリプトの以下の行頭のコメントを削除してください。

#. C:\Users\Administrator\Desktop\alert-mail.ps1

alert-mail.ps1

$topic="arn:aws:sns:ap-northeast-1:123456789012:service-alert"
$subject="[Tableau Server] Service Failure"
$message="Service AutoRegression Start!"

$accessKey="AAAAAAAAAAAAAAAAAA"
$secretKey="SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS"

if ($isFailed) {
  # Alert Mail
  Publish-SNSMessage -TopicArn $topic -Subject "subject" -Message "message" -AccessKey $accessKey -SecretKey $secretKey
}

サービスの自動復旧

サービスが停止している場合(isFailed)は、サービスの停止した後、開始します。

単一構成の場合はこれで構いませんが、クラスタを構成するサーバーの種類(Primary、BackupPrimary、Worker)によっては自動復旧の可否や順番を考慮してください。

なお、この機能を有効にするためには、各スクリプトの以下の行頭のコメントを削除してください。

#. C:\Users\Administrator\Desktop\auto-regression.ps1

 

auto-regression.ps1

if ($isFailed) {
  ## AutoRegression
  &$CMD "stop"
  &$CMD "start"
}

まとめ

Tableau Server の状態監視ついて3つの方法をご紹介しました。自己監視をするなら1,2,3いずれの方法も可能です。外部から監視する場合は2と3のいずれかで、内部の worker の状態まで監視したいのなら3となります。2の監視はフロントのロードバランサ(ELB)も含めたサービス監視ができますので、監視方法は目的によって使い分けてください。