• Save
Aula 7 - Hands On - Configurando nossa aplicação na AWS com EC2, Elastic Load Balancing e Auto Scaling
Upcoming SlideShare
Loading in...5
×
 

Aula 7 - Hands On - Configurando nossa aplicação na AWS com EC2, Elastic Load Balancing e Auto Scaling

on

  • 1,444 views

Prática de como implantar nossa aplicação web em uma instância EC2, com ELB e Auto Scaling.

Prática de como implantar nossa aplicação web em uma instância EC2, com ELB e Auto Scaling.

Statistics

Views

Total Views
1,444
Views on SlideShare
1,444
Embed Views
0

Actions

Likes
1
Downloads
0
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as OpenOffice

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Aula 7 - Hands On - Configurando nossa aplicação na AWS com EC2, Elastic Load Balancing e Auto Scaling Aula 7 - Hands On - Configurando nossa aplicação na AWS com EC2, Elastic Load Balancing e Auto Scaling Presentation Transcript

  • Introdução a Sistemas DistribuídosHands On ­ Configurando nossa aplicação na AWS com EC2, Elastic Load Balancing e AutoScalingEduardo de Lucena FalcãoAmazon CloudWatch
  • 25/05/2013 2Apresentação da Proposta IAlunos
  • 25/05/2013 3Depoimento FaculdadesAnhanguera - Case de usoda Nuvem da AWSVídeo
  • 25/05/2013 4Configuração do Ambientede Programação para aAWSHands On - 1
  • 25/05/2013 5Configurando seu Ambiente● Não é preciso muito, a AWS é 100% virtual:– Um desktop ou notebook (com acesso a Internet, é claro);– Um cartão de crédito (pra configurar uma conta AWS);– Um telefone (para completar o processo de registro).● Software:– Java: para utilizar as ferramentas de linha de comandoe/ou como Linguagem de Programação da sua aplicação(API Java p/ AWS);– Eclipse (caso realmente for programar em Java).
  • 25/05/2013 6Conta AWS●Sugiro fortemente que vocês criem suas próprias contas AWS.– Possibilita o uso do AWS Management Console;– Amazon Free Usage Tier por um ano para todos os serviços:● Por exemplo, é possível utilizar uma instância micro por 750h/mês.– S3: 5 GB de armazenamento padrão, 20.000 solicitações de Get,2.000 solicitações de Put, 15 GB de transferência de dados parafora a cada mês;– SQS e SimpleDB também oferecem transferências de dados eespaço grátis no primeiro ano.● Lembre-se de parar as instâncias quando não estiver mais usando, eisso lhe fará economizar;● É possível criar alarmes: Amazon CloudWatch.
  • 25/05/2013 7Conta AWS● Para quem não quiser criar a conta:– Fornecerei um par de chaves para acesso ;)
  • 25/05/2013 8Eclipse e JVM e AWS sdk● Opção 1● $ sudo apt-get update● $ sudo apt-get install openjdk-6-jdk● Extrair pasta do eclipse juno em suahome– http://www.eclipse.org/downloads/● Extrair pasta do AWS JDK em suahome– http://sdk-for-java.amazonwebservices.com/latest/aws-java-sdk.zip● Iniciar um projeto Java e adicionar asbibliotecas da pasta aws-java “libs” e“thitrd-party” ao nosso classpath● Opção 2 (mais fácil mas falha às vezes)● $ sudo apt-get install eclipse1. Abra "Help" (Ajuda) -> "Install NewSoftware." ;2. Digite http://aws.amazon.com/eclipsena caixa de texto rotulada “Work with”;3. Selecione “AWS Toolkit for Eclipse” nalista a seguir;4. Clique em “Next”.1. Escolha AWS SDK for Java5. Next ==> Next...
  • 25/05/2013 9Primeiro Teste● Crie um novo Projeto Java;– Na pasta aws-java-sdk-1.4.3/samples/AwsConsoleApp● Copie o AWSConsoleApp.java e AwsCredentials.propertiespara a pasta src do seu projeto● Adicione os seguintes jars no buildpath:– aws-java-sdk-1.4.3/lib/aws-java-sdk-1.4.3.jar– Todos os jars da pasta third-party● Peça a AwsCredentials.properties ao professor e atualize;● Execute AWSConsoleApp.java
  • 25/05/2013 10Primeiro Teste
  • 25/05/2013 11Gerenciador de das Instâncias EC2● Peça a classe chamada EC2Manager ao professor:– Nela teremos todos os nossos métodos paracriar/parar/terminar nossa instâncias EC2.– É uma alternativa a vocês não terem acesso ao AWSConsole Manager.
  • 25/05/2013 12Criando nossa 1ª instância EC2● Peça seu par de chaves ao professor. (para criar ainstância acoplada à sua chave)● Execute o método createNewInstance (uma única vez)– Em seguida: execute getInstancePublicDns, e guarde oDNS público que o método imprimirá na console.● Checando se nossa instância está executando:1.Conectar-se via ssh à mesma;2.Checar via AWS Management Console.
  • 25/05/2013 13Conectando à Instância EC21.Abra o terminal;2.Localize sua chave privada (eduardo-falcao.pem);3.Sua chave não pode estar publicamente visível para oSSH funcionar:1.$ chmod 400 eduardo-falcao.pem4.Conecte-se a sua intância usando o DNS Público dela:[ec2-54-235-27-45.compute-1.amazonaws.com]5.$ ssh -i eduardo-falcao.pem ubuntu@ec2-54-235-27-45.compute-1.amazonaws.com
  • 25/05/2013 14Implantando a aplicaçãoEtapa 1: localmenteHands On - 2
  • 25/05/2013 15Testando a aplicação● Primeiro testamos localmente – mais fácil de depurar1.Gerar o WAR;2.Instalar o Tomcat3.Deploy do WAR no Tomcat
  • 25/05/2013 16Para instalação do Tomcat c/Eclipse no Ubuntu1. $ sudo apt-get install tomcat7 $ sudo apt-get update (executar antes, caso ainda não otenha executado)2. Para linkar ao Eclipse: (para testar durante odesenvolvimento)1. $ sudo ln -s /var/lib/tomcat7/conf /usr/share/tomcat7/conf2. $ sudo ln -s /etc/tomcat7/policy.d/03catalina.policy/usr/share/tomcat7/conf/catalina.policy3. $ sudo ln -s /var/log/tomcat7 /usr/share/tomcat7/log4. $ sudo chmod -R 777 /usr/share/tomcat7/conf
  • 25/05/2013 17Deploy no Tomcat (local)● cd /var/lib/tomcat7/webapps/ROOT● sudo unzip -d . /home/eduardo/workspace/Quicksort-Restful.war● http://localhost:8080 (Welcome Page)● http://localhost:8080/requests (Página onde recebo minhasrequisições)● $ curl -X POST -d @intArray.json http://localhost:8080/requests--header "Content-Type:application/json"
  • 25/05/2013 18Implantando a aplicaçãoEtapa 2: remotamente (EC2)Hands On - 3
  • 25/05/2013 19Implantando a aplicação no EC21.Copiar o arquivo .WAR para a instância EC2 $ scp -i eduardo-falcao.pem/home/eduardo/workspace/Quicksort-Restful.war ubuntu@ec2-50-16-146-100.compute-1.amazonaws.com:/home/ubuntu2.Conectar-se à sua instância via ssh– ssh -i eduardo-falcao.pem ubuntu@ec2-50-16-146-100.compute-1.amazonaws.com3.Instalar o tomcat: $ sudo apt-get update (se ainda não tiver executado antes) $ sudo apt-get install tomcat7
  • 25/05/2013 20Configurando o Tomcat no EC2● Configurando as portas do Tomcat: o Tomcat7 roda na porta 8080por padrão. Mas a porta padrão no Grupo de Segurança do EC2 é80. Lembre-se de checar isso no Amazon EC2 Management Console.– $ sudo vim /etc/tomcat7/server.xml– $ sudo vim /etc/default/tomcat7– $ sudo service tomcat7 restart<Connector port="80" protocol="HTTP/1.1"connectionTimeout="20000"URIEncoding="UTF-8"redirectPort="443" />AUTHBIND=yes
  • 25/05/2013 21Deploy do WAR no Tomcat● $ cd /var/lib/tomcat7/webapps/ROOT/● $ sudo rm -rf *● Considerando que ainda estamos na pasta ROOT:– $ sudo unzip -d . /home/ubuntu/Quicksort-Restful.war● Checar se o WAR foi implantado via Web browser:– DNS público: http://ec2-50-16-146-100.compute-1.amazonaws.com/– Curl (POST):● curl -X POST -d @intArray.json http://ec2-50-16-146-100.compute-1.amazonaws.com/requests --header "Content-Type:application/json"
  • 25/05/2013 22Testando a aplicação1º Teste de Carga: Sistema ConvencionalQuantas requisições eu consigo atender em 5 minutos?Hands On - 4
  • 25/05/2013 23Carga de Trabalho
  • 25/05/2013 24Wrong Way!● Bash Script com requisições POST.●Bloqueante#!/bin/bashSTART=$(date +%s)for i in {1..5}docurl -X POST -d @intArray-5000.json http://ec2-50-16-146-100.compute-1.amazonaws.com/requests --header"Content-Type:application/json"doneEND=$(date +%s)DIFF=$(( $END - $START ))echo "It took $DIFF seconds"●Não Bloqueante#!/bin/bashSTART=$(date +%s)for i in {1..5}docurl -X POST -d @intArray-5000.json http://ec2-50-16-146-100.compute-1.amazonaws.com/requests --header"Content-Type:application/json" &doneEND=$(date +%s)DIFF=$(( $END - $START ))echo "It took $DIFF seconds"
  • 25/05/2013 25Right Way! (Apache Benchmark)● INSTALAR EM UMA INSTÂNCIA EC2 AWS● $ sudo apt-get install apache2-utils● Requisição HTTP/GET de uma página HTML– Quantidade de requisições: 100– Nível de concorrência: 10– URL:http://ec2-50-16-146-100.compute-1.amazonaws.com/● ab -n 100 -c 10http://ec2-50-16-146-100.compute-1.amazonaws.com/
  • 25/05/2013 26Right Way! (Apache Benchmark)
  • 25/05/2013 27Right Way! (Apache Benchmark)http://httpd.apache.org/docs/2.2/programs/ab.html
  • 25/05/2013 28Projetando nosso Teste● Quicksort● Quanto ao nível de concorrência?● Quanto à heterogeneidade da carga?– Nº de elementos de nosso array:● Máximo e mínimo;– Quantidades de requisições?– Conteúdo das requisições?● Pior e melhor caso do algoritmo.● Objetivo: aproximar nosso teste da realidade!
  • 25/05/2013 29Tipos de Teste1.Em quanto tempo meu sistemaconsegue atender N requisições?2.Quantas requisições eu consigoatender em N minutos?
  • 25/05/2013 30Projetando nosso Teste● Quicksort – qual a carga real desse sistema? o.O● Quanto ao nível de concorrência? 100● Quanto à heterogeneidade da carga?– Nº de elementos de nosso array:● Muito pouco: 10;● Pouco: 100;● Médio: 1000;● Alto: 5000;● Muito alto: 10000;– Quanto tempo de medição? 20 minutos– Conteúdo das requisições? (Não abordado)● Pior e melhor caso do algoritmo.
  • 25/05/2013 31Não faça de seu PC/Rede um gargaloem seus testes
  • 25/05/2013 32Exemplo simples● Array com 10 elementos (Meu PC)– Time taken for tests: 300.035 seconds– Complete requests: 1447– Failed requests: 0– Requests per second: 4.82 [#/sec] (mean)– Time per request: 207.350 [ms] (mean, across all concurrent requests)● Array com 10 elementos (EC2)– Time taken for tests: 300.034 seconds– Complete requests: 15461– Failed requests: 0– Requests per second: 51.53 [#/sec] (mean)– Time per request: 19.406 [ms] (mean, across all concurrent requests)
  • 25/05/2013 33Análise Geral dos Resultados● Testado a partir de meu PC● Quando o nosso sistema convencional é submetido auma carga variada (de 10 a 10000 elementos porrequisição) fornecida por 50 usuários simultâneosdurante 5 minutos nós temos os seguintes resultados:– Complete requests: 4449 (1447+1422+1263+209+108 )– Failed requests: 5– Requests per second: 2,964 =(4,82+4,74+4,21+0,69+0,36)/5– Time per request (ms):(1447*207.350)+(1422*211.070)+(1263*237.584)+(209*1447.802)+(108*2786.235) = 1503749.58 / 4449 = 337.997 ms● Testado a partir de uma instância EC2● Quando o nosso sistema convencional ésubmetido a uma carga variada (de 10 a10000 elementos por requisição) fornecidapor 50 usuários simultâneos durante 5minutos nós temos os seguintes resultados:– Complete requests: 58539(15461+14758+13196+10536+4588)– Failed requests: 0– Requests per second: 39,018 =(51,53+49,19+43,98+35,10+15,29)/5– Time per request (ms):(15461*19.406)+(14758*20.330)+(13196*22.738)+(10536*28.487)+(4588*65.399) =1500306,598 / 58539 = 25.629 ms
  • 25/05/2013 34Projetando nosso Teste● Quicksort – qual a carga real desse sistema? o.O● Quanto ao nível de concorrência? 100● Quanto à heterogeneidade da carga?– Nº de elementos de nosso array:● Muito pouco: 10;● Pouco: 100;● Médio: 1000;● Alto: 5000;● Muito alto: 10000;– Quanto tempo de medição? 20 minutos– Conteúdo das requisições? (Não abordado)● Pior e melhor caso do algoritmo.
  • 25/05/2013 35Projetando nosso Teste#!/bin/bash#20 minutos array com 10 números, -n 1000000 para que nao pare em 50K requisicoesab -t 1200 -n 1000000 -c 20 -p intArray-10.json -T Content-Type:application/json http://ec2-50-16-146-100.compute-1.amazonaws.com/requests > resposta-arrays-com-tamanho-10.txt &#20 minutos array com 100 números, -n 1000000 para que nao pare em 50K requisicoesab -t 1200 -n 1000000 -c 20 -p intArray-100.json -T Content-Type:application/json http://ec2-50-16-146-100.compute-1.amazonaws.com/requests > resposta-arrays-com-tamanho-100.txt &#20 minutos array com 1000 números, -n 1000000 para que nao pare em 50K requisicoesab -t 1200 -n 1000000 -c 20 -p intArray-1000.json -T Content-Type:application/json http://ec2-50-16-146-100.compute-1.amazonaws.com/requests > resposta-arrays-com-tamanho-1000.txt &#20 minutos array com 5000 números, -n 1000000 para que nao pare em 50K requisicoesab -t 1200 -n 1000000 -c 20 -p intArray-5000.json -T Content-Type:application/json http://ec2-50-16-146-100.compute-1.amazonaws.com/requests > resposta-arrays-com-tamanho-5000.txt &#20 minutos array com 10000 números, -n 1000000 para que nao pare em 50K requisicoesab -t 1200 -n 1000000 -c 20 -p intArray-10000.json -T Content-Type:application/json http://ec2-50-16-146-100.compute-1.amazonaws.com/requests > resposta-arrays-com-tamanho-10000.txt &
  • 25/05/2013 36Análise dos Resultados● Array com 10 elementos– Time taken for tests: 1200.056 seconds– Complete requests: 70950– Failed requests: 0– Requests per second: 59.12 [#/sec] (mean)– Time per request: 16.914 [ms] (mean, across all concurrent requests)● Array com 100 elementos– Time taken for tests: 1200.056 seconds– Complete requests: 69535– Failed requests: 0– Requests per second: 57.94 [#/sec] (mean)– Time per request: 17.258 [ms] (mean, across all concurrent requests)
  • 25/05/2013 37Análise dos Resultados● Array com 1000 elementos– Time taken for tests: 1200.037 seconds– Complete requests: 74929– Failed requests: 0– Requests per second: 62.44 [#/sec] (mean)– Time per request: 16.016 [ms] (mean, across all concurrent requests)● Array com 5000 elementos– Time taken for tests: 1200.157 seconds– Complete requests: 42301– Failed requests: 0– Requests per second: 35.25 [#/sec] (mean)– Time per request: 28.372 [ms] (mean, across all concurrent requests)
  • 25/05/2013 38Análise dos Resultados● Array com 10000 elementos– Time taken for tests: 1200.507 seconds– Complete requests: 24050– Failed requests: 0– Requests per second: 20.03 [#/sec] (mean)– Time per request: 49.923 [ms] (mean, across all concurrent requests)
  • 25/05/2013 39Análise Geral dos Resultados● Testado a partir de uma instância EC2● Quando o nosso sistema convencional é submetido a uma cargavariada (de 10 a 10000 elementos por requisição) fornecida por 100usuários simultâneos durante 20 minutos nós temos os seguintesresultados:– Complete requests: 281765 (70950+69535+74929+42301+24050)– Failed requests: 0– Requests per second: 46,956 = (59,12+57,94+62,44+35,25+20,03)/5– Time per request (ms):(70950*16,914)+(69535*17,258)+(74929*16,016)+(42301*28,372)+(24050*49,923) = 6000958,316 / 281765 = 21.297 ms
  • 25/05/2013 40Como otimizar o nosso Sistemavia AWS?● Utilizando instâncias EC2, com o AutoScalepara escalonar automaticamente, e o ElasticLoad Balancer para fazer um balanceamentode carga automático entre essas instâncias.
  • 25/05/2013 41Configurando o ElasticLoad BalancerHands On - 5
  • 25/05/2013 42Criando uma Imagem● Se tudo tiver ocorrido perfeitamente até agora, jápodemos criar uma Imagem do nosso Sistema.● Execute o método registerNewAmi (guarde a imageID)● Execute o método createNewInstance, usando a novaimageID como parâmetro– Em seguida: execute getInstancePublicDns, e guarde oDNS público que o método imprimirá na console;– Verifique se sua instância iniciou, tentando acessar osserviços fornecidos pela mesma.
  • 25/05/2013 43Elastic Load Balancing● Exemplo: criar um ELB com 5 máquinas, sem AutoScale, e rodarei nosso benchmark.● Passo 1: criar novas instâncias EC2 com nossa AMI previamente gerada.●Passo 2: criar um ELB passando como instância os Ids dessas máquinas recém-criadas, Zonas de Disponibilidade em que o ELB atuará, e seus Listeners.– Passo 2.1: configure um Listener.● Listener listener = new Listener("HTTP", 80, 80);● Parâmetros;– Protocol: TCP, HTTP, HTTPS;– Load balancer port – porta na qual o ELB irá receber as requisições.– Instance port – porta na qual o ELB usará para encaminhar requisições àoutras instâncias.– createElasticLoadBalancer("elbSimples", listener, new String[] {"i-2edf554f","i-b62006dd","i-76df5517"}, new String [] {"us-east-1b"});
  • 25/05/2013 44Elastic Load Balancer● Passo 3: configure o HealthCheck;– Timeout: tempo limite pra receber uma resposta de um“health check”;– Interval: tempo entre uma checagem e outra;– UnhealthyTreshold: número de checagens antes de declararuma instância como “Unhealthy”/não saudável;– HealthyTreshold: número de checagens antes de declararuma instância como “Healthy”/saudável;– Target: parte do sistema em que será checado a saúde.
  • 25/05/2013 45Elastic Load Balancer● Passo 3: configure o HealthCheck;
  • 25/05/2013 46Elastic Load Balancer● Passo 4: requisite o DNS público de seu ELB;– getLoadBalancerPublicDns("elbSimples")● Passo 5: checando se nosso ELB está funcionando;– Entre com o DNS no browser e verifique se o serviçoestá sendo fornecido como esperado.● Agora vamos projetar a nossa 2ª carga de teste!
  • 25/05/2013 47Testando a aplicação2º Teste de Carga: Sistema Distribuído Não Escalávelcom 5 instânciasQuantas requisições eu consigo atender em 20 minutos?Hands On - 6
  • 25/05/2013 48Carga de TrabalhoUtilizar a mesma carga de trabalho do teste anterior!
  • 25/05/2013 49Projetando nosso 2º Teste● Quicksort – qual a carga real desse sistema? o.O● Quanto ao nível de concorrência? 100● Quanto à heterogeneidade da carga?– Nº de elementos de nosso array:● Muito pouco: 10;● Pouco: 100;● Médio: 1000;● Alto: 5000;● Muito alto: 10000;– Quanto tempo de medição? 20 minutos– Conteúdo das requisições? (Não abordado)● Pior e melhor caso do algoritmo.
  • 25/05/2013 50Projetando nosso Teste#!/bin/bash#20 minutos array com 10 números, -n 1000000 para que nao pare em 50K requisicoesab -t 1200 -n 1000000 -c 20 -p intArray-10.json -T Content-Type:application/json http://elbsimples-286769172.us-east-1.elb.amazonaws.com/requests > resposta-arrays-com-tamanho-10.txt &#20 minutos array com 100 números, -n 1000000 para que nao pare em 50K requisicoesab -t 1200 -n 1000000 -c 20 -p intArray-100.json -T Content-Type:application/json http://elbsimples-286769172.us-east-1.elb.amazonaws.com/requests > resposta-arrays-com-tamanho-100.txt &#20 minutos array com 1000 números, -n 1000000 para que nao pare em 50K requisicoesab -t 1200 -n 1000000 -c 20 -p intArray-1000.json -T Content-Type:application/json http://elbsimples-286769172.us-east-1.elb.amazonaws.com/requests > resposta-arrays-com-tamanho-1000.txt &#20 minutos array com 5000 números, -n 1000000 para que nao pare em 50K requisicoesab -t 1200 -n 1000000 -c 20 -p intArray-5000.json -T Content-Type:application/json http://elbsimples-286769172.us-east-1.elb.amazonaws.com/requests > resposta-arrays-com-tamanho-5000.txt &#20 minutos array com 10000 números, -n 1000000 para que nao pare em 50K requisicoesab -t 1200 -n 1000000 -c 20 -p intArray-10000.json -T Content-Type:application/json http://elbsimples-286769172.us-east-1.elb.amazonaws.com/requests > resposta-arrays-com-tamanho-10000.txt &
  • 25/05/2013 51Análise dos Resultados● Array com 10 elementos– Time taken for tests: 1200.045 seconds– Complete requests: 207013– Failed requests: 0– Requests per second: 172.50 [#/sec] (mean)– Time per request: 5.797 [ms] (mean, across all concurrent requests)● Array com 100 elementos– Time taken for tests: 1200.487 seconds– Complete requests: 195892– Failed requests: 0– Requests per second: 163.18 [#/sec] (mean)– Time per request: 6.128 [ms] (mean, across all concurrent requests)
  • 25/05/2013 52Análise dos Resultados● Array com 1000 elementos– Time taken for tests: 1200.271 seconds– Complete requests: 183052– Failed requests: 0– Requests per second: 152.51 [#/sec] (mean)– Time per request: 6.557 [ms] (mean, across all concurrent requests)● Array com 5000 elementos– Time taken for tests: 1200.148 seconds– Complete requests: 39334– Failed requests: 0– Requests per second: 32.77 [#/sec] (mean)– Time per request: 30.512 [ms] (mean, across all concurrent requests)
  • 25/05/2013 53Análise dos Resultados● Array com 10000 elementos– Time taken for tests: 1201.065 seconds– Complete requests: 28502– Failed requests: 0– Requests per second: 23.73 [#/sec] (mean)– Time per request: 42.140 [ms] (mean, across all concurrent requests)
  • 25/05/2013 54Análise Geral dos Resultados● Quando o nosso sistema distribuído com ELB e 5 instâncias EC2 ésubmetido a uma carga variada (de 10 a 10000 elementos porrequisição) fornecida por 100 usuários simultâneos durante 20minutos nós temos os seguintes resultados:– Complete requests: 653793 (207013+195892+183052+39334+28502)– Failed requests: 0– Requests per second: 108,938 =(172,5+163,18+152,51+32,77+23,73)/5– Time per request (ms):(207013*5.797)+(195892*6.128)+(183052*6.557)+(39334*30.512)+(28502*42.140) = 6001985,789/653793 = 9.18 ms
  • 25/05/2013 55Comparativo: Sistema Convencional vsSistema Distribuído (ELB + 5 EC2)● Quando o nosso sistema convencional ésubmetido a uma carga variada (de 10 a 10000elementos por requisição) fornecida por 100usuários simultâneos durante 20 minutos nóstemos os seguintes resultados:– Complete requests: 281765(70950+69535+74929+42301+24050)– Failed requests: 0– Requests per second: 46,956 =(59,12+57,94+62,44+35,25+20,03)/5– Time per request (ms):(70950*16,914)+(69535*17,258)+(74929*16,016)+(42301*28,372)+(24050*49,923) = 6000958,316 /281765 = 21.297 ms● Quando o nosso sistema distribuído com ELB e 5instâncias EC2 é submetido a uma carga variada(de 10 a 10000 elementos por requisição)fornecida por 100 usuários simultâneos durante20 minutos nós temos os seguintes resultados:– Complete requests: 653793(207013+195892+183052+39334+28502)– Failed requests: 0– Requests per second: 108,938 =(172,5+163,18+152,51+32,77+23,73)/5– Time per request (ms):(207013*5.797)+(195892*6.128)+(183052*6.557)+(39334*30.512)+(28502*42.140) =6001985,789/653793 = 9.18 ms
  • 25/05/2013 56Comparativo: Sistema Convencional vsSistema Distribuído (ELB + 5 EC2)● Quando o nosso sistema convencional ésubmetido a uma carga variada (de 10 a 10000elementos por requisição) fornecida por 100usuários simultâneos durante 20 minutos nóstemos os seguintes resultados:● Quando o nosso sistema distribuído com ELBe 5 instâncias EC2 é submetido a uma cargavariada (de 10 a 10000 elementos porrequisição) fornecida por 100 usuáriossimultâneos durante 20 minutos nós temos osseguintes resultados:
  • 25/05/2013 57Comparativo: Sistema Convencional vsSistema Distribuído (ELB + 5 EC2)● Quando o nosso sistema convencional ésubmetido a uma carga variada (de 10 a 10000elementos por requisição) fornecida por 100usuários simultâneos durante 20 minutos nóstemos os seguintes resultados:● Quando o nosso sistema distribuído com ELBe 5 instâncias EC2 é submetido a uma cargavariada (de 10 a 10000 elementos porrequisição) fornecida por 100 usuáriossimultâneos durante 20 minutos nós temos osseguintes resultados:
  • 25/05/2013 58Tipos de Teste1.Em quanto tempo meu sistemaconsegue atender N requisições?2.Quantas requisições eu consigo atenderem N minutos?
  • 25/05/2013 59Testando a aplicação3º Teste de Carga: Sistema Convencional vs SistemaDistribuído com ELB e 5 instâncias EC2Em quanto tempo meu sistema consegue atender 5000000requisições?Hands On - 7
  • 25/05/2013 60Carga de TrabalhoUtilizar a mesma carga de trabalho do teste anterior!
  • 25/05/2013 61Projetando nosso 3º Teste● Quicksort – qual a carga real desse sistema? o.O● Quanto ao nível de concorrência? 100● Quanto à heterogeneidade da carga?– Nº de elementos de nosso array:● Muito pouco: 10;● Pouco: 100;● Médio: 1000;● Alto: 5000;● Muito alto: 10000;– Quantidade de requisições? 1000000– Conteúdo das requisições? (Não abordado)● Pior e melhor caso do algoritmo.
  • 25/05/2013 62Testando o Sist. Convencional#!/bin/bash#100000 requisicoes com array com 10 númerosab -n 100000 -c 20 -p intArray-10.json -T Content-Type:application/json http://ec2-50-16-146-100.compute-1.amazonaws.com/requests > resposta-arrays-com-tamanho-10.txt &#100000 requisicoes com array com 100 númerosab -n 100000 -c 20 -p intArray-100.json -T Content-Type:application/json http://ec2-50-16-146-100.compute-1.amazonaws.com/requests > resposta-arrays-com-tamanho-100.txt &#100000 requisicoes com array com 1000 númerosab -n 100000 -c 20 -p intArray-1000.json -T Content-Type:application/json http://ec2-50-16-146-100.compute-1.amazonaws.com/requests > resposta-arrays-com-tamanho-1000.txt &#100000 requisicoes com array com 5000 númerosab -n 100000 -c 20 -p intArray-5000.json -T Content-Type:application/json http://ec2-50-16-146-100.compute-1.amazonaws.com/requests > resposta-arrays-com-tamanho-5000.txt &#100000 requisicoes com array com 10000 númerosab -n 100000 -c 20 -p intArray-10000.json -T Content-Type:application/json http://ec2-50-16-146-100.compute-1.amazonaws.com/requests > resposta-arrays-com-tamanho-10000.txt &
  • 25/05/2013 63Testando o Sist. Distribuído (ELB+ 5 EC2)#!/bin/bash#100000 requisicoes com array com 10 númerosab -k -n 100000 -c 20 -p intArray-10.json -T Content-Type:application/json http://elbsimples-286769172.us-east-1.elb.amazonaws.com/requests > resposta-arrays-com-tamanho-10.txt &#100000 requisicoes com array com 100 númerosab -k -n 100000 -c 20 -p intArray-100.json -T Content-Type:application/json http://elbsimples-286769172.us-east-1.elb.amazonaws.com/requests > resposta-arrays-com-tamanho-100.txt &#100000 requisicoes com array com 1000 númerosab -k -n 100000 -c 20 -p intArray-1000.json -T Content-Type:application/json http://elbsimples-286769172.us-east-1.elb.amazonaws.com/requests > resposta-arrays-com-tamanho-1000.txt &#100000 requisicoes com array com 5000 númerosab -k -n 100000 -c 20 -p intArray-5000.json -T Content-Type:application/json http://elbsimples-286769172.us-east-1.elb.amazonaws.com/requests > resposta-arrays-com-tamanho-5000.txt &#100000 requisicoes com array com 10000 númerosab -k -n 100000 -c 20 -p intArray-10000.json -T Content-Type:application/json http://elbsimples-286769172.us-east-1.elb.amazonaws.com/requests > resposta-arrays-com-tamanho-10000.txt &
  • 25/05/2013 64Análise Geral dos Resultados(ELB + 5 EC2) vs Sist. Convenc.● Quando o nosso sistema convencional ésubmetido a uma carga variada (de 10 a10000 elementos por requisição)fornecida por 100 usuários simultâneoscom 500000 requisições nós temos osseguintes resultados:– Complete requests: 499999– Time taken for tests: 3784.8s =63.08min(1607.9+1551.9+1582.9+2457.5+3784.8)– Failed requests: 1 (0+0+1+0+0)– Requests per second: 51.38 =(62.19+64.43+63.17+40.69+26.42)/5– Time per request (ms): 21,964 ms(16.07+15.52+15.82+24.57+37.84)/5=109.82/5● Quando o nosso sistema distribuído comELB e 5 instâncias EC2 é submetido a umacarga variada (de 10 a 10000 elementos porrequisição) fornecida por 100 usuáriossimultâneos com 500000 requisições nóstemos os seguintes resultados:– Complete requests: 499996– Time taken for tests: 1468.2s = 24.47min(1466.3+1465.7+1461+1460+1468.2)– Failed requests: 4 (0+2+1+1+0)– Requests per second: 59.956 =(68.20+68.22+68.45+68.49+26.42)/5– Time per request (ms): 19,272 ms(14.66+14.65+14.61+14.6+37.84)/5= 96.36/5
  • 25/05/2013 65Comparativo: Sistema Convencional vsSistema Distribuído (ELB + 5 EC2)● Quando o nosso sistema convencional ésubmetido a uma carga variada (de 10 a 10000elementos por requisição) fornecida por 100usuários simultâneos com 500000 requisiçõesnós temos os seguintes resultados:● Quando o nosso sistema distribuído com ELBe 5 instâncias EC2 é submetido a uma cargavariada (de 10 a 10000 elementos porrequisição) fornecida por 100 usuáriossimultâneos com 500000 requisições nós temosos seguintes resultados:
  • 25/05/2013 66Comparativo: Sistema Convencional vsSistema Distribuído (ELB + 5 EC2)● Quando o nosso sistema convencional ésubmetido a uma carga variada (de 10 a 10000elementos por requisição) fornecida por 100usuários simultâneos com 500000 requisiçõesnós temos os seguintes resultados:● Quando o nosso sistema distribuído com ELBe 5 instâncias EC2 é submetido a uma cargavariada (de 10 a 10000 elementos porrequisição) fornecida por 100 usuáriossimultâneos com 500000 requisições nós temosos seguintes resultados:
  • 25/05/2013 67Análise Geral dos Resultados Parciais -(ELB + 5 EC2) vs Sist. Convenc.● Analisando o teste de quantas requisições os doissistemas conseguem atender em 20 minutos (slides 53,54, 55):– Conseguimos um speedup de 2,32 na quantidade derequisições atendidas: de 281765 para 653793;– Aumentamos a capacidade de atender requisições por segundode 46,956 para 108,938 (aumento de 61,982 req/s);– Conseguimos diminuir 12,117 ms no tempo de processamentode uma requisição de 21.297 ms para 9.18 ms.● Resumindo: tornamos o nosso sistema 2,32 x mais rápido.
  • 25/05/2013 68Análise Geral dos Resultados Parciais -(ELB + 5 EC2) vs Sist. Convenc.● Analisando o teste de em quanto tempo os dois sistemasconseguem atender em 500000 requisições (slides 62,63 e 64):– Conseguimos um speedup de 2,57 no tempo deprocessamento das requisições: de 63,08 minutos para 24,47minutos● Resumindo: tornamos o nosso sistema 2,57 x mais rápido.
  • 25/05/2013 69Análise Geral dos Resultados Parciais -(ELB + 5 EC2) vs Sist. Convenc.● Agora analisemos os gráficos de uso da CPU (20 minutos):– Ao passo em que uma instância não é suficiente para talprocessamento, é possível também constatar que 5 instância sóseria interessante no início, e talvez três instâncias fossem oideal para o processamento durante o restante do processo.
  • 25/05/2013 70Análise Geral dos Resultados Parciais -(ELB + 5 EC2) vs Sist. Convenc.● Agora analisemos os gráficos de uso da CPU (500000 requisições):– No início, talvez o ideal realmente seja 5 ou 6 instâncias, mascom o tempo o ideal é que elas diminuíssem para 1 ou 2instâncias.
  • 25/05/2013 71Análise Geral dos Resultados(ELB + 5 EC2) vs Sist. Convenc.● Quais as vantagens de se ter incorporado o ELB e 5 novas instâncias aonosso sistema?– Mais poder de processamento; Balanceamento de Carga com fácilimplantação; Capacidade de detectar instâncias disfuncionais e desviartráfego para instâncias saudáveis, consegue se recuperarautomaticamente de falhas (ainda que aconteçam), ...● O ELB supriu todas as nossas expectativas?– Desvantagens: o balanceamento não é ideal para cargas heterogêneas,não previne o acontecimento de falhas, falta de auto-escalonamento(proporcionando melhores resultados e melhor controle financeiro); ...
  • 25/05/2013 72Auto ScalingHands On - 8
  • 25/05/2013 73Configurando o nosso Sistemacom ELB e Auto Scaling● Passo 1: crie uma nova instância e com a mesma crieum novo ELB para o Auto ScalingListener listener = new Listener("HTTP", 80, 80);createElasticLoadBalancer("elbSimples-for-auto-scaling", listener, new String[] {"i-ee9c3b86"},new String [] {"us-east-1b"});HealthCheck healthCheck = new HealthCheck();healthCheck.setInterval(10); //intervalo de ChecagemhealthCheck.setHealthyThreshold(2); //qtdade de checagens para declarar umahealthCheck.setUnhealthyThreshold(2); //instancia como healthy ou unhealthyhealthCheck.setTarget("HTTP:80/requests");//a checagem será feita na url requestshealthCheck.setTimeout(5); //tempo limite pra responder um checkoutconfigureHealthCheck("elbSimples-for-auto-scaling", healthCheck);P.s.:Pode remover a instância depois do ELB criado.
  • 25/05/2013 74Configurando o nosso Sistemacom ELB e Auto Scaling● Passo 2: na classe AutoScalingManager, crie o seuserviço Auto Scaling– Passo 2.1: crie seu LaunchConfigurationCreateLaunchConfigurationRequest launchConfiguration = new CreateLaunchConfigurationRequest();launchConfiguration.setLaunchConfigurationName("launch-configuration-eduardo-falcao");launchConfiguration.setImageId("ami-7350391a"); //trocar por sua img pre-configuradalaunchConfiguration.setInstanceType("t1.micro");launchConfiguration.setKeyName("eduardo-falcao"); //trocar por sua chaveArrayList<String> securityGroupList = new ArrayList <String>();securityGroupList.add("ISD-Estacio"); //trocar pelo seu SecurityGrouplaunchConfiguration.setSecurityGroups(securityGroupList);autoScaling.createLaunchConfiguration(launchConfiguration);
  • 25/05/2013 75Configurando o nosso Sistemacom ELB e Auto Scaling● Passo 2: na classe AutoScalingManager, crie o seuserviço Auto Scaling– Passo 2.2: crie seu AutoScalingGroupCreateAutoScalingGroupRequest autoScalingGroup = new CreateAutoScalingGroupRequest();autoScalingGroup.setLaunchConfigurationName("launch-configuration-eduardo-falcao");ArrayList<String> loadBalancersList = new ArrayList <String>();loadBalancersList.add("elbSimples-for-auto-scaling"); //trocar pelo elb que vc criou pro AutoScalingautoScalingGroup.setLoadBalancerNames(loadBalancersList);autoScalingGroup.setAutoScalingGroupName("auto-scaling-group-eduardo-falcao");ArrayList<String> avaiLabilityZonesList = new ArrayList <String>();avaiLabilityZonesList.add("us-east-1a");avaiLabilityZonesList.add("us-east-1b");autoScalingGroup.setAvailabilityZones(avaiLabilityZonesList);autoScalingGroup.setMaxSize(10);autoScalingGroup.setMinSize(1);autoScaling.createAutoScalingGroup(autoScalingGroup);
  • 25/05/2013 76Configurando o nosso Sistemacom ELB e Auto Scaling● Nosso Auto Scaling já está criado! Por enquanto nãodefinimos nenhuma política de escalonamento.● Mas já temos a disponibilidade garantida!● O ELB tenta equilibrar o nº de máquinas em cadaZona de Disponibilidade....autoScalingGroup.setMaxSize(10);autoScalingGroup.setMinSize(1); //o ideal seria 2 para serviços mais importantesautoScaling.createAutoScalingGroup(autoScalingGroup);
  • 25/05/2013 77Escalonando nosso Sistema sobDemanda1.Eventos (proc. de CPU, I/O da rede, ...)2.Monitoramento (CloudWatch)3.Triggers1.Horário (meu escalonamento acontecerá toda noite)2.Manual (meu escalonamento mínimo é 5)3.Métricas (quando alcançar 60% de processamento)4.Políticas de Escalonamento1.Adicionar/Remover capacidade (adicionar 1 instância EC2)2.Capacidade exata (10 instâncias EC2)3.Percentual (50% de minha capacidade atual)
  • 25/05/2013 78Criando nossa 1ª Política deEscalonamento – Scale Out● Quando essa política for acionada: o auto scaling iráaumentar em 1 instância pra atender aquela demanda. Enovas políticas só poderão se ativadas depois de 1minuto.PutScalingPolicyRequest scalingOutPolicy = new PutScalingPolicyRequest();scalingOutPolicy.setAutoScalingGroupName("auto-scaling-group-eduardo-falcao");scalingOutPolicy.setPolicyName("Scale_Out");scalingOutPolicy.setAdjustmentType("ChangeInCapacity");scalingOutPolicy.setScalingAdjustment(1);scalingOutPolicy.setCooldown(60); //se escalonou, espera esse tempo antes de checar novas políticasPutScalingPolicyResult scalingOutPolicyResult = autoScaling.putScalingPolicy(scalingOutPolicy);
  • 25/05/2013 79Criando nosso 1º TriggerMy High CPU Alarm● Esse é o Trigger utilizado para ativar a a política deescalonamento Scale Out.PutMetricAlarmRequest myHighCPUAlarm = new PutMetricAlarmRequest();myHighCPUAlarm.setAlarmName("myHighCPUAlarm");myHighCPUAlarm.setMetricName("CPUUtilization");List<Dimension> dimensions = new ArrayList<Dimension>();Dimension dimension = new Dimension();dimension.setName("AutoScalingGroupName");dimension.setValue("auto-scaling-group-eduardo-falcao"); //mudar para seu nomemyHighCPUAlarm.setDimensions(dimensions);...
  • 25/05/2013 80Criando nosso 1º TriggerMy High CPU Alarm● Esse é o Trigger utilizado para ativar a a política deescalonamento Scale Out....myHighCPUAlarm.setNamespace("AWS/EC2");myHighCPUAlarm.setComparisonOperator(ComparisonOperator.GreaterThanThreshold);myHighCPUAlarm.setStatistic(Statistic.Average);myHighCPUAlarm.setUnit(StandardUnit.Percent);myHighCPUAlarm.setThreshold(60d);myHighCPUAlarm.setPeriod(60);myHighCPUAlarm.setEvaluationPeriods(1);List<String> actions = new ArrayList<String>();//Identifica que a ação a ser feita é a Política Scaling Outactions.add(scalingOutPolicyResult.getPolicyARN());myHighCPUAlarm.setAlarmActions(actions);cloudWatch.putMetricAlarm(myHighCPUAlarm);
  • 25/05/2013 81Criando nossa 2ª Política deEscalonamento – Scale In● Quando essa política for acionada: o auto scaling iráaumentar em 1 instância pra atender aquela demanda. Enovas políticas só poderão se ativadas depois de 1minuto.PutScalingPolicyRequest scalingInPolicy = new PutScalingPolicyRequest();scalingInPolicy.setAutoScalingGroupName("auto-scaling-group-eduardo-falcao");scalingInPolicy.setPolicyName("Scale_In");scalingInPolicy.setAdjustmentType("ChangeInCapacity");scalingInPolicy.setScalingAdjustment(-1);scalingInPolicy.setCooldown(60); //se escalonou, espera esse tempo antes de checar novas políticasPutScalingPolicyResult scalingInPolicyResult = autoScaling.putScalingPolicy(scalingInPolicy);
  • 25/05/2013 82Criando nosso 2º TriggerMy Down CPU Alarm● Esse é o Trigger utilizado para ativar a a política deescalonamento Scale In.PutMetricAlarmRequest myDownCPUAlarm = new PutMetricAlarmRequest();myDownCPUAlarm.setAlarmName("myDownCPUAlarm");myDownCPUAlarm.setMetricName("CPUUtilization");// List<Dimension> dimensions = new ArrayList<Dimension>();// Dimension dimension = new Dimension();// dimension.setName("AutoScalingGroupName");// dimension.setValue("auto-scaling-group-eduardo-falcao");myDownCPUAlarm.setDimensions(dimensions);...
  • 25/05/2013 83Criando nosso 2º TriggerMy Down CPU Alarm● Esse é o Trigger utilizado para ativar a política deescalonamento Scale In....myDownCPUAlarm.setNamespace("AWS/EC2");myDownCPUAlarm.setComparisonOperator(ComparisonOperator.LessThanThreshold);myDownCPUAlarm.setStatistic(Statistic.Average); //média da utilização do CPU naquele tempomyDownCPUAlarm.setUnit(StandardUnit.Percent);myDownCPUAlarm.setThreshold(30d);myDownCPUAlarm.setPeriod(60); //tempo em segundos para verificar o alarme//quantas vezes consecutivas o alarme precisa ser ativado para executar a açãomyDownCPUAlarm.setEvaluationPeriods(2);List<String> actions2 = new ArrayList<String>();//Identifica que a ação a ser feita é a Política Scaling Inactions2.add(scalingInPolicyResult.getPolicyARN());myDownCPUAlarm.setAlarmActions(actions2);cloudWatch.putMetricAlarm(myDownCPUAlarm);
  • 25/05/2013 84Testando o Sist. Distribuído(Auto Scaling)#!/bin/bash#100000 requisicoes com array com 10 númerosab -k -n 100000 -c 20 -p intArray-10.json -T Content-Type:application/json http://elbsimples-for-auto-scaling-1556089577.us-east-1.elb.amazonaws.com/requests > resposta-arrays-com-tamanho-10.txt &#100000 requisicoes com array com 10 númerosab -k -n 100000 -c 20 -p intArray-100.json -T Content-Type:application/json http://elbsimples-for-auto-scaling-1556089577.us-east-1.elb.amazonaws.com/requests > resposta-arrays-com-tamanho-100.txt &#100000 requisicoes com array com 10 númerosab -k -n 100000 -c 20 -p intArray-1000.json -T Content-Type:application/json http://elbsimples-for-auto-scaling-1556089577.us-east-1.elb.amazonaws.com/requests > resposta-arrays-com-tamanho-1000.txt &#100000 requisicoes com array com 10 númerosab -k -n 100000 -c 20 -p intArray-5000.json -T Content-Type:application/json http://elbsimples-for-auto-scaling-1556089577.us-east-1.elb.amazonaws.com/requests > resposta-arrays-com-tamanho-5000.txt &#100000 requisicoes com array com 10 númerosab -k -n 100000 -c 20 -p intArray-10000.json -T Content-Type:application/json http://elbsimples-for-auto-scaling-1556089577.us-east-1.elb.amazonaws.com/requests > resposta-arrays-com-tamanho-10000.txt &
  • 25/05/2013 85Análise Geral dos Resultados(ELB + 5 EC2) vs Sist. Convenc.Quando o nosso sistema convencionalé submetido a uma carga variada (de10 a 10000 elementos por requisição)fornecida por 100 usuáriossimultâneos com 500000 requisiçõesnós temos os seguintes resultados:● Complete requests: 499999● Time taken for tests: 3784.8s =63.08min(1607.9+1551.9+1582.9+2457.5+3784.8)● Failed requests: 1 (0+0+1+0+0)● Requests per second: 51.38 =(62.19+64.43+63.17+40.69+26.42)/5● Time per request (ms): 21,964 ms(16.07+15.52+15.82+24.57+37.84)/5=109.82/5Quando o nosso sistema distribuídocom ELB e 5 instâncias EC2 ésubmetido a uma carga variada (de10 a 10000 elementos por requisição)fornecida por 100 usuáriossimultâneos com 500000 requisiçõesnós temos os seguintes resultados:● Complete requests: 499996● Time taken for tests: 1468.2s =24.47min(1466.3+1465.7+1461+1460+1468.2)● Failed requests: 4 (0+2+1+1+0)● Requests per second: 59.956 =(68.20+68.22+68.45+68.49+26.42)/5● Time per request (ms): 19,272 ms(14.66+14.65+14.61+14.6+37.84)/5=96.36/5Quando o nosso Sistema comELB e Auto Scaling ésubmetido a uma cargavariada (de 10 a 10000elementos por requisição)fornecida por 100 usuáriossimultâneos com 500000requisições nós temos osseguintes resultados:● Complete requests: 49998● Time taken for tests:1605.923s = 26,76min1605.923 = (1090,164;1091.459; 1592.250;1577.380; 1605.923)● Failed requests: 2● Requests per second: 74,36=(91,73+91,62+62,80+63,40+62,27)/5● Time per request (ms):
  • 25/05/2013 86Analisando o Gráfico do Sistemacom ELB e Auto Scaling
  • 25/05/2013 87Analisando o Gráfico do Sistemacom ELB e Auto Scaling● Para esse teste específico é possível perceber que:– precisamos tomar mais cuidado quando formos criarmais instâncias;● Ex.: é evidente que não há necessidade alguma decriar as 3 últimas instâncias.– Precisamos de uma política de terminação deinstâncias mais refinada.● Percebemos que as instâncias cinza e verdepoderiam ter sido terminadas antes de atingir onível de processamento 0.
  • 25/05/2013 88Breves Conclusões e Comparações● Se por algum momento o Sistema com ELB e 5 EC2 lhe parecer sermelhor (caso você compare apenas o tempo total do processamento detodas as requisições), observe os seguintes pontos:– A capacidade de processar requisições/segundo aumentou em 15unidades;– E o tempo por requisição diminuiu 6 ms. Essa diferença pode causargrande impacto se o sistema recebe milhares de requisições/segundo;– A configuração do nosso Auto Scaling não está refinada;– Testes em curto período de tempo não são bons parâmetros;– Em longos períodos de tempo há uma grande possibilidade dessainfra (5 EC2) ser sub-utilizada ou insuficiente para nossa demanda. Eisso implica em muito dinheiro desperdiçado/perdido.
  • 25/05/2013 89Conclusões● Quando for aplicar definitivamente o Auto Scaling em seusistema, teste-o exaustivamente antes. Podem ser necessáriosalguns ajustes nos Triggers e Scaling Policies.● Ao testar:– procure executar pela maior quantidade de tempo possível.Algumas horas podem ser suficientes.– Varie quantidade de requisições, Carga/Tamanho dasrequisições, e número de requisições concorrentes,procurando sempre se aproximar de um caso de teste real.Sempre que possível, testar os piores casos possíveis.
  • 25/05/2013 90Referências● Amazon Web Services. http://aws.amazon.com/pt/(Acesso: abril/2013).● Introdução ao Auto-Scaling. Eduardo Horai. AWSSolutions Architect. (Acesso em: maio/2013)http://slideshare.net/AmazonWebServicesLATAM
  • 25/05/2013 91Comandos Auxiliares● Parar o Tomcat7: (quando for testar pelo Eclipse)– $ sudo /etc/init.d/tomcat7 stop● Instalar o unzip (necessário p/ o deploy do WAR):– $ sudo unzip -d . /home/ubuntu/Quicksort-Restful.war
  • 25/05/2013 92Dúvidashttps://sites.google.com/site/introsistemasdistribuidos/Eduardo de Lucena Falcãoeduardolfalcao@gmail.com@dudufalcao