Archive for the 'administración de sistemas' Category

Video del webinar sobre “Clustering y escalabilidad en Alfresco”

Toni Febrero 17th, 2011

Este es el video del webinar en el que hablamos sobre los componentes de la arquitectura que intervienen en Alfresco y que nos permiten escalar la plataforma ECM horizontal y verticalmente, así como conceptos y configuración de Alfresco en cluster para alta disponibilidad.

Recuerda que puedes encontrar más webinars en la sección ondemand de www.alfresco.com/es

  • Meneame
  • Netvibes Share
  • Delicious
  • Digg
  • Google Reader
  • Technorati Favorites
  • LinkedIn
  • Twitter
  • TypePad Post
  • Blogger Post
  • Google Bookmarks
  • WordPress
  • Facebook
  • Share/Bookmark

Configuración de correo saliente desde Alfresco

Toni Diciembre 24th, 2010

Aunque ya hablé de esto hace tiempo, quiero hacer un update de esta información, a modo de nota mental.

Para notificaciones, invitaciones y demás avisos, Alfresco se puede configurar para que se conecte a un servidor de correo y envíe esos mensajes. Desde las versiones 3.3 y 3.4 esto es más fácil de configurar. Vamos a ver como se configura el correo saliente mediante SMTPS (seguro), si quieres hacer los envíos mediante los servidores de Gmail de forma autenticada y cifrada.

Simplemente añadiendo las siguientes  lineas en alfresco-global.properties:

### Outbound mail SMTP ###
mail.host=smtp.gmail.com
mail.port=465
mail.protocol=smtps
mail.smtps.auth=true
mail.username=usuario@gmail.com
mail.password=contraseña
mail.encoding=UTF-8
mail.from.default=usuario@gmail.com
mail.smtp.starttls.enable=true

También se puede configurar un mensaje de test para que nos envíe un correo cada vez que arranca Alfresco y asegurarnos que el servicio funciona correctamente. Añadiríamos a alfresco-global.properties las siguientes líneas:

### Test message when Alfresco starts ###
mail.testmessage.send=true
mail.testmessage.to=tu-usuario@tu-dominio.com
mail.testmessage.subject=Outbound mail from Alfresco, server started.
mail.testmessage.text=Outbound SMTP email subsystem is working. Installed on ${dir.root}

Aprovecho para poner este anuncio de la disponibilidad de Alfresco Community 3.4c y Enterprise RC1 en ESPAÑOL!!!

  • Meneame
  • Netvibes Share
  • Delicious
  • Digg
  • Google Reader
  • Technorati Favorites
  • LinkedIn
  • Twitter
  • TypePad Post
  • Blogger Post
  • Google Bookmarks
  • WordPress
  • Facebook
  • Share/Bookmark

Alfresco EVT, herramienta para validación del entorno antes de instalar

Toni Diciembre 21st, 2010

Mi compañero en AlfrescoPeter Monks (Technical Director for Business Development), ha desarrollado un pequeño programa que permite validar el entorno donde se va a desplegar Alfresco tanto Enterprise como Community, aunque sin duda es más útil para Enterprise. Desde blyx.com quiero mostraros qué es y cómo funciona. Y dadas las fechas en las que estamos, a modo de regalo de Navidad.
Esta útil herramienta llamada Alfresco Environmente Validaton Tool (EVT) , comprueba varios puntos del sistema, base de datos y entorno específico, y nos muestra un informe donde podemos ver qué parámetros debemos cambiar para asegurarnos que Alfresco funcionará correctamente en nuestra red y enlaces donde encontrar esos recursos o recomendaciones. Básicamente analiza los puntos que desde Alfresco entendemos son más críticos o donde podemos encontrar problemas, de esta forma los evitamos.
Usarla es muy sencillo y funciona tanto en LINUX/UNIX como en windows ejecutando un script desde la línea de comandos. Claro, debe estar Java instalado en el sistema. Descomprimimos el zip que descargamos de la web del proyecto, ejecutamos  evt.sh o evt.cmd.
# ./evt.sh -help

Usage: evt[.sh|.cmd] [-?|--help] [-v] [-V|-vv]
            -t databaseType -h databaseHost [-r databasePort]
            [-d databaseName] -l databaseLogin [-p databasePassword]

where:      -?|--help        - display this help
            -v               - produce verbose output
            -V|-vv           - produce super-verbose output (stack traces)
            databaseType     - the type of database.  May be one of:
                               mysql, postgresql, oracle, mssqlserver, db2
            databaseHost     - the hostname of the database server
            databasePort     - the port the database is listening on (optional -
                               defaults to default for the database type)
            databaseName     - the name of the Alfresco database (optional -
                               defaults to 'alfresco')
            databaseLogin    - the login Alfresco will use to connect to the
                               database
            databasePassword - the password for that user (optional)
Aquí vemos un ejemplo de la ejecución en un servidor Linux CentOS 5.5. No voy a usar la opción -vv porque no se ve bien en el blog, pero en tu caso ¡úsala! porque mostrará más información y recomendaciones para solucionar los problemas o alertas que detecte (INFO, WARN! y FAIL!!):

# ./evt.sh -t mysql -h localhost -d alfresco -l alfresco -p alfresco

Alfresco Environment Validation Tool (for Alfresco Enterprise 3.3)
------------------------------------------------------------------

Validating JVM
  Vendor                : Sun Microsystems Inc. .......................PASS
  Version               : 1.6.0_21 ....................................PASS
  JVM Architecture      : 32 bit ......................................INFO
  Java Home             : /usr/java/jre1.6.0_21 .......................PASS

Validating Operating System
  OS                    : Linux .......................................PASS
  Distribution          : CentOS release 5.5 (Final) ..................WARN!
  OS Architecture       : 32 bit ......................................INFO
  File Descriptors      : 65535 .......................................PASS

Validating Server Hardware
  CPU Clock Speed       : 2673Mhz .....................................PASS
  CPU Count             : 2 sockets, 2 cores ..........................PASS
  Installed RAM         : 2032MB ......................................WARN!

Validating Network
  Local Hostname        : server ......................................PASS
  IP Address            : 10.10.100.100 ...............................PASS
  DNS Hostname          : server.blyx.com .............................PASS
  TCP 8005 (Tomcat)     : available ...................................PASS
  TCP 8080 (HTTP)       : available ...................................PASS
  TCP 50500 (RMI)       : available ...................................PASS
  TCP 21 (FTP)          : available ...................................PASS
  TCP 139 (NetBT)       : available ...................................PASS
  TCP 445 (SMB)         : available ...................................PASS
  TCP 7070 (Sharepoint) : available ...................................PASS
  TCP 25 (SMTP)         : available ...................................PASS
  TCP 143 (IMAP)        : available ...................................PASS
  UDP 137 (NetBT)       : available ...................................PASS
  UDP 138 (NetBT)       : available ...................................PASS
  Database Hostname     : resolved ....................................PASS
  Packet Loss           : (please wait) 0% ............................PASS
  Average Response Time : 0.186ms .....................................PASS
  Response Time Std Dev : 0.042ms .....................................PASS

Validating 3rd Party Apps
  Can fork OpenOffice   : yes .........................................PASS
  OpenOffice Version    : unknown .....................................WARN!
  Can fork ImageMagick  : yes .........................................PASS
  ImageMagick Version   : 6.2 .........................................PASS
  Can fork pdf2swf      : yes .........................................PASS

Validating Database
  Database Type         : mysql ...recognised .........................PASS
  JDBC Driver Loaded    : yes .........................................PASS
  Database Connectivity : connected ...................................PASS
  Scrollable Result Sets: true ........................................PASS
  JDBC Driver Version   : 5.1 .........................................PASS
  MySQL Version         : 5.1.52 ......................................PASS
  Default Storage Engine: InnoDB ......................................PASS
  Case Sensitivity Level: 0 ...........................................WARN!
  Client Encoding       : utf8 ........................................PASS
  Connection Encoding   : utf8 ........................................PASS
  Database Encoding     : latin1 ......................................FAIL!!
  Filesystem Encoding   : binary ......................................PASS
  Results Encoding      : utf8 ........................................PASS
  Server Encoding       : utf8 ........................................PASS
  System Encoding       : utf8 ........................................PASS

                         **** FINAL GRADE: FAIL!! ****
Como vemos en el report, se han analizado muchos puntos que pueden afectar al correcto funcionamiento de Alfresco:
  • Máquina virtual de Java.
  • Sistema Operativo (incluyendo file descriptors).
  • Hardware del servidor.
  • Información de la red, puertos disponibles y tiempos de respuesta con la base de datos.
  • Aplicaciones de terceros que necesita Alfresco para funcionar al 100%.
  • Configuración de la base de datos.
El ejemplo anterior tiene muchos errores para que veáis lo que puede detectar la herramienta. En ese sistema no sería recomendable instalar Alfresco.
Nota: recuerda ejecutar el comando antes de instalar Alfresco o con Alfresco parado, de lo contrario encontrarás muchos FAIL!! y WARN!

Espero que os sea útil.

A propósito, ¡Feliz Navidad a todos! ¡Y Feliz año 2011! Será el décimo aniversario de blyx.com (10 años desde que compré el dominio). Un año impar, seguro que es un buen año para todos.

  • Meneame
  • Netvibes Share
  • Delicious
  • Digg
  • Google Reader
  • Technorati Favorites
  • LinkedIn
  • Twitter
  • TypePad Post
  • Blogger Post
  • Google Bookmarks
  • WordPress
  • Facebook
  • Share/Bookmark

¿Quieres prepararte? Aplicaciones empresariales Open Source

Toni Octubre 26th, 2010

¿Estás estudiando? ¿No tienes trabajo y estás pensando en mejorar tu formación? ¿Quieres preparar tu perfil técnico pero no estás seguro por donde van las tendencias? Si eres o quieres ser técnico de sistemas, programador, administrador o arquitecto de sistemas o software y quieres trabajar con Software Libre, he preparado esta lista a modo de resumen y aprovechando que el curso acaba de empezar. Si no reunes las condiciones anteriores igual también te resulta interesante e incluso puedes ampliar la lista en los comentarios. (Parece que voy a vender cursos de CCC o algo así, pero nada más lejos de la realidad, es un simple listado :D ).
La familia de aplicaciones “Enterprise Open Source” es bastante amplia y abarcan todos los campos que puede necesitar una organización. Si estas empezando en este mundo y eres capaz de dominar algunas de estas aplicaciones o conocerlas en profundidad, creo que tendrás más oportunidades en tu proyección profesional.
Antes de empezar, quiero dejar claro que este artículo no pretende ser un listado al estilo Infoworld, aunque dichas clasificaciones me parecen de un gran interés, en este caso sólo pretendo reflejar mis aplicaciones favoritas para cada caso y sobre todo, las que creo que están más extendidas.
Me gustaría recomendaros que echéis un vistazo a los “Amazon Elastic Compute Cloud” (Amazon EC2), es importante saber cómo funciona, cómo desplegar servidores, sistemas de almacenamiento que soporta, etc. En muchas empresas, se hacen uso de estos servicios, ya sea a través de Amazon u otros.
Bueno, aquí va la lista:
Muchas de estas aplicaciones las puedes instalar y probar de una forma muy sencilla y en Linux, Mac o Windows gracias a los stacks de Bitnami.
La mayoría de estas aplicaciones están hechas en PHP o en Java, eso te puede dar otra idea, si decides aprender a programar.
Hace un par de semanas, la empresa Stratebi publicó un listado que subraya algunas de las aplicaciones que aquí he indicado. Puedes ver la presentación aquí.
Tras hacer este listado he pensado que posiblemente no haya, o al menos yo no lo conozco, un centro de formación que capacite a técnicos y desarrolladores en todas estas tecnologías… sería algo interesante ¿no crees?
  • Meneame
  • Netvibes Share
  • Delicious
  • Digg
  • Google Reader
  • Technorati Favorites
  • LinkedIn
  • Twitter
  • TypePad Post
  • Blogger Post
  • Google Bookmarks
  • WordPress
  • Facebook
  • Share/Bookmark

Monitoring Alfresco con Javamelody

Toni Septiembre 13th, 2010

Hace un tiempo leí este post sobre Monitorización de aplicaciones web con Javamelody escrito por Antonio Muñiz de Klicap y pensé que podría probarlo como no, con Alfresco. Así que me he puesto manos a la obra y aquí están los resultados.

En otros artículos (1, 2 y 3) he tratado de explicar las diferentes formas que existen para monitorizar Alfresco y tener una visión objetiva en cuanto al rendimiento de la aplicación, cuellos de botella, etc.

Hay métodos que son más intrusivos en cuanto a rendimiento que otros, por ejemplo, como indica Antonio en los comentarios de su artículo, el uso de VisualVM no sería viable para usos en producción ya que introduce retardos por cada línea de código ejecutada, JConsole (que viene con la JDK) no es tan intrusiva ya que sólo hace lecturas vía JMX de la información que ofrece la JVM (así es como funciona el plugin de Nagios para Alfresco). En el caso que nos ocupa, Javamelody, el impacto en la aplicación monitorizada es mucho menor que las anteriores ya que no se ataca directamente a la aplicación a monitorizar sino que se usan unos jars dedicados a la tarea de extraer la información.

La instalación de Javamelody es sencilla y aunque puedes ver más opciones aquí, estos son los pasos básicos para instalar la aplicación:

  • Paramos Alfresco (en mi caso la versión 3.3), no es obligatorio.
  • Descomprimimos el archivo zip.
  • Copiamos los ficheros javamelody-1.19.0.jar y jrobin-1.5.9.1.jar al directorio WEB-INF/lib que está dentro del directorio webapps/alfresco (puede variar dependiendo del servidor de aplicaciones), es el directorio que se crea automáticamente cuando desplegamos alfresco.war.
  • Por último añadimos las siguientes líneas en el fichero WEB-INF/web.xml de la aplicación, dentro de las etiquetas web-app:
        <filter>
                <filter-name>monitoring</filter-name>
                <filter-class>net.bull.javamelody.MonitoringFilter</filter-class>
        </filter>
        <filter-mapping>
                <filter-name>monitoring</filter-name>
                <url-pattern>/*</url-pattern>
        </filter-mapping>
        <listener>
                <listener-class>net.bull.javamelody.SessionListener</listener-class>
        </listener>
  • Opcionalmente, para poder generar informes en PDF debemos copiar a WEB-INF/lib el fichero itext-2.1.7.jar que podemos encontrar dentro del zip descargado en src/test/test-webapp/WEB-INF/lib/
  • Accedemos via web http://localhost:8080/alfresco/monitoring

Añadir a todo lo anterior unas notas:

  • Todos los ficheros generados por RRD se encuentran en tomcat/temp/javamelody.
  • Recuerda que al estar los ficheros de Javamelody dentro del directorio alfresco (alfresco.war desplegado), cuando actualices Alfresco deberás volver a hacer el procedimiento de instalación de Javamelody.
  • La web que nos muestra las estadísticas no tiene ningún tipo de protección por usuario y contraseña ya que es una web de consulta, no obstante, se podría establecer, mira aquí.

Dicho todo lo anterior ¿qué obtenemos? Aquí podemos ver algunas capturas de pantalla y otras muchas en este enlace:

Como comentaba anteriormente, lo he probado en Alfresco 3.3 Enterprise pero dadas las características de Javamelody debe funcionar en la versión Community. Espero vuestro feedback.

ACTUALIZACIÓN 16/Sept/2010:

Cuando arrancamos Alfresco tras haber copiado los ficheros jar, posiblemente veamos en el log de Tomcat, unas trazas como las siguientes (este error no afecta al rendimiento de la aplicación):

ERROR [log4j.jmx.LoggerDynamicMBean] Could not add appenderMBean for [null]. java.lang.NullPointerException: Invalid value (null)
at net.bull.javamelody.Log4JAppender.register(Log4JAppender.java:50)
 at net.bull.javamelody.MonitoringFilter.initLogs(MonitoringFilter.java:272)
 at net.bull.javamelody.MonitoringFilter.init(MonitoringFilter.java:98)

Contacté con el desarrollador de Javamelody, Emeric Vernat y muy amablemente me envió una nueva versión de uno de los jars que soluciona ese problema, se trata de este: http://javamelody.googlecode.com/files/javamelody-20100915.jar. Para actualizar el jar debemos parar Alfresco, borrar el fichero <tomcat>/webapps/alfresco/WEB-INF/lib/javamelody-1.19.0.jar y copiar javamelody-20100915.jar en el directorio donde se encontraba el anterior. Arrancamos Alfresco y listo. Muchas gracias por el feedback Emeric!!

  • Meneame
  • Netvibes Share
  • Delicious
  • Digg
  • Google Reader
  • Technorati Favorites
  • LinkedIn
  • Twitter
  • TypePad Post
  • Blogger Post
  • Google Bookmarks
  • WordPress
  • Facebook
  • Share/Bookmark

Arquitecturas en Alfresco

Toni Mayo 16th, 2010

alfresco_repository_architecture_diagram1_coloredCon este post me gustaría hacer una pequeña introducción a los diferentes diseños de arquitecturas que podemos llevar a cabo con Alfresco dependiendo del uso, usuarios, rendimiento, concurrencia y almacenamiento requerido.

Alfresco es un producto que acaba de cumplir 5 años, tras pasar por varias etapas con versiones más o menos estables, podemos decir, que desde hace un tiempo contamos con un producto confiable, robusto, estable y escalable. Preparado para pequeños proyectos con decenas de usuarios y unos cuantos miles de contenidos y para entornos con miles de usuarios y millones de contenidos. Y cada vez nos encontramos más y más instalaciones consolidadas.

Algo muy común que veo en las implantaciones de Alfresco, salvo casos muy concretos, es que muchas veces se instala la aplicación, base de datos y content store en la misma máquina, tanto para un piloto, desarrollo, test o producción. Para un piloto y desarrollo o incluso test es válido, o para producción si los requisitos no son demasiado exigentes. Teniendo todas las capas de la aplicación en la misma máquina (física o virtual), cuando el entorno pasa a producción y empieza a crecer considerablemente en número de usuarios y contenidos se suele experimentar un problema de rendimiento. Tiempos de respuesta elevados en el acceso, reglas, workflows, etc.

Vamos a ver, de forma resumida, algunos conceptos a tener en cuenta a la hora de hacer despliegues de Alfresco que nos permita crecer tanto horizontal como verticalmente.

Antes de seguir, para entender bien todo esto, veamos los componentes de la infraestructura que debemos conocer y diferenciar para diseñar una correcta arquitectura:

  • Repositorio Alfresco: hablamos de la aplicación principal de Alfresco (alfresco.war) que gestiona todo el repositorio (contenidos) y el core, así como las diferentes interfaces de acceso como CIFS, FTP, WebServices, Alfresco Explorer y muchas otras más.
  • Alfresco Share: aplicación (share.war) que es y será la cara web de Alfresco y nos permite acceder al repositorio mediante Share Point Protocol (vti-server.war) y sitios favoritos mediante IMAP. Este componente puede estar en una capa diferente al repositorio.
  • Aplicaciones de terceros: nos referimos a las aplicaciones que necesita Alfresco para funcionar al 100% como OpenOffice, ImageMagik y Pdftools. Recuerda que desde la versión 3.2, OpenOffice funciona como un subsistema y podemos instalarlo en una máquina diferente al repositorio.
  • Base de datos: será el motor de base de datos a usar por el software, como ya sabemos, pueden ser de varios tipos y “sabores” como MySQL, MS SQL Server, PostgreSQL, Oracle, etc. Alfresco almacena en la base de datos toda la información (metadatos, reglas, permisos… todo) excepto los índices y los ficheros físicos. Dicho esto, podemos adivinar que el uso de base de datos que hace Alfresco es importante.
  • Almacén de contenido o content store: será el sistema de ficheros, directorio o directorios del sistema operativo donde Alfresco deposita los ficheros que maneja, los ordena por diferentes niveles de directorios (año/mes/dia/hora/minuto). Por defecto se almacena dentro de alf_data/contentstore. En contentstore.deleted tendremos los ficheros borrados, tras 15 días de ser eliminados, y audit.contentstore que será la información extra que genera la aplicación si activamos las auditorías.
  • Índices: hablamos de la información que genera el motor de indexación y búsqueda que incorpora Alfresco, Lucene. Esta información se almacena en un directorio del sistema operativo llamado lucene-indexes dentro de alf_data por defecto. Diariamente a las 3 AM se genera un backup automático de los índices en el directorio alf_data/lucene-indexes.backup. Como decía, ahí se almacenan todos los índices de los contenidos del repositorio y tendrá un puntero a los mismos desde la base de datos. Podemos imaginar que cuanto más rápido sea el disco o discos donde residan los índices, más rápido funcionará nuestro sistema a nivel general.

Dicho lo anterior y conociendo el funcionamiento de Alfresco, podemos averiguar donde tenemos los cuellos de botella en las implantaciones.

Por ejemplo, tener el content store y la base de datos en la misma máquina sobre el mismo disco duro supone que cada vez que subimos un fichero o realizamos alguna acción con el mismo se escribe simultáneamente en base de datos y content store; moraleja: el disco duro debe escribir al mismo tiempo en varios sitios diferentes = sistema lento. Claro está, esto nos pasará si estamos haciendo un uso intensivo del sistema.

Todos esos componentes los podemos implementar de diferentes formas, dependiendo de la ubicación de cada componente hablaremos de diferentes capas o niveles.

  • Una capa única: es el despliegue por defecto que podemos realizar con los instaladores bundle de Alfresco. Todos los elementos de la infraestructura los tendríamos en la misma máquina. ¿Para qué es válido este tipo de despliegue? Para pruebas piloto, desarrollos o incluso pequeñas instalaciones orientadas a departamentos. Por supuesto, este tipo de despliegues no se recomiendan para sistemas críticos o con grandes expectativas por razones obvias de escalabilidad y rendimiento.
  • Dos capas: en este despliegue podemos empezar a usar una arquitectura realmente empresarial y escalable. Aquí separaremos en capas independientes:

Capa de contenidos: repositorio, Share, índices y aplicaciones de terceros que necesita Alfresco.
Capa de almacenamiento: Base de datos en una máquina dedicada a la que accede la aplicación vía JDBC y content store en una SAN o NAS.

Esta arquitectura permite más escalabilidad y rendimiento, configuración simple y la gestión del crecimiento del contenido es transparente para la aplicación. Si añadimos que en este caso los índices estarán en la capa de contenidos tendremos como resultado un entorno que imprima un rendimiento considerable para entornos de tipo medio que incluso pueden ponerse en alta disponibilidad, pero ojo, si crecen mucho los contenidos también crecerán los índices y en ese casos podríamos necesitar hacer cambios en la infraestructura o en la configuración de los servidores (asignar más almacenamiento, etc.).

  • Tres capas distribuidas: en versiones 3.X podemos separar en varias capas componentes de la capa web de Alfresco, es decir, separar Alfresco Share del repositorio. Este caso será el más escalable y nos permitirá implementar entornos con una gran carga y altas exigencias en cuanto a rendimiento. Esta arquitectura añade a la de dos capas la distribución de la capa web. Las capas serían las siguientes:

Capa web: donde tendríamos Alfresco Share o/y otras aplicaciones frontales que podamos tener para trabajar con Alfresco (Liferay, Joomla, Drupal, etc.) u otras hechas desde cero y opcionalmente un servidor web que proteja al servidor de aplicaciones vía mod_proxy, Varnish o similares.

Capa de contenidos: repositorio, índices y aplicaciones de terceros que necesita Alfresco.

Capa de almacenamiento: Base de datos en una máquina dedicada a la que accede la aplicación vía JDBC y content store en una SAN o NAS.

Podríamos añadir una capa extra entre la capa web y capa de contenidos que nos permita hacer caché, control de acceso o balanceo de carga. Como vemos, esta es la mejor forma de ofrecer el máximo rendimiento tanto de lectura como de escritura, que además podemos configurar en alta disponibilidad en todas las capas. Este tipo de arquitectura no es recomendada para pequeños despliegues departamentales y necesita un alto grado de conocimiento de Alfresco, sistemas y redes en general. Salvo uso de software específico, no se recomienda separar cada una de las capas de forma geográfica ya que una alta latencia entre capas puede influir negativamente en el rendimiento.

  • Meneame
  • Netvibes Share
  • Delicious
  • Digg
  • Google Reader
  • Technorati Favorites
  • LinkedIn
  • Twitter
  • TypePad Post
  • Blogger Post
  • Google Bookmarks
  • WordPress
  • Facebook
  • Share/Bookmark

Alfresco Hack: cómo sacar un informe rápido de los contenidos del repositorio

Toni Marzo 10th, 2010

Ya lo vi hace tiempo en Think Alfresco y sabía que algún día lo iba a necesitar, ahora quiero compartirlo con vosotros. Sabemos lo que ocupa el repositorio, sería tan fácil como hacer un du -sh contentstore, pero ¿qué tipo de archivos almacena ese repositorio y cuantos de cada tipo? Saber ese dato es importante al hacer migraciones, optimizar Lucene, etc. Es tan fácil como ejecutar el siguiente comando desde el directorio superior al contentstore de turno:

$ find ./contentstore -type f -exec file -inb {} \;| sort |uniq -c|sort -nr

Este comando nos dará como resultado algo parecido a lo siguiente:

    378 application/msword
    147 application/pdf
     72 text/plain; charset=us-ascii
     58 text/x-c++; charset=iso-8859-1
     12 text/plain; charset=utf-8
      8 text/html
      2 application/x-zip
      2 text/plain; charset=iso-8859-1
      2 image/jpeg
      2 application/x-empty
      2 text/x-c; charset=utf-8
      1 text/x-c++; charset=utf-8
      1 image/png

Fácil ¿no? Claro que también se puede hacer con un JavaScript y ejecutarlo como acción pero pienso que así es más rápido, además es el “Sys Admin way”.

  • Meneame
  • Netvibes Share
  • Delicious
  • Digg
  • Google Reader
  • Technorati Favorites
  • LinkedIn
  • Twitter
  • TypePad Post
  • Blogger Post
  • Google Bookmarks
  • WordPress
  • Facebook
  • Share/Bookmark

Archiving en Alfresco 3.2

Toni Febrero 17th, 2010

image_archivingActualización 25/Feb/2010: ver demo-config-files para configuración más cómoda incluso desde Share, reglas y demás (doc calentito que me han enviado desde Alfresco, Gracias Paul!!).

¿Que es el archiving/archivado? Un archivo en gestión documental es una colección de documentos históricos, así como el lugar donde se encuentran. Pues bien, vamos a ver como se configura Alfresco para poder almacenar los contenidos en diferentes sistemas de ficheros, particiones o filesystem (como quieras llamarlo). Cada filesystem puede ser de diferente naturaleza, es decir, los contenidos que se trabajan actualmente deberán estar en los discos más rápidos (discos locales o en una SAN) y los contenidos históricos o de acceso poco frecuente pero debemos mantener, podemos almacenarlos en discos más lentos/baratos o por ejemplo en una NAS.

Todo esto se consigue en Alfresco gracias al Content Store Selector. El Content Store Selector ofrece un mecanismo de control que relaciona el contenido lógico con un fichero físico y su ubicación. Usando el aspecto cm:storeSelector y asignándole una propiedad cm:storeName podemos mover el contenido de un Store a otro de forma totalmente transparente tanto para el usuario como para la aplicación a la hora de mostrar los contenidos, claro que previamente tenemos que definirlos. Esto nos permitirá declarar políticas para controlar la capa de almacenamiento y el uso que de ella hace Alfresco en base a regales de negocio.

Veamos como se configura en base al siguiente escenario:

El repositorio y los ficheros de uso diario, los más usados, los tenemos en /opt/alfresco/alf_data/contentstore, supongamos que ese filesystem corresponde a los discos más rápidos. También tenemos un disco local más lento montado en /opt/alfresco/alf_data/storeA, e incluso podemos tener un filesystem de tipo NAS para los datos que ya no usamos pero necesitamos almacenar montado en /opt/alfresco/alf_data/storeB.

¿Cómo lo configuramos?

Creamos un fichero llamado “sample-content-store-selector-context.xml” en shared/classes/alfresco/extension con el siguiente contenido, lee los comentarios para entender la configuración:

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE beans PUBLIC '-//SPRING//DTD BEAN//EN' 'http:// www.springframework.org/dtd/spring-beans.dtd'>
<!-- Define the new file stores -->
<beans>
        <bean id="firstSharedFileContentStore" class="org.alfresco.repo.content.filestore.FileContentStore">
                <constructor-arg>
                        <value>${dir.root}/storeA</value>
                </constructor-arg>
        </bean>
        <bean id="secondSharedFileContentStore" class="org.alfresco.repo.content.filestore.FileContentStore">
                <constructor-arg>
                        <value>${dir.root}/storeB</value>
                </constructor-arg>
        </bean>
<!-- Declare the mapping between store names and store instances -->
        <bean id="storeSelectorContentStore" parent="storeSelectorContentStoreBase">
                <property name="defaultStoreName">
                        <value>default</value>
                </property>
                <property name="storesByName">
                        <map>
                                <entry key="default">
                                        <ref bean="fileContentStore" />
                                </entry>
                                <entry key="storeA">
                                        <ref bean="firstSharedFileContentStore" />
                                </entry>
                                <entry key="storeB">
                                        <ref bean="secondSharedFileContentStore" />
                                </entry>
                        </map>
                </property>
        </bean>
<!-- Point the ContentService to the 'selector' store -->
        <bean id="contentService" parent="baseContentService">
                <property name="store">
                        <ref bean="storeSelectorContentStore" />
                </property>
        </bean>
<!-- Add the other stores to the list of stores for cleaning -->
        <bean id="eagerContentStoreCleaner" class="org.alfresco.repo.content.cleanup.EagerContentStoreCleaner" init-method="init">
                <property name="eagerOrphanCleanup" >
                        <value>${system.content.eagerOrphanCleanup}</value>
                </property>
                <property name="stores" >
                        <list>
                                <ref bean="fileContentStore" />
                                <ref bean="firstSharedFileContentStore" />
                                <ref bean="secondSharedFileContentStore" />
                        </list>
                </property>
                <property name="listeners" >
                        <ref bean="deletedContentBackupListeners" />
                </property>
        </bean>
</beans>

Si te fijas en los dos primeros beans, los valores que se especifican están relacionados con la ubicación de los dos Stores adicionales que estamos creando, en esta caso, relativos a ${dir.root} que es un atributo declarado en alfresco-global.properties. Si nuestros nuevos filesystems no están dentro de dir.root podemos poner la ruta absoluta, por ejemplo <value>/mnt/storeA</value>.

Para poder usar los nuevos contentStores debemos configurar el web-client (Alfresco Explorer) y declararlo como aspecto. Editamos web-client-config-custom.xml y añadimos las siguientes lineas:

<!-- Configuring in the cm:storeSelector aspect -->
        <config evaluator="aspect-name" condition="cm:storeSelector">
                <property-sheet>
                        <show-property name="cm:storeName" />
                </property-sheet>
        </config>
        <config evaluator="string-compare" condition="Action Wizards">
                <aspects>
                        <aspect name="cm:storeSelector"/>
                </aspects>
        </config>

Hecho lo anterior ya podemos reiniciar el servidor de aplicaciones para que los cambios surtan efecto.

Ahora vamos a ver como empezar a usarlo. Recuerda que el aspecto, aunque pueden aplicarlo todos los usuarios, sólo el usuario administrador podrá especificar el store correspondiente y sólo es aplicable a contenidos (no a espacios). En este ejemplo veremos como hacerlo de forma manual, para sistemas en producción deberíamos hacer un script que modifique dicho metadato automáticamente en base a las necesidades que tengamos, por ejemplo los que estén dentro de un espacio concreto, los que tengan más de N años en el repositorio, etc. El procedimiento sería el siguiente:

  • Localizamos el fichero con el que queremos probar (lo moveremos al storeA).
  • Vamos a “Ver detalles” de dicho fichero y pinchamos en “Ejecutar una acción”
  • Seleccionamos “Agregar aspecto al contenido” -> “ContentStore Selector” -> Aceptar -> Finalizar
  • En las propiedades del fichero ya veremos un nuevo metadato llamado “Store Name”.
    propiedades
    Editamos las propiedades y en Store Name especificamos: storeA
    storea
    Cuando pinchemos en Aceptar, automáticamente el contenido se moverá de forma transparente al filesystem alf_data/storeA/2010/2/17/22/50/4365380f-daf1-494c-b79d-db11480cb171.bin correspondiente, en mi ejemplo, a un fichero pdf.

¿Interesante no?

ACTUALIZACIÓN: para automatizar la clasificación por “Stores” podemos hacer un script en Java Script llamado, por ejemplo, action_storeA.js o B según el sitio donde queramos colocar los ficheros, con el contenido:

document.properties["cm:storeName"]="storeA";
document.save();

Lo guardamos y subimos a Diccionario de datos -> Scripts. Hecho esto podemos ejecutar una acción sobre el fichero de turno y seleccionamos “Ejecutar un script” -> Seleccionamos nuestro script “action_storeA.js” y listo. También podemos incluirlo en una regla y hacer el proceso de forma automática, cuando entren los ficheros a un espacio concreto, o incluso clasificar si son vídeos, imágenes, pdf, cad, etc.

  • Meneame
  • Netvibes Share
  • Delicious
  • Digg
  • Google Reader
  • Technorati Favorites
  • LinkedIn
  • Twitter
  • TypePad Post
  • Blogger Post
  • Google Bookmarks
  • WordPress
  • Facebook
  • Share/Bookmark

Nagios plugin for Alfresco released!!

Toni Enero 29th, 2010

I’ve just released the version 1.0 of the new Nagios Plugin for Alfresco, which can be used with Icinga too. I have employed Enterprise JMX capabilities to extract and check information from Alfresco. It has been tested in Alfresco Enterprise 3.2.

Nagios is an Open Source network monitoring tool that can be configured to monitor services on a network. Icinga is a new fork of Nagios. They are both used extensively in enterprise environments.

You can download it here http://forge.alfresco.com/projects/nagios4alfresco/

nagios_plugin_for_alfresco_screenshot

UPDATED! Version 1.1 released. Added “performance data” support. Now you can graph all checks with pnp4nagios.

It checks the following services:

  • PING
  • SSH
  • Alfresco Application Server
  • Alfresco Web Server – proxy
  • Alfresco VTI Share Point – Jetty
  • Alfresco FTP Server
  • Alfresco CIFS Server – NetBIOS
  • Alfresco CIFS Server – SMB
  • Alfresco RMI – JMX
  • Alfresco IMAP Server
  • Alfresco SMTP Server – incoming
  • Alfresco – Heap Memory Usage -
  • Alfresco – System Load Average
  • Alfresco – Thread Count
  • Alfresco – Number of Total Users
  • Alfresco – Number of Total Groups
  • Alfresco – Connection Pool
  • Alfresco – ContentStore Size
  • Alfresco – ContentStore Deleted Size
  • Alfresco – Audit Store Size
  • Alfresco – Hibernate Connect Count
  • Alfresco – Lucene Indexes SpacesStore Used
  • Alfresco – Lucene Indexes SpacesStore Num
  • Alfresco – Repo Sessions
  • Alfresco – Repo Users Connected
  • Alfresco – Total Memory Used
  • Alfresco – Free Memory
  • Alfresco – Max Memory
  • Alfresco – Cache Size

You can find it at Nagios Exchange or Monitoring Exchange

  • Meneame
  • Netvibes Share
  • Delicious
  • Digg
  • Google Reader
  • Technorati Favorites
  • LinkedIn
  • Twitter
  • TypePad Post
  • Blogger Post
  • Google Bookmarks
  • WordPress
  • Facebook
  • Share/Bookmark

Mejorando la velocidad de Alfresco con Varnish

Toni Diciembre 8th, 2009

En la charla que di en el Meetup de Alfresco en Madrid, comenté, entre otras cosas, cómo acelerar Alfresco, en este punto se hablaba de Varnish.

Varnish

Varnish es un proxy caché, acelerador web y balanceador de servidores web que funciona sobre Linux, Mac y *BSD, básicamente usa opciones del kernel y un almacén de la caché para acelerar las peticiones de páginas, es decir, un sustituto a mod_proxy, mod_proxy_balancer o mod_proxy_ajp.

En este artículo os dejo un manual sobre como implementar Varnish por delante de Alfresco para acelerar la experiencia del usuario y funcionamiento en general de la aplicación, tanto Alfresco Explorer como Alfresco Share u otras aplicaciones que desarrollemos sobre Alfresco, reduce los tiempos de conexión de forma considerable y libera de algunas peticiones al servidor de aplicaciones.

En este caso explicaré como instalar y configurar Varnish 2.0.5 en CentOS 5 mediante un RPM aunque también se puede compilar, todo en menos de 5 minutos. La lectura de esta web me ha ayudado para escribir el artículo.

Continue Reading »

  • Meneame
  • Netvibes Share
  • Delicious
  • Digg
  • Google Reader
  • Technorati Favorites
  • LinkedIn
  • Twitter
  • TypePad Post
  • Blogger Post
  • Google Bookmarks
  • WordPress
  • Facebook
  • Share/Bookmark

« Prev - Next »