Moxi es un proxy que originalmente está diseñado para ser usado con membase (http://www.couchbase.org/get/couchbase/current), aunque puede ser también utilizado con un pool de servidores memcached sin problemas. Moxi automáticamente balancea el tráfico hacia los servidores membase / memcached y comprueba el estado de la conexión, descartando de forma automática los nodos que no estén disponibles, por lo que puede ser muy útil en entornos distribuidos donde hay varios servidores web independientes, cada uno con su propia instancia de memcached y en el que se desea que haya coherencia de información entre los diferentes nodos, de manera que si en el nodo A escribimos el dato X, podamos leer dicho dato X desde cualquier otro nodo B,C,D,E,etc. sin tener que preocuparnos de recorrer todo el pool de servidores memcached ya que Moxi lo hará por nosotros.
Es decir, la idea es pasar de esta configuración:
a esta otra, aprovechando además las ventajas que ofrece Moxi en cuanto a supervisión y tolerancia a fallos:
Además, Moxi es totalmente compatible con el protocolo de comunicación de memcached, por lo que se convierte en un reemplazo directo sin necesidad de generar nuevo código o hacer adaptaciones en nuestras aplicaciones web que vayan más allá de un cambio en el host y/o puerto de conexión al servicio de memcached.
Esta presentación (de la cual he sacado las capturas anteriores) explica bastante bien las características de Moxi:
Lo que vamos a hacer es instalar en nuestro Debian squeeze o Ubuntu el servidor Moxi con conexión a un pool de servidores memcached.
Los pasos a seguir son los siguientes:
1. Descargar el paquete .deb de moxi-server adecuado para nuestra arquitectura y distribución. En el momento de escribir este artículo la versión precompilada en formato .deb más reciente es la 1.7.2 y se puede obtener de la siguiente dirección:
http://www.couchbase.com/downloads/moxi-server/community
2. Instalar el paquete descargado con el siguiente comando (como root), cambiando el nombre del paquete al correspondiente al que nos hayamos descargado. En mi caso he descargado moxi-server_x86_64_1.7.2.deb
4. Editamos el fichero /opt/moxi/moxi-cluster.cfg, el cual tendrá el siguiente contenido en la instalación por defecto:
Ojo, ya que es imprescindible eliminar las líneas de comentarios del fichero de configuración para que el servidor arranque correctamente. Hay que dejar solo la línea con la definición del pool de servidores memcached. En otro caso dará un error al arrancar el servicio.
La sintaxis del fichero de configuración es la siguiente:
También, si uno de los nodos memcached al que nos vamos a conectar está ubicado en la máquina local, no debemos usar localhost como nombre de host ya que (al menos en mi sistema) da problemas. En vez de localhost podemos usar otro nombre asociado al host (ver el fichero /etc/hosts) o bien poner directamente la dirección IP 127.0.0.1. Es decir, en vez de hacer esto:
Mario J. Barchéin
Es decir, la idea es pasar de esta configuración:
a esta otra, aprovechando además las ventajas que ofrece Moxi en cuanto a supervisión y tolerancia a fallos:
Además, Moxi es totalmente compatible con el protocolo de comunicación de memcached, por lo que se convierte en un reemplazo directo sin necesidad de generar nuevo código o hacer adaptaciones en nuestras aplicaciones web que vayan más allá de un cambio en el host y/o puerto de conexión al servicio de memcached.
Esta presentación (de la cual he sacado las capturas anteriores) explica bastante bien las características de Moxi:
Lo que vamos a hacer es instalar en nuestro Debian squeeze o Ubuntu el servidor Moxi con conexión a un pool de servidores memcached.
Los pasos a seguir son los siguientes:
1. Descargar el paquete .deb de moxi-server adecuado para nuestra arquitectura y distribución. En el momento de escribir este artículo la versión precompilada en formato .deb más reciente es la 1.7.2 y se puede obtener de la siguiente dirección:
http://www.couchbase.com/downloads/moxi-server/community
2. Instalar el paquete descargado con el siguiente comando (como root), cambiando el nombre del paquete al correspondiente al que nos hayamos descargado. En mi caso he descargado moxi-server_x86_64_1.7.2.deb
# sudo dpkg -i /tmp/moxi-server_x86_64_1.7.2.deb3. Tras instalarlo, tendremos todos los archivos desempaquetados en /opt/moxi. En la configuración por defecto de moxi-server que nos proporciona el paquete .deb, moxi-server no está preparado para conectarse a ningún servidor memcached ni membase. Vamos a adaptarlo a nuestro sistema en el siguiente paso.
> Selecting previously unselected package moxi-server.
> (Leyendo la base de datos ... 151335 ficheros o directorios instalados actualmente.)
> Desempaquetando moxi-server (de .../moxi-server_x86_64_1.7.2.deb) ...
> Configurando moxi-server (1.7.2r) ...
> You have successfully installed Moxi Server.
> Please next edit the configuration files: /opt/moxi/etc
> Afterwards, to start the moxi server: /etc/init.d/moxi-server start
> By using this software you agree to the End User License Agreement. See: /opt/moxi/LICENSE.txt
4. Editamos el fichero /opt/moxi/moxi-cluster.cfg, el cual tendrá el siguiente contenido en la instalación por defecto:
# Please point moxi at your membase cluster by specifyingLas líneas que comienzan por # son comentarios. Como vemos nos viene un ejemplo para conectarnos a un cluster membase, aunque no lo que nosotros queremos hacer es que moxi-server se conecte a una serie de servidores memcached estándar. Para ello, eliminamos todos los comentarios del archivo de configuración y añadimos la siguiente línea al fichero, usando los nombres adecuados de host y puertos que se adecúen a cada uno de los memcached de nuestro sistema distribuido:
# a membase REST URL.
#
# The moxi server won't start correctly until after you
# edit and uncomment the url line below...
#
# url=http://HOSTNAME:8091/pools/default/bucketsStreaming/default
11811=servidor1:11211,servidor2:11211,servidor3:11211
Ojo, ya que es imprescindible eliminar las líneas de comentarios del fichero de configuración para que el servidor arranque correctamente. Hay que dejar solo la línea con la definición del pool de servidores memcached. En otro caso dará un error al arrancar el servicio.
La sintaxis del fichero de configuración es la siguiente:
[puerto_moxi]=servidor1[:puerto1][,servidorN[:puertoN]]En el ejemplo anterior, moxi-server escuchará las conexiones entrantes en el puerto TCP/11811 del host donde lo tenemos instalado y usará los servidores memcached ubicados en los hosts servidor1, servidor2 y servidor3, todos ellos escuchando las conexiones entrantes el puerto 11211 de su respectivo host.
También, si uno de los nodos memcached al que nos vamos a conectar está ubicado en la máquina local, no debemos usar localhost como nombre de host ya que (al menos en mi sistema) da problemas. En vez de localhost podemos usar otro nombre asociado al host (ver el fichero /etc/hosts) o bien poner directamente la dirección IP 127.0.0.1. Es decir, en vez de hacer esto:
11811=localhost:11211 - PUEDE DAR PROBLEMASharemos esto:
11811=127.0.0.1:11211 - CORRECTO5. Para asegurarnos que hemos dejado el sistema correctamente configurado, arrancamos el servicio moxi-server:
# /etc/init.d/moxi-server startPodemos probar a almacenar un valor en el pool de memcached a través del moxi-server mediante el interfaz de telnet usando el protocolo de “texto plano” de memcached. En negrita están los comandos que introducimos y en texto normal las respuestas del servidor moxi, en caso de que todo haya ido bien (se puede consultar dicho protocolo en la URL http://code.sixapart.com/svn/memcached/trunk/server/doc/protocol.txt):
Started moxi server.
$ telnet localhost 118116. Ya está todo listo y ahora lo único que tenemos que hacer es modificar la configuración de conexión a memcached en nuestras aplicaciones web para que la conexión se haga al moxi-server local en el puerto 11811. La configuración recomendada es que cada nodo servidor web del sistema distribuido tenga funcionando de forma local un moxi-server con los parámetros de configuración necesarios para que acceda a todos los memcached de nuestro sistema (tal y como se muestra en la segunda imagen de este artículo). De esta manera tendremos una configuración de malla totalmente conectada, balanceada y tolerante a fallos.
Trying ::1...
Connected to localhost.
Escape character is '^]'.
set miclave 1 0 10
hola mundo
STORED
get miclave
VALUE
miclave 1 10
hola mundo
END
quit
Connection closed by foreign host.
Mario J. Barchéin
Muy interesante.
ResponderEliminarMás incluso ahora que comienzo la preparación de la asignatura "Servidores Web de Altas Prestaciones" (del Grado en Informática).
Pues la semana que viene o la otra tenemos otra entrada con esta temática de Administración de Sistemas Web de Altas Prestaciones.
ResponderEliminarY ya sabes, cualquier cosa en la que podamos ser de ayuda, estamos a tu disposición :)