jueves, 18 de julio de 2013

Instalación de memcached en centos

Memcached es un servicio que se encarga de gestionar datos en memoria a través de un procedimiento de claves  que apuntan a un contenido en especifico.
Lo cual hace que responda de manera muy rápida ya que los datos están memoria, el uso que por lo regular se le da es almacenar cache.


Para su instalación debemos de  bajar el código fuente desde http://memcached.org/

Instalar librería libevent
yum install libevent libevent-devel

Procedemos a descomprimir y compilar memcached
tar -xzf memcached-1.4.15.tar.gz

./configure
make
make install

A continuación procederemos a crear un script de auto inicio que tendrá dos 2 demonios corriendo con 128 en ram cada uno
########/etc/init.d/memcached
. /etc/init.d/functions
start(){
echo -n $"Iniciando memcached ..."
daemon  /usr/local/bin/memcached -d -p 11211 -u memcached -m 128 -c 1024
daemon  /usr/local/bin/memcached -d -p 11212 -u memcached -m 128 -c 1024
RETVAL=$?
echo
        [ $RETVAL -eq 0 ]
}
stop () {
        echo -n $"Parando memcached: "
        killproc memcached
        RETVAL=$?
echo
        [ $RETVAL -eq 0 ]
}

restart () {
        stop
        start
}


# See how we were called.
case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  status)
#       status -p ${pidfile} memcached
        status memcached
        RETVAL=$?
        ;;
  restart|reload|force-reload)
        restart
        ;;
  condrestart|try-restart)
        [ -f ${lockfile} ] && restart || :
        ;;
  *)
        echo $"Usage: $0 {start|stop|status|restart|reload|force-reload|condrestart|try-restart}"
        RETVAL=2
        ;;
esac

exit $RETVAL


########

Pueden especificar con la opción -l la ip en la cual estará nuestro servicio escuchando

Pero al tratar de iniciar nuestro script saldrá este error

service memcached start

Iniciando memcached .../usr/local/bin/memcached: error while loading shared libraries: libevent-2.0.so.5: cannot open shared object file: No such file or directory
/usr/local/bin/memcached: error while loading shared libraries: libevent-2.0.so.5: cannot open shared object file: No such file or directory
                                                           [FAILED]
Lo único que se tiene que realizar es crear un enlace simbólico

ln -s /usr/local/lib/libevent-2.0.so.5 /usr/lib64/

Nuevamente iniciamos el servicio
service memcached start

verificamos que este disponible
ps -ef | grep memcached

Nos mostrara algo parecido

501      27414     1  0 19:39 ?        00:00:00 /usr/local/bin/memcached -d -p 11211 -u memcached -m 128 -c 1024
501      27422     1  0 19:39 ?        00:00:00 /usr/local/bin/memcached -d -p 11212 -u memcached -m 128 -c 1024

Comando para memcached

set
add
get
gets
replace
append
prepend
cas
delete
command [key] [flags] [exptime] [bytes] [noreply]\r\n[value]\r

Definiciones:
[key]           : the key of the data stored
[flags]         : 32-bit unsigned integer that the server store with the data (provided by the user), and return along the data when the item is retrieved
[exptime]       : expiration time in seconds, 0 mean no delay, if exptime is superior to 30 day, Memcached will use it as a UNIX timestamps for expiration
[bytes]         : number of bytes in the data block
[cas unique]    : unique 64-bit value of an existing entry (retrieved with gets command) to use with cas command
[noreply]       : optional parameter that inform the server to not send the reply


Como probar que funciona, en bash
1.- Almacenar un dato

echo -e 'add my_key 0 60 8\r\nQue paso\r' | nc localhost 11211

Muestra la salida:
STORED

2.- Obtener el dato

echo -e 'get my_key \r' | nc localhost 11211

Muestra la salida:

VALUE my_key 0 8
Que paso
END

3.- Eliminar la llave

echo -e 'delete my_key\r' | nc localhost 11211

Muestra la salida:

DELETED

Asi mismo deben de agregar un regla en el firewall que permita almacenar y obetener datos desde otros servidores que tengan, ya sea php, python, java, o cualquier lenguaje de programacion que requiera cache.
Ejemplo de regla en iptables(/etc/sysconfig/iptables):

-A INPUT -m state --state NEW -m tcp -p tcp --dport 11211 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 11212 -j ACCEPT

Que son las que tenemos en nuestro script de inicio

Para php se requiere instalar:

yum install php-pecl-memcache

Para pyhton:

https://pypi.python.org/pypi/python-memcached/
yum install python-memcached

Para drupal:

https://drupal.org/project/memcache

Para wordpress:

http://wordpress.org/plugins/memcached/

Para java:

http://code.google.com/p/javamemcachedclient/


Cabe destacar que este servicio es utilizado por grandes portales como: