Azure Analysis Services – Powershell Automation im Tagesgeschäft

Automatic

Im Rahmen des SQLGrillen 2017 hatte ich das Vergnügen mit Gabi Münster einen Vortrag über Azure Analysis Services und deren Automation halten zu dürfen. Diese Inhalte möchte ich euch nicht vorenthalten und im Folgenden näher erläutern, wobei es nicht um die Prozessautomatisierung der Datenbereitstellung geht sondern um die Automatisierung des Deployments bzw des eigentlichen Services, also Möglichkeiten wie man die Services dem Tagesgeschäft entsprechend optimal einsetzen kann. Die hierbei zum Einsatz kommenden Powershell Skripte habe ich versucht so einfach wie möglich zu halten um allen ein Verständnis zu ermöglichen.

Ausgangslage für die Powershell Automation

Sicherlich gibt es zahlreiche Möglichkeiten um die unterschiedlichen Funktionen, Services und VMs in Azure zu deployen oder bearbeiten, ob nun Azure Automation grafisch, als Runbook oder mit der Azure Command Line… ich habe mich als Ausgangslage dafür entschieden, dass die meisten im normalen Tagesgeschäft (meist on-prem) einen Server habe, der die Job-Steuerung übernimmt, dieser dient mir in meinen Beispielen als Ausgangspunkt für alle Skripte. Als weitere Voraussetzung nutze ich eine Active Directory (AD) Applikation und einen Service Principal um mich bzw meine Skripte an Azure anzumelden. Hierbei habe ich mich an die Beschreibung von Christos Matskas gehalten, die recht gut erläutert wie man sich einen Azure Automation Login erstellt.

Azure Analysis Services Automation programmieren

Diesen Login verwende ich nun entweder als Klartext oder als “INCLUDE” innerhalb meiner Skripte, um das Skript bei jeder Ausführung an Azure anzumelden.

$azureAccountName = "1234567-1234-1234-1234-012345678912" 
$azurePassword = ConvertTo-SecureString "Passwort@2017" -AsPlainText -Force 
$psCred = New-Object System.Management.Automation.PSCredential($azureAccountName, $azurePassword) 
Add-AzureRmAccount -Credential $psCred -ServicePrincipal -TenantId "1234567-1234-1234-1234-012345678912"

Was kann man nun automatisieren?

Mit Powershell kann man natürlich auch das Prozessieren der Datenbanken/Cubes automatisieren, aber darum soll es hier nicht gehen, sondern mehr darum was man als DBA oder DevOps “regelmäßig” machen kann/muss. Zum Beispiel benötigt man im Laufe des Tages nicht unbedingt die gleiche Leistung wie in der Nacht während der Verarbeitung. On-premise bleibt einem nichts anderes übrig als eine Hardware zu kaufen, die alle möglichen Lastzustände abdecken kann, in Azure ist das ein wenig anders, hier kann man entsprechend skalieren. Was unter Berücksichtgung eines gewissen Kostendrucks zu einem positiven Eindruck im Management führen kann, wenn man diesem erklären kann, dass die Kosten für eben diesen Azure Analysis Service durch Automatisierung variabl gestaltet werden kann. Aber fangen wir einmal vorne an…

Entsprechend der vorhandenen Umgebung oder der Konzeptionierung der Datenaufbereitung kann man sich zwischen horizontaler und vertikaler Skalierung entscheiden, bei der vertikalen Skalierung benötigen wir nur einen Azure Analysis Service, den wir nach Bedarf “größer” oder “kleiner” machen können. Bei horizontaler Skalierung könnte man sich zum Beispiel zu bestimmten Zeitpunkten weitere Azure Analysis Services hinzu deployen. Oder wenn man eine Testumgebung nur in bestimmten Zyklen braucht, dann kann man diese eben genauso automatisiert erstellen.

Deployment von Azure Analysis Services

Um den Azure Analysis Service neu oder weitere zu deployen benötigen wir den Powershell Befehl “New-AzureRmAnalysisServicesServer“, mit Anmeldung und weiterer Parametrisierung ergibt sich folgender Ablauf bzw folgendes Script:

  • Anmeldung an Azure
  • Variablen deklarieren (SubscriptionID, ResourceGroupName, AAS-Name, etc)
  • Prüfen ob die Ressource-Gruppe existiert, ggfs erstellen.
  • Prüfen ob der anzulegende Azure Analysis Service bereits existiert, ggfs erstellen
    • Angabe von ResourceGroupName, AAS-Name, Performance-Klasse und der EMail des Administrators
$myResourceGroupName = 'SQLGrillen2017'
$mySubscriptionID = '1234567-1234-1234-1234-012345678912'
$myLocation = 'West Europe'
$myAAServerName = 'asbeer01'
 
Set-AzureRmContext -SubscriptionId $mySubscriptionID
 
Get-AzureRmResourceGroup -Name $myResourceGroupName -ev notPresent -ea 0
if ($notPresent) {
    New-AzureRmResourceGroup -Name $myResourceGroupName -Location $myLocation
} else {
    write-host "ResourceGroup already exists"
}
 
Get-AzureRmAnalysisServicesServer -ResourceGroupName $myResourceGroupName -Name $myAAServerName -ev notPresent -ea 0
if ($notPresent) {
    New-AzureRmAnalysisServicesServer -ResourceGroupName $myResourceGroupName -Name $myAAServerName -Location $myLocation -Sku "S0" -Administrator "your-admin-mailadress@test-url.de"
} else {
    write-host "AAS Server already exists"
}

Die Ausführung dauert nicht wirklich lange, aber ein wenig Geduld muss schon aufbringen. (2-3 Minuten)

Geduld

Wieviel Leistung wann in Azure Analysis Services

Nun gibt es im Tagesverlauf oder Verlauf eines Monats unterschiedliche Last-Situationen, in der Nacht während der Verarbeitung wird mehr Leistung benötigt, als tagsüber wenn die Mitarbeiter nur ihre Reports ziehen oder Analysen machen. Weitere Möglichkeit sind der Monatsende, das Quartalsende oder der Jahresabschluss, hier wird wesentlich mehr Performance gebraucht als an anderen Tagen, wobei man on-Premise diese Kapazität von Anfang an bedenken muss und die Maschine entsprechend im voraus darauf auslegen, damit alle erdenklichen Last-Verhalten abgedeckt werden. Als Azure Analysis Services ist dies nun wesentlich einfacher, denn Azure bietet die Möglichkeit auf relativ einfache Art und Weise die Leistung des Service an die auftretende Last anzupassen. Auch hierzu benötigt man nur den Powershell Befehl “Set-AzureRmAnalysisServicesServer“, mit Anmeldung und weiterer Parametrisierung ergibt sich auch hier folgendes Script:

  • Anmeldung an Azure
  • Variablen deklarieren (SubscriptionID, ResourceGroupName, AAS-Name, etc)
  • Prüfen ob die Ressource-Gruppe existiert, ggfs erstellen.
  • Prüfen ob der anzulegende Azure Analysis Service existiert, um diese hoch oder runter zu skalieren
    • Angabe von ResourceGroupName, AAS-Name, neuer Performance-Klasse
$myResourceGroupName = 'SQLGrillen2017'
$mySubscriptionID = '1234567-1234-1234-1234-012345678912'
$myLocation = 'West Europe'
$myAAServerName = 'asbeer01'
 
Set-AzureRmContext -SubscriptionId $mySubscriptionID
 
# Upscale Azure Analysis Services
Get-AzureRmAnalysisServicesServer -ResourceGroupName $myResourceGroupName -Name $myAAServerName -ev notPresent -ea 0
if ($notPresent) {
    write-host "AAS Server does not exists"
} else {
    Set-AzureRmAnalysisServicesServer -Name $myAAServerName -ResourceGroupName $myResourceGroupName -SKU "S4"
}
 
# Downscale Azure Analysis Services
Get-AzureRmAnalysisServicesServer -ResourceGroupName $myResourceGroupName -Name $myAAServerName -ev notPresent -ea 0
if ($notPresent) {
    write-host "AAS Server does not exists"
} else {
    Set-AzureRmAnalysisServicesServer -Name $myAAServerName -ResourceGroupName $myResourceGroupName -SKU "S2"
}

Über das Skalieren des Azure Analysis Services kann man nun auch die Kosten reduzieren, da in der Nutzungsärmeren Zeit die benötigte Leistungsklasse verwendet wird und nur wenn die Verarbeitung läuft auf ein performanteres PerformanceModel skaliert. Dieses Skalieren funktioniert online, so dass man nicht einmal mit einer Unterbrechung des Services rechnen muss.

Resize Azure Analysis Services Demo

Kann man das auch abschalten?

In manchen Umgebungen und Lösungen ergibt sich unter Umständen auch die Notwendigkeit oder Möglichkeit den Azure Analysis Services komplett “abzuschalten”, entweder man hat horizontal skaliert und benötigt unter Tage kein Service oder die Solution gibt es her, dass nach der Verarbeitung kein Azure Analysis Service mehr benötigt wird. Hierzu bietet die Azure Powershell Automation ebenfalls ein Cmdlet (Suspend/Resume), mit dem man den Service pausieren bzw wieder starten kann. Da man dieses Skript nur einsetzt, wenn ein AAS bereits vorhanden ist, verzichte ich hier auf das Überprüfen der Ressourcen-Gruppe und prüfe nur, ob der Analysis Service mit dem gegebenen Namen tatsächlich vorhanden ist.

$myResourceGroupName = 'SQLGrillen2017'
$mySubscriptionID = '1234567-1234-1234-1234-012345678912'
$myLocation = 'West Europe'
$myAAServerName = 'asbeer01'
 
Set-AzureRmContext -SubscriptionId $mySubscriptionID
 
# Pause AAS
Get-AzureRmAnalysisServicesServer -ResourceGroupName $myResourceGroupName -Name $myAAServerName -ev notPresent -ea 0
if ($notPresent) {
    write-host "AAS Server does not exists"
} else {
    Suspend-AzureRmAnalysisServicesServer -Name $myAAServerName -ResourceGroupName $myResourceGroupName
}
 
# Resume AAS
Get-AzureRmAnalysisServicesServer -ResourceGroupName $myResourceGroupName -Name $myAAServerName -ev notPresent -ea 0
if ($notPresent) {
    write-host "AAS Server does not exists"
} else {
    Resume-AzureRmAnalysisServicesServer -Name $myAAServerName -ResourceGroupName $myResourceGroupName
}
Björn arbeitet in Hamburg als Datenbank-Administrator und Head of Competence für MS SQL und mySQL. Er nimmt regelmäßig an den PASS Regionalgruppen Treffen in Hamburg, den Veranstaltungen der PASS wie SQLSaturday und SQLGrillen teil und er organisiert in Hamburg das Azure Meetup. Er interessiert sich neben den Themen rund um den SQL Server, Powershell und Azure für Science-Fiction, Snowboarden, Backen 😉 und Radfahren.

One thought on “Azure Analysis Services – Powershell Automation im Tagesgeschäft

Leave a Reply

Your email address will not be published. Required fields are marked *