web-dev-qa-db-fra.com

Échecing Logstash (avec Redis / Elasticsearch)

Sur un groupe de serveurs de plus de 12 centos 5.8, j'ai déployé la bourse en utilisant l'expéditeur Native Logstash, qui envoie /var/log/*/*.log Retour à un serveur de Logstash central.

Nous avons essayé d'utiliser RSYSLOGD comme expéditeur, mais en raison d'un bogue dans le module Imfile de RSYSLOGD, si l'extrémité distante n'a pas répondu, les journaux s'accumuleraient en mémoire.

Nous utilisons actuellement REDIS comme mécanisme de transport, de sorte que LOGSTASH01 a ReDIS exécutant localement, liée à l'adresse IP pour le VLAN pour ces journaux.

Donc, Logstash-Shipper envoie à Redis sur Logstash01. LOGSASH01 envoie à Elasticsearch fonctionnant dans un processus séparé.

Voici ce que nous voyons. Elasticsearch a 141 fils bloqués. Strasting the Elasticsearch Parent montre:

futex(0x7f4ccd1939d0, FUTEX_WAIT, 26374, NULL

Voici le Jstack de Elasticsearch

Voici le Jstack de Logstash

Alors .. la nuit dernière, certains des serveurs Web (dont les journaux sont quotidiens par LOGSTASH) ont été noués, avec des moyennes de charge supérieures à 500.

Sur Logstash01, il y a ce

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

SO OOM-KILLER a tué Redis-Server, qui signifiait alors des journaux empilés en mémoire sur les serveurs qui expédiaient des trucs .. Quel d'une manière ou d'une autre signifie que Apache obtient ses culottes dans une torsion. (Franchement, je ne suis pas sûr de savoir comment, je suppose juste que c'est la queue du journal) ..

C'est ma théorie de la déroulement des événements:

  1. Nous avons eu une pointe de la circulation.
  2. Une immense quantité de grumes a été générée.
  3. Celles-ci empilées à Redis, comme Logstash/ElasticseSearch semblent seulement être capables de gérer 300-400 nouveaux événements/seconde.
  4. Redis s'était entièrement rempli au point où Oom-Killer l'a massacré de manière insensée.
  5. Redis arrête d'accepter de nouveaux articles.
  6. Les articles commencent maintenant à empiler sur le côté des hôtes distants.
  7. Tout va Noix. Apache arrête d'accepter les demandes. (Pourquoi?).

Les questions sont celles-ci:

  1. Pourquoi Apache va-t-il écrou s'il y a juste quelque chose à la queue de son journal. Est-ce que la chose à suivre bloque Apache de l'écriture?

  2. Y a-t-il un moyen sain de rendre élasticsearch plus rapide/meilleur/résilient?

  3. Y a-t-il un moyen sain de rendre Redis résilient et de ne pas mourir à cause d'être oomé

  4. Y a-t-il une faille fondamentale dans la façon dont je l'ai tout donné, ou tout le monde a-t-il ce problème?

-- ÉDITER --

Certaines spécifications pour @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
16
Tom O'Connor

Votre message ne décrit pas beaucoup dans la manière des spécifications (mémoire sur l'indexeur LS, volume de journal ou beaucoup d'autre), mais je vais essayer de répondre au mieux à vos questions, je peux d'abord. Disclaimer: Je suis l'un des Devs Logstash -

  1. Apache Going Nuts était probablement un effet secondaire du processus de connexion à la bourse. Je mettais cela de côté pour l'instant.

  2. Le moyen sain de faire es f/b/s est d'ajouter plus de nœuds es. C'est sérieusement aussi facile. Ils autochitent même en fonction de la topologie du réseau. Après 17 ans dans cette industrie, je n'ai jamais rien vu d'échelle horizontalement aussi facile que l'élasticsearch.

  3. À F/B/S Redis, n'utilisez aucun replustation de Redis. Les versions plus récentes de Logstash peuvent faire de la baladerie de Redis en interne. La sortie ReDIS prend en charge une liste des hôtes ReDIS dans la configuration du plug-in et la prise en charge est sur le point d'être ajoutée au côté entrée également pour correspondre à cela. Dans l'intervalle, vous pouvez utiliser plusieurs définitions d'entrée REDIS sur le côté indexer/consommateur.

  4. Je ne peux pas répondre à cela au-delà de dire que cela semble être comme si vous essayez de faire beaucoup avec un seul (hôte éventuellement sous-alimenté).

Tout bon processus de mise à l'échelle commence par casser des composants collocatés dans des systèmes distincts. Je ne vois pas votre configuration GIST'D nulle part, mais les endroits où les "goulots d'étranglement" de Logstash sont en filtres. Selon le nombre de transformations que vous faites, cela peut avoir un impact sur l'utilisation de la mémoire des processus de bourse d'entreprise.

Logstash travaille beaucoup comme legos. Vous pouvez utiliser une brique 2x4 ou vous pouvez utiliser deux briques 2x2 pour accomplir la même tâche. Sauf dans le cas de LOGSTH, il est en fait Sturdier d'utiliser des briques plus petites qu'une seule grosse brique.

Quelques conseils généraux que nous donnons normalement:

  • journaux de navire le plus rapidement possible du bord si vous pouvez utiliser le transport de réseau pur au lieu d'écrire sur le disque, c'est bien mais non requis. Logstash est basé sur JVM et qui a de bonnes et de mauvaises implications. Utiliser un autre expéditeur. J'ai écrit un python one basé (- https://github.com/lusis/logstash-straupper ) mais je suggère que les gens utilisent le castor à la place ( https://github.com/josegonzalez/beaver ).

  • générez vos journaux dans un format nécessitant le plus petit filtrage possible (JSON ou optimalement JSON-Event), ce n'est pas toujours possible. J'ai écrit un appendend Log4J pour faire cela ( https://github.com/lusis/zmq-appender ) et a finalement éclaté la mise en page de modèle dans son propre repo ( HTTPS: // github.com/lusis/log4j-jsonevent-layout ). Cela signifie que je n'ai pas besoin de filtrer dans LOGSTH pour ces journaux. Je viens de définir le type d'entrée sur "JSON-Event"

Pour Apache, vous pouvez essayer cette approche: http://cookbook.logstash.net/recipes/apache-json-logs/

  • briser les choses en plusieurs composants dans chaque discours que j'ai fait à propos de Logstash, je le décris comme un tuyau Unix sur les stéroïdes. Vous pouvez faire le pipeline aussi longtemps que vous le souhaitez. Vous échelez la bourse en déplaçant des responsabilités horizontalement. Cela pourrait signifier faire du pipeline plus longtemps, mais nous ne parlons rien de manière statistique pertinente en termes de frais généraux de latence. Si vous avez un meilleur contrôle sur votre réseau (c'est-à-dire pas sur EC2), vous pouvez faire des choses étonnantes avec l'isolation de trafic standard.

Notez également que la liste de diffusion de Logstash est très active afin que vous devriez toujours commencer ici. Désaninez et gisez vos configurations comme c'est le meilleur endroit pour commencer.

Il existe des entreprises (comme Sonien) à l'échelle des niveaux d'élasticse à des niveaux et des sociétés de Pétabyte (comme MailChimp et Dreamhost). Ça peut être fait.

22
lusis