Ao infinito e além com PHP, Memcached e Gearman                                           Elton Luís Minettosegunda-feira, ...
Quem sou eu?       • Graduado e pós-graduado em Ciência da Computação.       • Trabalha com PHP/MySQL/Linux desde 1998    ...
O problemasegunda-feira, 29 de novembro de 2010
O problemasegunda-feira, 29 de novembro de 2010
O problemasegunda-feira, 29 de novembro de 2010
O problemasegunda-feira, 29 de novembro de 2010
O problema       • Performance: a habilidade que uma aplicação tem de         atingir um objetivo, como por exemplo respon...
A solução                         Distribua!segunda-feira, 29 de novembro de 2010
Distribua!                                        Memóriasegunda-feira, 29 de novembro de 2010
Distribua!                                        Trabalhosegunda-feira, 29 de novembro de 2010
Distribua!segunda-feira, 29 de novembro de 2010
GLAMMP       •   Gearman       •   Linux       •   Apache       •   MySQL       •   Memcached       •   Php (ou Perl ou Py...
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...
Por que usar?       • Escalável: fácil adicionar máquinas e instâncias       • RAM é muito mais rápido que I/O em disco   ...
Como funciona?       • Armazena qualquer coisa que pode ser serializado       • Armazena com uma chave única (255 caracter...
Como funciona?segunda-feira, 29 de novembro de 2010
O que armazenar?       •   Resultados de consultas SQL       •   Páginas inteiras       •   Sessões de usuários       •   ...
Quem usa?       • Facebook             • 805 servidores 8-core. 28TB de RAM. 300K req/seg (Set. 2008)             • Desenv...
Como usar?           Baixar código em http://www.danga.com/memcached/           e...           tar -xvzf memcached-X.Y.Z.t...
Como usar?      • No exemplo abaixo iniciamos o daemon com 128MB        RAM, ouvindo na porta 11211 no ip 127.0.0.1       ...
Como usar com PHP?      • Download do módulo em http://pecl.php.net/package/        memcache.      • e..           tar -xv...
Como usar com PHP?<?php$memcache = new Memcache;$memcache->connect(localhost, 11211);$memcache->connect(localhost, 11212);...
API       • Comandos de armazenamento:             • set, add, replace, append       • Comandos de recuperação:           ...
Monitorando       • Plugin para o Nagios       • memcache.phpsegunda-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       • Permi...
Áreas de Aplicação       •   Análise de logs       •   Redimensionamento de imagens       •   Processamento de URLs       ...
Por que usar?       • Open Source com interfaces para desenvolver em várias         linguagens (C, PHP, Perl, MySQL UDF, P...
Como funciona?       • Client- Cria um job a ser executado e o envia a um         servidor de jobs       • Worker - Regist...
Como funciona?                                        Fonte: http://www.gearman.orgsegunda-feira, 29 de novembro de 2010
Como funciona?                                        Fonte: http://www.gearman.orgsegunda-feira, 29 de novembro de 2010
Síncrono X Assíncrono       • Síncrono, ou “em primeiro plano”(“foreground”). O         cliente fica parado esperando o fi...
Instalando           wget http://launchpad.net/gearmand/trunk/0.13/+download/           gearmand-X.Y.tar.gz           tar ...
Iniciando o server      • Simples:           /usr/local/sbin/gearmand -d      • Completo:           /usr/local/sbin/gearma...
PHP      • Instalando a extensão do PHP:           wget http://pecl.php.net/get/gearman-X.Y.Z.tgz           tar xfvz gearm...
PHP - Exemplo: Cliente Síncrono<?php$client= new GearmanClient();/*indica em quais servidores o cliente pode enviar jobs.N...
PHP - Exemplo: Worker Síncrono<?php$worker= new GearmanWorker();$worker->addServer();//servidores q vai atender/*registra ...
PHP - Exemplo: Cliente Assíncrono<?php$client= new GearmanClient();$client->addServer();for($i=0;$i<10;$i++) {        /*ad...
PHP - Exemplo: Worker Assíncrono<?php$worker= new GearmanWorker();$worker->addServer();/*registra a função log_function co...
segunda-feira, 29 de novembro de 2010
Python - Exemplo: Worker Assíncrono           from gearman import libgearman        1.          2. def worker_func(job):  ...
PHP - Job API       • GearmanJob::sendStatus(int $numerator, int         $denominator)       • GearmanJob::sendWarning(str...
PHP - Job API - Client           <?php        1. $client= new GearmanClient();        2. $client->addServer();        3. $...
PHP - Job API - Worker           <?php        1. $worker= new GearmanWorker();        2. $worker->addServer();        3. $...
PHP - Client API - Prioridades  • Síncrono       echo $client->do("title", "uma frasE quAlquer");       echo $client->doHi...
Filas Persistentes       • Internamente todas as filas de jobs são armazenadas         em memória. Se o servidor reinicia ...
Monitorandotelnet localhost 4730Trying 127.0.0.1...Connected to localhost.localdomain (127.0.0.1).Escape character is ^].s...
Gearman no Drimio       • Processamento de Logs       • Monitoramento de redes sociais (Twitter, Youtube,         Flickr, ...
Tudo junto reunido!                      1. Faz pesquisa      2. Chamada de API                                           ...
Perguntas?segunda-feira, 29 de novembro de 2010
Contato           <?php           $card = array(                 ‘nome’ =>              ‘Elton Luís Minetto’,             ...
Referências       • http://www.danga.com       • http://www.slideshare.net/andreizm/all-the-little-         pieces-1573862...
Upcoming SlideShare
Loading in …5
×

PHP, Gearman e Memcache

376 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
376
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
4
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

PHP, Gearman e Memcache

  1. 1. Ao infinito e além com PHP, Memcached e Gearman Elton Luís Minettosegunda-feira, 29 de novembro de 2010
  2. 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 Coderockrsegunda-feira, 29 de novembro de 2010
  3. 3. O problemasegunda-feira, 29 de novembro de 2010
  4. 4. O problemasegunda-feira, 29 de novembro de 2010
  5. 5. O problemasegunda-feira, 29 de novembro de 2010
  6. 6. O problemasegunda-feira, 29 de novembro de 2010
  7. 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. 8. A solução Distribua!segunda-feira, 29 de novembro de 2010
  9. 9. Distribua! Memóriasegunda-feira, 29 de novembro de 2010
  10. 10. Distribua! Trabalhosegunda-feira, 29 de novembro de 2010
  11. 11. Distribua!segunda-feira, 29 de novembro de 2010
  12. 12. GLAMMP • Gearman • Linux • Apache • MySQL • Memcached • Php (ou Perl ou Python)segunda-feira, 29 de novembro de 2010
  13. 13. segunda-feira, 29 de novembro de 2010
  14. 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 pelasegunda-feira, 29 de novembro de 2010
  15. 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 Sourcesegunda-feira, 29 de novembro de 2010
  16. 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 dadosegunda-feira, 29 de novembro de 2010
  17. 17. Como funciona?segunda-feira, 29 de novembro de 2010
  18. 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. 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 SQLsegunda-feira, 29 de novembro de 2010
  20. 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 Trindadesegunda-feira, 29 de novembro de 2010
  21. 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 cachesegunda-feira, 29 de novembro de 2010
  22. 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.sosegunda-feira, 29 de novembro de 2010
  23. 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. 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, quitsegunda-feira, 29 de novembro de 2010
  25. 25. Monitorando • Plugin para o Nagios • memcache.phpsegunda-feira, 29 de novembro de 2010
  26. 26. segunda-feira, 29 de novembro de 2010
  27. 27. segunda-feira, 29 de novembro de 2010
  28. 28. segunda-feira, 29 de novembro de 2010
  29. 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 pelasegunda-feira, 29 de novembro de 2010
  30. 30. Áreas de Aplicação • Análise de logs • Redimensionamento de imagens • Processamento de URLs • Atualização de cache • Jobs de banco de dados • etcsegunda-feira, 29 de novembro de 2010
  31. 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íncronosegunda-feira, 29 de novembro de 2010
  32. 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 executarsegunda-feira, 29 de novembro de 2010
  33. 33. Como funciona? Fonte: http://www.gearman.orgsegunda-feira, 29 de novembro de 2010
  34. 34. Como funciona? Fonte: http://www.gearman.orgsegunda-feira, 29 de novembro de 2010
  35. 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 callbackssegunda-feira, 29 de novembro de 2010
  36. 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 Trindadesegunda-feira, 29 de novembro de 2010
  37. 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. 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. 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. 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 poratender a fila title*/$worker->addFunction("title", "title_function");while ($worker->work()); //fica em loop trabalhando   //função que vai executar o trabalhofunction title_function($job){        return ucwords(strtolower($job->workload()));}?>segunda-feira, 29 de novembro de 2010
  41. 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 chamadatitle, enviando um array como parâmetro. O cliente nãofica 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. 42. PHP - Exemplo: Worker Assíncrono<?php$worker= new GearmanWorker();$worker->addServer();/*registra a função log_function como responsável poratender 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. 43. segunda-feira, 29 de novembro de 2010
  44. 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. 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. 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. 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. 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. 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. 50. Monitorandotelnet localhost 4730Trying 127.0.0.1...Connected to localhost.localdomain (127.0.0.1).Escape character is ^].statusjobLog 0 0 1jobTwitter 0 0 1jobTwitterUser 0 0 1jobFacebookPostSearch 0 0 1jobFeed 0 0 1jobBlogsearch 0 0 1jobFacebookUser 2 1 1jobSlideshareUser 0 0 1segunda-feira, 29 de novembro de 2010
  51. 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/diasegunda-feira, 29 de novembro de 2010
  52. 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 MySQLsegunda-feira, 29 de novembro de 2010
  53. 53. Perguntas?segunda-feira, 29 de novembro de 2010
  54. 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. 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.htmsegunda-feira, 29 de novembro de 2010

×