SlideShare uma empresa Scribd logo
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
Memcached, Gearman e Sphinx
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

Mais conteúdo relacionado

PDF
Entre na fila. Processamento distribuído usando Gearman
PDF
Zabbix monitorando o zimbra collaboration 8.8 (1)
PDF
PHP Jedi - Boas Práticas e Alta Performance
PPTX
KEY
Yet Another Ruby Framework - Como o Rails funciona por dentro
PDF
Redis um banco chave valor
PPTX
Doctrine for Dummies
Entre na fila. Processamento distribuído usando Gearman
Zabbix monitorando o zimbra collaboration 8.8 (1)
PHP Jedi - Boas Práticas e Alta Performance
Yet Another Ruby Framework - Como o Rails funciona por dentro
Redis um banco chave valor
Doctrine for Dummies

Mais procurados (20)

ODP
Redis na Prática
KEY
A busca pelo deploy continuo
PDF
O que mudou no Ruby 1.9
PDF
Doctrine2 Seminário PHP
ODP
Php 07 Cakephp
PDF
Ao infinito e além com PHP memcached e Gearman
PDF
ReactPHP && programacao assincrona em PHP
PPSX
Cakephp 2.0 - O que mudou
PDF
PHP e PostgreSQL: Um é pouco, dois é bom, três é demais
PDF
PHP na Tela Escura: Aplicações Poderosas em Linha de Comando
PDF
PHP Experience 2016 - [Palestra] Keynote: PHP-7
PDF
PHP Conference Brasil 2013 - Aplicações PHP 5.4 com componentes Aura
PDF
Código legado - PHP Conference Brasil - 2014
PPT
Fundamentos Replicação MySQL
PDF
Hello SAFE World!!!
KEY
Plack
KEY
Python 08
PDF
JS Experience 2017 - Javascript Funcional
TXT
Changelog trunk
Redis na Prática
A busca pelo deploy continuo
O que mudou no Ruby 1.9
Doctrine2 Seminário PHP
Php 07 Cakephp
Ao infinito e além com PHP memcached e Gearman
ReactPHP && programacao assincrona em PHP
Cakephp 2.0 - O que mudou
PHP e PostgreSQL: Um é pouco, dois é bom, três é demais
PHP na Tela Escura: Aplicações Poderosas em Linha de Comando
PHP Experience 2016 - [Palestra] Keynote: PHP-7
PHP Conference Brasil 2013 - Aplicações PHP 5.4 com componentes Aura
Código legado - PHP Conference Brasil - 2014
Fundamentos Replicação MySQL
Hello SAFE World!!!
Plack
Python 08
JS Experience 2017 - Javascript Funcional
Changelog trunk
Anúncio

Destaque (14)

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

Semelhante a Memcached, Gearman e Sphinx (20)

PDF
Phpjedi 090307090434-phpapp01 2
PDF
Proxy, Man-In-The-Middle e testes
PDF
PHP e Redis
ODP
Alta Performance de Aplicações PHP com Nginx
PDF
Tutorial servidor debian linux ocs invetory
PDF
Consegi 2011: Puppet
PDF
Dev Ext PHP
PDF
Gerência de Configurações com o Puppet
ODP
Sapo Sessions PHP
PDF
O que esperar do Zend Framework 3
PDF
Supervisão e Monitorização
PDF
Pdo do PHP Palestra
ODP
Puppet – Torne Seu Datacenter áGil
PDF
Exemplos de scripts - RktgyvfikytkfouterOS - Documentação MikroTik.pdf
PDF
Otimizando aplicações Zend Framework - Tchelinux
PPTX
PDF
PHP - Programação para seres humanos
PDF
Escrevendo códigos php seguros
PDF
Aula 02 - Introdução ao PHP - Programação Web
PDF
Palestra PHPSP+Locaweb 2014 - PDO
Phpjedi 090307090434-phpapp01 2
Proxy, Man-In-The-Middle e testes
PHP e Redis
Alta Performance de Aplicações PHP com Nginx
Tutorial servidor debian linux ocs invetory
Consegi 2011: Puppet
Dev Ext PHP
Gerência de Configurações com o Puppet
Sapo Sessions PHP
O que esperar do Zend Framework 3
Supervisão e Monitorização
Pdo do PHP Palestra
Puppet – Torne Seu Datacenter áGil
Exemplos de scripts - RktgyvfikytkfouterOS - Documentação MikroTik.pdf
Otimizando aplicações Zend Framework - Tchelinux
PHP - Programação para seres humanos
Escrevendo códigos php seguros
Aula 02 - Introdução ao PHP - Programação Web
Palestra PHPSP+Locaweb 2014 - PDO

Mais de Elton Minetto (20)

PDF
Go e Microserviços - Nascidos um para o outro
PDF
Object Calisthenics em Go
PDF
Programar != desenvolver software (v2)
PDF
Gerenciando uma startup no Github Projects
PDF
Clean Architecture
PDF
Serverless em Go
PDF
JAMstack
PDF
Clean architecture em Go - v2
PDF
Programar != desenvolver software
PDF
Clean Architecture em PHP
PDF
Clean Architecture in Golang
PDF
A jornada do desenvolvedor
PDF
Product and Technology
PDF
Code:Nation Tech Stack
PDF
Modernizando projetos legados usando APIs
PDF
12 factor in the PHP world
PDF
Building APIs using Go
PDF
Start you
PDF
O case da Compufácil e AWS
PDF
Introdução a Go
Go e Microserviços - Nascidos um para o outro
Object Calisthenics em Go
Programar != desenvolver software (v2)
Gerenciando uma startup no Github Projects
Clean Architecture
Serverless em Go
JAMstack
Clean architecture em Go - v2
Programar != desenvolver software
Clean Architecture em PHP
Clean Architecture in Golang
A jornada do desenvolvedor
Product and Technology
Code:Nation Tech Stack
Modernizando projetos legados usando APIs
12 factor in the PHP world
Building APIs using Go
Start you
O case da Compufácil e AWS
Introdução a Go

Último (19)

PDF
Otimizador de planejamento e execução no SAP Transportation Management, TM120...
PDF
Custos e faturamento no SAP S/4HANA Transportation Management, S4TM3 Col26
PPTX
Programação - Linguagem C - Variáveis, Palavras Reservadas, tipos de dados, c...
PDF
Fundamentos de gerenciamento de ordens e planejamento no SAP TransportationMa...
PDF
Gestão de transportes básica no SAP S/4HANA, S4611 Col20
PDF
Processos na gestão de transportes, TM100 Col18
PPTX
Como-se-implementa-um-softwareeeeeeeeeeeeeeeeeeeeeeeee.pptx
PDF
Custos e liquidação no SAP Transportation Management, TM130 Col18
PDF
COBITxITIL-Entenda as diferença em uso governança TI
PPTX
BANCO DE DADOS - AULAS INICIAIS-sgbd.pptx
PPTX
Gestao-de-Bugs-em-Software-Introducao.pptxxxxxxxx
PDF
Mergulho profundo técnico para gestão de transportes no SAP S/4HANA, S4TM6 Col14
PPTX
Informática Aplicada Informática Aplicada Plano de Ensino - estudo de caso NR...
PDF
20250805_ServiceNow e a Arquitetura Orientada a Serviços (SOA) A Base para Ap...
PPTX
Aula16ManipulaçãoDadosssssssssssssssssssssssssssss
PDF
Fullfilment AI - Forum ecommerce 2025 // Distrito e Total Express
PDF
Apple Pippin Uma breve introdução. - David Glotz
PDF
Aula04-Academia Heri- Tecnologia Geral 2025
PPTX
Aula 18 - Manipulacao De Arquivos python
Otimizador de planejamento e execução no SAP Transportation Management, TM120...
Custos e faturamento no SAP S/4HANA Transportation Management, S4TM3 Col26
Programação - Linguagem C - Variáveis, Palavras Reservadas, tipos de dados, c...
Fundamentos de gerenciamento de ordens e planejamento no SAP TransportationMa...
Gestão de transportes básica no SAP S/4HANA, S4611 Col20
Processos na gestão de transportes, TM100 Col18
Como-se-implementa-um-softwareeeeeeeeeeeeeeeeeeeeeeeee.pptx
Custos e liquidação no SAP Transportation Management, TM130 Col18
COBITxITIL-Entenda as diferença em uso governança TI
BANCO DE DADOS - AULAS INICIAIS-sgbd.pptx
Gestao-de-Bugs-em-Software-Introducao.pptxxxxxxxx
Mergulho profundo técnico para gestão de transportes no SAP S/4HANA, S4TM6 Col14
Informática Aplicada Informática Aplicada Plano de Ensino - estudo de caso NR...
20250805_ServiceNow e a Arquitetura Orientada a Serviços (SOA) A Base para Ap...
Aula16ManipulaçãoDadosssssssssssssssssssssssssssss
Fullfilment AI - Forum ecommerce 2025 // Distrito e Total Express
Apple Pippin Uma breve introdução. - David Glotz
Aula04-Academia Heri- Tecnologia Geral 2025
Aula 18 - Manipulacao De Arquivos python

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
  • 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 !