terça-feira, 20 de julho de 2010

Memcached daemon + memcache com php

Tempos atrás eu me deparei com um problema de alto consumo do banco de dados e uma das alternativas para amenizar o problema foi utilizarmos o memcached, agora a pouco tempo tive que realizar uma nova configuração do mesmo e então resolvi documentar para que tanto eu, quanto todos que acessem esse blog possam ter como base essa implementação e assim ter algum tipo de auxilio, ou sugerir melhorias para essa minha implementação.

O memcached é uma ferramenta openSource que visa a alta performance do servidor, fazendo com que tanto a aplicação quanto o servidor passem a ter uma performance satisfatória.

Aqui falaremos sobre o Daemon do memcached, e logo após do módulo do memcache para o  PHP que prove um meio de se programar de forma mais simples utilizando funções do mesmo.


####################
# MENCACHED DAEMON #
####################

- Acesse:
http://code.google.com/p/memcached/downloads/list
- Faça o download da última versão estável.

wget -c http://memcached.googlecode.com/files/memcached-1.4.5.tar.gz
tar -xzvf memcached-1.4.5.tar.gz

- Acesse a pasta do memcached:
cd /home/user/memcached-1.4.5/

- Para compilar você pode ajustar para uma forma que mais se ajuste para seu ambiente, você pode verificar os parâmetros através de:
./configure --help

- Em meu caso, para atender o que necessito bastou:
./configure  --prefix=/opt/memcached-1.4.5 --enable-64bit

- Enquanto compilava obtive o seguinte erro:

checking for libevent directory... configure: error: libevent is required.  You can get it from http://www.monkey.org/~provos/libevent/
If it's already installed, specify its path using --with-libevent=/dir/

- Como estou utilizando em meu ambiente debian bastou utilizar um apt-get install libevent-dev e solucionou meu problema, porém basta verificar o gerenciador de pacotes de você utiliza e adequar, ou então passar o diretório caso você possua a libevent já instalada em algum lugar de seu servidor.


- Se nenhum outro warning aparecer, basta executar um:
make && make install

- E sucesso, seu memcached está instalado em /opt/memcached-1.4.5

- Agora você se pergunta.... o que fazer?

- Vamos dar um start no serviço! Para isso existem diversos scripts espalhados na internet, e também o próprio script que está no .tar.gz do memcached.
Eu optei nessa dica por criar um script simples, portanto ele precisa de melhorias e está aberto a criticas construtivas.

Link para o script:
https://github.com/abargiela/scripts/blob/master/init_memcached.sh
- Mova o script memcached-init para /etc/init.d/memcached-init, e faça um link simbolico para o seu rc, para verificar qual você utiliza, de um rulevel:
N 2
ln -s /etc/init.d/memcached-init  /etc/rc2.d/S99memcached-init

Considero as 2 formas acima correta, portanto verifique qual a melhor para você.

- Ajuste a permissão para nobody.
chown nobody.root /opt/memcached-1.4.5/

- Caso queria verificar o log, ele se encontra em /opt/memcached-1.4.5/log/memcached_log.txt
- É basicamente isso não tem muito segredo, qualquer dúvida estamos ai.



#####################
# Extension MEMCACHE PHP  #
#####################

- Acesse http://pecl.php.net/package/memcache
- Faça o download da ultima versão estável.

wget -c http://pecl.php.net/get/memcache-2.2.5.tgz

- Descompacte o pacote:
tar -xzvf memcache-2.2.5.tgz

- Acesse a pasta:
cd  memcache-2.2.5

- Agora o processo é simples, mantenha-se dentro da pasta do memcache, e execute:
--> phpize (obs.: caso você tenha compilado o php e especificado o prefix, o caminho do phpize pode variar)
- No meu caso:
/opt/php/bin/phpize
- Depois:
./configure --with-php-config=/opt/php/bin/php-config (também é necessário especificar)
--> Peguei um erro de compilação pois o memcache necessitava da ZLIB instalei zlib1g-dev  e compilou normalmente, portante fique atento antes de continuar a compilação para corrigir os eventuais erros.
- Caso não de erro:

make && make install

- Ao final irá aparecer algo como:
Installing shared extensions:     /opt/php/lib/php/extensions/no-debug-non-zts-20060613/

- Pegue esse caminho pois o memcache.so estará la vamos até o php.ini:
/opt/php-5.2.6/lib/php.ini (no meu caso esse é o path do php.ini)
- Vá até a parte das extensions e adicione:
extension=/opt/php-5.2.6/lib/php/extensions/no-debug-non-zts-20060613/memcache.so
- Salve e saia.
- Reinicie seu apache.
/opt/apache/bin/apachectl restart
- Para verificar se o memcache está funcionando como o esperado:
/opt/php/bin/php -i | grep -i --color memcache
- O retorno do comando acima deverá ser algo similar a:
memcache
memcache support => enabled
memcache.allow_failover => 1 => 1
memcache.chunk_size => 8192 => 8192
memcache.default_port => 11211 => 11211
memcache.default_timeout_ms => 1000 => 1000
memcache.hash_function => crc32 => crc32
memcache.hash_strategy => standard => standard
memcache.max_failover_attempts => 20 => 20

Referencias:
http://pecl.php.net/package/memcache
http://code.google.com/p/memcached/wiki/NewStart?tm=6
http://www.php.net/memcache

:D

Testa multiplos host telnet bash

Tive que realizar alguns testes em um servidor para ver se as regras de firewall haviam sido liberadas de acordo com o que havia sido solicitado, porém eram 5 servidores e  15 hosts diferentes, sendo que teria que testar porta 80 e 443 de cada um deles, então resolvi tornar automático. É um script extremamente simples, porém acho que nunca é demail compartilhar.

https://github.com/abargiela/scripts/blob/master/telnet_test.sh