Mostrando entradas con la etiqueta sysadmin. Mostrar todas las entradas
Mostrando entradas con la etiqueta sysadmin. Mostrar todas las entradas

lunes, 5 de septiembre de 2016

Enlaces interesantes. Agosto de 2016.

A modo de backup, vuelco aquí los enlaces interesantes que he encontrado este verano.


Cursos, MOOCs, Transparencias

Crimen, Mafia

Literatura y libros

Matemáticas

  • "This is a wiki-lab for collaborative work on Mathematics, Physics and Philosophy — especially from the n-point of view: insofar as these subjects are usefully treated with tools and notions of category theory or higher category theory.": https://ncatlab.org/nlab/show/HomePage

Juegos de rol

IoT, Microprocesadores, Electrónica

Programación

Seguridad informática

BigData, AI, NLP, Data Sets

Administración de Sistemas

Viajes

martes, 22 de septiembre de 2015

Mis podcasts favoritos

Un listado de los Podcasts que tengo configurados en la aplicación del móvil que uso para escucharos: Podcast Addict. También os la recomiendo encarecidamente. Los clasifico por temáticas, aunque casi todos son de programación. Pongo a mis favoritos un [*] a la derecha del nombre.




sábado, 17 de diciembre de 2011

Reflexiones sobre el tamaño óptimo de los backups incrementales o diferenciales


Definimos el factor:

Factor (F) = (Suma Incrementales o Diferenciales) / Full del ciclo

El factor está acotado de la siguiente manera:

0 ≤ F ≤ (N-1)

Donde N es la duración del ciclo. Por ejemplo si se hacen backups full semanales y cada día un incremental, N=7 porque es por semana. Si se hiciera un backup full mensual y el resto de los días del mes incrementales, N=30.

Valores de F mayores que (N-1) no tienen mucho sentido ya que querría decir que
la los incrementales, de media, pesan más que el full del ciclo.

Ej. 1: full semanal, resto de los días incrementales

         |-- L --|-- M --|-- X --|-- J --|-- V --|-- S --|-- D --|
Semana 1 |       |       |       |       |       |       | FullS |
Semana 2 | Inc1  | Inc2  | Inc3  | Inc4  | Inc5  | Inc6  |       |

=> Factor = (Inc1 + Inc2 + Inc3 + Inc4 + Inc5 + Inc6) / FullS

Ej. 2: full semanal, resto de los días diferenciales

         |-- L --|-- M --|-- X --|-- J --|-- V --|-- S --|-- D --|
Semana 1 |       |       |       |       |       |       | FullS |
Semana 2 | Dif1  | Dif2  | Dif3  | Dif4  | Dif5  | Dif6  |       |

=> Factor = (Dif1 + Dif2 + Dif3 + Dif4 + Dif5 + Dif6) / FullS

Ej. 3: full mensual, resto de los días incrementales

Semana 1 | FullM | Inc1  | Inc2  | Inc3  | Inc4  | Inc5  | Inc6  |
Semana 2 | Inc7  | Inc8  | Inc9  | Inc10 | Inc11 | Inc12 | Inc13 |
Semana 3 | Inc14 | Inc15 | Inc16 | Inc17 | Inc18 | Inc19 | Inc20 |
Semana 4 | Inc21 | Inc22 | Inc23 | Inc24 | Inc25 | Inc26 | Inc27 |
Semana 5 | Inc28 | Inc29 |

=> Factor = (Inc1 + Inc2 + Inc3 + ... + Inc29) / FullM


Tipos de clientes:

Nos encontramos con dos tipos de clientes problemáticos:

  • Clientes cuyo F < 0.1: Suma de incrementales o diferenciales es menor que el 10% del tamaño del full.
→ CLIENTES INACTIVOS

  • Clientes cuyo F > 0.9: Suma de incrementalos o diferenciales mayor que el 90% del tamaño del full.
→ CLIENTES HIPERACTIVOS

Valor óptimo del factor:

Es difícil dar una cifra óptima ya que la elección de este factor influiría por ejemplo en los tiempos de recuperación, que pueden ser diferentes dependiendo de la política que se quiera seguir en el cliente o de los requerimientos en los tiempos de recuperación.

Además también hay clientes más propensos a tener un F grande. Por ejemplo, cuando son clientes de base de datos es normal generar un volcado diario con los datos. Con lo cual el incremental suele ser grande.

Medidas a adoptar:

Dependiendo del tipo de cliente, ir adoptando las medidas en orden y estudiar cómo evoluciona F a lo largo de las sucesivas semanas.

◊ En los clientes INACTIVOS:

1) Full cada más tiempo

◊ En los clientes HIPERACTIVOS:

1) Estudiar los ficheros que ocupan más tamaño en los incrementales y activar directivas a nivel local en los SaveSets / directorios conflictivos

NOTA: Estas directivas se pueden aplicar a nivel global (se han definido varias políticas en función del sistema operativo) o por el administrador del servidor en cuestión (mediante el fichero .nsr).

1.1) Si son ficheros temporales o prescindibles, excluirlos del backup
  • skip : Excluye un directorio o fichero. Espera una máscara. 
1.2) Con los ficheros que no cambian de tamaño a lo largo de la semana, pero sin embargo se van a cinta:
  • mtime : Graba sólo un fichero cuando el tiempo de modificación del fichero cambia, es decir, cuando cambia el fichero. A veces te llevas ficheros que sólo se han accedido pero no han cambiado, lo que no es muy adecuado.
2) Si son ficheros de log que no se rotan:
  • En Unix se pueden rotar con el logrotate.
  • En Windows: habría que buscar una solución similar.
3) Si son volcados a disco (normalmente copias completas de bases de datos):
  • Estudiar si es necesario hacer el volcado realmente todos los días y llevárselo al backup o se pueden usar otras técnicas de volcado (por ejemplo, volcados incrementales aunque aumentaría el tiempo de recuperación)
  • Si no es posible, documentar en algún sitio que ese cliente tiene los incrementales/diferenciales muy altos y no se puede bajar. Reflejar también el razonamiento.
En la práctica:
  • Normalmente (aunque depende de la herramienta de backup que se use) la suma de los incrementales te los hace directamente, mientras que cuando es un cliente con diferenciales (tipo NAS) los tienes que sumar tú (por cada cliente) para calcular el factor (ya que los clasifica como diferencial nivel 1, 2, 3, etc.
  • Cuando la estadística es en un período de tiempo largo, se puede hacer la suma en el período de todos los incrementales o diferenciales y luego dividir por la suma de todos los fules en el período. De esta forma sale una muestra mayor y los valores son más significativos.
  • Si un cliente tiene varios SaveSets puede que uno de ellos tenga algún problema y los otros estén bien. Realmente cuentan los SaveSets de mayor tamaño dentro de un cliente (los que ocupan GB, es decir en tamaño los del orden de 1E+9). Dado que la política de backup se fija a nivel de cliente, si un SaveSet grande tiene problemas ese cliente tendría que ser entonces candidato para que se le optimice.
  • Los diferenciales en realidad son más grandes que los incrementales, ya que se reflejan los cambios desde el último backup full. Para clientes tipo NAS (como por ejemplo EMC Celerra, NetAPP, etc) no conviene tocar mucho la configuración ya que si no se penaliza de cara a los tiempos de recuperación.

lunes, 28 de noviembre de 2011

Un gestor de descargas programado en bash


El gestor de descargas favorito de todo sysadmin debería de ser un script programado en bash. Perl también sería otra opción, pero soy menos hábil en ese lenguaje. Lo único que necesita el script son los comandos básicos (echo, awk), uno para comprimir (gzip) y el que vamos a usar para descargar (wget).

El script es el siguiente:

Pastie | Mystic Paste
-----------------[ descarga.sh ]-----------------
#!/bin/bash

WGET_OPTS="-c"

graba_msg_error() {
  ERRORNO=$1
  case $ERRORNO in
    0) MSG_ERR="No problems occurred." ;;
    1) MSG_ERR="Generic error code." ;;
    2) MSG_ERR="Parse error --- for instance, \
when parsing command-line options, the .wgetrc \
or .netrc..." ;;
    3) MSG_ERR="File I/O error." ;;
    4) MSG_ERR="Network failure." ;;
    5) MSG_ERR="SSL verification failure." ;;
    6) MSG_ERR="Username/password authentication \
failure.";;
    7) MSG_ERR="Protocol errors." ;;
    8) MSG_ERR="Server issued an error response." ;;
    *) MSG_ERR="Unknown." ;;
  esac

  echo "(**) RESULTADO DEL COMANDO: $ERRORNO -- \
$MSG_ERR" >>$NOMBRE.log

}

while read LINEA;
do

  NOMBRE=$( echo $LINEA | awk '{print $1}' )
  URL=$( echo $LINEA | awk '{print $2}' )
  echo -n "Descargando $NOMBRE desde $URL..."
  wget $WGET_OPTS -o $NOMBRE.log -O $NOMBRE "$URL"
  N_ERROR=$?
  graba_msg_error $N_ERROR
  gzip -v9 $NOMBRE.log >>$NOMBRE.log 2>&1
  if [ $N_ERROR == "0" ]; then
    echo "OK"
  else
    echo "ERROR!"
    echo "=> N_ERROR = $N_ERROR, ver el log para \
mas informacion."
  fi

done <$1
-----------------[ descarga.sh ]-----------------

El modo de empleo es:

./descarga.sh <fichero_urls.txt>

El parámetro <fichero_urls.txt> es un fichero con líneas, donde en cada línea pones el nombre del fichero y la URL que quieres descargar. Por cada descarga se genera un fichero .log con la salida del comando wget (además de grabarse el fichero de la descarga si esta ha sido correcta). El flag "-c" que se pasa a wget sirve para continuar las descargas que estuvieran a medias. Como característica adicional, se ha programado una función (graba_msg_error) para el control de errores de wget.

martes, 11 de octubre de 2011

Tutorial: Tomcat7 + Struts2 + VIM "à la" sysadmin

  1. Nos bajamos las últimas versiones de Tomcat y de Struts. Para este tutorial suponemos que Tomcat está instalado y arrancado, de forma que podemos desplegar las aplicaciones en la URL /manager (esa parte de la complejidad es para nosotros transparente ya que la gestiona Tomcat).
  2. Creamos la estructura de directorios siguiente (los ficheros los iremos creando más adelante):
  3. +-webapp_template/
      | make.sh
      +-versions/
      +-src/
        | index.jsp
        +-jsps/
        | | HelloWorld.jsp
        +-WEB-INF/
          | web.xml
          | struts.xml
          +-lib/
          | | [librerías.jar, ver más adelante]
          +-classes/
            | [ficheros .java dentro de su paquete]
  4. Grabamos las últimas versiones de las siguientes librerías (todas son o de Struts o de se pueden encontrar en la web de Apache) en el directorio lib, que es donde va a buscar los .jar el servidor Tomcat. Las librerías son:
    • struts2-core
    • xwork-core
    • ognl
    • freemarker
    • commons-fileupload
    • commons-io
    • commons-lang
    • commons-logging
    • javassist
  5. El script en bash make.sh tiene el siguiente contenido (este realmente es el paso más "sysadmin"):
  6. ----------- make.sh ------------------------------------
    #!/bin/bash
    TIMESTAMP=$( date "+%Y%m%d%H%M%S" )
    RUTA_DIR_ACTUAL=$( dirname `pwd` )
    NOMB_DIR_ACTUAL=$( basename `pwd` )
    HOME_APP="`pwd`"
    ROOT_LIB="$HOME_APP/src/WEB-INF/lib"
    LIBRERIAS="."
    for i in $( ls -1 $ROOT_LIB ); do
      LIBRERIAS=$LIBRERIAS:$ROOT_LIB/$i
    done
    #echo LIBRERIAS=$LIBRERIAS
    rm -rf compiled
    cp -a src compiled
    cd compiled
    find . -name "*.java" -exec javac -verbose -classpath $LIBRERIAS {} \;
    find . -name "*~" -exec rm -v {} \;
    find . -name "#*#" -exec rm -v {} \;
    find . -name "*.java" -exec rm -v {} \;
    cp WEB-INF/struts.xml WEB-INF/classes
    zip -r ../${NOMB_DIR_ACTUAL}.war *
    cd ..
    cp ${NOMB_DIR_ACTUAL}.war versions/${NOMB_DIR_ACTUAL}_${TIMESTAMP}.war
    ---------------------------------------------------------
  7. Creamos nuestra vista (jsps/HelloWorld.jsp) y nuestro controlador (WEB-INF/classes/template/HelloWord.java) con el siguiente código:
  8. ----------- HelloWorld.jsp ------------------------------
    <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1" %>
    <p><s:property value="greetings" /></p>
    ---------------------------------------------------------
    ----------- HelloWorld.java -----------------------------
    package template;

    import com.opensymphony.xwork2.ActionSupport;

    public class HelloWorld extends ActionSupport {

      String greetings = null;

      public String execute() throws Exception {
        setGreetings("Hello World");
        return SUCCESS;
      }

      public String getGreetings() {
        return greetings;
      }

      public void setGreetings(String greetings) {
        this.greetings = greetings;
      }

    }
    ---------------------------------------------------------
  9. Lo siguiente es crear los ficheros de configuración de Tomcat (WEB-INF/web.xml) y de Struts (WEB-INF/struts.xml):
  10. ----------- web.xml -------------------------------------
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

      <display-name>hello</display-name>

      <filter>
        <filter-name>struts2</filter-name>
        <filter-class> org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter </filter-class>
      </filter>

      <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
      </filter-mapping>

      <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
      </welcome-file-list>

    </web-app>
    ---------------------------------------------------------
    ----------- struts.xml ----------------------------------
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE struts PUBLIC
      "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
      "http://struts.apache.org/dtds/struts-2.0.dtd">
    <struts>

      <package name="hello" extends="struts-default">
        <action name="HelloWorld" class="template.HelloWorld">
          <result>/jsps/HelloWorld.jsp</result>
        </action>
      </package>

    </struts>
    ---------------------------------------------------------
  11. Creamos el fichero index.jsp que luego llamará al Action:
  12. ----------- index.jsp -----------------------------------
    <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
    <!DOCTYPE& html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <%@ taglib prefix="s" uri="/struts-tags" %>
    <html>
      <head>
        <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
        <title>Hello Sample</title>
      </head>
      <body>
        <s:action name="HelloWorld" executeResult="true"></s:action>
      </body>
    </html>
    ---------------------------------------------------------
  13. ./make.sh, desplegar (en el interfaz web del Tomcat) y probar la aplicación (en http://localhost:8080/webapp_template/). Cruzar los dedos para que funcione.

La mayor parte de este tutorial está transcrito de una página web donde lo encontré. Realmente mi aportación es el script make.sh y perfilar la estructura de directorios.

Cualquier comentario será bienvenido.

domingo, 13 de febrero de 2011

Debian 6.0 Squeeze

La semana pasada (6/2/2011) se publicó una nueva versión del Sistema Operativo Debian/Linux. Es un sabor de Linux orientado a usuarios que se desenvuelven mejor con Linux (power users, no sé cómo traducirlo realmente). Como siempre, hacer el "dist-upgrade" desde Debian Lenny es fácil. Sólo hay que hacer lo siguiente:

  1. Cambiar tu /etc/apt/sources.list y cambiar donde ponga "lenny" por "squeeze". Adicionalmente yo tuve que comentar las fuentes "volatile" porque no me funcionaban. No sé de hecho si las han abierto con esta nueva versión ya.
  2. # apt-get update
  3. # apt-get install apt dpkg
  4. # apt-get dist-upgrade
Este último paso es el que más tarda. Después de él hay que reiniciar el equipo/servidor, y cruzar los dedos. Después de reiniciar a lo mejor se "fastidia algo". En uno de mis equipos se desconfiguraron las Xs, pero fue fácil de arreglar. En el otro, como tenía un tema personalizado para el GDM, tuve que reinstalar completamente el Gnome. Pero después funcionó correctamente.

Como siempre, si se trata del entorno de trabajo y no de tu ordenador personal, es aconsejable actualizar primero tu entorno de pruebas para prever posibles problemas y que la ventana de actualización en explotación se reduzca.

En cuanto a las diferencias entre versiones, no me las he leído, pero mi impresión es que sigue funcionando igual de bien, pero con versiones de paquete más actualizadas.

Lo dicho, actualiza tu Debian, que si no te vas a quedar atrás ;-) Aunque con la frecuencia de actualización que tienen, seguro que te quedan por lo menos un par de años para actualizar.

Disfrutad lo que queda de domingo.