Introducción a ELK Stack

    Los productos que creamos a menudo se basan en múltiples servidores web y / o múltiples servidores de bases de datos. En tales casos, a menudo no tenemos herramientas centralizadas para analizar y almacenar registros. En tales circunstancias, identificar diferentes tipos de eventos y correlacionarlos con otros tipos de eventos es una misión casi imposible.

    Una sola condición de excepción, en algún lugar en el medio del sistema, puede ser desastrosa tanto para el usuario final como para el equipo de desarrollo. Un usuario puede terminar viendo una página en blanco después de enviar el pago por su servicio, o puede ocurrir una gran pérdida de paquetes dentro de su red, lo que puede hacer que un simple trabajo de 10 minutos se convierta en un dolor de cabeza de 10 horas.

    Lo lógico sería saber exactamente qué pasó y cómo evitar que vuelva a suceder. Sin embargo, esto significa extraer registros de máquinas individuales, agregarlos para solucionar la desviación del reloj y unirlos a través de algún tipo de identificación de transacción antes de que pueda comenzar a hacer preguntas.

    Todo esto es bajo la condición de que los registros que debe verificar estén en la memoria de trabajo de la computadora o cuando cat + grep + xargs no es suficiente para el análisis.

    Hoy en día, la mayoría de las infraestructuras de TI se han trasladado a nubes públicas como Servicios web de Amazon, Microsoft Azure, Océano digitalo Google Cloud.

    Las herramientas de seguridad de la nube pública y las plataformas de registro se convirtieron en plugins necesarios de estos servicios. Aunque son herramientas independientes, se crearon para trabajar juntas.

    Pila de ELK se crea exactamente para tales situaciones.

    ¿Qué es ELK Stack?

    ELK significa:

    • ElasticSearch – Se utiliza para búsquedas profundas y análisis de datos. Es una base de datos NoSQL distribuida de código abierto, construida en Java y basada en Apache Lucene. Lucene se encarga de almacenar datos de disco, indexar y escanear documentos, mientras que ElasticSearch mantiene actualizaciones de documentos, API y distribución de documentos entre instancias de ElasticSearch en el mismo clúster.
    • Logstash – Se utiliza para el registro centralizado, el enriquecimiento de registros y el análisis. Es una herramienta ETL (Extract, Transfer, Load) que transforma y almacena registros dentro de ElasticSearch.
    • Kibana – Se utiliza para visualizaciones de datos potentes y hermosas. Es una herramienta basada en web a través de la cual las bases de datos de ElasticSearch visualizan y analizan datos almacenados previamente.

    Estas tres herramientas son necesarias para el análisis y visualización de eventos en el sistema.

    Análisis de registros

    El aislamiento del rendimiento es difícil de alcanzar, especialmente cuando los sistemas están muy cargados. Se debe registrar cada evento relevante dentro de su sistema. Es mejor exagerar con el registro que no tener información sobre un evento potencialmente problemático.

    Un buen “objetivo” para iniciar sesión en el nivel de la aplicación es todo lo relacionado con la interacción del usuario con el sistema, ya sea la autorización del usuario al sistema o una solicitud del usuario a alguna URL, un correo electrónico enviado al usuario, etc. registrar una variedad de información, este registro no está estructurado en absoluto, pero debe tener información básica para que pueda acceder a él más fácilmente.

    El mejor consejo con respecto al inicio de sesión en sistemas distribuidos es “sellar” cualquier evento relevante en la fuente, que se propague de alguna manera a través del sistema distribuido, ya sea que toque más partes del sistema o no. En el caso de una solicitud de una página web, por ejemplo, un equilibrador de carga o un servidor web se colocaría en dicho “sello”. Este evento sellado se transmite más hasta el final de su vida. Estos “sellos” a menudo se realizan como UUID.

    Esto garantiza que no se pierda la linealidad del evento y que pueda agrupar y vincular eventos; por ejemplo, puede vincular esa solicitud de página más adelante con la consulta a la base de datos necesaria para que aparezca la página.

    Logstash

    Cuando el evento se registra en el archivo de registro, Logstash entra en juego. Logstash garantiza que sus entradas se transformen en uno de los formatos de destino admitidos que luego se enviarán al servidor ElasticSearch.

    Recopila datos de diferentes fuentes y luego transmite los datos en forma de una canalización de procesamiento de datos a la instancia de ElasticSearch.

    Es seguro imaginar ElasticSearch como una base de datos y LogStash como el componente de transmisión que envía los registros o archivos.

    El procesamiento de Logstash se lleva a cabo en tres etapas:

    • Entrada – La entrada, además de un archivo, también puede ser un syslog, Rediso Leñador (ahora logstash-forwarder). Redis se utiliza a menudo como un intermediario pub / sub en una infraestructura Logstash centralizada, donde los productores de Logstash envían sus mensajes y una de las instancias los procesa más.
    • Transformación y filtrado – Esta etapa se lleva a cabo según el conjunto de reglas previamente definidas, donde además, por ejemplo, una transformación de formato de fecha, también se puede registrar la información de la dirección IP (ciudad / país de la IP). El libre MaxMind La base de datos se utiliza para este propósito.
    • Salida – La salida se puede transformar mediante plugins a casi cualquier formato, en nuestro caso será ElasticSearch.

    Echemos un vistazo a un archivo de configuración de Logstash y un ejemplo de un registro de aplicación:

    logstash.conf:

    input {
        file {
            path => ["/var/log/myapp/*.log"]
        }
    }
    
    filter {
        // Collect or process some data (e.g. 'time') as timestamp and
        // store them into @timestamp data.
        // That data will later be used by Kibana.
            
        date {
            match => [ "time" ]
        }
    
         // Adds geolocation data based on the IP address.
        geoip {
            source => "ip"
        }
    }
    
    output {
        elasticsearch {
           hosts => ["localhost:9200"]
        }
        stdout { codec => rubydebug }
    }
    

    Registro de aplicaciones::

    {
        "action": "action log",
        "user": "John",
        "time": 12:12:2012,
        "ip": "192.168....",
        "transaction-id": "r5e1244-32432-1465-q346-6ahsms57081x4"
    }
    

    ElasticSearch

    En el momento en que Logstash finaliza su trabajo y reenvía los registros, ElasticSearch ya puede procesar los datos.

    Con lo simple curl mando curl -XGET 'http://192.168.(host ip):9200/_search' puede ver “documentos” en la base de datos.

    192.168.(host ip) es, en este caso, la dirección de boot2docker VMy 9200 es el puerto expuesto predeterminado.

    Dado que el resultado está en formato JSON, sus resultados están listos para su procesamiento posterior. curl -XGET 'http: //192.168.(host ip):9200/_search?hello' devuelve una versión más legible del documento para una rápida inspección. Dependiendo del desarrollo, es una práctica común registrar la solicitud / respuesta de carga útil, el ID de correlación, etc., para poder rastrear el error a través del panel de IU de Kibana más adelante.

    Kibana

    Kibana es básicamente un cliente de IU estático (HTML + CSS + JS) que muestra los datos de la forma deseada en la instancia de ElasticSearch, donde ve diferentes informes y análisis. Excepto que a través de Kibana puedes hacer consultas fácilmente sobre índices de ElasticSearch, la principal ventaja es que para esas consultas, por complicadas que sean, puedes “ordenarlas” en un “tablero” muy transparente y ese “tablero” para guardar y compartir con los demás.

    Kibana viene con un conjunto muy poderoso de herramientas de visualización y, por ejemplo, puede ver con qué frecuencia se repite un evento similar a lo largo del tiempo, puede agregar eventos de acuerdo con varios criterios (por ejemplo, cuántas solicitudes provienen de una dirección IP en particular en la última hora, si ha aumentado el número de errores en un servidor en particular, o incluso si ha notado un aumento en el número de solicitudes para una página en particular). Además, esta es una gran herramienta para detectar anomalías causadas por cambios en su sistema.

    Probar ELK Stack

    Para poder probar la pila ELK y probar algunos de los comandos que estamos a punto de cubrir, deberá instalar ELK y Docker, o boot2docker, localmente.

    Estibador es una herramienta diseñada para facilitar la creación, implementación y ejecución de aplicaciones mediante el uso de contenedores.

    Los contenedores permiten al desarrollador empaquetar una aplicación con todas las partes que necesita, como bibliotecas y otras dependencias, y enviarlo todo como un solo paquete. Este artículo no cubrirá Docker y boot2docker en detalle; los recursos oficiales son más que excelentes y es muy fácil configurar esta combinación.

    Para el propósito de esta prueba, usaremos Imagen de ELK Docker:

    $ docker pull sebp/elk
    $ docker run -p 5601:5601 -p 9200:9200 -p 5000:5000 -it --name elk sebp/elk
    $ docker exec -it elk /bin/bash
    $ /logstash/bin/logstash -e 'input { stdin { } } output { elasticsearch { host => localhost } }'
    # Now write the message e.g.
    This is a test message.
    CTRL-C
    

    Desde la máquina host, usaremos curl:

    $ curl -s -XGET 'http://192.168.(host ip):9200/_search?hello&q=message'
    

    El resultado se verá así:

    {
        "took" : 3,
        "timed_out" : false,
        "_shards" : {
            "total" : 6,
            "successful" : 6,
            "failed" : 0
        },
        "hits" : {
            "total" : 1,
            "max_score" : 0.4790727,
            "hits" : [ {
            "_index" : "logstash-2018.08.26",
            "_type" : "logs",
            "_id" : "Z8kCtFYHOWWinjAN6pHUqE",
            "_score" : 0.5720636,
            "_source":{"message":"This is a test message.","@version":"1","@timestamp":"2018-08-26T09:41:17.634Z","host":"5136b631e113"}
            } ]
        }
    }
    

    Como puede ver, nuestra búsqueda dio como resultado 1 instancia de registro que se nos devolvió en formato JSON.

    ElasticSearch y pérdida de datos en particiones de red

    Al igual que con todas las demás herramientas, ELK Stack viene con su propio conjunto de problemas. Durante el año anterior y este año, se han escrito numerosos artículos sobre cómo ElasticSearch pierde datos debido a la partición de red, incluso si las condiciones de la partición de red duran solo unos segundos.

    aquí Puede encontrar más información sobre cómo se comporta ElasticSearch durante una partición de red transitiva sin tránsito, así como en la partición de node singular.

    Lo interesante es que incluso las microparticiones pueden causar un retraso de 90 segundos dentro del cual funciona el nuevo líder dentro del clúster y todo lo que se insertó durante ese clúster puede descartarse potencialmente, por lo que es una buena idea mantener sus registros en el original. formato y no depender al 100% de ElasticSearch, incluso para registros “de misión crítica”.

    Conclusión

    Con esto, solo rascamos la superficie y presentamos un conjunto muy pequeño de posibilidades del ELK Stack.

    Los problemas resueltos en este artículo son el análisis rápido y sencillo de logs y la visualización de eventos en el sistema, utilizando una interfaz monolítica que puede servir de base para una mayor instrumentación.

    ¡Feliz registro!

     

    Etiquetas:

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *