Escalando Apps PHP

Post on 09-Jul-2015

100 views 0 download

Tags:

description

Palestra no primeiro Maceió DEV Meetup sobre escalabilidade. Embora o tema da palestra tenha sido Escalando Apps PHP, os conceitos apresentados (LoadBalancing e DNS) se aplicam a qualquer linguagem/stack. Link do evento: http://www.meetup.com/maceio-dev-meetup/events/218622546/

transcript

HTTP

NginxPHP

usuário

usuário

usuário

usuário

usuário

usuário

HTTP

HTTP

NginxPHP

App 1

App 2

DB

HaProxy

TCP

TCPHTTP

HTTP

HTTP

HTTP

HaProxy

TCP

TCP

HaProxy (spare)

Escalando Apps PHPMaceió Dev Meetup #1

HTTP

NginxPHP

usuário

usuário

usuário

usuário

usuário

usuário

HTTP

HTTP

NginxPHP

App 1

App 2

DB

HaProxy

TCP

TCPHTTP

HTTP

HTTP

HTTP

HaProxy

TCP

TCP

HaProxy (spare)

quem sou eu?

➔ Desenvolvedor web há +4 anos;

➔ Formado em Análise de Sistemas pelo

CESMAC;

➔ Engenheiro de Software no

HTTP

NginxPHP

usuário

usuário

usuário

usuário

usuário

usuário

HTTP

HTTP

NginxPHP

App 1

App 2

DB

HaProxy

TCP

TCPHTTP

HTTP

HTTP

HTTP

HaProxy

TCP

TCP

HaProxy (spare)

➔ Load Balancing

com HAProxy;

➔ Distribuição de

DNS;

(Disponível no leanpub.com)

TL;DW

não trabalho

diretamente com infra

não somos o facebook

mas ficar fora do ar pode custar caro $$

(e pega mal pra caramba)

HTTP

NginxPHP

usuário

usuário

usuário

usuário

usuário

usuário

HTTP

HTTP

NginxPHP

App 1

App 2

DB

HaProxy

TCP

TCPHTTP

HTTP

HTTP

HTTP

HaProxy

TCP

TCP

HaProxy (spare)

não vamos abordar LAMP

o que tem de errado com LAMP?

stack sugerido: LHNMPRR

Linux, HAProxy, nginx, MySQL, PHP-FPM, Redis e Resque

WTF?!

calma, vamos por partes

HTTP

NginxPHPMySQL

usuário

HTTP

NginxPHPMySQL

usuário

usuário

usuário

usuário

HTTP

HTTP

HTTP

NginxPHPMySQL

usuário

usuário

usuário

usuário

HTTP

HTTP

usuário usuário

usuário

usuário

HTTP

HTTP

HTTP

ApachePHPMySQL

usuário

usuário

usuário

usuário

HTTP

HTTP

usuário usuário

usuário

usuário

HTTP

HTTP

O que podemos fazer nesse ponto?

VERTICAL SCALING!

...escalar verticalmente quer dizer

MAIS RECURSOSem um único servidor...

HTTP

NginxPHPMySQL

usuário

usuário

usuário

usuário

HTTP

HTTP

usuário usuário

usuário

usuário

HTTP

HTTP

HTTP

NginxPHPMySQL

usuário

usuário

usuário

usuário

HTTP

HTTP

usuário usuário

usuário

usuário

HTTP

HTTP

HTTP

NginxPHPMySQL

usuário

usuário

usuário

usuário

HTTP

HTTP

usuário usuário

usuário

usuário

HTTP

HTTP

usuário

usuário

usuário

usuário

usuárioHT

TP HTTP

HTTP

usuário

E se eu disser que você não precisa de máquinas muito tunadas?

HORIZONTAL SCALING!

… escalar horizontalmente quer dizer

MAIS SERVIDORESque formam um cluster...

HTTP

usuário

usuário

usuário

usuário

usuário

usuário

HTTP

HTTP

DB

NginxPHP

App 1

HTTP

NginxPHP

usuário

usuário

usuário

usuário

usuário

usuário

HTTP

HTTP

NginxPHP

App 1

App 2

DB

Load Balancing

HTTP

NginxPHP

usuário

usuário

usuário

usuário

usuário

usuário

HTTP

HTTP

NginxPHP

App 1

App 2

DB

HaProxy

TCP

TCP

HTTP

NginxPHP

usuário

usuário

usuário

usuário

usuário

usuário

HTTP

HTTP

NginxPHP

App 1

App 2

DB

HaProxy

TCP

TCP

Cuidados quando usar LoadBalacing:

❖ Utilização de sessão;

❖ IP do usuário;

❖ Upload de arquivos;

HTTP

NginxPHP

usuário

usuário

usuário

usuário

usuário

usuário

HTTP

HTTP

NginxPHP

App 1

App 2

DB

HaProxy

TCP

TCP

HTTP

NginxPHP

usuário

usuário

usuário

usuário

usuário

usuário

HTTP

HTTP

NginxPHP

App 1

App 2

DB

HaProxy

TCP

TCP

HTTP

HTTP

HTTP

HTTP

HTTP

ApachePHP

usuário

usuário

usuário

usuário

usuário

usuário

HTTP

HTTP

ApachePHP

App 1

App 2

DB

HaProxy

TCP

TCP

HTTP

HTTP

HTTP

HTTP

HTTP

NginxPHP

usuário

usuário

usuário

usuário

usuário

usuário

HTTP

HTTP

NginxPHP

App 1

App 2

DB

HaProxy

TCP

TCPHTTP

HTTP

HTTP

HTTP HaProxy

TCP

TCP

HTTP

NginxPHP

usuário

usuário

usuário

usuário

usuário

usuário

HTTP

HTTP

NginxPHP

App 1

App 2

DB

HaProxy

TCP

TCPHTTP

HTTP

HTTP

HTTP HaProxy

TCP

TCP

$ dig A example.com

; <<>> DiG 9.9.5-3-Ubuntu <<>> A example.com;; global options: +cmd

;; QUESTION SECTION:;example.com. IN A

;; ANSWER SECTION:example.com. 16 IN A 199.16.158.40example.com. 16 IN A 199.16.158.104....

HTTP

NginxPHP

usuário

usuário

usuário

usuário

usuário

usuário

HTTP

HTTP

NginxPHP

App 1

App 2

DB

HaProxy

TCP

TCPHTTP

HTTP

HTTP

HTTP HaProxy

TCP

TCP

$ dig A example.com

; <<>> DiG 9.9.5-3-Ubuntu <<>> A example.com;; global options: +cmd

;; QUESTION SECTION:;example.com. IN A

;; ANSWER SECTION:example.com. 19 IN A 199.16.158.104example.com. 19 IN A 199.16.158.40....

HTTP

NginxPHP

usuário

usuário

usuário

usuário

usuário

usuário

HTTP

HTTP

NginxPHP

App 1

App 2

DB

HaProxy

TCP

TCPHTTP

HTTP

HTTP

HTTP HaProxy

TCP

TCP

SPARE HaProxy(com keepalived)

HTTP

NginxPHP

usuário

usuário

usuário

usuário

usuário

usuário

HTTP

HTTP

NginxPHP

App 1

App 2

DB

HaProxy

TCP

TCPHTTP

HTTP

HTTP

HTTP

HaProxy

TCP

TCP

HaProxy (spare)

HTTP

NginxPHP

usuário

usuário

usuário

usuário

usuário

usuário

HTTP

HTTP

NginxPHP

App 1

App 2

DB

HaProxy

TCP

TCPHTTP

HTTP

HTTP

HTTP

HaProxy

TCP

TCP

HaProxy (spare)

HTTP

NginxPHP

usuário

usuário

usuário

usuário

usuário

usuário

HTTP

HTTP

NginxPHP

App 1

App 2

DB

HaProxy

TCP

TCPHTTP

HTTP

HTTP

HTTP

HaProxy

TCP

TCP

HaProxy (spare)

HTTP

NginxPHP

usuário

usuário

usuário

usuário

usuário

usuário

HTTP

HTTP

NginxPHP

App 1

App 2

DB

HaProxy

TCP

TCPHTTP

HTTP

HTTP

HTTP

HaProxy

TCP

TCP

HaProxy (spare)

<hands-on>

HTTP

NginxPHP

usuário

usuário

usuário

usuário

usuário

usuário

HTTP

HTTP

NginxPHP

App 1

App 2

DB

HaProxy

TCP

TCPHTTP

HTTP

HTTP

HTTP

HaProxy

TCP

TCP

HaProxy (spare)

var http = require('http');

function serve(ip, port)

{

http.createServer(function (req, res) {

res.writeHead(200, {'Content-Type': 'text/plain'});

res.write(JSON.stringify(req.headers));

res.end("\nThere's no place like "+ip+":"+port+"\n");

}).listen(port, ip);

console.log('Server running at http://'+ip+':'+port+'/');

}

// simulando um cluster de servidores

// em um mesmo server

serve('0.0.0.0', 9000);

serve('0.0.0.0', 9001);

serve('0.0.0.0', 9002);

HTTP

NginxPHP

usuário

usuário

usuário

usuário

usuário

usuário

HTTP

HTTP

NginxPHP

App 1

App 2

DB

HaProxy

TCP

TCPHTTP

HTTP

HTTP

HTTP

HaProxy

TCP

TCP

HaProxy (spare)

$ sudo add-apt-repository -y ppa:vbernat/haproxy-1.5

$ sudo apt-get update

$ sudo apt-get install -y haproxy

HTTP

NginxPHP

usuário

usuário

usuário

usuário

usuário

usuário

HTTP

HTTP

NginxPHP

App 1

App 2

DB

HaProxy

TCP

TCPHTTP

HTTP

HTTP

HTTP

HaProxy

TCP

TCP

HaProxy (spare)

alguns conceitos do HaProxy

frontend: onde configuramos o HaProxy para ouvir conexões;

backend: para onde o HaProxy vai enviar as conexões recebidas pelo frontend;

stats: opcional, uma interface web para monitorar o load balancer.

HTTP

NginxPHP

usuário

usuário

usuário

usuário

usuário

usuário

HTTP

HTTP

NginxPHP

App 1

App 2

DB

HaProxy

TCP

TCPHTTP

HTTP

HTTP

HTTP

HaProxy

TCP

TCP

HaProxy (spare)

frontend localnodes

bind *:80

mode http

default_backend nodes

HTTP

NginxPHP

usuário

usuário

usuário

usuário

usuário

usuário

HTTP

HTTP

NginxPHP

App 1

App 2

DB

HaProxy

TCP

TCPHTTP

HTTP

HTTP

HTTP

HaProxy

TCP

TCP

HaProxy (spare)

backend nodes

mode http

balance roundrobin

option forwardfor

http-request set-header X-Forwarded-Port %[dst_port]

http-request add-header X-Forwarded-Proto https if { ssl_fc }

option httpchk HEAD / HTTP/1.1\r\nHost:localhost

server web01 127.0.0.1:9000 check

server web02 127.0.0.1:9001 check

server web03 127.0.0.1:9002 check

HTTP

NginxPHP

usuário

usuário

usuário

usuário

usuário

usuário

HTTP

HTTP

NginxPHP

App 1

App 2

DB

HaProxy

TCP

TCPHTTP

HTTP

HTTP

HTTP

HaProxy

TCP

TCP

HaProxy (spare)

</hands-on>

HTTP

NginxPHP

usuário

usuário

usuário

usuário

usuário

usuário

HTTP

HTTP

NginxPHP

App 1

App 2

DB

HaProxy

TCP

TCPHTTP

HTTP

HTTP

HTTP

HaProxy

TCP

TCP

HaProxy (spare)

mais sobre o assunto:➔ Deploy em cluster;

➔ Replicação de banco de dados;

➔ Cache com Redis;

➔ Background jobs (queues);

➔ Centralização de LOGS (ELK);

HTTP

NginxPHP

usuário

usuário

usuário

usuário

usuário

usuário

HTTP

HTTP

NginxPHP

App 1

App 2

DB

HaProxy

TCP

TCPHTTP

HTTP

HTTP

HTTP

HaProxy

TCP

TCP

HaProxy (spare)

Obrigado!