SlideShare una empresa de Scribd logo
1 de 55
Descargar para leer sin conexión
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
O que é?

       • 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




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
O que é?

       • 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




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
                                                    Acabou a
           sudo make install                        criativade :(
      • Adicionar no php.ini:                       Mas você
          extension = gearman.so                    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
         5. Página de resultados

                                        4. Jobs para processar imagens e para Log de
                                        acesso



                                         Imagens processadas e salvas em Memcached
                                         e Logs em MySQL




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

Más contenido relacionado

La actualidad más candente

Apostila Treinamento AvançAdo Em Linux
Apostila Treinamento AvançAdo Em LinuxApostila Treinamento AvançAdo Em Linux
Apostila Treinamento AvançAdo Em Linux
eliezer
 
Slide minicursocalourosufpa2010
Slide minicursocalourosufpa2010Slide minicursocalourosufpa2010
Slide minicursocalourosufpa2010
Diego Damasceno
 

La actualidad más candente (20)

I educar-manual-de-instalaao
I educar-manual-de-instalaaoI educar-manual-de-instalaao
I educar-manual-de-instalaao
 
Tutorial de instalação do PlayerStageGazebo no ubuntu linux 10.10 maverick me...
Tutorial de instalação do PlayerStageGazebo no ubuntu linux 10.10 maverick me...Tutorial de instalação do PlayerStageGazebo no ubuntu linux 10.10 maverick me...
Tutorial de instalação do PlayerStageGazebo no ubuntu linux 10.10 maverick me...
 
Node JS - Parte 3
Node JS - Parte 3Node JS - Parte 3
Node JS - Parte 3
 
Apostila Treinamento AvançAdo Em Linux
Apostila Treinamento AvançAdo Em LinuxApostila Treinamento AvançAdo Em Linux
Apostila Treinamento AvançAdo Em Linux
 
Tutorial beagleboard
Tutorial beagleboardTutorial beagleboard
Tutorial beagleboard
 
Semana da computacao - Linux Day
Semana da computacao - Linux DaySemana da computacao - Linux Day
Semana da computacao - Linux Day
 
Minicurso GNU/Linux básico - Aula1 - Semana Sistemas de Informação 2015 - UNI...
Minicurso GNU/Linux básico - Aula1 - Semana Sistemas de Informação 2015 - UNI...Minicurso GNU/Linux básico - Aula1 - Semana Sistemas de Informação 2015 - UNI...
Minicurso GNU/Linux básico - Aula1 - Semana Sistemas de Informação 2015 - UNI...
 
Node JS - Parte 4
Node JS - Parte 4Node JS - Parte 4
Node JS - Parte 4
 
Ubuntu 8.04 LTS 2008
Ubuntu 8.04 LTS 2008Ubuntu 8.04 LTS 2008
Ubuntu 8.04 LTS 2008
 
Gerenciamento de Backups PostgreSQL com pgbarman
Gerenciamento de Backups PostgreSQL com pgbarmanGerenciamento de Backups PostgreSQL com pgbarman
Gerenciamento de Backups PostgreSQL com pgbarman
 
9 - segurança - ataques buffer-injection
9 - segurança -  ataques buffer-injection9 - segurança -  ataques buffer-injection
9 - segurança - ataques buffer-injection
 
Pal bpi
Pal bpiPal bpi
Pal bpi
 
Seguranca em Servidores Linux
Seguranca em Servidores LinuxSeguranca em Servidores Linux
Seguranca em Servidores Linux
 
Slide minicursocalourosufpa2010
Slide minicursocalourosufpa2010Slide minicursocalourosufpa2010
Slide minicursocalourosufpa2010
 
Instalando o MySQL em menos de 10 minutos
Instalando o MySQL em menos de 10 minutosInstalando o MySQL em menos de 10 minutos
Instalando o MySQL em menos de 10 minutos
 
Vagrant + Puppet
Vagrant + PuppetVagrant + Puppet
Vagrant + Puppet
 
Linux - Instalação de Programas
Linux - Instalação de ProgramasLinux - Instalação de Programas
Linux - Instalação de Programas
 
1 - redes de computadores - introção a redes de computadores e topologias
1 - redes de computadores - introção a redes de computadores e topologias1 - redes de computadores - introção a redes de computadores e topologias
1 - redes de computadores - introção a redes de computadores e topologias
 
Como definir a quantidade de workers para sua aplicação
Como definir a quantidade de workers para sua aplicaçãoComo definir a quantidade de workers para sua aplicação
Como definir a quantidade de workers para sua aplicação
 
Customizando Slackware
Customizando SlackwareCustomizando Slackware
Customizando Slackware
 

Similar a PHP, Gearman e Memcache

App Web Escalaveis Fisl
App Web Escalaveis FislApp Web Escalaveis Fisl
App Web Escalaveis Fisl
Elton Minetto
 
Segurança em servidores Linux
Segurança em servidores LinuxSegurança em servidores Linux
Segurança em servidores Linux
Impacta Eventos
 
Apostila Treinamento AvançAdo Em Linux
Apostila Treinamento AvançAdo Em LinuxApostila Treinamento AvançAdo Em Linux
Apostila Treinamento AvançAdo Em Linux
guest7a481e8
 

Similar a PHP, Gearman e Memcache (20)

Otimizacao de websites em PHP
Otimizacao de websites em PHPOtimizacao de websites em PHP
Otimizacao de websites em PHP
 
Integração de Sistemas usando tecnologias open source
Integração de Sistemas usando tecnologias open sourceIntegração de Sistemas usando tecnologias open source
Integração de Sistemas usando tecnologias open source
 
MySQL em 10min - Alexandre Almeida HTI Tecnologia
MySQL em 10min - Alexandre Almeida HTI TecnologiaMySQL em 10min - Alexandre Almeida HTI Tecnologia
MySQL em 10min - Alexandre Almeida HTI Tecnologia
 
App Web Escalaveis Fisl
App Web Escalaveis FislApp Web Escalaveis Fisl
App Web Escalaveis Fisl
 
Segurança em servidores Linux
Segurança em servidores LinuxSegurança em servidores Linux
Segurança em servidores Linux
 
Apostila Treinamento AvançAdo Em Linux
Apostila Treinamento AvançAdo Em LinuxApostila Treinamento AvançAdo Em Linux
Apostila Treinamento AvançAdo Em Linux
 
Apostila Treinamento AvançAdo Em Linux
Apostila Treinamento AvançAdo Em LinuxApostila Treinamento AvançAdo Em Linux
Apostila Treinamento AvançAdo Em Linux
 
Meu Plone Site está lento. O que fazer???
Meu Plone Site está lento. O que fazer???Meu Plone Site está lento. O que fazer???
Meu Plone Site está lento. O que fazer???
 
Introducao ao sistema de gerenciamento de conteúdo Plone
Introducao ao sistema de gerenciamento de conteúdo PloneIntroducao ao sistema de gerenciamento de conteúdo Plone
Introducao ao sistema de gerenciamento de conteúdo Plone
 
Despertando para o PHP
Despertando para o PHPDespertando para o PHP
Despertando para o PHP
 
Segurança Linux
Segurança LinuxSegurança Linux
Segurança Linux
 
Docker - Tutorial for beginners
Docker - Tutorial for beginnersDocker - Tutorial for beginners
Docker - Tutorial for beginners
 
Cygwin
CygwinCygwin
Cygwin
 
Portando Aplicações Para a Plataforma Maemo
Portando Aplicações Para a Plataforma MaemoPortando Aplicações Para a Plataforma Maemo
Portando Aplicações Para a Plataforma Maemo
 
Administracao de sistemas_com_puppet
Administracao de sistemas_com_puppetAdministracao de sistemas_com_puppet
Administracao de sistemas_com_puppet
 
Nodejs justdigital
Nodejs justdigitalNodejs justdigital
Nodejs justdigital
 
Consegi 2011: Puppet
Consegi 2011: PuppetConsegi 2011: Puppet
Consegi 2011: Puppet
 
Adeus Wordpress. Ola Pelican!
Adeus Wordpress. Ola Pelican!Adeus Wordpress. Ola Pelican!
Adeus Wordpress. Ola Pelican!
 
Conhecendo o Nodejs
Conhecendo o NodejsConhecendo o Nodejs
Conhecendo o Nodejs
 
Intro linux
Intro linuxIntro linux
Intro linux
 

PHP, Gearman e Memcache

  • 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
  • 8. A solução Distribua! segunda-feira, 29 de novembro de 2010
  • 9. Distribua! Memória segunda-feira, 29 de novembro de 2010
  • 10. Distribua! Trabalho 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. O que é? • 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 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. O que é? • 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 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
  • 33. Como funciona? Fonte: http://www.gearman.org segunda-feira, 29 de novembro de 2010
  • 34. Como funciona? Fonte: http://www.gearman.org 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 Acabou a sudo make install criativade :( • Adicionar no php.ini: Mas você extension = gearman.so 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 5. Página de resultados 4. Jobs para processar imagens e para Log de acesso Imagens processadas e salvas em Memcached e Logs em MySQL 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