Ejercicio: Protección, supervisión y ajuste de una base de datos migrada

Completado

Trabaja como desarrollador de bases de datos para la organización AdventureWorks. AdventureWorks ha vendido bicicletas y piezas de bicicleta directamente a los consumidores finales y distribuidores durante más de una década. Sus sistemas almacenan información en una base de datos que anteriormente se migró a Azure Database for PostgreSQL.

Tras la migración, quiere asegurarse de que el sistema funciona correctamente. Decide usar las herramientas de Azure disponibles para supervisar el servidor. Para mitigar la posibilidad de experimentar tiempos de respuesta lentos debido a la contención y la latencia, decide implementar la replicación de lectura. Debe supervisar el sistema resultante y comparar los resultados con la arquitectura de servidor flexible.

En este tutorial, realizará las tareas siguientes:

  1. Configurar las métricas de Azure para el servicio Azure Database for PostgreSQL.
  2. Ejecutar una aplicación de ejemplo que simula que varios usuarios consultan la base de datos.
  3. Consultar las métricas.

Configuración del entorno

Ejecute estos comandos de la CLI de Azure en Cloud Shell para crear una base de datos de Azure para PostgreSQL, con una copia de la base de datos adventureworks. Los últimos comandos imprimirán el nombre del servidor.

SERVERNAME="adventureworks$((10000 + RANDOM % 99999))"
PUBLICIP=$(wget http://ipecho.net/plain -O - -q)
git clone https://github.com/MicrosoftLearning/DP-070-Migrate-Open-Source-Workloads-to-Azure.git workshop

az postgres server create \
    --resource-group <rgn>[sandbox resource group name]</rgn> \
    --name $SERVERNAME \
    --location westus \
    --admin-user awadmin \
    --admin-password Pa55w.rdDemo \
    --version 10 \
    --storage-size 5120

az postgres db create \
    --name azureadventureworks \
    --server-name $SERVERNAME \
    --resource-group <rgn>[sandbox resource group name]</rgn>

az postgres server firewall-rule create \
    --resource-group <rgn>[sandbox resource group name]</rgn> \
    --server $SERVERNAME \
    --name AllowMyIP \
    --start-ip-address $PUBLICIP --end-ip-address $PUBLICIP

PGPASSWORD=Pa55w.rdDemo psql -h $SERVERNAME.postgres.database.azure.com -U awadmin@$SERVERNAME -d postgres -f workshop/migration_samples/setup/postgresql/adventureworks/create_user.sql

PGPASSWORD=Pa55w.rd psql -h $SERVERNAME.postgres.database.azure.com -U azureuser@$SERVERNAME -d azureadventureworks -f workshop/migration_samples/setup/postgresql/adventureworks/adventureworks.sql 2> /dev/null

echo "Your PostgreSQL server name is:\n"
echo $SERVERNAME.postgres.database.azure.com

Configuración de las métricas de Azure para el servicio Azure Database for PostgreSQL

  1. Abra una nueva pestaña en un explorador web y navegue hasta Azure Portal.

  2. En Azure Portal, seleccione Todos los recursos.

  3. Seleccione el nombre del servidor Azure Database for PostgreSQL comenzando con adventureworks.

  4. En Supervisión, seleccione Métricas.

  5. En la página del gráfico, agregue la métrica siguiente:

    Propiedad Valor
    Ámbito adventureworks[nnn]
    Espacio de nombres de métrica Métricas estándar del servidor PostgreSQL
    Métrica Conexiones activas
    Agregación Avg

    Esta métrica muestra el número promedio de conexiones hechas al servidor cada minuto.

  6. Seleccione Agregar métrica y agregue la métrica siguiente:

    Propiedad Valor
    Ámbito adventureworks[nnn]
    Espacio de nombres de métrica Métricas estándar del servidor PostgreSQL
    Métrica Porcentaje de CPU
    Agregación Avg
  7. Seleccione Agregar métrica y agregue la métrica siguiente:

    Propiedad Valor
    Ámbito adventureworks[nnn]
    Espacio de nombres de métrica Métricas estándar del servidor PostgreSQL
    Métrica Porcentaje de memoria
    Agregación Avg
  8. Seleccione Agregar métrica y agregue la métrica siguiente:

    Propiedad Valor
    Ámbito adventureworks[nnn]
    Espacio de nombres de métrica Métricas estándar del servidor PostgreSQL
    Métrica Porcentaje de E/S
    Agregación Avg

    Estas tres métricas finales muestran cómo la aplicación de prueba consume los recursos.

  9. Establezca el intervalo de tiempo en Últimos 30 minutos.

  10. Seleccione Anclar al panel y, después, seleccione Anclar.

Ejecución de una aplicación de ejemplo que simula que varios usuarios consultan la base de datos

  1. En la página del servidor Azure Database for PostgreSQL de Azure Portal, en Configuración, seleccione Cadenas de conexión. Copie la cadena de conexión ADO.NET en el Portapapeles.

  2. Vaya a la carpeta ~/workshop/migration_samples/code/postgresql/AdventureWorksSoakTest.

    cd ~/workshop/migration_samples/code/postgresql/AdventureWorksSoakTest
    
  3. Abra el archivo App.config con el editor de código:

    code App.config
    
  4. Reemplace el valor de Database por azureadventureworks y ConectionString0 por la cadena de conexión del Portapapeles. Cambie el identificador de usuario a azureuser@adventureworks[nnn] y establezca la contraseña en Pa55w.rd. El archivo completado debe tener un aspecto similar al ejemplo siguiente:

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
        <appSettings>
            <add key="ConnectionString0" value="Server=adventureworks101.postgres.database.azure.com;Database=azureadventureworks;Port=5432;User Id=azureuser@adventureworks101;Password=Pa55w.rd;Ssl Mode=Require;" />
            <add key="ConnectionString1" value="INSERT CONNECTION STRING HERE" />
            <add key="ConnectionString2" value="INSERT CONNECTION STRING HERE" />
            <add key="NumClients" value="100" />
            <add key="NumReplicas" value="1"/>
        </appSettings>
    </configuration>
    

    Nota:

    Por ahora, omita la configuración ConnectionString1 y ConnectionString2. Estos elementos se actualizarán más adelante en el laboratorio.

  5. Guarde los cambios y cierre el editor.

  6. En el símbolo del sistema de Cloud Shell, ejecute el comando siguiente para compilar y ejecutar la aplicación:

    dotnet run
    

    Cuando se inicia la aplicación, se genera un número de subprocesos, cada uno de los cuales simula un usuario. Los subprocesos realizan un bucle, ejecutando una serie de consultas. Verá que aparecen mensajes como los que se muestran a continuación:

    Client 48 : SELECT * FROM purchasing.vendor
    Response time: 630 ms
    
    Client 48 : SELECT * FROM sales.specialoffer
    Response time: 702 ms
    
    Client 43 : SELECT * FROM purchasing.vendor
    Response time: 190 ms
    
    Client 57 : SELECT * FROM sales.salesorderdetail
    Client 68 : SELECT * FROM production.vproductanddescription
    Response time: 51960 ms
    
    Client 55 : SELECT * FROM production.vproductanddescription
    Response time: 160212 ms
    
    Client 59 : SELECT * FROM person.person
    Response time: 186026 ms
    
    Response time: 2191 ms
    
    Client 37 : SELECT * FROM person.person
    Response time: 168710 ms
    

    Deje que la aplicación se ejecute mientras completa los pasos siguientes.

Visualización de las métricas

  1. Vuelva a Azure Portal.

  2. En el panel de la izquierda, seleccione Panel.

    Debe ver el gráfico que muestra las métricas del servicio Azure Database for PostgreSQL.

  3. Seleccione el gráfico para abrirlo en el panel Métricas.

  4. Permita que la aplicación se ejecute durante varios minutos (mientras más, mejor). A medida que pasa el tiempo, las métricas del gráfico deben verse similares al patrón que se muestra en la imagen siguiente:

    Image showing the metrics gathered while the sample app is running

    En este gráfico se resaltan los puntos siguientes:

    • La CPU se ejecuta a plena capacidad; la utilización alcanza muy rápidamente el 100 %.
    • El número de conexiones aumenta lentamente. La aplicación de ejemplo está diseñada para iniciar 101 clientes en una sucesión rápida, pero el servidor solo puede hacer frente a la apertura de algunas conexiones a la vez. El número de conexiones agregadas en cada "paso" del gráfico se reduce y el tiempo entre los "pasos" aumenta. Tras aproximadamente 45 minutos, el sistema solo puede establecer 70 conexiones de clientes.
    • El uso de la memoria aumenta de manera uniforme con el tiempo.
    • El uso de E/S es cercano a cero. Actualmente, todos los datos que requieren las aplicaciones cliente están almacenados en la memoria.

    Si deja que la aplicación se ejecute durante un tiempo suficiente, verá que las conexiones empiezan a generar errores, con los mensajes de error que se muestran en la imagen siguiente.

    Image showing the connection errors that can occur when the server has insufficient resources available

  5. En Cloud Shell, presione ENTRAR para detener la aplicación.

Configuración del servidor para recopilar datos de rendimiento de las consultas

  1. En la página del servidor Azure Database for PostgreSQL de Azure Portal, en Configuración, seleccione Parámetros del servidor.

  2. En la página Parámetros del servidor, establezca los parámetros siguientes en los valores especificados en la tabla siguiente.

    Parámetro Valor
    pg_qs.max_query_text_length 6000
    pg_qs.query_capture_mode ALL
    pg_qs.replace_parameter_placeholders ON
    pg_qs.retention_period_in_days 7
    pg_qs.track_utility ON
    pg_stat_statements.track ALL
    pgms_wait_sampling.history_period 100
    pgms_wait_sampling.query_capture_mode ALL
  3. Seleccione Guardar.

Examen de las consultas que ejecuta la aplicación mediante el Almacén de consultas

  1. Vuelva a Cloud Shell y reinicie la aplicación de ejemplo:

    dotnet run
    

    Permita que la aplicación se ejecute durante unos 5 minutos antes de continuar.

  2. Deje que la aplicación se ejecute y vaya a Azure Portal.

  3. En la página del servidor Azure Database for PostgreSQL, en Rendimiento inteligente, seleccione Información de rendimiento de consultas.

  4. En la página Información de rendimiento de consultas, en la pestaña Consultas de larga duración, establezca el valor de Número de consultas en 10, establezca Seleccionado por en avg y el Período de tiempo en Últimas 6 horas.

  5. Encima del gráfico, seleccione Acercar (el icono de lupa con el signo "+") un par de veces para centrarse en los datos más recientes.

    En función de cuánto tiempo deje que se ejecute la aplicación, verá un gráfico similar al que se muestra a continuación. El Almacén de consultas agrega las estadísticas de las consultas cada 15 minutos, por lo que cada barra muestra el tiempo relativo que cada consulta consume en cada período de 15 minutos:

    Image showing the statistics for long running queries captured by using Query Store

  6. Mantenga el mouse sobre cada barra para ver las estadísticas de las consultas en ese período de tiempo. Las tres consultas a las que el sistema dedica más tiempo son las siguientes:

    SELECT * FROM sales.salesorderdetail
    SELECT * FROM sales.salesorderheader
    SELECT * FROM person.person
    

    Esta información es útil para un administrador que supervisa un sistema. Tener una visión de las consultas que ejecutan los usuarios y las aplicaciones le permite comprender las cargas de trabajo que se realizan y, posiblemente, hacer recomendaciones a los desarrolladores de aplicaciones sobre cómo pueden mejorar su código. Por ejemplo, ¿realmente es necesario que una aplicación recupere las más de 121 000 filas de la tabla sales.salesorderdetail?

Uso del Almacén de consultas para examinar las esperas que se produzcan

  1. Seleccione la pestaña Estadísticas de espera.

  2. Establezca el Período de tiempo en Últimas 6 horas, Agrupar por en Evento y el Número máximo de grupos en 5.

    Al igual que con la pestaña Consultas de larga duración, los datos se agregan cada 15 minutos. La tabla situada debajo del gráfico muestra que el sistema ha sido el sujeto de dos tipos de eventos de espera:

    • Cliente: ClientWrite. Este evento de espera se produce cuando el servidor escribe datos (resultados) de vuelta en el cliente. No indica las esperas en las que se incurre mientras escribe en la base de datos.
    • Cliente: ClientRead. Este evento de espera se produce cuando el servidor espera leer datos (solicitudes de consulta u otros comandos) de un cliente. No está asociado al tiempo empleado en leer la base de datos.

    Image showing the wait statistics captured by using Query Store

    Nota:

    Las operaciones de lectura y escritura en la base de datos se indican mediante eventos de E/S en lugar de eventos de Cliente. La aplicación de ejemplo no incurre en ninguna espera de E/S, porque todos los datos que necesita se almacenen en caché después de la primera lectura. Si las métricas mostraron que la memoria se estaba agotando, es probable que vea que se producen eventos de espera de E/S.

  3. Vuelva a Cloud Shell y presione ENTRAR para detener la aplicación de ejemplo.

Incorporación de réplicas al servicio Azure Database for PostgreSQL

  1. En la página del servidor Azure Database for PostgreSQL de Azure Portal, en Configuración, seleccione Replicación.

  2. En la página Replicación, seleccione + Agregar réplica.

  3. En la página Servidor PostgreSQL, en el cuadro Nombre del servidor, escriba adventureworks[nnn]-replica1 y, luego, seleccione Aceptar.

  4. Cuando se haya creado la primera réplica (que tardará varios minutos), repita el paso anterior y agregue otra réplica denominada adventureworks[nnn]-replica2.

  5. Espere hasta que el estado de ambas réplicas pase de Implementando a Disponible antes de seguir.

    Image showing the Replication page for Azure Database for PostgreSQL. Two replicas have been added.

Configuración de las réplicas para permitir el acceso de cliente

  1. Seleccione el nombre de la réplica adventureworks[nnn]-replica1. Se lo dirigirá a la página de Azure Database for PostgreSQL para esta réplica.
  2. En Configuración, seleccione Seguridad de la conexión.
  3. En la página Seguridad de la conexión, establezca Permitir el acceso a servicios de Azure en ON y, luego, seleccione Guardar. Esta configuración permite que las aplicaciones que ejecuta mediante Cloud Shell accedan al servidor.
  4. Una vez guardada la configuración, repita los pasos anteriores y permita que los servicios de Azure accedan a la réplica adventureworks[nnn]-replica2.

Reinicio de cada servidor

Nota:

La configuración de la replicación no requiere reiniciar un servidor. El propósito de esta tarea es borrar la memoria y las conexiones extrañas de cada servidor, de modo que se limpien las métricas que se recopilan cuando se vuelve a ejecutar la aplicación.

  1. Vaya a la página del servidor adventureworks[nnn].
  2. En la página Información general, seleccione Reiniciar.
  3. En el cuadro de diálogo Reiniciar servidor, seleccione .
  4. Espere a que se cree el servicio antes de continuar.
  5. Siga el mismo procedimiento y reinicie los servidores adventureworks[nnn]-replica1 y adventureworks[nnn]-replica2.

Reconfiguración de la aplicación de ejemplo para utilizar las réplicas

  1. En Cloud Shell, edite el archivo App.config.

    code App.config
    
  2. Agregue las cadenas de conexión para la configuración ConnectionString1 y ConnectionString2. Estos valores deben ser los mismos que de ConnectionString0, pero con el texto adventureworks[nnn] reemplazado por adventureworks[nnn]-replica1 y adventureworks[nnn]-replica2 en los elementos Server e User Id.

  3. Establezca la configuración NumReplicas en 3.

    El archivo App.config debe tener un aspecto similar al siguiente:

    <configuration>
        <appSettings>
            <add key="ConnectionString0" value="Server=adventureworks101.postgres.database.azure.com;Database=azureadventureworks;Port=5432;User Id=azureuser@adventureworks101;Password=Pa55w.rd;Ssl Mode=Require;" />
            <add key="ConnectionString1" value="Server=adventureworks101-replica1.postgres.database.azure.com;Database=azureadventureworks;Port=5432;User Id=azureuser@adventureworks101-replica1;Password=Pa55w.rd;Ssl Mode=Require;" />
            <add key="ConnectionString2" value="Server=adventureworks101-replica2.postgres.database.azure.com;Database=azureadventureworks;Port=5432;User Id=azureuser@adventureworks101-replica2;Password=Pa55w.rd;Ssl Mode=Require;" />
            <add key="NumClients" value="100" />
            <add key="NumReplicas" value="3"/>
        </appSettings>
    </configuration>
    
  4. Guarde el archivo y cierre el editor.

  5. Vuelva a iniciar la aplicación:

    dotnet run
    

    La aplicación se ejecutará como antes. Pero esta vez las solicitudes se distribuyen entre los tres servidores.

  6. Permita que la aplicación se ejecute durante unos minutos antes de continuar.

Supervisión de la aplicación y observación de las diferencias en las métricas de rendimiento

  1. Deje que la aplicación se ejecute y vuelva a Azure Portal.

  2. En el panel de la izquierda, seleccione Panel.

  3. Seleccione el gráfico para abrirlo en el panel Métricas.

    Recuerde que en este gráfico se muestran las métricas para el servidor adventureworks*[nnn]*, pero no las réplicas. La carga de cada réplica debe ser muy similar.

    En el gráfico de ejemplo se muestran las métricas recopiladas para la aplicación durante un período de 30 minutos, desde el inicio. El gráfico muestra que el uso de la CPU todavía era alto, pero el uso de la memoria era menor. Además, después de unos 25 minutos, el sistema había establecido conexiones para más de 30 conexiones. Esto podría no parecer una comparación favorable con la configuración anterior, que admitía 70 conexiones después de 45 minutos. Sin embargo, ahora la carga de trabajo se ha distribuido en tres servidores, que se ejecutaban en el mismo nivel, y se establecieron 101 conexiones. Además, el sistema pudo llevar a cabo la ejecución sin informar ningún error de conexión.

    Image showing the metrics for the Azure Database for PostgreSQL server while running the application, after replication was configured

    Puede resolver el problema del uso de la CPU si escala de manera vertical a un plan de tarifa superior con más núcleos de CPU. El sistema de ejemplo que se usa en este laboratorio se ejecuta con el plan de tarifa Básico con 2 núcleos. Cambiar al plan de tarifa De uso general le proporcionará hasta 64 núcleos.

  4. Vuelva a Cloud Shell y presione ENTRAR para detener la aplicación.

Ahora aprendió a supervisar la actividad del servidor con las herramientas disponibles en Azure Portal. También aprendió a configurar la replicación y descubrió cómo la creación de réplicas de solo lectura puede distribuir la carga de trabajo en escenarios de datos con muchas operaciones de lectura.