16 votos

Escala Logstash (con redis/elasticsearch)

Más de un grupo de más de 12 centos 5.8 servidores, he desplegado logstash el uso de los nativos logstash remitente, que envía /var/log/*/*.log de vuelta a una central de logstash servidor.

Tratamos de usar rsyslogd como el remitente, pero debido a un error en rsyslogd del ImFile módulo, si el extremo remoto no responde, los registros se acumularían en la memoria.

Actualmente estamos utilizando Redis como mecanismo de transporte, por lo que logstash01 ha redis que se ejecutan localmente, unida a la IP de la VLAN para estos registros.

Así logstash-remitente envía a redis en logstash01. logstash01 envía a Elasticsearch ejecuta en un proceso independiente.

He aquí lo que estamos viendo. Elasticsearch 141 bloqueado hilos. Stracing la elasticsearch de los padres muestra:

futex(0x7f4ccd1939d0, FUTEX_WAIT, 26374, NULL

Aquí está el jstack de elasticsearch

Aquí está el jstack de logstash

Así que.. anoche, algunos de los servidores web (cuyos registros son de cola por logstash) se volvió loco, con una carga promedio de más de 500.

En logstash01, hay esta

Dec 19 00:44:45 logstash01 kernel: [736965.925863] Killed process 23429 (redis-server) total-vm:5493112kB, anon-rss:4248840kB, file-rss:108kB

Así OOM-asesino mató a la redis-servidor, lo que significó troncos amontonados en la memoria de los servidores que fueron envío de material.. Que de alguna manera significa que apache se pone su ropa interior, en un giro. (Francamente, no estoy seguro de cómo, acabo de asumir que se trata de colas de la sesión)..

Esta es mi teoría de cómo se desarrollaban los acontecimientos:

  1. Tuvimos un pico de tráfico.
  2. Una inmensa cantidad de registros se han generado.
  3. Estos se amontonan en Redis, como logstash/elasticsearch sólo parece ser capaz de manejar 300-400 nuevos eventos / segundo.
  4. Redis de haber llenado completamente hasta el punto donde el OOM killer sacrificaron cruelmente.
  5. Redis deja de aceptar nuevos elementos.
  6. Ahora empiezan a amontonarse en los hosts remotos lado.
  7. Todo va nueces. Apache deja de aceptar solicitudes. (Por qué?).

Las preguntas son estas:

  1. ¿Por qué apache volver loco si es que hay algo en seguir a la cola de su registro. Es que la cosa colas bloquea apache a partir de la escritura?

  2. Es allí una manera coherente para hacer elasticsearch más rápido/mejor/resistente?

  3. Es allí una manera coherente para hacer redis resistente y no morir, porque de ser OOM d

  4. Hay un error fundamental en la manera en la que he organizado todo, o ¿todo el mundo tiene este problema?

-- EDIT --

Algunas de las especificaciones para @lusis.

admin@log01:/etc/init$ free -m
             total       used       free     shared    buffers     cached
Mem:          7986       6041       1944          0        743       1157
-/+ buffers/cache:       4140       3845
Swap:         3813       3628        185

Filesystem             Size  Used Avail Use% Mounted on
/dev/sda2               19G  5.3G   13G  31% /
udev                   3.9G  4.0K  3.9G   1% /dev
tmpfs                  1.6G  240K  1.6G   1% /run
none                   5.0M     0  5.0M   0% /run/lock
none                   3.9G     0  3.9G   0% /run/shm
/dev/sda1               90M   72M   14M  85% /boot
/dev/mapper/data-disk  471G  1.2G  469G   1% /data

/dev/sda2 on / type ext3 (rw,errors=remount-ro)
proc on /proc type proc (rw,noexec,nosuid,nodev)
sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)
none on /sys/fs/fuse/connections type fusectl (rw)
none on /sys/kernel/debug type debugfs (rw)
none on /sys/kernel/security type securityfs (rw)
udev on /dev type devtmpfs (rw,mode=0755)
devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=0620)
tmpfs on /run type tmpfs (rw,noexec,nosuid,size=10%,mode=0755)
none on /run/lock type tmpfs (rw,noexec,nosuid,nodev,size=5242880)
none on /run/shm type tmpfs (rw,nosuid,nodev)
/dev/sda1 on /boot type ext2 (rw)
/dev/mapper/data-disk on /data type ext3 (rw)
/data/elasticsearch on /var/lib/elasticsearch type none (rw,bind)

log01:/etc/init$ top 
top - 14:12:20 up 18 days, 21:59,  2 users,  load average: 0.20, 0.35, 0.40
Tasks: 103 total,   1 running, 102 sleeping,   0 stopped,   0 zombie
Cpu0  :  3.0%us,  1.0%sy,  0.0%ni, 95.7%id,  0.0%wa,  0.0%hi,  0.3%si,  0.0%st
Cpu1  : 12.0%us,  1.0%sy,  0.0%ni, 86.6%id,  0.0%wa,  0.0%hi,  0.3%si,  0.0%st
Cpu2  :  4.7%us,  0.3%sy,  0.0%ni, 94.9%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu3  :  5.6%us,  1.3%sy,  0.0%ni, 93.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu4  :  5.3%us,  1.3%sy,  0.0%ni, 93.3%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu5  :  6.4%us,  1.0%sy,  0.0%ni, 92.3%id,  0.0%wa,  0.0%hi,  0.3%si,  0.0%st
Mem:   8178120k total,  6159036k used,  2019084k free,   761780k buffers

22voto

beach Puntos 4116

Tu post no describe mucho en el camino de las especificaciones (de memoria en la LS indizador, el volumen de registro o mucho más), pero voy a tratar de responder a sus preguntas mejor que puedo en primer lugar. Descargo de responsabilidad: yo soy uno de los logstash devs -

  1. Apache tuercas de que era probable un efecto secundario de la logstash proceso actuando. Me había puesto a un lado por ahora.

  2. La misma manera de hacer ES f/b/s es agregar más nodos ES. Es en serio que fácil. Incluso la detección automática de uno a otro dependiendo de la topología de la red. Después de 17 años en esta industria nunca he visto nada de la escala horizontal es tan fácil como ElasticSearch.

  3. A f/b/s Redis, no usar ningún tipo de redis de la agrupación. Las versiones más recientes de Logstash puede hacer Redis equilibrio de carga internamente. La Redis de salida soporta una lista de Redis aloja en el plugin de configuración y soporte técnico está a punto de ser añadido a la entrada de lado para que coincida con. En el ínterin se pueden utilizar varios Redis de entrada de las definiciones en el indexador/lado de los consumidores.

  4. Yo no puedo responder a esta más allá de decir que suena como que usted está tratando de hacer mucho con una sola (posiblemente de poca potencia de host).

Cualquier buen proceso de escalado se inicia con la ruptura de colocación de componentes en sistemas distintos. No veo tus configs gist había en cualquier lugar, pero los lugares donde logstash "cuellos de botella" en los filtros. Dependiendo de cómo muchas de las transformaciones que estás haciendo puede tener un impacto en el uso de la memoria de Logstash procesos.

Logstash funciona en gran medida como legos. También se puede usar un 2x4 ladrillo o puede utilizar dos 2x2 ladrillos para realizar la misma tarea. Excepto en el caso de logstash, es en realidad más robusto para el uso de pequeños ladrillos de una sola grande de ladrillo.

Algunos consejos generales que normalmente nos dan es:

  • registros de las naves tan pronto como sea posible desde el borde Si usted puede utilizar puro de la red de transporte, en lugar de escribir en el disco, eso es bueno, pero no es necesario. Logstash es la JVM y que tiene buenas y malas consecuencias. Usar otro cargador. Escribí un python ( https://github.com/lusis/logstash-shipper pero yo sugeriría que la gente utiliza Beaver ( https://github.com/josegonzalez/beaver ).

  • generar los registros en un formato que requiere tan poco filtrado como sea posible (json o de forma óptima json-formato del evento) Esto no siempre es posible. Escribí un log4j appender hacer esto ( los https://github.com/lusis/zmq-appender ) y, finalmente, se rompió el patrón de diseño en su propio repo ( https://github.com/lusis/log4j-jsonevent-layout ). Esto significa que no tengo que hacer NINGÚN tipo de filtro en logstash para los registros. Acabo de configurar el tipo de entrada para "json-evento"

Para apache, puedes probar este enfoque: http://cookbook.logstash.net/recipes/apache-json-logs/

  • romper cosas en varios componentes En todas las charlas que he hecho acerca de logstash, lo describen como un unix para el tubo de esteroides. Usted puede hacer la canalización de tan largo o tan corto como quieras. La escala logstash por el desplazamiento de alrededor de responsabilidades horizontalmente. Esto podría significar que el oleoducto más largo, pero no estamos hablando de cualquier cosa estadísticamente relevantes en términos de sobrecarga de latencia. Si usted tiene un mayor control sobre su red (es decir, NO en EC2) puede hacer cosas asombrosas con estándar de tráfico de aislamiento.

También tenga en cuenta que el logstash lista de correo es MUY activo, por lo que siempre se debe empezar por ahí. Desinfectar y gist su configs, ya que es el mejor lugar para empezar.

Hay empresas (como Sonian) escala ElasticSearch para petabyte de los niveles y las empresas (como Mailchimp y Dreamhost) escala Logstash al loco niveles. Que se puede hacer.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: