Este artículo proviene de un motor de traducción automática.

Pronóstico: una gran nube

Escalabilidad de Windows Azure basada en el rendimiento

Joseph Fultz

Descargar el ejemplo de código

Joseph FultzSin una duda, la nube informática es obtener gran cantidad de reconocimiento de los clientes, y su uso práctico es impulso a través de plataformas de tecnología y a lo largo de la industria. Nube de informática no es un concepto nuevo o revolucionario;de hecho, ha estado presente desde hace años en el formulario de alojamiento compartido y otros servicios de este tipo. Ahora, sin embargo, los avances tecnológicos y los años de experiencia con los servidores y servicios realizados nube, no sólo informática técnica práctica, pero cada vez más interesantes para los consumidores y proveedores.

Progreso en la nube de informática alcance más allá de TI y pulse en todas las partes de su compañía, de las personas que administran el hardware y servicios, para los desarrolladores y arquitectos, para los ejecutivos que se apruebe el presupuesto y pagar las facturas. Sería mejor preparado para él.

En esta columna, me centraré principalmente en los desarrolladores y arquitectos que deben conocer y aprovechar la nube de informática en su trabajo. Le proporcione algunas directrices sobre cómo realizar una tarea determinada, como notas sobre las consideraciones de arquitectura y su impacto en el costo y el rendimiento. Por favor, me saber su opinión de los temas tratan y, lo que es aún más importante, sobre los temas de interés especial en la nube de informática.

Inicialización de la nube

Uno de los primeros beneficia a personas foco en la nube de informática es la idea de que los propietarios de la aplicación no tienen que preocuparse por el programa de instalación de infraestructura, mantenimiento o configuración. Let’s ser honestos: que es muy interesante.

Sin embargo, creo que es más importante para centrarse en la capacidad de escalar o servir a las necesidades del propietario de la aplicación, lo que origina un costo más eficaz de modelo sin sacrificar el rendimiento o la pérdida de recursos. Según mi experiencia, la elasticidad de demanda es algo que aparece en una conversación acerca de la nube, independientemente de la plataforma que se está debatiendo.

En este artículo, mostraré cómo utilizar los datos del contador de rendimiento de la ejecución de funciones para automatizar el proceso de reducción o aumentando el número de instancias de una función determinada de Web. Para ello, echaremos un vistazo a una amplia muestra de las características de Windows Azure y funcionalidad, que incluye Compute Azure de Windows, Windows Azure almacenamiento y la API de administración de REST.

El concepto es bastante simple: comprobar los datos de rendimiento recopilados en un umbral y, a continuación, ajustar el número de instancias de arriba o hacia abajo según corresponda. No entraré en detalles acerca de la recopilación de datos de diagnóstico, cerrará que usted o para una futura entrega. En su lugar, examinaremos los datos del contador de rendimiento que haya sido volcados para una tabla de almacenamiento de Azure de Windows, así como el código y el programa de instalación necesario para ejecutar la llamada REST para cambiar el número de instancia de la configuración. Además, en el ejemplo de código descargable contiene una página simple que se realiza llamadas de la administración de REST para forzar que la cuenta de instancias para cambiar en función por el usuario. El escenario es similar al plano en de figura 1.

image: Performance-Based Scaling

Figura 1 de ajuste de escala de basada en el rendimiento

Configuración de proyecto

Para obtener las cosas que se ha iniciado, he creado un proyecto de servicio de Windows Azure nube que contiene una función de trabajo y una función de la Web. He configurado la función de la Web para publicar datos de contador de rendimiento, especialmente % tiempo de procesador, de la función y enviarlo a almacenamiento cada 20 segundos. El código para obtener ese curso se encuentra dentro del método WebRole::OnStart y tiene un aspecto similar al siguiente:

var performanceConfiguration = 
  new PerformanceCounterConfiguration();
performanceConfiguration.CounterSpecifier = 
  @"\Processor(_Total)\% Processor Time";
performanceConfiguration.SampleRate = 
  System.TimeSpan.FromSeconds(1.0);
            
// Add the new performance counter to the configuration 
config.PerformanceCounters.DataSources.Add(
  performanceConfiguration);
config.PerformanceCounters.ScheduledTransferPeriod = 
  System.TimeSpan.FromSeconds(20.0);

Este código registra el contador de rendimiento, establece el intervalo de recopilación de datos y, a continuación, inserta los datos de almacenamiento. Los valores que utiliza para los intervalos adecuados para este ejemplo, pero no son representativos de los valores que usaría en un sistema de producción. En un sistema de producción, el intervalo de la colección sería mucho más tiempo que sea preocuparse de las operaciones de 24 horas. Además, el intervalo que se va a insertar al almacenamiento sería más tiempo para reducir el número de transacciones en el almacenamiento de Windows Azure.

A continuación, se crea un certificado firmado que se puede usar para realizar las llamadas de API de administración de Azure REST. Todas las solicitudes deben ser autenticados y el certificado es el medio para conseguir esto. He seguido las instrucciones para crear un certificado con firma personal en el artículo de TechNet Library “ crear un certificado de servidor autofirmados en IIS 7 ” (technet.microsoft.com/library/cc753127(WS.10) ). Exportar un archivo .cer y un archivo pfx. El archivo .cer que se va a utilizar para firmar las solicitudes de envío a la API de administración y el archivo .pfx se importará a la función de cálculo a través de la administración de la interfaz (consulte de figura 2).

image: Importing Certificates

La figura 2 de la importación de certificados

Va a volver más tarde y tomar la huella digital para colocarlo en la configuración de las funciones de trabajo que estoy creando para que puedan tener acceso al almacén de certificados y recuperar el certificado y de las funciones de la Web.

Por último, para obtener este trabajo de Windows Azure, necesito un proyecto de cálculo, donde puede publicar las dos funciones y un proyecto de almacenamiento al que pueden transferir los datos de rendimiento. Estos elementos en su lugar, puede pasar a la sustancia del trabajo.

¿Está dañado urgente en ejecución o en frío?

Ahora que tengo el código agregado al publicar los datos del contador de rendimiento y la función de Web configurada, el siguiente paso es recuperar los datos y compararlo con un valor de umbral. Crearé un método TestPerfData en las que recuperar los datos de la tabla y probar los valores. Escribiré una instrucción de LINQ similar al siguiente:

double AvgCPU = (
  from d in selectedData
  where d.CounterName == 
    @"\Processor(_Total)\% Processor Time"
  select d.CounterValue).Average();

Al comparar la utilización media, puedo determinar el rendimiento de la aplicación actual. Si las instancias son demasiado elevada, puedo agregar instancias. Si se están ejecutando en frío y estoy malgastar los recursos, dinero de significado, al que se ejecutan las instancias no es necesario, puede reducir el número de instancias.

Encontrará la cobertura exhaustiva del código y el programa de instalación necesarios para tener acceso a la tabla de datos de contador de rendimiento en una entrada de blog que escribí en blogs.msdn.com/b/joseph_fultz/archive/2010/06/30/querying-azure-perf-counter-data-with-linq.aspx de . Uso un simple bloque if-then-else para evaluar el estado y determinar la acción que desee. Describiré los detalles de una vez creadas las funciones necesarias para la ejecución de cambiar la configuración de servicio.

La API de administración de REST

Antes de que pueda terminar el método TestPerfData, tengo que hacer algo más de trabajo. Necesito una serie de métodos que me ayude a detectar el número de instancias de una función dada, crear una nueva configuración de servicio válidos para esa función con un recuento actualizado de la instancia y, por último, permítame actualizar la configuración.

Con este fin he agregado un archivo de clase al proyecto y creado los seis métodos estáticos que se muestra en de figura 3.

La figura 3 de métodos de configuración

Método Descripción
GetDeploymentInfo Recupera la configuración de implementación, incluida la configuración del servicio codificado.
GetServiceConfig Recupera y descodifica la configuración del servicio de la información de implementación.
GetInstanceCount Obtiene el número de instancia de una función especificada.
ChangeInstanceCount Actualiza la configuración del servicio y devuelve el código XML completo.
ChangeConfigFile Actualiza la configuración del servicio con la configuración del servicio proporcionada a la función.
LookupCertificate Se pasa en la configuración de entorno que contiene la huella digital y recupera el certificado del almacén de certificados.

Las llamadas que interactúan con la API de administración de REST deben incluir un certificado. Para ello, se agrega el certificado para el servicio alojado y la huella digital se agrega a la configuración de la función y se utiliza para recuperar el certificado en tiempo de ejecución. Una vez que el servicio y la función están correcta, para obtener el certificado del almacén de certificados de uso en el siguiente código:

string Thumbprint = 
  RoleEnvironment.GetConfigurationSettingValue(
  ThumbprintSettingName);
X509Store certificateStore = 
  new X509Store(StoreName.My, StoreLocation.LocalMachine);
certificateStore.Open(OpenFlags.ReadOnly);
X509Certificate2Collection certs = 
  certificateStore.Certificates.Find(
  X509FindType.FindByThumbprint, Thumbprint, false);

Éste es el código principal del método LookUpCertificate y se le llama en los métodos en la que desea interactuar con la API de REST. Revisaré la función GetDeploymentInfo como un ejemplo de cómo se construyen las llamadas. En este ejemplo, he codificado algunas de las variables necesitan para tener acceso a la API de REST:

string x_ms_version = "2009-10-01";
string SubscriptionID = "[your subscription ID]";
string ServiceName = "[your service name]";
string DeploymentSlot = "Production";

Se necesita crear un HttpWebRequest con el URI adecuado, establezca los encabezados de solicitud y agregar el certificado a la misma. Aquí creo el identificador URI de cadena y cree un nuevo objeto HttpWebRequest utilizando:

string RequestUri = "https://management.core.windows.
net/" + 
  SubscriptionID + "/services/hostedservices/"+ 
  ServiceName + "/deploymentslots/" + DeploymentSlot;

HttpWebRequest RestRequest = 
  (HttpWebRequest)HttpWebRequest.Create(RequestUri);

Para que la llamada sea válido, debe incluir la versión en el encabezado. Por lo tanto, crea una colección de valores de nombre, agregar la clave de versión y los datos y agregue a la colección de encabezados de solicitud:

NameValueCollection RequestHeaders = 
  new NameValueCollection();
RequestHeaders.Add("x-ms-version", x_ms_version);
if (RequestHeaders != null) {
  RestRequest.Headers.Add(RequestHeaders);
}

Lo último que debe hacer para preparar esta petición determinada es agregar el certificado a la solicitud:

X509Certificate cert = LookupCertificate("RESTMgmtCert");
RestRequest.ClientCertificates.Add(cert);

Por último, ejecutar la solicitud y la respuesta de lectura:

RestResponse = RestRequest.GetResponse();
using (StreamReader RestResponseStream = new StreamReader(RestResponse.GetResponseStream(), true)) {
  ResponseBody = RestResponseStream.ReadToEnd();
  RestResponseStream.Close();
}

Que es el modelo general que utiliza para construir las solicitudes realizadas a la API de administración de REST. La función GetServiceConfig extrae la configuración del servicio de fuera de la configuración de implementación, el uso de LINQ para las instrucciones de XML similar al siguiente:

XElement DeploymentInfo = XElement.Parse(DeploymentInfoXML);
string EncodedServiceConfig = 
  (from element in DeploymentInfo.Elements()
where element.Name.LocalName.Trim().ToLower() == "configuration"
select (string) element.Value).Single();

En mi código, la devolución de la GetServiceConfig se pasa a la GetInstanceCount ChangeInstance recuento de las funciones (o ambos) para extraer la información o actualizarlo. El valor devuelto de la función ChangeInstance es una configuración de servicio actualizado, que se pasa a ChangeConfigFile. A su vez, ChangeConfigFile inserta la actualización para el servicio mediante la creación de una solicitud similar a la anterior se utiliza para recuperar la información de implementación, con estas diferencias importantes:

  1. “ /? comp = config ” se agrega al final de la dirección URI
  2. Se utiliza el verbo PUT en lugar de GET
  3. La configuración actualizada se transmite como el cuerpo de la solicitud

Montaje todos juntos

Con las funciones para buscar y cambiar la configuración del servicio y que lleva a cabo el otro trabajo preparatorio como, por ejemplo, configurando los contadores, la configuración de la cadena de conexión para el almacenamiento de configuración e instalar certificados, es hora de implementar la prueba de umbral de CPU.

La plantilla de Visual Studio genera una función de trabajo que se activa cada 10 segundos para ejecutar el código. Para simplificar las cosas, me estoy dejando pero agregar un único temporizador que se ejecute cada cinco minutos. En el temporizador, una simple instrucción condicional comprueba si la utilización de es superior o inferior al 85 por ciento y va a crear dos instancias de la función de la Web. De esta manera que garantiza que el número de instancias se reducirá definitivamente desde las dos instancias iniciales para una sola instancia.

Dentro de la función de trabajo hay un método de ejecución que se declara y crea una instancia del temporizador. Dentro del controlador de temporizador transcurridos, se agrega una llamada a la función TestPerfData que se ha creado anteriormente. En este ejemplo estoy se omitirá la implementación de la mayor: que la condición ya sé que la utilización de CPU no es alta. Se establece el menor - que condición sea inferior al 85 por ciento, estoy seguro de que será menor que el promedio del contador. Configuración de estas condiciones artificioso me permitirá ver el cambio a través de la consola de administración de Web o a través del explorador de servidores en Visual Studio.

En el bloque de menos de 85% Compruebe el número de instancia, modifique la configuración del servicio y actualizar la ejecución configuración del servicio, como se muestra en de figura 4.

La figura 4 de los bloques de menos de 85 %

else if (AvgCPU < 85.0) {
  Trace.TraceInformation("in the AvgCPU < 25 test.");
  string deploymentInfo = 
    AzureRESTMgmtHelper.GetDeploymentInfo();
  string svcconfig = 
    AzureRESTMgmtHelper.GetServiceConfig(deploymentInfo);
  int InstanceCount = 
    System.Convert.ToInt32(
    AzureRESTMgmtHelper.GetInstanceCount(
    svcconfig, "WebRole1"));
  if (InstanceCount > 1) {
    InstanceCount--;
    string UpdatedSvcConfig = 
      AzureRESTMgmtHelper.ChangeInstanceCount(
      svcconfig, "WebRole1", InstanceCount.ToString());
    AzureRESTMgmtHelper.ChangeConfigFile(UpdatedSvcConfig);
  }
}

Asegurarse de que comprobar el número de instancia antes de ajustar hacia abajo, ya que no es necesario que aparezca en cero, ya que esto no es una configuración válida y se produciría un error.

El ejemplo en ejecución

Ahora estoy listo para ejecutar el ejemplo y demostrar la elasticidad de Azure de Windows. Sabiendo que el código es siempre derecha de la primera vez, ahem: con el botón secundario en el proyecto de servicio de la nube y haga clic en publicar. El cuadro de diálogo le ofrece la opción para configurar las credenciales, que ya he hecho (consulte de figura 5).

image: Publishing the Project

La figura 5 de publicar el proyecto

Hacer clic en Aceptar y sólo tiene que esperar para que el paquete se copian hasta e implementar. Una vez finalizada la implementación, cambiar a la consola de administración de Web y ver dos funciones de Web y una función de trabajo en ejecución, como se muestra en de figura 6.

image: Two Web Roles and One Worker Role

La figura 6 de dos funciones de Web y una función de trabajo

Espera para que el evento de temporizador de activación, ejecución del código que determina que el promedio de la CPU es menor que el 85 por ciento y reducir el recuento de la instancia WebRole1. Una vez en este caso, la página de administración se actualizará para reflejar una actualización de la implementación.

Debido a que utilizo VM pequeñas, cambiar el recuento, sólo uno y la aplicación es ligero (una página de aspx), la actualización no llevan tiempo y se ve el final, implementación automática-reducido como se muestra en de la figura 7 .

image: Now One Web Role and One Worker Role

La figura 7 de Web de ahora una función y una función de trabajo

Skies azules

Me gustaría compartir algunas ideas finales acerca de la muestra en el contexto de una implementación real de tener en cuenta. Hay algunos puntos importantes que pensar.

En primer lugar, la prueba es trivial y artificioso. En una implementación real, tendrá que evaluar más sencilla la utilización de CPU y será necesario tener en cuenta el cuanto en el que se ha producido la colección.

Además, debe evaluar los costos de uso de almacenamiento de Windows Azure. En función de la solución, puede ser aconsejable para eliminar los registros de la tabla de sólo a los que son de interés. Se puede reducir el intervalo de carga para reducir los costos de transacción, o puede que desee mover los datos a Azure de SQL para minimizar el costo de ese.

También deberá tener en cuenta lo que ocurre durante una actualización. Una actualización directa hará que se pierda la conectividad a los usuarios. Es posible que sea mejor mostrar las nuevas instancias de ensayo y, a continuación, cambie la dirección IP virtual. Sin embargo, en cualquier caso, tendrá problemas de la sesión y el estado de vista. Una solución mejor es ir sin estado y deshabilitar la prueba durante el ajuste de escala.

Eso es todo para mi implementación de elasticidad de Azure de Windows. Descargar el ejemplo de código y empezar a reproducir con él en la actualidad.

Joseph Fultz es arquitecto en el centro de tecnología de Microsoft en Dallas, donde trabaja con clientes empresariales y diseñar el ISV y las soluciones de software de creación de prototipos para satisfacer las necesidades de negocio y de mercado. Se habla en eventos como, por ejemplo, Tech•Ed y eventos de formación interna similar.

Gracias al siguiente experto técnico para este artículo: Suraj Puri