Elasticsearch está utilizando demasiado espacio en disco

12

Tengo un servidor CentOS 6.5 en el que instalé Elasticsearch 1.3.2 .

Mi elasticsearch.ymlarchivo de configuración es una modificación mínima del envío con Elasticsearch como predeterminado. Una vez despojado de todas las líneas comentadas, se ve así:

cluster.name: xxx-kibana

node:
    name: "xxx"
    master: true
    data: true

index.number_of_shards: 5

index.number_of_replicas: 1

path:
    logs: /log/elasticsearch/log
    data: /log/elasticsearch/data


transport.tcp.port: 9300

http.port: 9200

discovery.zen.ping.multicast.enabled: false

Elasticsearch debería tener la compresión activada de forma predeterminada , y leí varios puntos de referencia que ponen la relación de compresión desde un 50% hasta un 95%. Desafortunadamente, la relación de compresión en mi caso es -400%, o en otras palabras: los datos almacenados con ES ocupan 4 veces más espacio en disco que el archivo de texto con el mismo contenido . Ver:

12K     logstash-2014.10.07/2/translog
16K     logstash-2014.10.07/2/_state
116M    logstash-2014.10.07/2/index
116M    logstash-2014.10.07/2
12K     logstash-2014.10.07/4/translog
16K     logstash-2014.10.07/4/_state
127M    logstash-2014.10.07/4/index
127M    logstash-2014.10.07/4
12K     logstash-2014.10.07/0/translog
16K     logstash-2014.10.07/0/_state
109M    logstash-2014.10.07/0/index
109M    logstash-2014.10.07/0
16K     logstash-2014.10.07/_state
12K     logstash-2014.10.07/1/translog
16K     logstash-2014.10.07/1/_state
153M    logstash-2014.10.07/1/index
153M    logstash-2014.10.07/1
12K     logstash-2014.10.07/3/translog
16K     logstash-2014.10.07/3/_state
119M    logstash-2014.10.07/3/index
119M    logstash-2014.10.07/3
622M    logstash-2014.10.07/  # <-- This is the total!

versus:

6,3M    /var/log/td-agent/legacy_api.20141007_0.log
8,0M    /var/log/td-agent/legacy_api.20141007_10.log
7,6M    /var/log/td-agent/legacy_api.20141007_11.log
6,7M    /var/log/td-agent/legacy_api.20141007_12.log
8,0M    /var/log/td-agent/legacy_api.20141007_13.log
7,6M    /var/log/td-agent/legacy_api.20141007_14.log
7,6M    /var/log/td-agent/legacy_api.20141007_15.log
7,7M    /var/log/td-agent/legacy_api.20141007_16.log
5,6M    /var/log/td-agent/legacy_api.20141007_17.log
7,9M    /var/log/td-agent/legacy_api.20141007_18.log
6,3M    /var/log/td-agent/legacy_api.20141007_19.log
7,8M    /var/log/td-agent/legacy_api.20141007_1.log
7,1M    /var/log/td-agent/legacy_api.20141007_20.log
8,0M    /var/log/td-agent/legacy_api.20141007_21.log
7,2M    /var/log/td-agent/legacy_api.20141007_22.log
3,8M    /var/log/td-agent/legacy_api.20141007_23.log
7,5M    /var/log/td-agent/legacy_api.20141007_2.log
7,3M    /var/log/td-agent/legacy_api.20141007_3.log
8,0M    /var/log/td-agent/legacy_api.20141007_4.log
7,5M    /var/log/td-agent/legacy_api.20141007_5.log
7,5M    /var/log/td-agent/legacy_api.20141007_6.log
7,8M    /var/log/td-agent/legacy_api.20141007_7.log
7,8M    /var/log/td-agent/legacy_api.20141007_8.log
7,2M    /var/log/td-agent/legacy_api.20141007_9.log
173M    total

¿Qué estoy haciendo mal? ¿Por qué no se comprimen los datos?

He agregado provisionalmente index.store.compress.stored: 1a mi archivo de configuración, ya que descubrí que en las elasticsearch 0.19.5notas de la versión (fue cuando la storecompresión salió primero), pero todavía no puedo decir si está marcando la diferencia, y de todos modos la compresión debería estar activada por por defecto, hoy en día ...

Mac
fuente
¿Alguna vez consideró los gastos generales necesarios para almacenar e indexar esos datos? De aquí viene la diferencia.
mailq
@mailq - AFAIK, Elastic comprime tanto datos como índices, y aún debería notar una disminución en el uso de espacio en su disco, en comparación con los registros de texto. Supongo que el kilometraje puede variar de acuerdo con la estructura del registro, pero los registros suelen ser de naturaleza muy repetitiva, por lo que la indexación no debería ser la más ocupada de las operaciones. ... o me estoy equivocando?
mac
Los registros no son realmente repetitivos. El usuario A inicia sesión en el momento 1. El usuario B inicia sesión en el momento 2. ¿Qué es repetitivo? Ambas tuplas tienen que indexarse ​​y almacenarse por separado. Además de la entrada de registro en sí.
mailq
@mailq - Supercool maliq, muchas gracias. Si amplía su comentario y escribe una respuesta adecuada, me complacería marcarlo como aceptado (de lo contrario, lo haré más adelante, ¡pero no quiero robarle el trueno!).
mac

Respuestas:

17

Elasticsearch no reduce sus datos automáticamente. Esto es cierto para cualquier base de datos. Además de almacenar los datos sin procesar, cada base de datos tiene que almacenar metadatos junto con ellos. Las bases de datos normales solo almacenan un índice (para una búsqueda más rápida) para las columnas que db-admin eligió por adelantado. ElasticSearch es diferente, ya que indexa cada columna de forma predeterminada. De este modo, el índice es extremadamente grande, pero, por otro lado, proporciona un rendimiento perfecto al recuperar datos.

En configuraciones normales, verá un aumento de 4 a 6 veces de los datos sin procesar después de la indexación. Aunque depende en gran medida de los datos reales. Pero este es en realidad un comportamiento intencionado.

Por lo tanto, para disminuir el tamaño de la base de datos, debe ir al revés como lo hizo en los RDBM: excluya las columnas de la indexación o el almacenamiento que no necesita indexar.

Además, puede activar la compresión, pero esto solo mejorará cuando sus "documentos" sean grandes, lo que probablemente no sea cierto para las entradas del archivo de registro.

Aquí hay algunas comparaciones y consejos útiles: https://github.com/jordansissel/experiments/tree/master/elasticsearch/disk

Pero recuerde: la búsqueda tiene un costo. El costo a pagar es el espacio en disco. Pero ganas flexibilidad. Si su tamaño de almacenamiento excede, ¡entonces crezca horizontalmente! Aquí es donde gana ElasticSearch.

mailq
fuente