SlideShare a Scribd company logo
1 of 47
Download to read offline
Memcached,
Gearman e Sphinx
elton luís minetto
@eminetto
@coderockr
Memcached
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
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
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
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”
Quem usa?
Facebook

•
•

805 servidores 8-core. 28TB de RAM. 300K req/seg (Set.
2008). "Trillions of itens, bilions of requests/s" (2013)

•

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)
Como usar?
Baixar código em http://memcached.org
tar -xvzf memcached-X.Y.Z.tar.gz 	
cd memcached-X.Y.Z	
./configure 	
make 	
sudo make install	
(ou usar o pacote da sua distribuição Linux)
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
Como usar com PHP?
•

Download do módulo em http://pecl.php.net/package/memcache.
tar -xvzf memcache-2.2.7.tgz 	
cd memcache-2.2.7 	
phpize 	
./configure 	
make 	
sudo make install

•

(executar como root)	

Adicionar a linha abaixo no php.ini e reiniciar o Apache
extension=memcache.so
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);	
?>
API
•

Comandos de armazenamento:
•

•

Comandos de recuperação:
•

•

get

Comandos de exclusão:
•

•

set, add, replace, append

delete

Outros comandos:
•

stats, flush_all, version, verbosity, quit
Monitorando
•

Plugin para o Nagios

•

memcache.php
!
!
!
Gearman
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
Áreas de Aplicação
•

Análise de logs

•

Redimensionamento de imagens

•

Processamento de URLs

•

Atualização de cache

•

Jobs de banco de dados

•

etc
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
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
Fonte: http://www.gearman.org
Fonte: http://www.gearman.org
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
Instalando
wget https://launchpad.net/gearmand/1.2/1.1.11/+download/
gearmand-1.1.11.tar.gz	
tar xfvz gearmand-1.1.11.tar.gz	
cd gearmand-1.1.11	
./configure	
make	
sudo make install 	
(ou use o pacote da sua distribuição Linux)
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 (default 4730)
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
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", “Mensagem");	
print "n";
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 esperando trabalhos	
   	
//função que vai executar o trabalho 	
function title_function($job)	
{	
   return ucwords(strtolower($job->workload()));	
}	
?>
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'] = "Mensagem $i";	
        $client->doBackground("log_queue", serialize($log));	
}	
?>	

!
!
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";	
}	
?>
PHP - Job API
•

GearmanJob::sendStatus(int $numerator, int
$denominator)

•

GearmanJob::sendWarning(string $warning)

•

GearmanJob::sendComplete(string $result)

•

GearmanJob::sendFail(void)

•

GearmanJob::sendException(string $exception)
PHP - Job API - Client
<?php
$client= new GearmanClient();
$client->addServer();
$handle = $client->doBackground("title", "o PHp");
if($client->returnCode() != GEARMAN_SUCCESS) {
echo "Job com problemas";exit;
}
$done = false;
do {
sleep(2);
$stat = $client->jobStatus($handle);
if(!$stat[0]) { $done = true; }//job terminou
if($stat[1] == true)
echo "Executando:", ' passo ' , $stat[2], ' de ', $stat[3], "n";
}while(!$done);
PHP - Job API - Worker
<?php
$worker= new GearmanWorker();
$worker->addServer();
$worker->addFunction("title", "title_function");
while ($worker->work());

function title_function($job){
$job->sendStatus(0, 2);
sleep(3);
$job->sendStatus(1, 2);
sleep(3);
$job->sendStatus(2, 2);
return ucwords(strtolower($job->workload()));
}
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");
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)
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	

jobFeed	

0	

0	

1	

0	

0	

1	

jobFacebookUser	2	

1	

1	

jobSlideshareUser	

0	

0	

1	

jobBlogsearch	

!

1
Sphinx
O que é?
•

Sphinx é um motor de pesquisa de texto
completo, distribuído sob a versão GPLv2 .

•

Sphinx foi especialmente desenvolvido para
integrar um banco de dados SQL com uma
linguagem de 'scripts' (oficialmente suportada PHP). Atualmente o Sphinx conecta-se diretamente
com os bancos de dados MySQL e Postgres

•

O nome "Sphinx" é um acrônimo oficial da frase
'SQL Phrase Index'.
Características
•

Alta velocidade de indexação (10 MB/s em uma
CPU)

•

Alta velocidade de pesquisa (menor que 0.1
segundo em 2-4 GB de texto)

•

Alta escalabilidade (mais de 100 GB de texto,
mais de 100 M de documentos em uma CPU)

•

Suporte a pesquisa distribuida
Características
•

Suporte nativo ao banco de dados MySQL

•

Suporte a pesquisa por frases

•

Suporte a 'ranking' de proximidade das frases,
com boa relevância

•

Suporte a 'stemming' de Inglês e Russo
Características
•

Suporte a vários números de campos de
documentos (os pesos podem ser mudados na
hora)

•

Suporte a grupos de documentos

•

Suporte a 'stopwords'

•

Suporte a diferentes modos de pesquisas
("match all", "match phrase" e "match any" - v.
0.9.5)
Arquitetura
•

O Sphinxsearch inclui os seguintes programas:
•

indexer - um utilitário para criar índices fulltext

•

search - uma simples (teste) utilidade para consulta
índices fulltext de linha de comando

•

searchd - um servidor('daemon') para pesquisar através
de índices fulltext.

•

sphinxapi - um conjunto de APIs de bibliotecas
populares da web (API - PHP, Python, Java, Perl e Ruby).
Sphinx X MySQL
mysql> select id from entity where name = 'Apple';	
2 rows in set (0.01 sec)	
mysql> select id from entity where name like '%Apple%';	
6610 rows in set (36.49 sec)
Sphinx X MySQL
[root@linux ~]# search -i entity apple	
Sphinx 0.9.9-release (r2117)	
Copyright (c) 2001-2009, Andrew Aksyonoff	

!
using config file '/usr/local/etc/sphinx.conf'...	
index 'entity': query 'apple ': returned 1000 matches of 5930 total in 0.001
sec	

!
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://sphinxsearch.com/

•

http://www.ibm.com/developerworks/library/os-php-sphinxsearch/

•

https://www.usenix.org/sites/default/files/conference/protected-files/
nishtala_nsdi13_slides.pdf
Contato
http://eltonminetto.net
@eminetto

More Related Content

What's hot

O que mudou no Ruby 1.9
O que mudou no Ruby 1.9O que mudou no Ruby 1.9
O que mudou no Ruby 1.9Nando Vieira
 
Ao infinito e além com PHP memcached e Gearman
Ao infinito e além com PHP memcached e GearmanAo infinito e além com PHP memcached e Gearman
Ao infinito e além com PHP memcached e GearmanElton Minetto
 
ReactPHP && programacao assincrona em PHP
ReactPHP && programacao assincrona em PHPReactPHP && programacao assincrona em PHP
ReactPHP && programacao assincrona em PHPLuis Gustavo Almeida
 
PHP e PostgreSQL: Um é pouco, dois é bom, três é demais
PHP e PostgreSQL: Um é pouco, dois é bom, três é demaisPHP e PostgreSQL: Um é pouco, dois é bom, três é demais
PHP e PostgreSQL: Um é pouco, dois é bom, três é demaisFabrízio Mello
 
PHP na Tela Escura: Aplicações Poderosas em Linha de Comando
PHP na Tela Escura: Aplicações Poderosas em Linha de ComandoPHP na Tela Escura: Aplicações Poderosas em Linha de Comando
PHP na Tela Escura: Aplicações Poderosas em Linha de ComandoRafael Jaques
 
PHP Experience 2016 - [Palestra] Keynote: PHP-7
PHP Experience 2016 - [Palestra] Keynote: PHP-7PHP Experience 2016 - [Palestra] Keynote: PHP-7
PHP Experience 2016 - [Palestra] Keynote: PHP-7iMasters
 
PHP Conference Brasil 2013 - Aplicações PHP 5.4 com componentes Aura
PHP Conference Brasil 2013 - Aplicações PHP 5.4 com componentes AuraPHP Conference Brasil 2013 - Aplicações PHP 5.4 com componentes Aura
PHP Conference Brasil 2013 - Aplicações PHP 5.4 com componentes AuraFlávio Lisboa
 
Código legado - PHP Conference Brasil - 2014
Código legado - PHP Conference Brasil - 2014Código legado - PHP Conference Brasil - 2014
Código legado - PHP Conference Brasil - 2014Michael Castillo Granados
 
Fundamentos Replicação MySQL
Fundamentos Replicação MySQLFundamentos Replicação MySQL
Fundamentos Replicação MySQLAlexandre Almeida
 
JS Experience 2017 - Javascript Funcional
JS Experience 2017 - Javascript FuncionalJS Experience 2017 - Javascript Funcional
JS Experience 2017 - Javascript FuncionaliMasters
 
Changelog trunk
Changelog trunkChangelog trunk
Changelog trunksrwawa12
 

What's hot (20)

Redis na Prática
Redis na PráticaRedis na Prática
Redis na Prática
 
A busca pelo deploy continuo
A busca pelo deploy continuoA busca pelo deploy continuo
A busca pelo deploy continuo
 
O que mudou no Ruby 1.9
O que mudou no Ruby 1.9O que mudou no Ruby 1.9
O que mudou no Ruby 1.9
 
Doctrine2 Seminário PHP
Doctrine2 Seminário PHPDoctrine2 Seminário PHP
Doctrine2 Seminário PHP
 
Php 07 Cakephp
Php 07 CakephpPhp 07 Cakephp
Php 07 Cakephp
 
Ao infinito e além com PHP memcached e Gearman
Ao infinito e além com PHP memcached e GearmanAo infinito e além com PHP memcached e Gearman
Ao infinito e além com PHP memcached e Gearman
 
ReactPHP && programacao assincrona em PHP
ReactPHP && programacao assincrona em PHPReactPHP && programacao assincrona em PHP
ReactPHP && programacao assincrona em PHP
 
Cakephp 2.0 - O que mudou
Cakephp 2.0 - O que mudouCakephp 2.0 - O que mudou
Cakephp 2.0 - O que mudou
 
PHP e PostgreSQL: Um é pouco, dois é bom, três é demais
PHP e PostgreSQL: Um é pouco, dois é bom, três é demaisPHP e PostgreSQL: Um é pouco, dois é bom, três é demais
PHP e PostgreSQL: Um é pouco, dois é bom, três é demais
 
PHP na Tela Escura: Aplicações Poderosas em Linha de Comando
PHP na Tela Escura: Aplicações Poderosas em Linha de ComandoPHP na Tela Escura: Aplicações Poderosas em Linha de Comando
PHP na Tela Escura: Aplicações Poderosas em Linha de Comando
 
PHP Experience 2016 - [Palestra] Keynote: PHP-7
PHP Experience 2016 - [Palestra] Keynote: PHP-7PHP Experience 2016 - [Palestra] Keynote: PHP-7
PHP Experience 2016 - [Palestra] Keynote: PHP-7
 
PHP Conference Brasil 2013 - Aplicações PHP 5.4 com componentes Aura
PHP Conference Brasil 2013 - Aplicações PHP 5.4 com componentes AuraPHP Conference Brasil 2013 - Aplicações PHP 5.4 com componentes Aura
PHP Conference Brasil 2013 - Aplicações PHP 5.4 com componentes Aura
 
Código legado - PHP Conference Brasil - 2014
Código legado - PHP Conference Brasil - 2014Código legado - PHP Conference Brasil - 2014
Código legado - PHP Conference Brasil - 2014
 
Stack based overflow
Stack based overflowStack based overflow
Stack based overflow
 
Fundamentos Replicação MySQL
Fundamentos Replicação MySQLFundamentos Replicação MySQL
Fundamentos Replicação MySQL
 
Hello SAFE World!!!
Hello SAFE World!!!Hello SAFE World!!!
Hello SAFE World!!!
 
Plack
PlackPlack
Plack
 
Python 08
Python 08Python 08
Python 08
 
JS Experience 2017 - Javascript Funcional
JS Experience 2017 - Javascript FuncionalJS Experience 2017 - Javascript Funcional
JS Experience 2017 - Javascript Funcional
 
Changelog trunk
Changelog trunkChangelog trunk
Changelog trunk
 

Viewers also liked

Memorias das trincheiras - 2015
Memorias das trincheiras - 2015Memorias das trincheiras - 2015
Memorias das trincheiras - 2015Elton Minetto
 
PHP like a Super Hero - V3
PHP like a Super Hero - V3PHP like a Super Hero - V3
PHP like a Super Hero - V3Elton Minetto
 
Os 12 fatores: uma metodologia para criação de projetos SaaS
Os 12 fatores: uma metodologia para criação de projetos SaaSOs 12 fatores: uma metodologia para criação de projetos SaaS
Os 12 fatores: uma metodologia para criação de projetos SaaSElton Minetto
 
Desenvolvimento de aplicativos para FirefoxOS
Desenvolvimento de aplicativos para FirefoxOSDesenvolvimento de aplicativos para FirefoxOS
Desenvolvimento de aplicativos para FirefoxOSElton Minetto
 
Do monolito ao micro serviço
Do monolito ao micro serviçoDo monolito ao micro serviço
Do monolito ao micro serviçoElton Minetto
 
Como manter a qualidade do seu projeto sem perder a sua sanidade!
Como manter a qualidade do seu projeto sem perder a sua sanidade!Como manter a qualidade do seu projeto sem perder a sua sanidade!
Como manter a qualidade do seu projeto sem perder a sua sanidade!Elton Minetto
 
Desenvolvendo APIs em Go usando Middlewares
Desenvolvendo APIs em Go usando MiddlewaresDesenvolvendo APIs em Go usando Middlewares
Desenvolvendo APIs em Go usando MiddlewaresElton Minetto
 
Metodologias ágeis interativas
Metodologias ágeis interativasMetodologias ágeis interativas
Metodologias ágeis interativasElton Minetto
 
PHP like a super hero
PHP like a super heroPHP like a super hero
PHP like a super heroElton Minetto
 
6 questões que levam à inovação
6 questões que levam à inovação6 questões que levam à inovação
6 questões que levam à inovaçãoElton Minetto
 
Desenvolvimento Mobile
Desenvolvimento MobileDesenvolvimento Mobile
Desenvolvimento MobileElton Minetto
 
Creating an API with Expressive
Creating an API with ExpressiveCreating an API with Expressive
Creating an API with ExpressiveElton Minetto
 
De Padawan a Jedi - Versão 2016
De Padawan a Jedi - Versão 2016De Padawan a Jedi - Versão 2016
De Padawan a Jedi - Versão 2016Elton Minetto
 
PSR-7, middlewares e o futuro dos frameworks
PSR-7, middlewares e o futuro dos frameworksPSR-7, middlewares e o futuro dos frameworks
PSR-7, middlewares e o futuro dos frameworksElton Minetto
 

Viewers also liked (14)

Memorias das trincheiras - 2015
Memorias das trincheiras - 2015Memorias das trincheiras - 2015
Memorias das trincheiras - 2015
 
PHP like a Super Hero - V3
PHP like a Super Hero - V3PHP like a Super Hero - V3
PHP like a Super Hero - V3
 
Os 12 fatores: uma metodologia para criação de projetos SaaS
Os 12 fatores: uma metodologia para criação de projetos SaaSOs 12 fatores: uma metodologia para criação de projetos SaaS
Os 12 fatores: uma metodologia para criação de projetos SaaS
 
Desenvolvimento de aplicativos para FirefoxOS
Desenvolvimento de aplicativos para FirefoxOSDesenvolvimento de aplicativos para FirefoxOS
Desenvolvimento de aplicativos para FirefoxOS
 
Do monolito ao micro serviço
Do monolito ao micro serviçoDo monolito ao micro serviço
Do monolito ao micro serviço
 
Como manter a qualidade do seu projeto sem perder a sua sanidade!
Como manter a qualidade do seu projeto sem perder a sua sanidade!Como manter a qualidade do seu projeto sem perder a sua sanidade!
Como manter a qualidade do seu projeto sem perder a sua sanidade!
 
Desenvolvendo APIs em Go usando Middlewares
Desenvolvendo APIs em Go usando MiddlewaresDesenvolvendo APIs em Go usando Middlewares
Desenvolvendo APIs em Go usando Middlewares
 
Metodologias ágeis interativas
Metodologias ágeis interativasMetodologias ágeis interativas
Metodologias ágeis interativas
 
PHP like a super hero
PHP like a super heroPHP like a super hero
PHP like a super hero
 
6 questões que levam à inovação
6 questões que levam à inovação6 questões que levam à inovação
6 questões que levam à inovação
 
Desenvolvimento Mobile
Desenvolvimento MobileDesenvolvimento Mobile
Desenvolvimento Mobile
 
Creating an API with Expressive
Creating an API with ExpressiveCreating an API with Expressive
Creating an API with Expressive
 
De Padawan a Jedi - Versão 2016
De Padawan a Jedi - Versão 2016De Padawan a Jedi - Versão 2016
De Padawan a Jedi - Versão 2016
 
PSR-7, middlewares e o futuro dos frameworks
PSR-7, middlewares e o futuro dos frameworksPSR-7, middlewares e o futuro dos frameworks
PSR-7, middlewares e o futuro dos frameworks
 

Similar to Memcached, Gearman e Sphinx

Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2PrinceGuru MS
 
Proxy, Man-In-The-Middle e testes
Proxy, Man-In-The-Middle e testesProxy, Man-In-The-Middle e testes
Proxy, Man-In-The-Middle e testesStanislaw Pusep
 
Alta Performance de Aplicações PHP com Nginx
Alta Performance de Aplicações PHP com NginxAlta Performance de Aplicações PHP com Nginx
Alta Performance de Aplicações PHP com NginxThiago Paes
 
Tutorial servidor debian linux ocs invetory
Tutorial servidor debian linux ocs invetory Tutorial servidor debian linux ocs invetory
Tutorial servidor debian linux ocs invetory gigadrop
 
Gerência de Configurações com o Puppet
Gerência de Configurações com o PuppetGerência de Configurações com o Puppet
Gerência de Configurações com o Puppetpericles_junior
 
O que esperar do Zend Framework 3
O que esperar do Zend Framework 3O que esperar do Zend Framework 3
O que esperar do Zend Framework 3Flávio Lisboa
 
Supervisão e Monitorização
Supervisão e MonitorizaçãoSupervisão e Monitorização
Supervisão e MonitorizaçãoSAPO Sessions
 
Puppet – Torne Seu Datacenter áGil
Puppet – Torne Seu Datacenter áGilPuppet – Torne Seu Datacenter áGil
Puppet – Torne Seu Datacenter áGiljefesrodrigues
 
Otimizando aplicações Zend Framework - Tchelinux
Otimizando aplicações Zend Framework - TchelinuxOtimizando aplicações Zend Framework - Tchelinux
Otimizando aplicações Zend Framework - TchelinuxElton Minetto
 
PHP - Programação para seres humanos
PHP - Programação para seres humanosPHP - Programação para seres humanos
PHP - Programação para seres humanosCaike Souza
 
Escrevendo códigos php seguros
Escrevendo códigos php segurosEscrevendo códigos php seguros
Escrevendo códigos php segurosDouglas V. Pasqua
 
Aula 02 - Introdução ao PHP - Programação Web
Aula 02  - Introdução ao PHP - Programação WebAula 02  - Introdução ao PHP - Programação Web
Aula 02 - Introdução ao PHP - Programação WebDalton Martins
 
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 minutosAlexandre Almeida
 

Similar to Memcached, Gearman e Sphinx (20)

Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2
 
Proxy, Man-In-The-Middle e testes
Proxy, Man-In-The-Middle e testesProxy, Man-In-The-Middle e testes
Proxy, Man-In-The-Middle e testes
 
PHP e Redis
PHP e RedisPHP e Redis
PHP e Redis
 
Alta Performance de Aplicações PHP com Nginx
Alta Performance de Aplicações PHP com NginxAlta Performance de Aplicações PHP com Nginx
Alta Performance de Aplicações PHP com Nginx
 
Tutorial servidor debian linux ocs invetory
Tutorial servidor debian linux ocs invetory Tutorial servidor debian linux ocs invetory
Tutorial servidor debian linux ocs invetory
 
Consegi 2011: Puppet
Consegi 2011: PuppetConsegi 2011: Puppet
Consegi 2011: Puppet
 
Dev Ext PHP
Dev Ext PHPDev Ext PHP
Dev Ext PHP
 
Gerência de Configurações com o Puppet
Gerência de Configurações com o PuppetGerência de Configurações com o Puppet
Gerência de Configurações com o Puppet
 
Sapo Sessions PHP
Sapo Sessions PHPSapo Sessions PHP
Sapo Sessions PHP
 
O que esperar do Zend Framework 3
O que esperar do Zend Framework 3O que esperar do Zend Framework 3
O que esperar do Zend Framework 3
 
Supervisão e Monitorização
Supervisão e MonitorizaçãoSupervisão e Monitorização
Supervisão e Monitorização
 
Pdo do PHP Palestra
Pdo do PHP PalestraPdo do PHP Palestra
Pdo do PHP Palestra
 
Puppet – Torne Seu Datacenter áGil
Puppet – Torne Seu Datacenter áGilPuppet – Torne Seu Datacenter áGil
Puppet – Torne Seu Datacenter áGil
 
Otimizando aplicações Zend Framework - Tchelinux
Otimizando aplicações Zend Framework - TchelinuxOtimizando aplicações Zend Framework - Tchelinux
Otimizando aplicações Zend Framework - Tchelinux
 
Modern PHP
Modern PHPModern PHP
Modern PHP
 
PHP - Programação para seres humanos
PHP - Programação para seres humanosPHP - Programação para seres humanos
PHP - Programação para seres humanos
 
Escrevendo códigos php seguros
Escrevendo códigos php segurosEscrevendo códigos php seguros
Escrevendo códigos php seguros
 
Aula 02 - Introdução ao PHP - Programação Web
Aula 02  - Introdução ao PHP - Programação WebAula 02  - Introdução ao PHP - Programação Web
Aula 02 - Introdução ao PHP - Programação Web
 
Palestra PHPSP+Locaweb 2014 - PDO
Palestra PHPSP+Locaweb 2014 - PDOPalestra PHPSP+Locaweb 2014 - PDO
Palestra PHPSP+Locaweb 2014 - PDO
 
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
 

More from Elton Minetto

Go e Microserviços - Nascidos um para o outro
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
 
Object Calisthenics em Go
Object Calisthenics em GoObject Calisthenics em Go
Object Calisthenics em GoElton Minetto
 
Programar != desenvolver software (v2)
Programar != desenvolver software (v2)Programar != desenvolver software (v2)
Programar != desenvolver software (v2)Elton Minetto
 
Gerenciando uma startup no Github Projects
Gerenciando uma startup no Github ProjectsGerenciando uma startup no Github Projects
Gerenciando uma startup no Github ProjectsElton Minetto
 
Clean architecture em Go - v2
Clean architecture em Go - v2Clean architecture em Go - v2
Clean architecture em Go - v2Elton Minetto
 
Programar != desenvolver software
Programar != desenvolver softwareProgramar != desenvolver software
Programar != desenvolver softwareElton Minetto
 
Clean Architecture em PHP
Clean Architecture em PHPClean Architecture em PHP
Clean Architecture em PHPElton Minetto
 
Clean Architecture in Golang
Clean Architecture in GolangClean Architecture in Golang
Clean Architecture in GolangElton Minetto
 
A jornada do desenvolvedor
A jornada do desenvolvedorA jornada do desenvolvedor
A jornada do desenvolvedorElton Minetto
 
Product and Technology
Product and TechnologyProduct and Technology
Product and TechnologyElton Minetto
 
Code:Nation Tech Stack
Code:Nation Tech StackCode:Nation Tech Stack
Code:Nation Tech StackElton Minetto
 
Modernizando projetos legados usando APIs
Modernizando projetos legados usando APIsModernizando projetos legados usando APIs
Modernizando projetos legados usando APIsElton Minetto
 
12 factor in the PHP world
12 factor in the PHP world12 factor in the PHP world
12 factor in the PHP worldElton Minetto
 
Building APIs using Go
Building APIs using GoBuilding APIs using Go
Building APIs using GoElton Minetto
 
O case da Compufácil e AWS
O case da Compufácil e AWSO case da Compufácil e AWS
O case da Compufácil e AWSElton Minetto
 

More from Elton Minetto (20)

Go e Microserviços - Nascidos um para o outro
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
 
Object Calisthenics em Go
Object Calisthenics em GoObject Calisthenics em Go
Object Calisthenics em Go
 
Programar != desenvolver software (v2)
Programar != desenvolver software (v2)Programar != desenvolver software (v2)
Programar != desenvolver software (v2)
 
Gerenciando uma startup no Github Projects
Gerenciando uma startup no Github ProjectsGerenciando uma startup no Github Projects
Gerenciando uma startup no Github Projects
 
Clean Architecture
Clean ArchitectureClean Architecture
Clean Architecture
 
Serverless em Go
Serverless em GoServerless em Go
Serverless em Go
 
JAMstack
JAMstackJAMstack
JAMstack
 
Clean architecture em Go - v2
Clean architecture em Go - v2Clean architecture em Go - v2
Clean architecture em Go - v2
 
Programar != desenvolver software
Programar != desenvolver softwareProgramar != desenvolver software
Programar != desenvolver software
 
Clean Architecture em PHP
Clean Architecture em PHPClean Architecture em PHP
Clean Architecture em PHP
 
Clean Architecture in Golang
Clean Architecture in GolangClean Architecture in Golang
Clean Architecture in Golang
 
A jornada do desenvolvedor
A jornada do desenvolvedorA jornada do desenvolvedor
A jornada do desenvolvedor
 
Product and Technology
Product and TechnologyProduct and Technology
Product and Technology
 
Code:Nation Tech Stack
Code:Nation Tech StackCode:Nation Tech Stack
Code:Nation Tech Stack
 
Modernizando projetos legados usando APIs
Modernizando projetos legados usando APIsModernizando projetos legados usando APIs
Modernizando projetos legados usando APIs
 
12 factor in the PHP world
12 factor in the PHP world12 factor in the PHP world
12 factor in the PHP world
 
Building APIs using Go
Building APIs using GoBuilding APIs using Go
Building APIs using Go
 
Start you
Start youStart you
Start you
 
O case da Compufácil e AWS
O case da Compufácil e AWSO case da Compufácil e AWS
O case da Compufácil e AWS
 
Introdução a Go
Introdução a GoIntrodução a Go
Introdução a Go
 

Memcached, Gearman e Sphinx

  • 1. Memcached, Gearman e Sphinx elton luís minetto @eminetto @coderockr
  • 3. 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
  • 4. 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
  • 5. 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
  • 6.
  • 7. 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”
  • 8. Quem usa? Facebook • • 805 servidores 8-core. 28TB de RAM. 300K req/seg (Set. 2008). "Trillions of itens, bilions of requests/s" (2013) • 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)
  • 9. Como usar? Baixar código em http://memcached.org tar -xvzf memcached-X.Y.Z.tar.gz cd memcached-X.Y.Z ./configure make sudo make install (ou usar o pacote da sua distribuição Linux)
  • 10. 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
  • 11. Como usar com PHP? • Download do módulo em http://pecl.php.net/package/memcache. tar -xvzf memcache-2.2.7.tgz cd memcache-2.2.7 phpize ./configure make sudo make install • (executar como root) Adicionar a linha abaixo no php.ini e reiniciar o Apache extension=memcache.so
  • 12. 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); ?>
  • 13. API • Comandos de armazenamento: • • Comandos de recuperação: • • get Comandos de exclusão: • • set, add, replace, append delete Outros comandos: • stats, flush_all, version, verbosity, quit
  • 14. Monitorando • Plugin para o Nagios • memcache.php ! ! !
  • 16. 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
  • 17. Áreas de Aplicação • Análise de logs • Redimensionamento de imagens • Processamento de URLs • Atualização de cache • Jobs de banco de dados • etc
  • 18. 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
  • 19. 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
  • 22. 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
  • 23. Instalando wget https://launchpad.net/gearmand/1.2/1.1.11/+download/ gearmand-1.1.11.tar.gz tar xfvz gearmand-1.1.11.tar.gz cd gearmand-1.1.11 ./configure make sudo make install (ou use o pacote da sua distribuição Linux)
  • 24. 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 (default 4730)
  • 25. 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
  • 26. 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", “Mensagem"); print "n";
  • 27. 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 esperando trabalhos     //função que vai executar o trabalho function title_function($job) {    return ucwords(strtolower($job->workload())); } ?>
  • 28. 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'] = "Mensagem $i";         $client->doBackground("log_queue", serialize($log)); } ?> ! !
  • 29. 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"; } ?>
  • 30. PHP - Job API • GearmanJob::sendStatus(int $numerator, int $denominator) • GearmanJob::sendWarning(string $warning) • GearmanJob::sendComplete(string $result) • GearmanJob::sendFail(void) • GearmanJob::sendException(string $exception)
  • 31. PHP - Job API - Client <?php $client= new GearmanClient(); $client->addServer(); $handle = $client->doBackground("title", "o PHp"); if($client->returnCode() != GEARMAN_SUCCESS) { echo "Job com problemas";exit; } $done = false; do { sleep(2); $stat = $client->jobStatus($handle); if(!$stat[0]) { $done = true; }//job terminou if($stat[1] == true) echo "Executando:", ' passo ' , $stat[2], ' de ', $stat[3], "n"; }while(!$done);
  • 32. PHP - Job API - Worker <?php $worker= new GearmanWorker(); $worker->addServer(); $worker->addFunction("title", "title_function"); while ($worker->work()); function title_function($job){ $job->sendStatus(0, 2); sleep(3); $job->sendStatus(1, 2); sleep(3); $job->sendStatus(2, 2); return ucwords(strtolower($job->workload())); }
  • 33. 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");
  • 34. 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)
  • 35. 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 jobFeed 0 0 1 0 0 1 jobFacebookUser 2 1 1 jobSlideshareUser 0 0 1 jobBlogsearch ! 1
  • 37. O que é? • Sphinx é um motor de pesquisa de texto completo, distribuído sob a versão GPLv2 . • Sphinx foi especialmente desenvolvido para integrar um banco de dados SQL com uma linguagem de 'scripts' (oficialmente suportada PHP). Atualmente o Sphinx conecta-se diretamente com os bancos de dados MySQL e Postgres • O nome "Sphinx" é um acrônimo oficial da frase 'SQL Phrase Index'.
  • 38. Características • Alta velocidade de indexação (10 MB/s em uma CPU) • Alta velocidade de pesquisa (menor que 0.1 segundo em 2-4 GB de texto) • Alta escalabilidade (mais de 100 GB de texto, mais de 100 M de documentos em uma CPU) • Suporte a pesquisa distribuida
  • 39. Características • Suporte nativo ao banco de dados MySQL • Suporte a pesquisa por frases • Suporte a 'ranking' de proximidade das frases, com boa relevância • Suporte a 'stemming' de Inglês e Russo
  • 40. Características • Suporte a vários números de campos de documentos (os pesos podem ser mudados na hora) • Suporte a grupos de documentos • Suporte a 'stopwords' • Suporte a diferentes modos de pesquisas ("match all", "match phrase" e "match any" - v. 0.9.5)
  • 41. Arquitetura • O Sphinxsearch inclui os seguintes programas: • indexer - um utilitário para criar índices fulltext • search - uma simples (teste) utilidade para consulta índices fulltext de linha de comando • searchd - um servidor('daemon') para pesquisar através de índices fulltext. • sphinxapi - um conjunto de APIs de bibliotecas populares da web (API - PHP, Python, Java, Perl e Ruby).
  • 42. Sphinx X MySQL mysql> select id from entity where name = 'Apple'; 2 rows in set (0.01 sec) mysql> select id from entity where name like '%Apple%'; 6610 rows in set (36.49 sec)
  • 43. Sphinx X MySQL [root@linux ~]# search -i entity apple Sphinx 0.9.9-release (r2117) Copyright (c) 2001-2009, Andrew Aksyonoff ! using config file '/usr/local/etc/sphinx.conf'... index 'entity': query 'apple ': returned 1000 matches of 5930 total in 0.001 sec !