Il presente articolo è stato tradotto automaticamente.

Previsioni: “Cloud” sparse

Scalabilità basata sulle prestazioni in Windows Azure

Joseph Fultz

Scaricare il codice di esempio

Senza dubbio, cloud computing sta acquisendo numerose mindshare e relativo utilizzo pratico è creazione volatili attraverso piattaforme tecnologiche e tutto il settore. Cloud computing non è un concetto nuovo o rivoluzionario;in realtà, è stato intorno per anni in forma di hosting condivisi e altri servizi. Ora, tuttavia, progressi della tecnologia e anni di esperienza in esecuzione server e servizi sono state cloud elaborazione non solo tecnicamente pratico, ma sempre più interessanti per i consumer e provider.

Avanzamento cloud computing raggiungeranno oltre IT e tocca ogni parte della società, ovvero da persone gestione hardware e servizi per sviluppatori e architetti, per i dirigenti che verrà approvare il budget e i pagamenti. Sarebbe meglio essere preparati per esso.

In questo articolo mi concentrerò principalmente su sviluppatori e progettisti che desiderano comprendere e sfruttare l'area di lavoro di elaborazione. Potrà fornire indicazioni su come eseguire una determinata attività, note su considerazioni sull'architettura e l'impatto sui costi e prestazioni. Immettere me sapere cosa ne pensi ancora più importante, gli argomenti trattati e su argomenti di particolare interesse nell'area informatica.

L'area di seeding

Fra i primi benefici persone lo stato attivo su cloud informatica è l'idea che i proprietari dell'applicazione non devono preoccuparsi di infrastruttura installazione, configurazione o manutenzione. Let’s essere sinceri: è piuttosto interessante.

Tuttavia, ritengo che è più importante concentrarsi sulla capacità di scalare o a servire le esigenze del proprietario dell'applicazione creando un costo più efficiente del modello senza compromettere le prestazioni o inutile spreco di risorse. In base alla mia esperienza, richiesta elasticity è qualcosa che appare in qualsiasi conversazione sulle cloud, indipendentemente dalla piattaforma vengano trattata.

In questo articolo illustrerò come utilizzare i dati dei contatori di prestazioni dall'esecuzione dei ruoli per automatizzare il processo di compattazione o aumentando il numero di istanze di un particolare ruolo Web. A tale scopo, potrà dare un'occhiata un'ampia sezione di Windows Azure caratteristiche e funzionalità, tra cui Windows Azure Compute, Windows Azure Storage e l'API di gestione REST.

Il concetto è abbastanza semplice: Verificare i dati sulle prestazioni raccolti con una soglia e quindi ridimensiona il numero di istanze in alto o in basso in modo appropriato. Non verrà esaminato in dettaglio sulla raccolta di dati diagnostici, è possibile lasciare che o un articolo futuro. Invece, presi in esame i dati del contatore delle prestazioni che consente di eseguire il dump di una tabella in Windows Azure Storage, nonché il codice e necessarie per eseguire la chiamata REST per modificare il numero di istanza nella configurazione dell'installazione. Inoltre, nell'esempio di codice scaricabile conterrà una semplice pagina renderà REST Gestione chiamate per forzare il conteggio delle istanze per cambiare in base all'input dell'utente. Lo scenario è simile al disegno in di Figura 1.

Figura 1 prestazioni basata su scala

Progetto di installazione

Per ottenere le cose avviate, ho creato un progetto di servizio di Windows Azure area contenente un ruolo di lavoro e un ruolo Web. Ho configurato il ruolo Web per pubblicare i dati del contatore di prestazioni, in particolare % tempo processore, dal ruolo e push di archiviazione ogni 20 secondi. Il codice per ottenere che risiede all'interno del metodo WebRole::OnStart e simile al seguente:

 

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);

Questo codice registra il contatore delle prestazioni, imposta l'intervallo di raccolta dei dati e quindi inserisce i dati negli archivi. Valori utilizzato per intervalli adatti per questo esempio, ma non sono rappresentativa di valori che utilizzerebbe in un sistema di produzione. In un sistema di produzione, l'intervallo di raccolta sarebbe molto più di quanto è possibile che si occupano delle operazioni 24/7. Inoltre, l'intervallo push di archiviazione sarebbe più tempo per ridurre il numero di transazioni eseguite a fronte di Windows Azure Storage.

Successivamente creare un certificato autofirmato che posso utilizzare per eseguire le chiamate API di gestione Azure REST. Ogni richiesta dovrà essere autenticato e il certificato è il mezzo per eseguire questa operazione. Seguite le istruzioni per la creazione di un certificato autofirmato nell'articolo TechNet Library “ crea Self-Signed certificato server in IIS 7 ” (technet.microsoft.com/library/cc753127(WS.10) ). Dopo aver esportato un file con estensione cer e un file pfx. Il file verrà utilizzato per firmare le richieste di invio per l'API di gestione e il file PFX verrà importato nel ruolo di calcolo tramite la gestione dell'interfaccia (vedere di Figura 2).

image: Importing Certificates

Figura 2 importazione certificati

Verrà tornarci in un secondo momento e catturare l'identificazione personale da inserire nelle impostazioni dei ruoli Web e ruoli di lavoro sto creando in modo da poter accedere all'archivio certificati e recuperare il certificato.

Infine, per il funzionamento in Windows Azure, è necessario un progetto di archiviazione a cui è possibile trasferire i dati delle prestazioni e un progetto di calcolo in cui è possibile pubblicare i due ruoli. Con questi elementi in luogo, è possibile spostare Carne del lavoro.

Esecuzione rapida o fredda, È IT?

Ora che ho ho ottenuto il ruolo Web configurata e il codice aggiunto per pubblicare i dati del contatore delle prestazioni, il passaggio successivo è per il recupero dei dati e confrontare un valore di soglia. Creerò un metodo TestPerfData in cui è possibile recuperare i dati dalla tabella e verificare i valori. Scriverò un'istruzione LINQ simile al seguente:

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

Confrontando l'utilizzo medio, è possibile determinare le prestazioni dell'applicazione corrente. Se le istanze in esecuzione troppo caldo, posso aggiungere istanze. Se in esecuzione a freddo e sto inutile spreco di risorse, significato denaro, dalla presenza di istanze non in esecuzione, è possibile ridurre il numero di istanze.

Troverete approfondite del codice e il programma di installazione necessari per accedere ai dati della tabella del contatore delle prestazioni in un post di blog che è stato scritto in blogs.msdn.com/b/joseph_fultz/archive/2010/06/30/querying-azure-perf-counter-data-with-linq.aspx . Utilizzare un semplice blocco if-then / else per valutare lo stato e determinare l'azione desiderata. Si parlerà dettagli una volta create le funzioni necessarie per modificare l'esecuzione configurazione del servizio.

Tramite l'API di gestione REST

Prima è possibile terminare di metodo TestPerfData, ho un po' più operazioni da eseguire. È necessario che alcuni metodi di suggerimenti per individuare il numero di istanze di un determinato ruolo, creare una nuova configurazione di servizio valida per il ruolo con un conteggio di istanza rettificato e, infine, consentono di aggiornare la configurazione.

A tal fine ho aggiunto un file di classe al progetto e creato i sei metodi statici illustrati in di Figura 3.

Figura 3 di metodi di configurazione

Metodo Descrizione
GetDeploymentInfo Recupera la configurazione di distribuzione, tra cui la configurazione del servizio codificato.
GetServiceConfig Recupera e decodifica la configurazione del servizio dalle informazioni di distribuzione.
GetInstanceCount Recupera il numero di istanza per un ruolo specifico.
ChangeInstanceCount Aggiorna la configurazione del servizio e restituisce il codice XML completo.
ChangeConfigFile Aggiorna la configurazione del servizio con la configurazione del servizio fornita alla funzione.
LookupCertificate Passa nell'impostazione ambiente contenente l'identificazione personale e recupera il certificato dall'archivio certificati.

Le chiamate che interagiscono con l'API di gestione REST devono includere un certificato. A tale scopo, il certificato viene aggiunto al servizio ospitato e l'identificazione personale viene aggiunto per la configurazione dei ruoli e utilizzato per recuperare il certificato in fase di esecuzione. Dopo aver configurati correttamente il servizio e il ruolo, è possibile utilizzare il codice seguente per ottenere il certificato dall'archivio certificati:

 

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);

Questo è il codice principale del metodo LookUpCertificate e nei metodi viene chiamato in cui si desidera interagire con l'API REST. Verrà esaminare la funzione GetDeploymentInfo ad esempio delle modalità di creazione di chiamate. In questo esempio è hardcoded alcune delle variabili necessarie per accedere all'API REST:

 

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

È necessario creare un oggetto HttpWebRequest con l'URI appropriato, impostare le intestazioni di richiesta e aggiungere il certificato. Qui è possibile generare l'URI di stringa e creare un nuovo oggetto HttpWebRequest utilizzarlo:

 

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

Per la chiamata sia valido, deve includere la versione nell'intestazione. Pertanto è possibile creare un insieme nome / valore, aggiungere i dati e il codice della versione e che aggiungere l'insieme di intestazioni di richiesta:

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

L'ultima operazione da eseguire per preparare questa particolare richiesta consiste nell'aggiungere il certificato per la richiesta:

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

Infine, è possibile eseguire la richiesta e leggere la risposta:

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

Questo è il modello generale che consente di costruire le richieste all'API di gestione REST. La funzione GetServiceConfig estrae la configurazione servizio di configurazione distribuzione mediante LINQ alle istruzioni XML simile al seguente:

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

Nel codice, restituire il GetServiceConfig viene passato per il GetInstanceCount ChangeInstance conteggio funzioni (o entrambi) per estrarre le informazioni o per aggiornarlo. Il valore restituito dalla funzione ChangeInstance è una configurazione servizio aggiornato, che viene passata a ChangeConfigFile. A sua volta ChangeConfigFile inserisce l'aggiornamento al servizio creando una richiesta simile a quello precedente utilizzata per recuperare le informazioni di distribuzione, con questi importanti differenze:

  1. “ /? comp = config ” viene aggiunto alla fine dell'URI
  2. Il verbo PUT utilizzato anziché GET
  3. La configurazione aggiornata viene inviata come corpo della richiesta

Considerazioni finali

Con le funzioni per cercare e modificare la configurazione del servizio e di dover eseguire altre operazioni preliminari, ad esempio l'impostazione di contatori, le impostazioni della stringa di connessione per archivi di configurazione e installazione dei certificati, è possibile implementare il test del limite di CPU.

Modello Visual Studio genera un ruolo di lavoro viene attivato ogni 10 secondi per l'esecuzione di codice. Per semplificare le cose, è possibile lasciare che non aggiungendo un timer singolo verrà eseguito ogni cinque minuti. Il timer, una semplice istruzione condizionale verifica se l'utilizzo è maggiore o minore rispetto all'85% e creerò due istanze del ruolo Web. In tal modo che garantisce che il numero di istanze indubbiamente verrà ridotta da due istanze iniziale per una singola istanza.

All'interno del ruolo di lavoro dispone di un metodo di esecuzione che dichiara e crea un'istanza del timer. All'interno del gestore trascorso timer è possibile aggiungere una chiamata alla funzione TestPerfData creata in precedenza. Per questo esempio, sta ignorando l'implementazione del maggiore, a condizione perché so che l'utilizzo della CPU non saranno elevato che. È possibile impostare la minore - a condizione di essere inferiore all'85%, come si è sicuri che sarà inferiore a quello medio del contatore. L'impostazione di queste condizioni forzate mi consentirà di visualizzare la modifica mediante la console di gestione Web o tramite Esplora Server in Visual Studio.

Nel blocco minore rispetto all'85% è possibile controllare il numero di istanza, modificare la configurazione del servizio e aggiornare l'esecuzione configurazione del servizio, come illustrato in di Figura 4.

Figura 4 il blocco minore di 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);
  }
}

È possibile assicurarsi che calcolare il numero di istanza prima di regolare verso il basso, poiché non si desidera passare a zero, questa non è una configurazione valida e avrà esito negativo.

Esecuzione dell'esempio

A questo punto si è pronto per eseguire l'esempio e dimostrare elasticity in Windows Azure. Knowing that my code is always right the first time—ahem—I right-click on the Cloud Service Project and click Publish. Nella finestra di dialogo offre la possibilità di configurare le credenziali, ho già fatto (vedere di Figura 5).

image: Publishing the Project

Figura 5 pubblicazione del progetto

È possibile scegliere OK e sufficiente attendere il pacchetto copiato backup e distribuiti. Al termine dell'installazione, è possibile passare alla console di gestione Web e vedere due ruoli Web e un ruolo di lavoro in esecuzione, come illustrato in di Figura 6.

image: Two Web Roles and One Worker Role

Figura 6 due ruoli Web e un ruolo di lavoro

Attendere l'evento del timer generare, eseguire il codice che consente di verificare che l'utilizzo medio della CPU è inferiore all'85% e diminuire il numero di istanza WebRole1. Una volta in questo caso, la pagina di gestione verrà aggiornata per riflettere l'aggiornamento della distribuzione.

Poiché l'utilizzo di piccole VM, modificando il conteggio da solo 1 e l'applicazione è leggero (una pagina .aspx), l'aggiornamento non richiede tempo e vedo finale, distribuzione di compattazione automatica come illustrato nella Figura 7 .

image: Now One Web Role and One Worker Role

Figura 7 di ruolo in un Web e un ruolo di lavoro

Skies blu

Si desidera condividere alcune idee finale sull'esempio nel contesto di considerare un'implementazione reale. Vi sono alcuni punti importanti da considerare.

Innanzitutto, il test è semplice e forzata. In un'implementazione reale che sarebbe necessario valutare più semplice l'utilizzo della CPU ed è necessario prendere in considerazione il quantum su cui si è verificato nell'insieme.

Inoltre, è necessario valutare i costi di utilizzo di Windows Azure Storage. A seconda della soluzione, potrebbe essere consigliabile ripulire i record nella tabella per solo quelli che interessano. È possibile ridurre l'intervallo di caricamento per ridurre i costi di transazione oppure è possibile spostare i dati in SQL Azure per ridurre al minimo tale costo.

È inoltre necessario considerare che cosa avviene durante un aggiornamento. Un aggiornamento diretto causerà la perdita di connettività. È consigliabile visualizzare nuove istanze di gestione temporanea e quindi passare l'indirizzo IP virtuale. In entrambi i casi, tuttavia, sarà necessario problemi di sessione e viewstate. Una soluzione migliore consiste nel passare senza informazioni sullo stato e disattivare il test durante la regolazione di scala.

Questo è tutto per l'implementazione di elasticity in Windows Azure. Scaricare il codice di esempio e iniziare a giocare con esso oggi.

Joseph Fultz  è un architetto presso il Microsoft Technology Center di Roma, dove lavora con utenti aziendali e ISV progettazione e soluzioni software di creazione di prototipi per soddisfare esigenze aziendali e di mercato. Egli è parlato in eventi come Tech•ed e gli eventi di formazione interna simili.

Grazie all'esperto di tecnica seguente per la revisione di questo articolo: Suraj Puri