SafeChildren Banner

Havoc Oracle Solaris Experts

lunes, 12 de abril de 2010

Instalar MemCached (32bits) en Solaris 10

Introducción
En esta ocasión vamos a ver cómo instalar y configurar MemCached en Solaris 10, en 32bits. En otro post vimos cómo Instalar MemCached en Solaris 10 en 64bits, debéis tener en cuenta que si lo instalamos en 32bits no podremos poner un tamaño de caché superior a 4Gb, a parte de esto, no tenemos más limitaciones.

La instalación de MemCached necesita de la biblioteca LibEvent, por lo tanto, primero deberemos descargar y compilarla. En nuestro ejemplo vamos a utilizar la siguiente estructura:
$MEMCACHED_HOME=/opt/memcached/32
$LIBEVENT_HOME=/opt/memcached/libevent/32
Y crearemos el usuario <memcached> y el project <user.memcached&gt para gestionar el uso de recursos dentro del sistema. Además, haremos que nuestro servidor de MemCached esté ejecutado -y controlado- mediante SMF, por lo tanto, podremos incluirlo como servicio requerido.

Para aquellos que no tenéis la posibilidad de compilar los paquetes, os he dejado uno listo para instalar -en el path </opt/memcached> en Solaris 10 SPARC de MemCached 1.4.5 32bits y Solaris 10 X86 de MemCached 1.4.5 32bits

Instalación de LibEvent (32Bits)
$ wget http://www.monkey.org/%7Eprovos/libevent-1.4.13-stable.tar.gz
$ gtar zxpf libevent-1.4.13-stable.tar.gz
$ cd libevent-1.4.13-stable
$ ./configure --enable-static --prefix=/opt/memcached/libevent/32
$ make
# make install
Comprobamos que todo se ha instalado correctamente y que no tenemos dependencias fallidas
$ ldd /opt/memcached/libevent/32/lib/libevent.so
        libnsl.so.1 =>   /lib/libnsl.so.1
        librt.so.1 =>    /lib/librt.so.1
        libresolv.so.2 =>        /lib/libresolv.so.2
        libsocket.so.1 =>        /lib/libsocket.so.1
        libc.so.1 =>     /lib/libc.so.1
        libgcc_s.so.1 =>         /usr/sfw/lib/libgcc_s.so.1
        libmp.so.2 =>    /lib/libmp.so.2
        libmd.so.1 =>    /lib/libmd.so.1
        libscf.so.1 =>   /lib/libscf.so.1
        libaio.so.1 =>   /lib/libaio.so.1
        libdoor.so.1 =>  /lib/libdoor.so.1
        libuutil.so.1 =>         /lib/libuutil.so.1
        libgen.so.1 =>   /lib/libgen.so.1
        libm.so.2 =>     /lib/libm.so.2
        /platform/SUNW,Sun-Fire-280R/lib/libc_psr.so.1
        /platform/SUNW,Sun-Fire-280R/lib/libmd_psr.so.1


Instalación de MemCached (32bits)
En la instalación de MemCached, vamos a forzar a nuestro linker para que se asocie con la biblioteca libevent que hemos creado, es decir, vamos a utilizar el flag &lt:-R> y de esta forma, no será necesario exportar la variable de entorno LD_LIBRARY_PATH_32. Para ello, deberemos utilizar la variable de entorno LDFLAGS que nos permitirá incluirlo en el sistema de configuración de MemCache.


Además, existe un bug en Solaris 10 que hace que el sistema incluya la opción <-pthread> que en algunas versiones antiguas de GCC no es válida, así que nos muestra el error:
gcc: unrecognized option `-pthread'
Para solucionarlo, simplemente exportaremos el valor a <-pthreads> en $CFLAGS y configuraremos. Si queréis más información aquí esta el link al bug
$ wget http://memcached.googlecode.com/files/memcached-1.4.5.tar.gz
$ gtar zxpf memcached-1.4.5.tar.gz
$ cd memcached-1.4.5
$ export LDFLAGS="-R/opt/memcached/libevent/32/lib -R/usr/sfw/lib"
$ export CFLAGS="-pthreads -O3"
$ ./configure --with-libevent=/opt/memcached/libevent/32 --prefix=/opt/memcached/32
$ make
# make install
Comprobamos que se ha instalado correctamente y que no tiene dependencias fallidas
$ ldd /opt/memcached/32/bin/memcached
        libumem.so.1 =>  /lib/libumem.so.1
        libnsl.so.1 =>   /lib/libnsl.so.1
        libsocket.so.1 =>        /lib/libsocket.so.1
        libevent-1.4.so.2 =>     /opt/memcached/libevent/32/lib/libevent-1.4.so.2
        libc.so.1 =>     /lib/libc.so.1
        libmp.so.2 =>    /lib/libmp.so.2
        libmd.so.1 =>    /lib/libmd.so.1
        libscf.so.1 =>   /lib/libscf.so.1
        librt.so.1 =>    /lib/librt.so.1
        libresolv.so.2 =>        /lib/libresolv.so.2
        libgcc_s.so.1 =>         /usr/sfw/lib/libgcc_s.so.1
        libdoor.so.1 =>  /lib/libdoor.so.1
        libuutil.so.1 =>         /lib/libuutil.so.1
        libgen.so.1 =>   /lib/libgen.so.1
        libaio.so.1 =>   /lib/libaio.so.1
        libm.so.2 =>     /lib/libm.so.2
        /platform/SUNW,Sun-Fire-280R/lib/libc_psr.so.1
        /platform/SUNW,Sun-Fire-280R/lib/libmd_psr.so.1
Configuración MemCached
A continuación vamos a crear el usuario y grupo <memcached> y el project <user.memcached> -recordar que SMF necesita hacer un chdir al home del usuario-
# groupadd memcache
# useradd -g memcache -s /bin/bash -d /export/home/memcache -m memcache
# projadd -G memcache -c 'MemCache Project' user.memcache
Creamos el Manifest para MemCached -en mi caso he decidido ponerlo en <application/cache> pero puedes ponerlo donde quieras-

# cd /var/svc/manifest/application/cache/
# /usr/sfw/bin/wget http://blog.sfchildren.com/blogger/memcached/svc/memcached_1.xml
# svccfg
svc:> validate memcached_1.xml
svc:> import memcached_1.xml
svc:> quit
Y ahora, el Method para MemCached
# cd /lib/svc/method
# /usr/sfw/bin/wget http://blog.sfchildren.com/blogger/memcached/svc/memcached_1
# chmod 555 memcached_1
# chown root:bin memcached_1
Ya hemos instalado todos los requisitos de Solaris SMF, sin embargo, hemos declarado que guarde el <PID> en <$MEMCACHED_HOME/run>, por lo tanto, debemos crear el directorio
# mkdir /opt/memcached/32/run
# chown memcache:memcache /opt/memcached/32/run
# chmod 750  /opt/memcached/32/run
Ahora ya podemos activar nuestro servicio MemCached utilizando el FRMI <memcached_1>
# svcs memcached_1
STATE          STIME    FMRI
disabled       11:37:41 svc:/application/cache/memcached_1:memcached_default32bits
# svcadm enable memcached_1
# svcs -p memcached_1
STATE          STIME    FMRI
online         12:04:25 svc:/application/cache/memcached_1:memcached_default32bits
               12:04:25    18580 memcached
Conclusiones
En esta ocasión hemos visto cómo instalarlo y configurarlo, la verdad es que no requiere de mucho tiempo -ni conocimientos- y, al introducir el control dentro de Solaris SMF, podemos gestionar las dependencias, por ejemplo, si nuestro memcached se cae, el servicio de Tomcat gestionado por SMF se marque como degraded


Referencias

8 comentarios:

  1. hola que tal ,muy interesante tu articulo
    una pregunta
    como hago para levantar dos servidores memcached en una misma maquina?

    hago esto para una memcached

    svccfg -s memcached setprop memcached/options='("-u" "-p" "11211" "noaccess" "-m" "2048")'

    svcadm refresh memcached

    y luego le hago enable

    pero si quiero levantar otra memcached en otro puerto como seria el procedimiento?

    Muchas gracias! :)

    ResponderEliminar
  2. Tal y como está "planteado" el manifest sólo puede ejecutar un servidor de memcached al mismo tiempo, sin embargo, puedes modificar el manifest para poder incluir varias "instancias".

    He creado un manifest de ejemplo con dos instancias: port_11211 y port_11214. Ambas se ejecutan con el mismo usuario/project.

    Puedes descarte un Ejemplo de MemCached Múltiples para Solaris 10

    Espero que te sirva de ayuda/ejemplo y muchas gracias por tu comentario.

    Un Saludo,
    Urko

    ResponderEliminar
  3. si la verdad que me ah servido mucho, estoy haciendo un TP para mi facultad, con memcached y me piden que levante dos servidores. Y busque por toda la web y mucha informacion no hay , lo mas completito que vi es este blog!

    Muchas gracias de nuevo!

    ResponderEliminar
  4. Hola, estoy tratando de instalar y configurar memcached, necesito un cluster con dos servidores.

    Segui los pasos que pusiste, pero los resultados que obtuve fueron un poco diferentes, y queria consultarte a ver si me esta faltando algo.
    Al instalar libevent no tengo problemas, pero cuando ejecuto ldd /opt/memcached/libevent/32/lib/libevent.so, en el listado me aparece todo lo que pusiste vos menos:
    /platform/SUNW,Sun-Fire-280R/lib/libc_psr.so.1
    /platform/SUNW,Sun-Fire-280R/lib/libmd_psr.so.1

    Despues, al instalar memcached, cuando ejecuto make me sigue apareciendo gcc: unrecognized option `-pthread', por lo que en vez de poner $ export CFLAGS="-pthreads -O3", probe con $ export CFLAGS="-pthread -O3" y con eso no volvi a tener problemas al ejecutar make.
    Al poner $ ldd /opt/memcached/32/bin/memcached, tambien encontre algunas diferencias con lo que pusiste vos:
    No me aparece:
    libdoor.so.1 => /lib/libdoor.so.1
    libaio.so.1 => /lib/libaio.so.1
    /platform/SUNW,Sun-Fire-280R/lib/libc_psr.so.1
    /platform/SUNW,Sun-Fire-280R/lib/libmd_psr.so.1
    Y me aparece:
    libpthread.so.1 => /lib/libpthread.so.1

    Bueno, no se si esas diferencias hacen a una instalacion incompleta, queria saber tu opinion. Por lo pronto voy a seguir adelante con los pasos para la configuracion, a ver si llego a poder levantar los dos servidores.

    Muchas gracias!!

    ResponderEliminar
  5. Hola,

    La verdad es que cuando hablo de "vamos a comprobar que todo está OK", quiero referirme a que las bibliotecas de enlace dinámico <.so> las encuentra y no aparece un mensaje diciendo <referencia no encontrada>.

    Sobre las <so> que muestro son para una Sun Fire 280R, por eso ves lo de:

    /platform/SUNW,Sun-Fire-280R/lib/libc_psr.so.1
    /platform/SUNW,Sun-Fire-280R/lib/libmd_psr.so.1

    Y otras más que son necesarias en Solaris SPARC, si tu arquitectura es x86 serán otras.

    Aquí te dejo el resultado de ldd con una máquina Solaris x86-64

    # ldd /opt/memcached/32/bin/memcached
    libumem.so.1 => /lib/libumem.so.1
    libnsl.so.1 => /lib/libnsl.so.1
    libsocket.so.1 => /lib/libsocket.so.1
    libevent-1.4.so.2 => /opt/memcached/libevent/32/lib/libevent-1.4.so.2
    libpthread.so.1 => /lib/libpthread.so.1
    libc.so.1 => /lib/libc.so.1
    libmp.so.2 => /lib/libmp.so.2
    libmd.so.1 => /lib/libmd.so.1
    libscf.so.1 => /lib/libscf.so.1
    librt.so.1 => /lib/librt.so.1
    libresolv.so.2 => /lib/libresolv.so.2
    libgcc_s.so.1 => /usr/sfw/lib/libgcc_s.so.1
    libdoor.so.1 => /lib/libdoor.so.1
    libuutil.so.1 => /lib/libuutil.so.1
    libgen.so.1 => /lib/libgen.so.1
    libaio.so.1 => /lib/libaio.so.1
    libm.so.2 => /lib/libm.so.2
    # uname -p
    i386
    # isainfo -v
    64-bit amd64 applications
    mon sse3 sse2 sse fxsr mmx cmov amd_sysc cx8 tsc fpu
    32-bit i386 applications
    mon sse3 sse2 sse fxsr mmx cmov sep cx8 tsc fpu

    También verás una "diferente" -probablemente-: libumem.so.1

    Esto es porque yo tengo asignado que "precarge" esta biblioteca que proporciona mejor rendimiento en el acceso a memoria y, puedes ver los memory leaks de las aplicaciones.

    Para saber qué tipo de arquitectura de Solaris es, puedes ver Cómo saber si Solaris soporta 64bis y Cómo saber si un binario es de 64bits o 32bits

    Espero haberte ayudado a resolver tus dudas,

    Un Saludo,
    Urko

    ResponderEliminar
  6. muchas gracias! entonces lo tengo bien instalado.
    te molesto con una cosa mas.. justo en este momento estoy intentando "prender" los servidores, no se si eso se hace por consola o si hay algun ejecutable (como un servidor opends, que tambien tengo que usar y lo corro con un ejecutable).

    ResponderEliminar
  7. Cuando quiero configurar el servidor hago:
    # svccfg
    svc:> select memcached
    svc:/application/database/memcached> setprop memcached/options=("-u" "nobody" "-m" "2048")
    svc:/application/database/memcached> quit
    # svcadm refresh memcached

    Pero cuando ejecuto svc:> select memcached, me dice:
    Pattern 'memcached' doesn´t match any instances or services

    Si sabes que puede estar pasando te agradeceria mucho, este blog es lo mas completo que encontre, como dijo Leonel (supongo que estamos con el mismo trabajo practico). Y los problemas que a veces trae la configuracion de las tecnologias que hay usar me traba un poco con el tp!

    Muchas gracias por tu tiempo, saludos

    ResponderEliminar
  8. Hola,

    No te preocupes, no me molesta!

    Si has cargado el manifest que yo tengo en el blog, el nombre del serivio es memcached_1.

    Puedes utilizar los * para comprobar los servicios declarados, por ejemplo,

    # svcs *memcached*
    STATE STIME FMRI
    online 19:42:43 svc:/application/cache/memcached_1:memcached_default32bits

    # svcs memcached_1
    STATE STIME FMRI
    online 19:42:43 svc:/application/cache/memcached_1:memcached_default32bits

    Y ahora, puedes activarlo con

    # svcadm enable memcached_1:memcached_default32bits

    Y desactivarlo con

    # svcadm disable memcached_1:memcached_default32bits


    Si tienes que hacer "lo mismo que Leonel", entonces puedes utilizar el otro manifest que incluia dos servidores,

    Por cierto, de dónde son esas prácticas? Al final, voy a tener que hacer un post con la solución, xD

    Un Saludo,
    Urko

    ResponderEliminar