En este post vamos a mostrar como podemos utilizar los Azure Elastic Database jobs para planificar jobs que se ejecuten de forma automática contra un pool de Azure SQL Databases. Durante el pasado SolidQ Summit 2016 se expuso esta funcionalidad como parte de los Elastic Pools bajo la versión V12 de SQL Databases pero no se mostró en las demostraciones.

El primer paso para poder utilizar Elastic Database jobs es crear un Elastic Pool. Sobre nuestro servidor de bases de datos SQL Database seleccionaremos la opción “Grupo Nuevo”:

elastic1

Una vez creado el grupo veremos que por defecto no nos incluye ninguna base de datos existente:

elastic2

El siguiente paso será añadir las bases de datos que deseemos. En nuestro ejemplo añadiremos las bases de datos BBDD1 y BBDD2:

elastic3

elastic4

Es importante que guardemos la configuración antes de seguir realizando ajustes para evitar perder los cambios realizados:

elastic5

La incorporación de las bases de datos en el pool elástico puede ser muy rápida (del orden de unos pocos minutos) o bastante lenta (del orden de varias horas). La operación se realiza de forma online pero se puede sufrir algún corte si durante el proceso existe una fuerte actividad transaccional en la base de datos. Por tanto es recomendable realizar esta operación durante el horario valle de nuestros sistemas y asegurándonos que no mantenemos transacciones de larga duración abiertas.

elastic6

Una vez tenemos las bases de datos en el pool es recomendable que ajustemos los valores de eDTUs (DTUs elásticas) mínimo y máximo. Esto nos permitirá evitar que una única base de datos consuma todos los recursos así como que las bases de datos “menos afortunadas” no dispongan ni de un mínimo de DTUs reservados:

elastic7

Llegados a este punto estamos en disposición de poder comenzar a crear los Elastic Database jobs. Para ello lo primero será intentar crear un trabajo nuevo:

elastic8

Cuando por primera vez intentamos añadir un trabajo se nos mostrará un asistente para instalar servicios. Los Elastic Database Job se despliegan como una pequeña solución independiente y desde esta pantalla configuraremos el usuario administrador y su contraseña:

elastic9

Una vez finaliza la instalación veremos que se nos ha creado un nuevo resource group con los componentes de la solución:

elastic10

Normalmente no necesitaremos modificar la configuración, pero si deseamos poder acceder desde el exterior a la base de datos que utiliza Elastic Database Jobs necesitaremos abrir el firewall:

elastic11

elastic12

Esta base de datos es accedida desde los CmdLets de Powershell para manejar los Elastic Database jobs. Por ello en la pantalla anterior decidimos abrir el acceso a todo el rango de IPs. Habitualmente nos limitaríamos a abrirlo de forma controlada al rango de IPs corporativo que requiera su uso.

Finalmente tras todos los preparativos podemos proceder con la creación de un primer job de prueba:

elastic13

Una vez lo ejecutemos veremos que queda registrada la ejecución satisfactoria en el portal:

 

elastic16

Si conectamos a las bases de datos veremos que el job ha creado correctamente la tabla en ambas bases de datos:

elastic14

Cuando queremos planificar un Azure Elastic Database job necesitamos tirar mano de PowerShell. El siguiente código crea un grupo de bases de datos sobre las que se planificará la ejecución de un job que ejecutará una vez cada minuto. Los conceptos utilizados son los siguientes:

  • Credential. Almacena los credenciales necesarios para la conexión
  • Target. Apunta a las bases de datos sobre las que ejecutaremos los jobs. Se pueden anidar mediante la creación de target hijos (ChildTarget) para facilitar la gestión.
  • Content. Es el cuerpo del job, la tarea a ejecutar. Disponemos de tareas de script y de tareas de despliegue de ficheros DACPAC.
  • Job. Representa el trabajo que mediante los credenciales suministrados conectará al target para ejecutar el content correspondiente.
  • Schedule. Representa una frecuencia de ejecución, es decir, será la planificación que utilizaremos en nuestro job
  • Trigger. Asocia un schedule a un job. La relación entre ambos en N a M por lo que podremos reutilizar los schedules para distintos jobs y también ejecutar un job en base a múltiples schedules.
$SubscriptionId

 =

“6627e12a-0ed3-4594-a940-d544fb2ead2d”$ResourceGroupName

 =

“SolidQ”$Location

 =

“North Europe”Add-AzureRmAccountSelect-AzureRMSubscription

 -SubscriptionId

$SubscriptionIdSelect-AzureSubscription

 -SubscriptionId

$SubscriptionIdimport-module

 ElasticDatabaseJobs

$serverPassword

 =

“Passw0rd”$secureString

 =

ConvertTo-SecureString$serverPassword

 -AsPlainText -Force

$credential

 =

New-Object

 System.Management.Automation.PSCredential ("administrador",

$secureString

)

Use-AzureSqlJobConnection

 -CurrentAzureSubscription -Credential

$credential# Creamos el scheduleNew-AzureSqlJobSchedule

 -ScheduleName

“Cada Minuto”

 -StartTime (

Get-Date

).ToUniversalTime() -MinuteInterval 1

# Creamos el target$databaseServerName

=

“elasticbbdd.database.windows.net”New-AzureSqlJobTarget

 -DatabaseName

“BBDD1”

 -ServerName

$databaseServerNameNew-AzureSqlJobTarget

 -DatabaseName

“BBDD2”

 -ServerName

$databaseServerNameNew-AzureSqlJobTarget

 -CustomCollectionName c  

Add-AzureSqlJobChildTarget

 -CustomCollectionName

“Mis BBDD”

 -ServerName

$databaseServerName

 -DatabaseName

“BBDD1”Add-AzureSqlJobChildTarget

 -CustomCollectionName

“Mis BBDD”

 -ServerName

$databaseServerName

 -DatabaseName

“BBDD2”# Creamos el contenidoNew-AzureSqlJobContent

 -ContentName

“Mi Script”

 -CommandText

“insert into test (a) select coalesce(max(a),0)+1 a from test (xlock)”# Guardamos el credentialNew-AzureSqlJobCredential

 -Credential

$credential

 -CredentialName

“mi credential”# Creamos el job$target

=

Get-AzureSqlJobTarget

 -CustomCollectionName

“Mis BBDD”$job

=

New-AzureSqlJob

 -Credential

“mi credential”

 -JobName

“Mi job”

 -ContentName

“mi script”

 -TargetId

$target

.TargetId 

# Asociamos el scheduler al jobNew-AzureSqlJobTrigger

 -ScheduleName

“Cada Minuto”

 –JobName

“Mi job”

 

Como podemos ver el código es bastante legible y sencillo aunque debemos indicar que la documentación que Microsoft ofrece de muchos comandos PowerShell para Azure es realmente lamentable. La documentación es sin duda el punto más flojo de muchas APIs y Cmdlets, lo cual dificulta su adopción creando errores y frustraciones claramente evitables. Los cambios también están al orden del día por lo que scripts y procesos que funcionen hoy tienen un alta probabilidad de no hacerlo en tan solo unas semanas/meses. Recomendamos por tanto testear extensivamente los scripts que utilicemos habitualmente antes de desplegar cualquier cambio en la versión de Azure Powershell o del módulo ElasticDatabaseJobs en producción.

 

Rubén Garrigós

Rubén Garrigós is an expert in high-availability enterprise solutions based on SQL Server design, tuning, and troubleshooting. Over the past ten years, he has worked with Microsoft data access technologies in leading companies around the world. He currently is a Microsoft SQL Server and .NET applications architect with SolidQ. Ruben is certified by Microsoft as a Solution Expert on the Microsoft Data Platform (MSCE: Data Platform) and as a Solution Expert on the Microsoft Private Cloud (MSCE: Private Cloud). As a Microsoft Certified Trainer (MCT), Ruben has taught multiple official Microsoft courses as well as other courses specializing in SQL Server. He has also presented sessions at official events for various Microsoft technologies user groups.