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
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
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)
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";
}
?>
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)
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
!