En Filebeat 8.10.0 y 7.17.12, introdujimos un nuevo modo de huellas dactilares que brinda a nuestros usuarios la opción de usar hash del contenido de los archivos para identificarlos en lugar de depender de los metadatos del sistema de archivos. Este cambio está disponible en las entradas de Filestream.
¿Qué es Filestream?
Filestream es un tipo de entrada en Filebeat que se utiliza para ingerir archivos de las rutas indicadas.
Arquitectura de flujo de archivos
Para explicar qué es el modo de huella digital y dónde exactamente lo introdujimos en Filestream, comencemos explicando la arquitectura básica de una entrada de Filestream.
Pelar la cebolla de los componentes superiores:
Cuando el enfoque predeterminado no es suficiente
De forma predeterminada, File Scanner utiliza metadatos del sistema de archivos para comparar archivos cuando busca cambios de nombre/movimientos, como: cadena - en sistemas Unix (puede encontrar más información sobre inode aquí ) y - -cadena en Windows ( nFileIndexHigh , nFileIndexLow y dwVolumeSerialNumber respectivamente; lea más en la documentación oficial de Microsoft). La misma cadena se utiliza como identificador de archivo único devuelto por File Identity Provider , y este valor se utiliza como clave para cada archivo en el Registro para buscar el estado actual del archivo.
El objetivo del identificador de archivo único devuelto por el proveedor de identidad de archivo es que debe ser estable, lo que significa que no cambiará durante el tiempo que Filestream ingiere el archivo. Debe ser estable porque Filestream usa este identificador para rastrear los metadatos del archivo, incluido el desplazamiento actual del archivo, para saber dónde continuar la ingesta.
¿Qué pasa si el identificador no es estable? Conduce a la pérdida o duplicación de datos.
Ejemplo de pérdida de datos :
Ejemplo de duplicación de datos :
Desafortunadamente, no todos los sistemas de archivos pueden producir valores de inodo y de dispositivo estables.
Los sistemas de archivos almacenan en caché los inodos y los reutilizan
Si intenta ejecutar este script en diferentes sistemas de archivos, es posible que vea resultados diferentes:
#!/bin/bashnnFILENAME=inode-testnntouch $FILENAMEnINODE=$(ls -i "$FILENAME")necho "$FILENAME created with inode '$INODE'"nnCOPY_FILENAME="$FILENAME-copy"ncp -a $FILENAME $COPY_FILENAMEnCOPY_INODE=$(ls -i "$COPY_FILENAME")necho "Copied $FILENAME->$COPY_FILENAME, the new inode for the copy '$COPY_INODE'"nnrm $FILENAMEnecho "$FILENAME has been deleted"nnls $FILENAMEnncp -a $COPY_FILENAME $FILENAMEnNEW_INODE=$(ls -i "$FILENAME")nnecho "After copying $COPY_FILENAME back to $FILENAME the inode is '$NEW_INODE'"nnrm $FILENAME $COPY_FILENAME
Por ejemplo, en Mac (APFS) verás:
inode-test created with inode '112076744 inode-test'nCopied inode-test->inode-test-copy, the new inode for the copy '112076745 inode-test-copy'ninode-test has been deletednAfter copying inode-test-copy back to inode-test the inode is '112076746 inode-test'
Como puede ver, en APFS los tres archivos tienen diferentes valores de inodo: 112076744 , 112076745 y 112076746 . Entonces, esto funciona como se esperaba.
Sin embargo, si ejecuta el mismo script en un contenedor Docker de Ubuntu:
inode-test created with inode '1715023 inode-test'nCopied inode-test->inode-test-copy, the new inode for the copy '1715026 inode-test-copy'ninode-test has been deletednls: cannot access 'inode-test': No such file or directorynAfter copying inode-test-copy back to inode-test the inode is '1715023 inode-test'
Puede ver que el sistema de archivos almacenó en caché el valor de inodo del primer archivo, que eliminamos, y lo reutilizó para la segunda copia con el mismo nombre de archivo: 1715023 , 1715026 y 1715023 .
Ni siquiera tiene que ser el mismo nombre de archivo; un archivo diferente puede reutilizar el mismo inodo :
# touch xn# ls -i xn1715023 x # <-n# rm xn# touch yn# ls -i yn1715023 y # <-
Hemos observado estos problemas principalmente en entornos de contenedores/virtualizados, pero depende de la implementación del sistema de archivos almacenar en caché y reutilizar los inodos o no. En teoría, puede suceder en cualquier lugar.
Los valores de inodo pueden cambiar en sistemas de archivos que no son Ext.
Los sistemas de archivos ext (por ejemplo, ext4) almacenan el número de inodo en el archivo i_ino , dentro de la estructura inode , que se escribe en el disco. En este caso, si el archivo es el mismo (no otro archivo con el mismo nombre), se garantiza que el número de inodo será el mismo.
Si el sistema de archivos no es Ext, el número de inodo se genera mediante las operaciones de inodo definidas por el controlador del sistema de archivos. Como no tienen el concepto de qué es un inodo , tienen que imitar todos los campos internos del inodo para cumplir con VFS , por lo que este número probablemente será diferente después de reiniciar, en teoría, incluso después de cerrar y abrir el archivo nuevamente. .
Fuentes:
Algunas herramientas de procesamiento de archivos cambian los valores de inodo
La identificación del dispositivo puede cambiar
Además de los problemas con inode , dependiendo de cómo estén montadas las unidades de disco, es posible que el ID del dispositivo cambie después de reiniciar. Sin embargo, hace algún tiempo ya presentamos una solución para este problema: file_identity: inodemarker .
¿Qué es el modo de huella digital?
El nuevo modo de huellas dactilares se implementa en el componente Escáner de archivos para evitar los problemas mencionados anteriormente.
El nuevo modo de huellas digitales cambia el comportamiento predeterminado del Explorador de archivos de usar metadatos del sistema de archivos a usar hash SHA256 para un rango de bytes determinado del archivo. De forma predeterminada, este rango es de 0 a 1024, pero se puede configurar mediante parámetros de configuración de desplazamiento y longitud .
Qué tener en cuenta al utilizar el modo de huella digital + identidad del archivo de huella digital
Hay algunos puntos que se deben considerar antes de comenzar a utilizar esta nueva característica:
Actuación
Desde la etapa inicial de trabajo en esta característica, hubo preocupación con respecto al impacto en el rendimiento que causaría en File Scanner . Al final, necesitaríamos abrir un archivo, leer la cantidad de bytes establecidos por la opción de configuración prospector.scanner.fingerprint.length y calcular un SHA256 a partir de él. Y necesitaríamos hacer eso para cada archivo que coincida con los globos en las rutas .
Una pequeña nota al margen aquí: para implementar esta nueva característica, File Scanner tuvo que cambiar mucho. Entonces, cuando trabajé en el código, aproveché esta oportunidad para refactorizar algunas partes de File Scanner y hacer algunas optimizaciones mientras lo hacía, principalmente reduciendo la cantidad de llamadas al sistema . También agregué muchas pruebas para verificar el comportamiento esperado. Entonces, existía la sospecha de que el nuevo Explorador de archivos (modo de huella digital deshabilitado) es más rápido ya que ya no realiza tantas llamadas al sistema.
Después de que el modo de huellas dactilares finalmente se entregó a main , ejecuté algunas pruebas comparativas.
Conclusión
Este nuevo modo de huellas dactilares resuelve muchos problemas con metadatos inestables en sistemas de archivos y, en comparación con la versión anterior de Filebeat, es incluso más rápido que el modo predeterminado.
Además, el modo predeterminado se volvió mucho más rápido en la nueva versión de Filebeat, por lo que parece muy beneficioso refactorizar algún código antiguo de vez en cuando y ejecutar pruebas comparativas/perfiles para ver cómo cambió el rendimiento.
¿Qué más hay de nuevo en Elastic 8.10? Consulte la publicación del anuncio 8.10 para obtener más información .