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 livr...
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 t...
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 ...
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 car...
Como funciona?
• Armazena qualquer coisa que pode ser serializado
• Armazena com uma chave única (255 caracteres) e
tempo ...
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
• Ima...
Quem usa?
• Facebook
• 805 servidores 8-core. 28TB de RAM. 300K req/seg (Set. 2008)
• Desenvolveu fork com suporte a UDP
•...
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
./con...
Como usar?
• No exemplo abaixo iniciamos o daemon com 128MB
RAM, ouvindo na porta 11211 no ip 127.0.0.1
/usr/local/bin/mem...
Como usar com PHP?
• Download do módulo em http://pecl.php.net/package/
memcache.
• e..
tar -xvzf memcache-2.2.5.tgz
cd me...
Como usar com PHP?
<?php
$memcache = new Memcache;
$memcache->connect('localhost', 11211);
$memcache->connect('localhost',...
API
• Comandos de armazenamento:
• set, add, replace, append
• Comandos de recuperação:
• get
• Comandos de exclusão:
• de...
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 tar...
Áreas de Aplicação
• Análise de logs
• Redimensionamento de imagens
• Processamento de URLs
• Atualização de cache
• Jobs ...
Por que usar?
• Open Source com interfaces para desenvolver em várias
linguagens (C, PHP, Perl, MySQL UDF, Python, etc).
C...
Como funciona?
• Client- Cria um job a ser executado e o envia a um
servidor de jobs
• Worker - Registra-se em um servidor...
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 ...
Instalando
wget http://launchpad.net/gearmand/trunk/0.13/+download/
gearmand-X.Y.tar.gz
tar xfvz gearmand-X.Y.tar.gz
cd ge...
Iniciando o server
• Simples:
/usr/local/sbin/gearmand -d
• Completo:
/usr/local/sbin/gearmand -d -u <user> -L <host> -p 7...
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...
PHP - Exemplo: Cliente Síncrono
<?php
$client= new GearmanClient();
/*indica em quais servidores o cliente pode enviar job...
PHP - Exemplo: Worker Síncrono
<?php
$worker= new GearmanWorker();
$worker->addServer();//servidores q vai atender
/*regis...
PHP - Exemplo: Cliente Assíncrono
<?php
$client= new GearmanClient();
$client->addServer();
for($i=0;$i<10;$i++) {
       ...
PHP - Exemplo: Worker Assíncrono
<?php
$worker= new GearmanWorker();
$worker->addServer();
/*registra a função log_functio...
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_wo...
PHP - Job API
• GearmanJob::sendStatus(int $numerator, int
$denominator)
• GearmanJob::sendWarning(string $warning)
• Gear...
PHP - Job API - Client
<?php
1. $client= new GearmanClient();
2. $client->addServer();
3. $handle = $client->doBackground(...
PHP - Job API - Worker
<?php
1. $worker= new GearmanWorker();
2. $worker->addServer();
3. $worker->addFunction("title", "t...
PHP - Client API - Prioridades
• Síncrono
echo $client->do("title", "uma frasE quAlquer");
echo $client->doHigh("title", "...
Filas Persistentes
• Internamente todas as filas de jobs são armazenadas
em memória. Se o servidor reinicia ou acontece al...
Monitorando
telnet localhost 4730
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is ...
Gearman no Drimio
• Processamento de Logs
• Monitoramento de redes sociais (Twitter, Youtube,
Flickr, Yahoo, Facebook, Fee...
Tudo junto reunido!
1. Faz pesquisa 2. Chamada de API
3. Resultado
4. Jobs para processar imagens e para Log de
acesso
Ima...
Perguntas?
segunda-feira, 29 de novembro de 2010
Contato
<?php
$card = array(
‘nome’ => ‘Elton Luís Minetto’,
‘site’ => ‘http://www.eltonminetto.net’,
‘e-mail’ => ‘eminett...
Referências
• http://www.danga.com
• http://www.slideshare.net/andreizm/all-the-little-
pieces-1573862
• http://www.slides...
Upcoming SlideShare
Loading in...5
×

Ao infinito e além com PHP memcached e Gearman

5,861

Published on

São apresentados o Gearman e o Memcached. O Gearman é um framework genérico para gerenciar filas de tarefas de forma que possam ser executadas em paralelo, com balanceamento de carga e acessíveis a múltiplas linguagens de programação. O Memcached é um sistema distribuído e de alta performance para fazer cache de objetos em memória RAM. São de extrema utilidade em sites e aplicativos com grande carga de processamento e necessidades de escalabilidade.

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

No Downloads
Views
Total Views
5,861
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
104
Comments
0
Likes
10
Embeds 0
No embeds

No notes for slide

Ao infinito e além com PHP memcached e Gearman

  1. 1. Ao infinito e além com PHP, Memcached e Gearman Elton Luís Minetto segunda-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 Coderockr segunda-feira, 29 de novembro de 2010
  3. 3. O problema segunda-feira, 29 de novembro de 2010
  4. 4. O problema segunda-feira, 29 de novembro de 2010
  5. 5. O problema segunda-feira, 29 de novembro de 2010
  6. 6. O problema segunda-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ória segunda-feira, 29 de novembro de 2010
  10. 10. Distribua! Trabalho segunda-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. • 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. 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. 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. 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 SQL segunda-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 Trindade segunda-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 cache segunda-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.so segunda-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, quit segunda-feira, 29 de novembro de 2010
  25. 25. Monitorando • Plugin para o Nagios • memcache.php segunda-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. • 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. 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. 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. 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. 33. Como funciona? Fonte: http://www.gearman.org segunda-feira, 29 de novembro de 2010
  34. 34. Como funciona? Fonte: http://www.gearman.org segunda-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 callbacks segunda-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 Trindade segunda-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 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. 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 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. 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. 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. 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. 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. 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. 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
  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.htm segunda-feira, 29 de novembro de 2010
  1. Gostou de algum slide específico?

    Recortar slides é uma maneira fácil de colecionar informações para acessar mais tarde.

×