Ao infinito e além com PHP memcached e Gearman

Elton Minetto
Elton MinettoSoftware developer, teacher, speaker, open source evangelist, tech leader at Code:Nation
Ao infinito e além com PHP, Memcached e Gearman
Elton Luís Minetto
segunda-feira, 29 de novembro de 2010
Quem sou eu?
• Graduado e pós-graduado em Ciência da Computação.
• Trabalha com PHP/MySQL/Linux desde 1998
• Autor do livro Frameworks para Desenvolvimento em
PHP - Editora Novatec e co-autor do livro Grid
Computing in Research and Education - IBM Redbooks
• Membro do PHPSC
• Professor na Unochapecó(Chapecó/SC)
• Sócio da Coderockr
segunda-feira, 29 de novembro de 2010
O problema
segunda-feira, 29 de novembro de 2010
O problema
segunda-feira, 29 de novembro de 2010
O problema
segunda-feira, 29 de novembro de 2010
O problema
segunda-feira, 29 de novembro de 2010
O problema
• Performance: a habilidade que uma aplicação tem de
atingir um objetivo, como por exemplo responder no
menor tempo possível
• Capacidade: a carga total que uma aplicação pode
suportar
• Escalabilidade: a habilidade de uma aplicação manter a
performance quando a carga de trabalho aumenta. É a
junção da capacidade e da performance
• “Performance is a problem. Scaling your performance is a
bigger problem”
segunda-feira, 29 de novembro de 2010
A solução
Distribua!
segunda-feira, 29 de novembro de 2010
Distribua!
Memória
segunda-feira, 29 de novembro de 2010
Distribua!
Trabalho
segunda-feira, 29 de novembro de 2010
Distribua!
segunda-feira, 29 de novembro de 2010
GLAMMP
• Gearman
• Linux
• Apache
• MySQL
• Memcached
• Php (ou Perl ou Python)
segunda-feira, 29 de novembro de 2010
segunda-feira, 29 de novembro de 2010
• Sistema distribuído e de alta performance para fazer
cache de objetos em memória RAM.
• Genérico por natureza mas muito usado para acelerar
aplicações web dinâmicas, reduzindo a carga de bases
de dados, sessões de usuários, arquivos CSS.
• Criado pela
O que é?
segunda-feira, 29 de novembro de 2010
Por que usar?
• Escalável: fácil adicionar máquinas e instâncias
• RAM é muito mais rápido que I/O em disco
• Alivia a carga do banco de dados
• Muito flexível: pode armazenar qualquer dado, desde
que não ultrapasse 1 MB
• Bibliotecas client disponíveis em diversas linguagens
(PHP, C, Java, Ruby, Python)
• Open Source
segunda-feira, 29 de novembro de 2010
Como funciona?
• Armazena qualquer coisa que pode ser serializado
• Armazena com uma chave única (255 caracteres) e
tempo de validade
• O programador usa da seguinte forma :
• Encontrou no cache? Retorna os dados
• Não encontrou no cache? Processa, armazena no cache e
retorna o dado
segunda-feira, 29 de novembro de 2010
Como funciona?
segunda-feira, 29 de novembro de 2010
O que armazenar?
• Resultados de consultas SQL
• Páginas inteiras
• Sessões de usuários
• Fragmentos de HTML gerados
• Imagens (thumbnails)
• Arquivos css
• Arquivos js
• “Qualquer coisa que demore um pouco para ser gerada”
segunda-feira, 29 de novembro de 2010
Quem usa?
• Facebook
• 805 servidores 8-core. 28TB de RAM. 300K req/seg (Set. 2008)
• Desenvolveu fork com suporte a UDP
• http://github.com/fbmarc/facebook-memcached/tree/
master
• Flickr
• 38K req/seg. 12 milhões de objetos (Set. 2008)
• Digg
• Drimio
• Sessões de usuários, imagens, arquivos CSS, arquivos JS,
resultados de consultas SQL
segunda-feira, 29 de novembro de 2010
Como usar?
Baixar código em http://www.danga.com/memcached/
e...
tar -xvzf memcached-X.Y.Z.tar.gz
cd memcached-X.Y.Z
./configure
make
sudo make install
Santíssima Trindade
segunda-feira, 29 de novembro de 2010
Como usar?
• No exemplo abaixo iniciamos o daemon com 128MB
RAM, ouvindo na porta 11211 no ip 127.0.0.1
/usr/local/bin/memcached -d -m 128 -l 127.0.0.1 -p 11211
• Pode-se criar quantas instâncias forem necessárias,
mudando a porta. Assim aumenta-se o espaço total do
cache
segunda-feira, 29 de novembro de 2010
Como usar com PHP?
• Download do módulo em http://pecl.php.net/package/
memcache.
• e..
tar -xvzf memcache-2.2.5.tgz
cd memcache-2.2.5
phpize
./configure
make
sudo make install (executar como root)
• Adicionar a linha abaixo no php.ini e reiniciar o Apache
extension=memcache.so
segunda-feira, 29 de novembro de 2010
Como usar com PHP?
<?php
$memcache = new Memcache;
$memcache->connect('localhost', 11211);
$memcache->connect('localhost', 11212);
$memcache->connect(’192.168.0.10', 11212);
$conteudo = $memcache->get('estados');
if($conteudo === false) {
	 $uf = array('SC','RS','SP');
	 $memcache->set('estados', $uf, false, 100) ;
	 $conteudo = $uf;
}
var_dump($conteudo);
?>
segunda-feira, 29 de novembro de 2010
API
• Comandos de armazenamento:
• set, add, replace, append
• Comandos de recuperação:
• get
• Comandos de exclusão:
• delete
• Outros comandos:
• stats, flush_all, version, verbosity, quit
segunda-feira, 29 de novembro de 2010
Monitorando
• Plugin para o Nagios
• memcache.php
segunda-feira, 29 de novembro de 2010
segunda-feira, 29 de novembro de 2010
segunda-feira, 29 de novembro de 2010
segunda-feira, 29 de novembro de 2010
• Framework genérico para distribuir jobs a serem
executados por uma ou mais máquinas
• Permite uma aplicação executar tarefas em paralelo,
com balanceamento da carga de processos, e até
invocar códigos escritos em outras linguagens
• O nome é um anagrama para "Manager"
• Criado pela
O que é?
segunda-feira, 29 de novembro de 2010
Áreas de Aplicação
• Análise de logs
• Redimensionamento de imagens
• Processamento de URLs
• Atualização de cache
• Jobs de banco de dados
• etc
segunda-feira, 29 de novembro de 2010
Por que usar?
• Open Source com interfaces para desenvolver em várias
linguagens (C, PHP, Perl, MySQL UDF, Python, etc).
Clients podem ser em uma linguagem, workers em
outra
• Rápido - possui protocolo e interfaces simples, com um
servidor desenvolvido em C
• Escalável e tolerante a falhas
• Digg: +45 servers, 400mil jobs/dia (em 2009)
• Yahoo: +60 servers, 6milhões jobs/dia
• Síncrono ou assíncrono
segunda-feira, 29 de novembro de 2010
Como funciona?
• Client- Cria um job a ser executado e o envia a um
servidor de jobs
• Worker - Registra-se em um servidor de jobs e pega
jobs para executar
• Job Server - Recebe os jobs e coordena a entrega de um
job para um worker executar
segunda-feira, 29 de novembro de 2010
Como funciona?
Fonte: http://www.gearman.org
segunda-feira, 29 de novembro de 2010
Como funciona?
Fonte: http://www.gearman.org
segunda-feira, 29 de novembro de 2010
Síncrono X Assíncrono
• Síncrono, ou “em primeiro plano”(“foreground”). O
cliente fica parado esperando o fim da execução da
tarefa
• Assíncrono, ou “em segundo plano”(“background”). O
cliente continua sua execução e o trabalho vai ser
realizado por algum Worker. O cliente pode ser avisado
do status por métodos e callbacks
segunda-feira, 29 de novembro de 2010
Instalando
wget http://launchpad.net/gearmand/trunk/0.13/+download/
gearmand-X.Y.tar.gz
tar xfvz gearmand-X.Y.tar.gz
cd gearmand-X.Y
./configure
make
sudo make install
Lembra?
Santíssima Trindade
segunda-feira, 29 de novembro de 2010
Iniciando o server
• Simples:
/usr/local/sbin/gearmand -d
• Completo:
/usr/local/sbin/gearmand -d -u <user> -L <host> -p 70
• Sendo
-d Inicia como um daemon em background
-u <user> Executa como o usuário específico
-L <host> Fica ouvindo neste ip
-p <port> Ouve na porta específica (defaul 4730)
segunda-feira, 29 de novembro de 2010
PHP
• Instalando a extensão do PHP:
wget http://pecl.php.net/get/gearman-X.Y.Z.tgz
tar xfvz gearman-X.Y.Z.tgz
cd gearman-X.Y.Z
phpize
./configure
make
sudo make install
• Adicionar no php.ini:
extension = gearman.so
Acabou a
criativade :(
Mas você
entendeu né?
segunda-feira, 29 de novembro de 2010
PHP - Exemplo: Cliente Síncrono
<?php
$client= new GearmanClient();
/*indica em quais servidores o cliente pode enviar jobs.
No caso somente o localhost, pois não é passado nada*/
$client->addServer();
/*adiciona um job síncrono, para a fila chamada title,
enviando uma string como parâmetro*/
print $client->do("title", "o Ivo andava de PATINS!!!");
print "n";
?>
segunda-feira, 29 de novembro de 2010
PHP - Exemplo: Worker Síncrono
<?php
$worker= new GearmanWorker();
$worker->addServer();//servidores q vai atender
/*registra a função title_function como responsável por
atender a fila title*/
$worker->addFunction("title", "title_function");
while ($worker->work()); //fica em loop trabalhando
   
//função que vai executar o trabalho
function title_function($job)
{
        return ucwords(strtolower($job->workload()));
}
?>
segunda-feira, 29 de novembro de 2010
PHP - Exemplo: Cliente Assíncrono
<?php
$client= new GearmanClient();
$client->addServer();
for($i=0;$i<10;$i++) {
        /*adiciona um job asíncrono, para a fila chamada
title, enviando um array como parâmetro. O cliente não
fica esperando o final do processamento */
        $log['data'] = date('l jS of F Y h:i:s A');
        $log['msg'] = "O Ivo andou de patins $i vez(es)";
        $client->doBackground("log_queue", serialize
($log));
}
?>
segunda-feira, 29 de novembro de 2010
PHP - Exemplo: Worker Assíncrono
<?php
$worker= new GearmanWorker();
$worker->addServer();
/*registra a função log_function como responsável por
atender a fila log_queue*/
$worker->addFunction("log_queue", "log_function");
while ($worker->work()); //fica em loop trabalhando
   
function log_function($job){
        $log = unserialize($job->workload());
        sleep(1); //sleep só para demonstrar executando
        echo $log['data'], ' - ', $log['msg'], "n";
}
?>
segunda-feira, 29 de novembro de 2010
segunda-feira, 29 de novembro de 2010
Python - Exemplo: Worker Assíncrono
from gearman import libgearman
1.  
2. def worker_func(job):
3.   workload= job.get_workload()
4.   print workload
5.   return workload
6.  
7. worker = libgearman.Worker()
8. worker.set_timeout(5000)
9. worker.add_server('localhost')
10.worker.add_function("log_queue", worker_func)
11.ret= libgearman.GEARMAN_SUCCESS
12.while 1:
13.  ret= worker.work()
segunda-feira, 29 de novembro de 2010
PHP - Job API
• GearmanJob::sendStatus(int $numerator, int
$denominator)
• GearmanJob::sendWarning(string $warning)
• GearmanJob::sendComplete(string $result)
• GearmanJob::sendFail(void)
• GearmanJob::sendException(string $exception)
segunda-feira, 29 de novembro de 2010
PHP - Job API - Client
<?php
1. $client= new GearmanClient();
2. $client->addServer();
3. $handle = $client->doBackground("title", "o PHp");
4. if($client->returnCode() != GEARMAN_SUCCESS) {
5. echo "Job com problemas";exit;
6. }
7. $done = false;
8. do {
9. sleep(2);
10. $stat = $client->jobStatus($handle);
11. if(!$stat[0]) { $done = true; }//job terminou
12. if($stat[1] == true)
13. echo "Executando:", ' passo ' , $stat[2], ' de ',
$stat[3], "n";
14.}while(!$done);
15.?>
segunda-feira, 29 de novembro de 2010
PHP - Job API - Worker
<?php
1. $worker= new GearmanWorker();
2. $worker->addServer();
3. $worker->addFunction("title", "title_function");
4. while ($worker->work());
5.    
6. function title_function($job){
7. $job->sendStatus(0, 2);
8. sleep(3);
9. $job->sendStatus(1, 2);
10. sleep(3);
11. $job->sendStatus(2, 2);
12. return ucwords(strtolower($job->workload()));
13.}
14.?>
segunda-feira, 29 de novembro de 2010
PHP - Client API - Prioridades
• Síncrono
echo $client->do("title", "uma frasE quAlquer");
echo $client->doHigh("title", "uma frasE quAlquer");
echo $client->doLow("title", "uma frasE quAlquer"); 
• Assíncrono
$handle1 = $client->doBackground("title", "uma frasE quAlquer");
$handle1 = $client->doHighBackground("title", "uma frasE
quAlquer");
$handle1 = $client->doLowBackground("title", "uma frasE
quAlquer");
segunda-feira, 29 de novembro de 2010
Filas Persistentes
• Internamente todas as filas de jobs são armazenadas
em memória. Se o servidor reinicia ou acontece algum
erro todos os jobs pendentes são perdidos
• Pode-se usar filas persistentes para armazenar os jobs
pendentes (somente jobs assíncronos)
• É possível armazenar a fila em:
• MySQL (libdrizzle)
• Memcached (libmemcached)
• SQLite3 (libsqlite3)
segunda-feira, 29 de novembro de 2010
Monitorando
telnet localhost 4730
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
status
jobLog	 0	 0	 1
jobTwitter	 0	 0	 1
jobTwitterUser	0	 0	 1
jobFacebookPostSearch	 0	 0	 1
jobFeed	0	 0	 1
jobBlogsearch	 0	 0	 1
jobFacebookUser	 2	 1	 1
jobSlideshareUser	 0	 0	 1
segunda-feira, 29 de novembro de 2010
Gearman no Drimio
• Processamento de Logs
• Monitoramento de redes sociais (Twitter, Youtube,
Flickr, Yahoo, Facebook, Feeds, Blogsearch, Slideshare,
etc)
• Envio de e-mails
• Captura de snapshots de URLS
• Envio de tweets/posts Facebook
• Redimensionamento de imagens
• Média de 55 mil jobs/dia
segunda-feira, 29 de novembro de 2010
Tudo junto reunido!
1. Faz pesquisa 2. Chamada de API
3. Resultado
4. Jobs para processar imagens e para Log de
acesso
Imagens processadas e salvas em Memcached
e Logs em MySQL
5. Página de resultados
segunda-feira, 29 de novembro de 2010
Perguntas?
segunda-feira, 29 de novembro de 2010
Contato
<?php
$card = array(
‘nome’ => ‘Elton Luís Minetto’,
‘site’ => ‘http://www.eltonminetto.net’,
‘e-mail’ => ‘eminetto@coderockr.com’,
‘twitter’ => ‘@eminetto’,
‘all’ => ‘http://about.me/eminetto'
);
var_dump($card);
?>
segunda-feira, 29 de novembro de 2010
Referências
• http://www.danga.com
• http://www.slideshare.net/andreizm/all-the-little-
pieces-1573862
• http://www.slideshare.net/acme/scaling-with-
memcached
• http://www.slideshare.net/oemebamo/introduction-to-
memcached
• http://www.slideshare.net/felixdv/high-gear-php-with-
gearman-3404242
• http://www.eltonminetto.net/material-da-palestra-no-
phpsc-conf-2009.htm
• http://www.eltonminetto.net/material-de-minha-
palestra-sobre-gearman.htm
segunda-feira, 29 de novembro de 2010
1 of 55

Recommended

Entre na fila. Processamento distribuído usando Gearman by
Entre na fila. Processamento distribuído usando GearmanEntre na fila. Processamento distribuído usando Gearman
Entre na fila. Processamento distribuído usando GearmanElton Minetto
1K views34 slides
Memcached, Gearman e Sphinx by
Memcached, Gearman e SphinxMemcached, Gearman e Sphinx
Memcached, Gearman e SphinxElton Minetto
1.4K views47 slides
Rest workshop by
Rest workshopRest workshop
Rest workshopDiogo Gomes
308 views19 slides
PHPSP TestFest 2009 by
PHPSP TestFest 2009PHPSP TestFest 2009
PHPSP TestFest 2009Rafael Dohms
1.1K views23 slides
PHP e AJAX: do Request ao Framework by
PHP e AJAX: do Request ao FrameworkPHP e AJAX: do Request ao Framework
PHP e AJAX: do Request ao FrameworkRafael Dohms
1.7K views30 slides
Mongo Db - PHP Day Workshop by
Mongo Db - PHP Day WorkshopMongo Db - PHP Day Workshop
Mongo Db - PHP Day WorkshopDiego Sana
1.5K views50 slides

More Related Content

What's hot

Desenvolvendo aplicações Web escaláveis by
Desenvolvendo aplicações Web escaláveisDesenvolvendo aplicações Web escaláveis
Desenvolvendo aplicações Web escaláveiselliando dias
674 views38 slides
Opennebula instalação by
Opennebula instalaçãoOpennebula instalação
Opennebula instalaçãoLuís Eduardo
1.7K views26 slides
Abstração do banco de dados com PHP Doctrine by
Abstração do banco de dados com PHP DoctrineAbstração do banco de dados com PHP Doctrine
Abstração do banco de dados com PHP DoctrineOtávio Calaça Xavier
3.5K views34 slides
Threads 05: Travas de Exclusão Mútua by
Threads 05: Travas de Exclusão MútuaThreads 05: Travas de Exclusão Mútua
Threads 05: Travas de Exclusão MútuaHelder da Rocha
362 views18 slides
Threads 01: Criação e controle de threads by
Threads 01: Criação e controle de threadsThreads 01: Criação e controle de threads
Threads 01: Criação e controle de threadsHelder da Rocha
971 views32 slides
Threads 03: Ciclo de vida, aplicações e boas práticas by
Threads 03: Ciclo de vida, aplicações e boas práticasThreads 03: Ciclo de vida, aplicações e boas práticas
Threads 03: Ciclo de vida, aplicações e boas práticasHelder da Rocha
1.2K views15 slides

What's hot(15)

Desenvolvendo aplicações Web escaláveis by elliando dias
Desenvolvendo aplicações Web escaláveisDesenvolvendo aplicações Web escaláveis
Desenvolvendo aplicações Web escaláveis
elliando dias674 views
Opennebula instalação by Luís Eduardo
Opennebula instalaçãoOpennebula instalação
Opennebula instalação
Luís Eduardo1.7K views
Threads 05: Travas de Exclusão Mútua by Helder da Rocha
Threads 05: Travas de Exclusão MútuaThreads 05: Travas de Exclusão Mútua
Threads 05: Travas de Exclusão Mútua
Helder da Rocha362 views
Threads 01: Criação e controle de threads by Helder da Rocha
Threads 01: Criação e controle de threadsThreads 01: Criação e controle de threads
Threads 01: Criação e controle de threads
Helder da Rocha971 views
Threads 03: Ciclo de vida, aplicações e boas práticas by Helder da Rocha
Threads 03: Ciclo de vida, aplicações e boas práticasThreads 03: Ciclo de vida, aplicações e boas práticas
Threads 03: Ciclo de vida, aplicações e boas práticas
Helder da Rocha1.2K views
Desenvolvendo aplicações Web escaláveis com PHP by Elton Minetto
Desenvolvendo aplicações Web escaláveis com PHPDesenvolvendo aplicações Web escaláveis com PHP
Desenvolvendo aplicações Web escaláveis com PHP
Elton Minetto2.5K views
Aumente a performance de seu site de maneira disciplinada by Henrique Lima
Aumente a performance de seu site de maneira disciplinadaAumente a performance de seu site de maneira disciplinada
Aumente a performance de seu site de maneira disciplinada
Henrique Lima1.4K views
Alta perfomance de aplicações PHP com Nginx by Thiago Paes
Alta perfomance de aplicações PHP com NginxAlta perfomance de aplicações PHP com Nginx
Alta perfomance de aplicações PHP com Nginx
Thiago Paes4.2K views
Threads 02: Acesso exclusivo e comunicação entre threads by Helder da Rocha
Threads 02: Acesso exclusivo e comunicação entre threadsThreads 02: Acesso exclusivo e comunicação entre threads
Threads 02: Acesso exclusivo e comunicação entre threads
Helder da Rocha666 views
Block Hosts: Bloqueando Ataques De ForçA Bruta (Brute Force) Em Ftp, Ssh E Ou... by Felipe Santos
Block Hosts: Bloqueando Ataques De ForçA Bruta (Brute Force) Em Ftp, Ssh E Ou...Block Hosts: Bloqueando Ataques De ForçA Bruta (Brute Force) Em Ftp, Ssh E Ou...
Block Hosts: Bloqueando Ataques De ForçA Bruta (Brute Force) Em Ftp, Ssh E Ou...
Felipe Santos1.3K views
Alta Performance de Aplicações PHP com Nginx by Thiago Paes
Alta Performance de Aplicações PHP com NginxAlta Performance de Aplicações PHP com Nginx
Alta Performance de Aplicações PHP com Nginx
Thiago Paes3.5K views

Viewers also liked

DevOps e PHP by
DevOps e PHPDevOps e PHP
DevOps e PHPElton Minetto
3.1K views43 slides
DevOps für PHP (und andere) by
DevOps für PHP (und andere)DevOps für PHP (und andere)
DevOps für PHP (und andere)Mayflower GmbH
1.8K views70 slides
DevOps for PHP by
DevOps for PHPDevOps for PHP
DevOps for PHPMayflower GmbH
5.3K views83 slides
11 tools for your PHP devops stack by
11 tools for your PHP devops stack11 tools for your PHP devops stack
11 tools for your PHP devops stackKris Buytaert
12.6K views54 slides
E-commerce e o novo consumidor by
E-commerce e o novo consumidorE-commerce e o novo consumidor
E-commerce e o novo consumidorElton Minetto
684 views36 slides
Code Squad by
Code SquadCode Squad
Code SquadElton Minetto
754 views12 slides

Viewers also liked(14)

DevOps für PHP (und andere) by Mayflower GmbH
DevOps für PHP (und andere)DevOps für PHP (und andere)
DevOps für PHP (und andere)
Mayflower GmbH1.8K views
11 tools for your PHP devops stack by Kris Buytaert
11 tools for your PHP devops stack11 tools for your PHP devops stack
11 tools for your PHP devops stack
Kris Buytaert12.6K views
E-commerce e o novo consumidor by Elton Minetto
E-commerce e o novo consumidorE-commerce e o novo consumidor
E-commerce e o novo consumidor
Elton Minetto684 views
De Padawan a Jedi - Versão 2016 by Elton Minetto
De Padawan a Jedi - Versão 2016De Padawan a Jedi - Versão 2016
De Padawan a Jedi - Versão 2016
Elton Minetto627 views
Desenvolvendo APIs em Go usando Middlewares by Elton Minetto
Desenvolvendo APIs em Go usando MiddlewaresDesenvolvendo APIs em Go usando Middlewares
Desenvolvendo APIs em Go usando Middlewares
Elton Minetto950 views
Metodologias ágeis interativas by Elton Minetto
Metodologias ágeis interativasMetodologias ágeis interativas
Metodologias ágeis interativas
Elton Minetto1.6K views
PSR-7, middlewares e o futuro dos frameworks by Elton Minetto
PSR-7, middlewares e o futuro dos frameworksPSR-7, middlewares e o futuro dos frameworks
PSR-7, middlewares e o futuro dos frameworks
Elton Minetto3.4K views
Devops is not about Tooling by Kris Buytaert
Devops is not about ToolingDevops is not about Tooling
Devops is not about Tooling
Kris Buytaert1.2K views

Similar to Ao infinito e além com PHP memcached e Gearman

PHP, Gearman e Memcache by
PHP, Gearman e MemcachePHP, Gearman e Memcache
PHP, Gearman e MemcacheAndre Golvea
410 views55 slides
Despertando para o PHP by
Despertando para o PHPDespertando para o PHP
Despertando para o PHPRafael Dohms
2.4K views67 slides
Node JS - Parte 2 by
Node JS - Parte 2Node JS - Parte 2
Node JS - Parte 2Bruno Catão
187 views40 slides
Instalando o MySQL em menos de 10 minutos by
Instalando o MySQL em menos de 10 minutosInstalando o MySQL em menos de 10 minutos
Instalando o MySQL em menos de 10 minutosAlexandre Almeida
1.9K views18 slides
Otimizacao de websites em PHP by
Otimizacao de websites em PHPOtimizacao de websites em PHP
Otimizacao de websites em PHPFelipe Ribeiro
2.3K views80 slides
Cakephp - framework de desenvolvimento de aplicações Web em PHP by
Cakephp - framework de desenvolvimento de aplicações Web em PHPCakephp - framework de desenvolvimento de aplicações Web em PHP
Cakephp - framework de desenvolvimento de aplicações Web em PHPArlindo Santos
3.1K views47 slides

Similar to Ao infinito e além com PHP memcached e Gearman(20)

PHP, Gearman e Memcache by Andre Golvea
PHP, Gearman e MemcachePHP, Gearman e Memcache
PHP, Gearman e Memcache
Andre Golvea410 views
Despertando para o PHP by Rafael Dohms
Despertando para o PHPDespertando para o PHP
Despertando para o PHP
Rafael Dohms2.4K views
Instalando o MySQL em menos de 10 minutos by Alexandre Almeida
Instalando o MySQL em menos de 10 minutosInstalando o MySQL em menos de 10 minutos
Instalando o MySQL em menos de 10 minutos
Alexandre Almeida1.9K views
Otimizacao de websites em PHP by Felipe Ribeiro
Otimizacao de websites em PHPOtimizacao de websites em PHP
Otimizacao de websites em PHP
Felipe Ribeiro2.3K views
Cakephp - framework de desenvolvimento de aplicações Web em PHP by Arlindo Santos
Cakephp - framework de desenvolvimento de aplicações Web em PHPCakephp - framework de desenvolvimento de aplicações Web em PHP
Cakephp - framework de desenvolvimento de aplicações Web em PHP
Arlindo Santos3.1K views
Oficina de infraestrutura como código (apresentando o Puppet) by Jose Augusto Carvalho
Oficina de infraestrutura como código (apresentando o Puppet)Oficina de infraestrutura como código (apresentando o Puppet)
Oficina de infraestrutura como código (apresentando o Puppet)
Administracao de sistemas_com_puppet by Ramon Mota
Administracao de sistemas_com_puppetAdministracao de sistemas_com_puppet
Administracao de sistemas_com_puppet
Ramon Mota525 views
Conhecendo o Nodejs by Caio Cutrim
Conhecendo o NodejsConhecendo o Nodejs
Conhecendo o Nodejs
Caio Cutrim411 views
Phpjedi 090307090434-phpapp01 2 by PrinceGuru MS
Phpjedi 090307090434-phpapp01 2Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2
PrinceGuru MS490 views
Integração de Sistemas usando tecnologias open source by Tiago Peczenyj
Integração de Sistemas usando tecnologias open sourceIntegração de Sistemas usando tecnologias open source
Integração de Sistemas usando tecnologias open source
Tiago Peczenyj714 views
Adeus Wordpress. Ola Pelican! by magnunleno
Adeus Wordpress. Ola Pelican!Adeus Wordpress. Ola Pelican!
Adeus Wordpress. Ola Pelican!
magnunleno810 views
Otimização de infra estrutura para hospedagem de websites by Fabiano Weimar
Otimização de infra estrutura para hospedagem de websitesOtimização de infra estrutura para hospedagem de websites
Otimização de infra estrutura para hospedagem de websites
Fabiano Weimar222 views

More from Elton Minetto

Go e Microserviços - Nascidos um para o outro by
Go e Microserviços - Nascidos um para o outroGo e Microserviços - Nascidos um para o outro
Go e Microserviços - Nascidos um para o outroElton Minetto
1.9K views37 slides
Object Calisthenics em Go by
Object Calisthenics em GoObject Calisthenics em Go
Object Calisthenics em GoElton Minetto
792 views79 slides
Programar != desenvolver software (v2) by
Programar != desenvolver software (v2)Programar != desenvolver software (v2)
Programar != desenvolver software (v2)Elton Minetto
341 views22 slides
Gerenciando uma startup no Github Projects by
Gerenciando uma startup no Github ProjectsGerenciando uma startup no Github Projects
Gerenciando uma startup no Github ProjectsElton Minetto
402 views30 slides
Clean Architecture by
Clean ArchitectureClean Architecture
Clean ArchitectureElton Minetto
915 views37 slides
Serverless em Go by
Serverless em GoServerless em Go
Serverless em GoElton Minetto
433 views31 slides

More from Elton Minetto(20)

Go e Microserviços - Nascidos um para o outro by Elton Minetto
Go e Microserviços - Nascidos um para o outroGo e Microserviços - Nascidos um para o outro
Go e Microserviços - Nascidos um para o outro
Elton Minetto1.9K views
Object Calisthenics em Go by Elton Minetto
Object Calisthenics em GoObject Calisthenics em Go
Object Calisthenics em Go
Elton Minetto792 views
Programar != desenvolver software (v2) by Elton Minetto
Programar != desenvolver software (v2)Programar != desenvolver software (v2)
Programar != desenvolver software (v2)
Elton Minetto341 views
Gerenciando uma startup no Github Projects by Elton Minetto
Gerenciando uma startup no Github ProjectsGerenciando uma startup no Github Projects
Gerenciando uma startup no Github Projects
Elton Minetto402 views
Clean architecture em Go - v2 by Elton Minetto
Clean architecture em Go - v2Clean architecture em Go - v2
Clean architecture em Go - v2
Elton Minetto663 views
Programar != desenvolver software by Elton Minetto
Programar != desenvolver softwareProgramar != desenvolver software
Programar != desenvolver software
Elton Minetto1.6K views
Clean Architecture em PHP by Elton Minetto
Clean Architecture em PHPClean Architecture em PHP
Clean Architecture em PHP
Elton Minetto3.3K views
Clean Architecture in Golang by Elton Minetto
Clean Architecture in GolangClean Architecture in Golang
Clean Architecture in Golang
Elton Minetto1.4K views
A jornada do desenvolvedor by Elton Minetto
A jornada do desenvolvedorA jornada do desenvolvedor
A jornada do desenvolvedor
Elton Minetto636 views
Modernizando projetos legados usando APIs by Elton Minetto
Modernizando projetos legados usando APIsModernizando projetos legados usando APIs
Modernizando projetos legados usando APIs
Elton Minetto1K views
12 factor in the PHP world by Elton Minetto
12 factor in the PHP world12 factor in the PHP world
12 factor in the PHP world
Elton Minetto1.4K views
O case da Compufácil e AWS by Elton Minetto
O case da Compufácil e AWSO case da Compufácil e AWS
O case da Compufácil e AWS
Elton Minetto256 views

Ao infinito e além com PHP memcached e Gearman

  • 1. Ao infinito e além com PHP, Memcached e Gearman Elton Luís Minetto segunda-feira, 29 de novembro de 2010
  • 2. Quem sou eu? • Graduado e pós-graduado em Ciência da Computação. • Trabalha com PHP/MySQL/Linux desde 1998 • Autor do livro Frameworks para Desenvolvimento em PHP - Editora Novatec e co-autor do livro Grid Computing in Research and Education - IBM Redbooks • Membro do PHPSC • Professor na Unochapecó(Chapecó/SC) • Sócio da Coderockr segunda-feira, 29 de novembro de 2010
  • 3. O problema segunda-feira, 29 de novembro de 2010
  • 4. O problema segunda-feira, 29 de novembro de 2010
  • 5. O problema segunda-feira, 29 de novembro de 2010
  • 6. O problema segunda-feira, 29 de novembro de 2010
  • 7. O problema • Performance: a habilidade que uma aplicação tem de atingir um objetivo, como por exemplo responder no menor tempo possível • Capacidade: a carga total que uma aplicação pode suportar • Escalabilidade: a habilidade de uma aplicação manter a performance quando a carga de trabalho aumenta. É a junção da capacidade e da performance • “Performance is a problem. Scaling your performance is a bigger problem” segunda-feira, 29 de novembro de 2010
  • 12. GLAMMP • Gearman • Linux • Apache • MySQL • Memcached • Php (ou Perl ou Python) segunda-feira, 29 de novembro de 2010
  • 13. segunda-feira, 29 de novembro de 2010
  • 14. • Sistema distribuído e de alta performance para fazer cache de objetos em memória RAM. • Genérico por natureza mas muito usado para acelerar aplicações web dinâmicas, reduzindo a carga de bases de dados, sessões de usuários, arquivos CSS. • Criado pela O que é? segunda-feira, 29 de novembro de 2010
  • 15. Por que usar? • Escalável: fácil adicionar máquinas e instâncias • RAM é muito mais rápido que I/O em disco • Alivia a carga do banco de dados • Muito flexível: pode armazenar qualquer dado, desde que não ultrapasse 1 MB • Bibliotecas client disponíveis em diversas linguagens (PHP, C, Java, Ruby, Python) • Open Source segunda-feira, 29 de novembro de 2010
  • 16. Como funciona? • Armazena qualquer coisa que pode ser serializado • Armazena com uma chave única (255 caracteres) e tempo de validade • O programador usa da seguinte forma : • Encontrou no cache? Retorna os dados • Não encontrou no cache? Processa, armazena no cache e retorna o dado segunda-feira, 29 de novembro de 2010
  • 17. Como funciona? segunda-feira, 29 de novembro de 2010
  • 18. O que armazenar? • Resultados de consultas SQL • Páginas inteiras • Sessões de usuários • Fragmentos de HTML gerados • Imagens (thumbnails) • Arquivos css • Arquivos js • “Qualquer coisa que demore um pouco para ser gerada” segunda-feira, 29 de novembro de 2010
  • 19. Quem usa? • Facebook • 805 servidores 8-core. 28TB de RAM. 300K req/seg (Set. 2008) • Desenvolveu fork com suporte a UDP • http://github.com/fbmarc/facebook-memcached/tree/ master • Flickr • 38K req/seg. 12 milhões de objetos (Set. 2008) • Digg • Drimio • Sessões de usuários, imagens, arquivos CSS, arquivos JS, resultados de consultas SQL segunda-feira, 29 de novembro de 2010
  • 20. Como usar? Baixar código em http://www.danga.com/memcached/ e... tar -xvzf memcached-X.Y.Z.tar.gz cd memcached-X.Y.Z ./configure make sudo make install Santíssima Trindade segunda-feira, 29 de novembro de 2010
  • 21. Como usar? • No exemplo abaixo iniciamos o daemon com 128MB RAM, ouvindo na porta 11211 no ip 127.0.0.1 /usr/local/bin/memcached -d -m 128 -l 127.0.0.1 -p 11211 • Pode-se criar quantas instâncias forem necessárias, mudando a porta. Assim aumenta-se o espaço total do cache segunda-feira, 29 de novembro de 2010
  • 22. Como usar com PHP? • Download do módulo em http://pecl.php.net/package/ memcache. • e.. tar -xvzf memcache-2.2.5.tgz cd memcache-2.2.5 phpize ./configure make sudo make install (executar como root) • Adicionar a linha abaixo no php.ini e reiniciar o Apache extension=memcache.so segunda-feira, 29 de novembro de 2010
  • 23. Como usar com PHP? <?php $memcache = new Memcache; $memcache->connect('localhost', 11211); $memcache->connect('localhost', 11212); $memcache->connect(’192.168.0.10', 11212); $conteudo = $memcache->get('estados'); if($conteudo === false) { $uf = array('SC','RS','SP'); $memcache->set('estados', $uf, false, 100) ; $conteudo = $uf; } var_dump($conteudo); ?> segunda-feira, 29 de novembro de 2010
  • 24. API • Comandos de armazenamento: • set, add, replace, append • Comandos de recuperação: • get • Comandos de exclusão: • delete • Outros comandos: • stats, flush_all, version, verbosity, quit segunda-feira, 29 de novembro de 2010
  • 25. Monitorando • Plugin para o Nagios • memcache.php segunda-feira, 29 de novembro de 2010
  • 26. segunda-feira, 29 de novembro de 2010
  • 27. segunda-feira, 29 de novembro de 2010
  • 28. segunda-feira, 29 de novembro de 2010
  • 29. • Framework genérico para distribuir jobs a serem executados por uma ou mais máquinas • Permite uma aplicação executar tarefas em paralelo, com balanceamento da carga de processos, e até invocar códigos escritos em outras linguagens • O nome é um anagrama para "Manager" • Criado pela O que é? segunda-feira, 29 de novembro de 2010
  • 30. Áreas de Aplicação • Análise de logs • Redimensionamento de imagens • Processamento de URLs • Atualização de cache • Jobs de banco de dados • etc segunda-feira, 29 de novembro de 2010
  • 31. Por que usar? • Open Source com interfaces para desenvolver em várias linguagens (C, PHP, Perl, MySQL UDF, Python, etc). Clients podem ser em uma linguagem, workers em outra • Rápido - possui protocolo e interfaces simples, com um servidor desenvolvido em C • Escalável e tolerante a falhas • Digg: +45 servers, 400mil jobs/dia (em 2009) • Yahoo: +60 servers, 6milhões jobs/dia • Síncrono ou assíncrono segunda-feira, 29 de novembro de 2010
  • 32. Como funciona? • Client- Cria um job a ser executado e o envia a um servidor de jobs • Worker - Registra-se em um servidor de jobs e pega jobs para executar • Job Server - Recebe os jobs e coordena a entrega de um job para um worker executar segunda-feira, 29 de novembro de 2010
  • 35. Síncrono X Assíncrono • Síncrono, ou “em primeiro plano”(“foreground”). O cliente fica parado esperando o fim da execução da tarefa • Assíncrono, ou “em segundo plano”(“background”). O cliente continua sua execução e o trabalho vai ser realizado por algum Worker. O cliente pode ser avisado do status por métodos e callbacks segunda-feira, 29 de novembro de 2010
  • 36. Instalando wget http://launchpad.net/gearmand/trunk/0.13/+download/ gearmand-X.Y.tar.gz tar xfvz gearmand-X.Y.tar.gz cd gearmand-X.Y ./configure make sudo make install Lembra? Santíssima Trindade segunda-feira, 29 de novembro de 2010
  • 37. Iniciando o server • Simples: /usr/local/sbin/gearmand -d • Completo: /usr/local/sbin/gearmand -d -u <user> -L <host> -p 70 • Sendo -d Inicia como um daemon em background -u <user> Executa como o usuário específico -L <host> Fica ouvindo neste ip -p <port> Ouve na porta específica (defaul 4730) segunda-feira, 29 de novembro de 2010
  • 38. PHP • Instalando a extensão do PHP: wget http://pecl.php.net/get/gearman-X.Y.Z.tgz tar xfvz gearman-X.Y.Z.tgz cd gearman-X.Y.Z phpize ./configure make sudo make install • Adicionar no php.ini: extension = gearman.so Acabou a criativade :( Mas você entendeu né? segunda-feira, 29 de novembro de 2010
  • 39. PHP - Exemplo: Cliente Síncrono <?php $client= new GearmanClient(); /*indica em quais servidores o cliente pode enviar jobs. No caso somente o localhost, pois não é passado nada*/ $client->addServer(); /*adiciona um job síncrono, para a fila chamada title, enviando uma string como parâmetro*/ print $client->do("title", "o Ivo andava de PATINS!!!"); print "n"; ?> segunda-feira, 29 de novembro de 2010
  • 40. PHP - Exemplo: Worker Síncrono <?php $worker= new GearmanWorker(); $worker->addServer();//servidores q vai atender /*registra a função title_function como responsável por atender a fila title*/ $worker->addFunction("title", "title_function"); while ($worker->work()); //fica em loop trabalhando     //função que vai executar o trabalho function title_function($job) {         return ucwords(strtolower($job->workload())); } ?> segunda-feira, 29 de novembro de 2010
  • 41. PHP - Exemplo: Cliente Assíncrono <?php $client= new GearmanClient(); $client->addServer(); for($i=0;$i<10;$i++) {         /*adiciona um job asíncrono, para a fila chamada title, enviando um array como parâmetro. O cliente não fica esperando o final do processamento */         $log['data'] = date('l jS of F Y h:i:s A');         $log['msg'] = "O Ivo andou de patins $i vez(es)";         $client->doBackground("log_queue", serialize ($log)); } ?> segunda-feira, 29 de novembro de 2010
  • 42. PHP - Exemplo: Worker Assíncrono <?php $worker= new GearmanWorker(); $worker->addServer(); /*registra a função log_function como responsável por atender a fila log_queue*/ $worker->addFunction("log_queue", "log_function"); while ($worker->work()); //fica em loop trabalhando     function log_function($job){         $log = unserialize($job->workload());         sleep(1); //sleep só para demonstrar executando         echo $log['data'], ' - ', $log['msg'], "n"; } ?> segunda-feira, 29 de novembro de 2010
  • 43. segunda-feira, 29 de novembro de 2010
  • 44. Python - Exemplo: Worker Assíncrono from gearman import libgearman 1.   2. def worker_func(job): 3.   workload= job.get_workload() 4.   print workload 5.   return workload 6.   7. worker = libgearman.Worker() 8. worker.set_timeout(5000) 9. worker.add_server('localhost') 10.worker.add_function("log_queue", worker_func) 11.ret= libgearman.GEARMAN_SUCCESS 12.while 1: 13.  ret= worker.work() segunda-feira, 29 de novembro de 2010
  • 45. PHP - Job API • GearmanJob::sendStatus(int $numerator, int $denominator) • GearmanJob::sendWarning(string $warning) • GearmanJob::sendComplete(string $result) • GearmanJob::sendFail(void) • GearmanJob::sendException(string $exception) segunda-feira, 29 de novembro de 2010
  • 46. PHP - Job API - Client <?php 1. $client= new GearmanClient(); 2. $client->addServer(); 3. $handle = $client->doBackground("title", "o PHp"); 4. if($client->returnCode() != GEARMAN_SUCCESS) { 5. echo "Job com problemas";exit; 6. } 7. $done = false; 8. do { 9. sleep(2); 10. $stat = $client->jobStatus($handle); 11. if(!$stat[0]) { $done = true; }//job terminou 12. if($stat[1] == true) 13. echo "Executando:", ' passo ' , $stat[2], ' de ', $stat[3], "n"; 14.}while(!$done); 15.?> segunda-feira, 29 de novembro de 2010
  • 47. PHP - Job API - Worker <?php 1. $worker= new GearmanWorker(); 2. $worker->addServer(); 3. $worker->addFunction("title", "title_function"); 4. while ($worker->work()); 5.     6. function title_function($job){ 7. $job->sendStatus(0, 2); 8. sleep(3); 9. $job->sendStatus(1, 2); 10. sleep(3); 11. $job->sendStatus(2, 2); 12. return ucwords(strtolower($job->workload())); 13.} 14.?> segunda-feira, 29 de novembro de 2010
  • 48. PHP - Client API - Prioridades • Síncrono echo $client->do("title", "uma frasE quAlquer"); echo $client->doHigh("title", "uma frasE quAlquer"); echo $client->doLow("title", "uma frasE quAlquer");  • Assíncrono $handle1 = $client->doBackground("title", "uma frasE quAlquer"); $handle1 = $client->doHighBackground("title", "uma frasE quAlquer"); $handle1 = $client->doLowBackground("title", "uma frasE quAlquer"); segunda-feira, 29 de novembro de 2010
  • 49. Filas Persistentes • Internamente todas as filas de jobs são armazenadas em memória. Se o servidor reinicia ou acontece algum erro todos os jobs pendentes são perdidos • Pode-se usar filas persistentes para armazenar os jobs pendentes (somente jobs assíncronos) • É possível armazenar a fila em: • MySQL (libdrizzle) • Memcached (libmemcached) • SQLite3 (libsqlite3) segunda-feira, 29 de novembro de 2010
  • 50. Monitorando telnet localhost 4730 Trying 127.0.0.1... Connected to localhost.localdomain (127.0.0.1). Escape character is '^]'. status jobLog 0 0 1 jobTwitter 0 0 1 jobTwitterUser 0 0 1 jobFacebookPostSearch 0 0 1 jobFeed 0 0 1 jobBlogsearch 0 0 1 jobFacebookUser 2 1 1 jobSlideshareUser 0 0 1 segunda-feira, 29 de novembro de 2010
  • 51. Gearman no Drimio • Processamento de Logs • Monitoramento de redes sociais (Twitter, Youtube, Flickr, Yahoo, Facebook, Feeds, Blogsearch, Slideshare, etc) • Envio de e-mails • Captura de snapshots de URLS • Envio de tweets/posts Facebook • Redimensionamento de imagens • Média de 55 mil jobs/dia segunda-feira, 29 de novembro de 2010
  • 52. Tudo junto reunido! 1. Faz pesquisa 2. Chamada de API 3. Resultado 4. Jobs para processar imagens e para Log de acesso Imagens processadas e salvas em Memcached e Logs em MySQL 5. Página de resultados segunda-feira, 29 de novembro de 2010
  • 54. Contato <?php $card = array( ‘nome’ => ‘Elton Luís Minetto’, ‘site’ => ‘http://www.eltonminetto.net’, ‘e-mail’ => ‘eminetto@coderockr.com’, ‘twitter’ => ‘@eminetto’, ‘all’ => ‘http://about.me/eminetto' ); var_dump($card); ?> segunda-feira, 29 de novembro de 2010
  • 55. Referências • http://www.danga.com • http://www.slideshare.net/andreizm/all-the-little- pieces-1573862 • http://www.slideshare.net/acme/scaling-with- memcached • http://www.slideshare.net/oemebamo/introduction-to- memcached • http://www.slideshare.net/felixdv/high-gear-php-with- gearman-3404242 • http://www.eltonminetto.net/material-da-palestra-no- phpsc-conf-2009.htm • http://www.eltonminetto.net/material-de-minha- palestra-sobre-gearman.htm segunda-feira, 29 de novembro de 2010