{"id":32723,"date":"2019-10-31T21:48:35","date_gmt":"2019-10-31T18:48:35","guid":{"rendered":"https:\/\/prohoster.info\/blog\/yurij-bushmelev-karta-grablej-na-pole-sbora-i-dostavki-logov-rasshifrovka-doklada\/"},"modified":"2019-10-31T21:48:35","modified_gmt":"2019-10-31T18:48:35","slug":"yurij-bushmelev-karta-grablej-na-pole-sbora-i-dostavki-logov-rasshifrovka-doklada","status":"publish","type":"post","link":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/yurij-bushmelev-karta-grablej-na-pole-sbora-i-dostavki-logov-rasshifrovka-doklada","title":{"rendered":"Juri Buschmelev \"Karte der Stolpersteine im Bereich Sammlung und Lieferung von Logs\" \u2014 Entschl\u00fcsselung des Vortrags","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Logs sind ein entscheidender Bestandteil des Systems, der erm\u00f6glicht zu verstehen, ob es wie erwartet funktioniert oder nicht. In einer Microservices-Architektur wird die Arbeit mit Logs zu einer eigenen Disziplin in einem speziellen Wettbewerb. Hier m\u00fcssen viele Fragen gleichzeitig gekl\u00e4rt werden:<\/p>\n<p><\/p>\n<ul>\n<li>Wie man Logs aus der Anwendung schreibt;<\/li>\n<li>Wohin man Logs schreibt;<\/li>\n<li>Wie man Logs zur Speicherung und Verarbeitung transportiert;<\/li>\n<li>Wie man Logs verarbeitet und speichert.<\/li>\n<\/ul>\n<p><\/p>\n<p>Der Einsatz der heutzutage beliebten Containerisierungstechnologien f\u00fcgt noch mehr Komplexit\u00e4t auf dem Weg zur L\u00f6sung hinzu.<\/p>\n<p><\/p>\n<p>Genau darum geht es in dem Bericht von Yuri Bushmelev \u201eDie Stolpersteine beim Sammeln und Liefern von Logs\u201c. <\/p>\n<p>\n<center><div class=\"youtube-placeholder\" data-id=\"NAeedJv-S3I\" onclick=\"loadVideo(this)\">\r\n        <img decoding=\"async\" src=\"https:\/\/img.youtube.com\/vi\/NAeedJv-S3I\/hqdefault.jpg\" alt=\"Video abspielen\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><\/p>\n<p>Wer interessiert ist, ist herzlich eingeladen, weiterzulesen.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Ich hei\u00dfe Yuri Bushmelev. Ich arbeite bei Lazada. Heute werde ich dar\u00fcber berichten, wie wir unsere Logs erstellt haben, wie wir sie gesammelt haben und was wir darin festhalten. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Juri Buschmelev &quot;Karte der Stolpersteine im Bereich Sammlung und Lieferung von Logs&quot; \u2014 Entschl\u00fcsselung des Vortrags\" src=\"\/wp-content\/uploads\/2019\/04\/ece6053b1027ab3681022049ddcd79ea.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Woher kommen wir? Wer sind wir? Lazada ist der f\u00fchrende Online-Shop in sechs L\u00e4ndern S\u00fcdostasiens. Diese L\u00e4nder sind auf unsere Rechenzentren verteilt. Insgesamt gibt es derzeit 4 Rechenzentren. Warum ist das wichtig? Weil einige Entscheidungen darauf basieren, dass es zwischen den Zentren eine sehr schwache Verbindung gibt. Wir verwenden eine Mikrodienstarchitektur. Ich war \u00fcberrascht zu entdecken, dass wir bereits 80 Mikrodienste haben. Als ich mit der Protokollierung begann, gab es nur 20. Dar\u00fcber hinaus gibt es einen ziemlich gro\u00dfen Teil von PHP Legacy, mit dem wir ebenfalls leben m\u00fcssen. All dies generiert derzeit mehr als 6 Millionen Nachrichten pro Minute im gesamten System. Im Folgenden werde ich zeigen, wie wir versuchen, damit umzugehen, und warum dies so ist.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Juri Buschmelev &quot;Karte der Stolpersteine im Bereich Sammlung und Lieferung von Logs&quot; \u2014 Entschl\u00fcsselung des Vortrags\" src=\"\/wp-content\/uploads\/2019\/04\/0ba5fcee5064865e836cefd47c40d246.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mit diesen 6 Millionen Nachrichten m\u00fcssen wir irgendwie umgehen. Was sollen wir mit ihnen machen? 6 Millionen Nachrichten, die:<\/p>\n<p><\/p>\n<ul>\n<li>aus der Anwendung gesendet werden m\u00fcssen<\/li>\n<li>f\u00fcr die Lieferung empfangen werden m\u00fcssen<\/li>\n<li>f\u00fcr die Analyse und Speicherung geliefert werden m\u00fcssen.<\/li>\n<li>analysiert werden m\u00fcssen<\/li>\n<li>irgendwie gespeichert werden m\u00fcssen.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Juri Buschmelev &quot;Karte der Stolpersteine im Bereich Sammlung und Lieferung von Logs&quot; \u2014 Entschl\u00fcsselung des Vortrags\" src=\"\/wp-content\/uploads\/2019\/04\/a449062193c4b1757a61f5c92e270a74.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Als wir drei Millionen Nachrichten erreicht hatten, sah ich ungef\u00e4hr so aus. Denn wir haben mit wenigen Cent begonnen. Klar, dass dort Anwendungsprotokolle geschrieben werden. Zum Beispiel, konnte keine Verbindung zur Datenbank hergestellt werden, die Verbindung zur Datenbank wurde erfolgreich hergestellt, aber etwas konnte nicht gelesen werden. Aber zus\u00e4tzlich dazu schreibt jeder unserer Mikrodienste auch ein Zugriffsprotokoll. Jede Anfrage, die an den Mikrodienst gesendet wird, wird im Protokoll festgehalten. Warum machen wir das? Die Entwickler m\u00f6chten die M\u00f6glichkeit haben, eine Trace-Analyse durchzuf\u00fchren. In jedem Zugriffsprotokoll gibt es ein Feld traceid, mit dem eine spezielle Schnittstelle die gesamte Kette aufbereitet und sch\u00f6n den Trace pr\u00e4sentiert. Der Trace zeigt, wie die Anfrage verlaufen ist, und hilft unseren Entwicklern, schneller mit unidentifizierten Problemen umzugehen.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Juri Buschmelev &quot;Karte der Stolpersteine im Bereich Sammlung und Lieferung von Logs&quot; \u2014 Entschl\u00fcsselung des Vortrags\" src=\"\/wp-content\/uploads\/2019\/04\/e13a2d37ce57e894d023ad405a2b5200.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wie damit umgehen? Jetzt m\u00f6chte ich kurz einige Optionen vorstellen \u2014 wie diese Problematik generell gel\u00f6st wird. Wie man die Aufgabe des Sammelns, \u00dcbertragens und Speicherns von Protokollen angeht. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Juri Buschmelev &quot;Karte der Stolpersteine im Bereich Sammlung und Lieferung von Logs&quot; \u2014 Entschl\u00fcsselung des Vortrags\" src=\"\/wp-content\/uploads\/2019\/04\/60af5e5db804770295741995adb37d90.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wie schreibt man aus einer Anwendung heraus? Es gibt verschiedene M\u00f6glichkeiten. Insbesondere gibt es Best Practices, wie uns trendige Kollegen erz\u00e4hlen. Es gibt alte Schule in zwei Varianten, wie es die Gro\u00dfv\u00e4ter beigebracht haben. Und es gibt andere Methoden. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Juri Buschmelev &quot;Karte der Stolpersteine im Bereich Sammlung und Lieferung von Logs&quot; \u2014 Entschl\u00fcsselung des Vortrags\" src=\"\/wp-content\/uploads\/2019\/04\/deab57e4ac0472a8591c0fad9e9f2910.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Die Situation bei der Protokollierung ist \u00e4hnlich. Es gibt nicht viele L\u00f6sungen f\u00fcr diesen speziellen Teil. Es sind zwar schon einige vorhanden, aber es k\u00f6nnten noch mehr sein. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Juri Buschmelev &quot;Karte der Stolpersteine im Bereich Sammlung und Lieferung von Logs&quot; \u2014 Entschl\u00fcsselung des Vortrags\" src=\"\/wp-content\/uploads\/2019\/04\/8a6004aaeb931332983a975d0fa5c1d6.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Bei der Lieferung und der anschlie\u00dfenden Analyse hingegen explodiert die Anzahl der Variationen f\u00f6rmlich. Ich werde jetzt nicht jede Option beschreiben. Ich glaube, die g\u00e4ngigsten Optionen sind jedem, der sich f\u00fcr das Thema interessiert, bekannt.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Juri Buschmelev &quot;Karte der Stolpersteine im Bereich Sammlung und Lieferung von Logs&quot; \u2014 Entschl\u00fcsselung des Vortrags\" src=\"\/wp-content\/uploads\/2019\/04\/6a0b64c7e58bc59f56aaddd27112ec51.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ich zeige Ihnen, wie wir das bei Lazada gemacht haben und wie alles urspr\u00fcnglich begann. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Juri Buschmelev &quot;Karte der Stolpersteine im Bereich Sammlung und Lieferung von Logs&quot; \u2014 Entschl\u00fcsselung des Vortrags\" src=\"\/wp-content\/uploads\/2019\/04\/20f3aa5ceea8b28733ce5399bc30f5b5.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vor einem Jahr kam ich zu Lazada, und ich wurde f\u00fcr ein Projekt zur Protokollierung eingesetzt. Es lief ungef\u00e4hr so ab: Das Protokoll der Anwendung wurde sowohl in stdout als auch in stderr geschrieben. Alles war modern gestaltet. Aber die Entwickler haben es dann aus den Standard-Streams entfernt, und ab da sollten die Infrastruktur-Spezialisten das irgendwie kl\u00e4ren. Zwischen den Infrastruktur-Spezialisten und den Entwicklern gibt es auch Release-Manager, die gesagt haben: \u201e\u00c4h\u2026 na gut, lassen Sie uns das einfach per Shell in eine Datei packen, und das war's\u201c. Da alles in einem Container war, wurde es direkt im Container verpackt, das Verzeichnis wurde gemappt und dort abgelegt. Ich denke, dass allen klar ist, was daraus geworden ist.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Juri Buschmelev &quot;Karte der Stolpersteine im Bereich Sammlung und Lieferung von Logs&quot; \u2014 Entschl\u00fcsselung des Vortrags\" src=\"\/wp-content\/uploads\/2019\/04\/d92e02c18a4c683c9389321e4d5412df.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Schauen wir uns einmal die vorhergehenden Schritte an. Wie wir diese Logs transportiert haben. Jemand hat sich f\u00fcr td-agent entschieden, der tats\u00e4chlich fluentd ist, aber nicht genau das gleiche wie fluentd. Ich habe das Verh\u00e4ltnis dieser beiden Projekte nie ganz verstanden, aber sie scheinen sich um dasselbe Thema zu drehen. Dieser fluentd, der in Ruby geschrieben ist, las die Logdateien und parste sie mithilfe bestimmter regul\u00e4rer Ausdr\u00fccke in JSON. Danach wurden sie an Kafka gesendet. \u00dcbrigens hatten wir in Kafka f\u00fcr jede API vier separate Themen. Warum vier? Weil es live gibt, staging, und weil stdout und stderr vorhanden sind. Die Entwickler erstellen diese, und die Infrastrukturteams m\u00fcssen sie in Kafka anlegen. Allerdings wurde Kafka von einer anderen Abteilung verwaltet. Daher musste ein Ticket erstellt werden, damit sie vier Themen f\u00fcr jede API anlegen konnten. Das wurde oft vergessen. Insgesamt war das ein riesiges Chaos. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Juri Buschmelev &quot;Karte der Stolpersteine im Bereich Sammlung und Lieferung von Logs&quot; \u2014 Entschl\u00fcsselung des Vortrags\" src=\"\/wp-content\/uploads\/2019\/04\/3130f9ebfda22713cffacf10db45ca89.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Was haben wir danach damit gemacht? Wir haben es in Kafka geschickt. Dann gingen die Logger die H\u00e4lfte in Logstash. Die andere H\u00e4lfte der Logs wurde aufgeteilt. Ein Teil ging in einen Graylog, ein anderer Teil in einen anderen Graylog. Am Ende landete alles in einem Elasticsearch-Cluster. Das bedeutet, dass all dieses Durcheinander letztendlich dort landete. So sollte man das nicht machen!<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Juri Buschmelev &quot;Karte der Stolpersteine im Bereich Sammlung und Lieferung von Logs&quot; \u2014 Entschl\u00fcsselung des Vortrags\" src=\"\/wp-content\/uploads\/2019\/04\/98bf4811c102fc12fcd1114c25886b69.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>So sieht es aus, wenn man es aus der Ferne von oben betrachtet. Das sollte man so nicht machen! Hier sind sofort die problematischen Stellen mit Zahlen markiert. Tats\u00e4chlich gibt es mehr, aber 6 sind ganz besonders problematisch, bei denen man etwas unternehmen muss. Dar\u00fcber werde ich gleich separat berichten. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Juri Buschmelev &quot;Karte der Stolpersteine im Bereich Sammlung und Lieferung von Logs&quot; \u2014 Entschl\u00fcsselung des Vortrags\" src=\"\/wp-content\/uploads\/2019\/04\/69f7682e6677bdda3068d6dea4db7732.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hier (1, 2, 3) werden die Dateien geschrieben, und entsprechend gibt es hier gleich drei Probleme. <\/p>\n<p><\/p>\n<p>Erstens (1) m\u00fcssen wir sie irgendwo schreiben. Es w\u00e4re nicht immer w\u00fcnschenswert, dem API die M\u00f6glichkeit zu geben, direkt in eine Datei zu schreiben. Es w\u00e4re ideal, wenn das API in einem Container isoliert ist, und noch besser \u2013 wenn es nur lesbar ist. Ich bin Sysadmin, deshalb habe ich eine etwas alternative Sichtweise auf diese Dinge.<\/p>\n<p><\/p>\n<p>Ein zweiter Punkt (2,3) \u2013 wir erhalten viele Anfragen \u00fcber die API. Die API schreibt viele Daten in eine Datei. Die Dateien wachsen. Wir m\u00fcssen sie rotieren. Denn sonst kommen wir mit dem Speicherplatz nicht mehr klar. Die Rotation ist schwierig, weil sie \u00fcber einen Shell-Redirect in ein Verzeichnis erfolgt. Wir k\u00f6nnen das nicht einfach rotieren. Man kann der Anwendung nicht sagen, sie soll die Deskriptoren neu \u00f6ffnen. Denn die Entwickler schauen einen an, als w\u00e4re man verr\u00fcckt: \u201eWelche Deskriptoren? Wir schreiben doch direkt in stdout.\u201c Die Infrastruktur-Engineers haben in logrotate einen copytruncate-Befehl implementiert, der einfach eine Kopie der Datei macht und das Original k\u00fcrzt. In der Regel geht der Speicherplatz genau zwischen diesen Kopierprozessen aus.<\/p>\n<p><\/p>\n<p>(4) Wir hatten verschiedene Formate in den verschiedenen APIs. Diese unterschieden sich ein wenig, aber es mussten unterschiedliche regul\u00e4re Ausdr\u00fccke geschrieben werden. Da alles mit Puppet gesteuert wurde, gab es ein gro\u00dfes B\u00fcndel von Klassen mit ihren eigenen Problemen. Zudem konnte td-agent die meiste Zeit viel Speicher verbrauchen, tr\u00e4ge sein und einfach so tun, als ob er arbeiten w\u00fcrde, ohne tats\u00e4chlich etwas zu tun. Von au\u00dfen war es unm\u00f6glich zu erkennen, dass er nichts tat. Im besten Fall st\u00fcrzte er ab und wurde sp\u00e4ter wieder hochgefahren. Genauer gesagt, es kam ein Alert, und jemand ging manuell wieder himmelhoch. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Juri Buschmelev &quot;Karte der Stolpersteine im Bereich Sammlung und Lieferung von Logs&quot; \u2014 Entschl\u00fcsselung des Vortrags\" src=\"\/wp-content\/uploads\/2019\/04\/424cda2b60e9e5669b7ef2b34ca74e48.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>(6) Die gr\u00f6\u00dfte Herausforderung war Elasticsearch. Das lag daran, dass wir eine alte Version verwendeten und zu diesem Zeitpunkt keine dedizierten Master-Server hatten. Wir hatten heterogene Logs, deren Felder sich \u00fcberschnitten. Verschiedene Logs unterschiedlicher Anwendungen konnten mit denselben Feldnamen erstellt werden, jedoch unterschiedliche Daten enthalten. Ein Log k\u00f6nnte beispielsweise einen Integer im Feld 'level' geliefert haben, w\u00e4hrend ein anderes Log einen String im selben Feld lieferte. Bei fehlendem statischen Mapping ergibt sich eine interessante Situation: Wenn nach der Indexrotation in Elasticsearch zuerst eine Nachricht mit einem String ankommt, l\u00e4uft alles gut. Kommt jedoch zuerst eine Nachricht mit einem Integer, werden alle nachfolgenden Nachrichten mit einem String einfach verworfen, weil die Feldtypen nicht \u00fcbereinstimmen.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Juri Buschmelev &quot;Karte der Stolpersteine im Bereich Sammlung und Lieferung von Logs&quot; \u2014 Entschl\u00fcsselung des Vortrags\" src=\"\/wp-content\/uploads\/2019\/04\/bc869f827bed326792857113191bb028.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wir begannen, uns diese Fragen zu stellen. Wir beschlossen, keine Schuldigen zu suchen.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Juri Buschmelev &quot;Karte der Stolpersteine im Bereich Sammlung und Lieferung von Logs&quot; \u2014 Entschl\u00fcsselung des Vortrags\" src=\"\/wp-content\/uploads\/2019\/04\/a071a4b38462f249339c988c35463639.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Es gibt einiges zu tun! Eine offensichtliche Sache ist, dass wir Standards etablieren m\u00fcssen. Einige Standards hatten wir bereits, andere haben wir etwas sp\u00e4ter eingef\u00fchrt. Gl\u00fccklicherweise wurde zu diesem Zeitpunkt bereits ein einheitliches Log-Format f\u00fcr alle APIs genehmigt. Es ist direkt in den Interaktionsstandards der Dienste definiert. Folglich m\u00fcssen diejenigen, die Protokolle erhalten m\u00f6chten, diese in diesem Format schreiben. Wer seine Protokolle nicht in diesem Format schreibt, erh\u00e4lt von uns keine Garantien. <\/p>\n<p><\/p>\n<p>Dar\u00fcber hinaus sollten wir einen einheitlichen Standard f\u00fcr die Art und Weise der Aufzeichnung, Lieferung und Sammlung von Protokollen festlegen. Konkret geht es darum, wo sie geschrieben werden und wie sie geliefert werden. Die ideale Situation w\u00e4re, wenn in den Projekten dieselbe Bibliothek verwendet wird. Es gibt eine spezielle Logging-Bibliothek f\u00fcr Go und eine separate Bibliothek f\u00fcr PHP. Alle, die bei uns t\u00e4tig sind, m\u00fcssen diese nutzen. Momentan w\u00fcrde ich sagen, dass wir das zu etwa 80 % erreichen. Aber einige halten weiterhin an ihren alten Gewohnheiten fest.<\/p>\n<p><\/p>\n<p>Auf der Folie beginnt es gerade, das \u201eSLA f\u00fcr die Log-Zustellung\u201c sichtbar zu werden. Es existiert noch nicht, aber wir arbeiten daran. Denn es ist \u00e4u\u00dferst praktisch, wenn die Infrastruktur sagt, dass wir, wenn Sie in einem bestimmten Format an einen bestimmten Ort schreiben und nicht mehr als N Nachrichten pro Sekunde senden, dies mit einer bestimmten Wahrscheinlichkeit zustellen werden. Das nimmt einem eine Menge Kopfzerbrechen. Wenn ein SLA vorhanden ist, ist das einfach gro\u00dfartig!<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Juri Buschmelev &quot;Karte der Stolpersteine im Bereich Sammlung und Lieferung von Logs&quot; \u2014 Entschl\u00fcsselung des Vortrags\" src=\"\/wp-content\/uploads\/2019\/04\/a887aceac13135afe90bb5f5a5ec1d26.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wie haben wir das Problem angegangen? Die gr\u00f6\u00dfte H\u00fcrde war der td-agent. Es war unklar, wohin unsere Logs verschwinden. Werden sie zugestellt? Werden sie gesammelt? Wo sind sie \u00fcberhaupt? Daher wurde als erster Schritt beschlossen, den td-agent zu ersetzen. Kurz habe ich hier einige Alternativen skizziert.<\/p>\n<p><\/p>\n<p>Fluentd. Erstens habe ich damit in meinem vorherigen Job gearbeitet, und auch dort ist es manchmal ausgefallen. Zweitens ist es im Grunde dasselbe, nur spezialisierter. <\/p>\n<p><\/p>\n<p>Filebeat. Warum war es f\u00fcr uns praktisch? Weil es in Go geschrieben ist, und wir haben viel Expertise in Go. Das hei\u00dft, wenn n\u00f6tig, k\u00f6nnten wir es irgendwie anpassen. Deshalb haben wir es nicht gew\u00e4hlt, um keinen Anreiz zu haben, es f\u00fcr uns umzuschreiben. <\/p>\n<p><\/p>\n<p>F\u00fcr Sysadmins bleibt die evidente L\u00f6sung eine Vielzahl von Sys-Logs, wie syslog-ng, rsyslog oder nxlog.<\/p>\n<p><\/p>\n<p>Oder man k\u00f6nnte etwas Eigenes schreiben, aber das haben wir verworfen, ebenso wie filebeat. Wenn man etwas schreibt, sollte es besser n\u00fctzlich f\u00fcr das Gesch\u00e4ft sein. F\u00fcr die Logzustellung ist es besser, eine fertige L\u00f6sung zu w\u00e4hlen.<\/p>\n<p><\/p>\n<p>Daher schloss sich die Wahl im Grunde auf syslog-ng oder rsyslog. Ich habe mich f\u00fcr rsyslog entschieden, einfach weil wir in Puppet bereits Klassen f\u00fcr rsyslog hatten, und ich keinen offensichtlichen Unterschied zwischen ihnen gefunden habe. Da syslog hier und da, ja, die Dokumentation ist bei manchen schlechter, bei manchen besser. Der eine kann so, der andere anders.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Juri Buschmelev &quot;Karte der Stolpersteine im Bereich Sammlung und Lieferung von Logs&quot; \u2014 Entschl\u00fcsselung des Vortrags\" src=\"\/wp-content\/uploads\/2019\/04\/a88116711b547fa5b2b34daf72cc4220.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ein paar Worte zu rsyslog. Zun\u00e4chst einmal ist es gro\u00dfartig, weil es viele Module bietet. Es verwendet die benutzerfreundliche RainerScript (eine moderne Konfigurationssprache). Ein genialer Vorteil ist, dass wir veraltetes Verhalten von td-agent mit den Standardmitteln simulieren konnten, sodass sich f\u00fcr die Anwendungen nichts ge\u00e4ndert hat. Wir ersetzen also td-agent durch rsyslog und lassen alles andere vorerst unber\u00fchrt. Damit erhalten wir sofort eine funktionierende Lieferung. Dar\u00fcber hinaus ist mmnormalize ein hervorragendes Werkzeug in rsyslog. Es erm\u00f6glicht das Parsen von Protokollen, jedoch nicht mit Grok oder regexp. Stattdessen erstellt es einen abstrakten Syntaxbaum. Es interpretiert Protokolle wie ein Compiler Quellcode interpretiert. Das erm\u00f6glicht eine sehr schnelle Verarbeitung, verbraucht wenig CPU und ist insgesamt wirklich eine tolle Sache. Es gibt viele andere Vorteile. Ich werde nicht n\u00e4her darauf eingehen.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Juri Buschmelev &quot;Karte der Stolpersteine im Bereich Sammlung und Lieferung von Logs&quot; \u2014 Entschl\u00fcsselung des Vortrags\" src=\"\/wp-content\/uploads\/2019\/04\/ca811be9f9ff318fb8c8bbf3dc45a038.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>rsyslog hat allerdings auch eine Reihe von Nachteilen. Diese sind \u00e4hnlich wie die Vorteile. Die Hauptprobleme sind, dass man wissen muss, wie man es konfiguriert, und die passende Version ausw\u00e4hlen muss.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Juri Buschmelev &quot;Karte der Stolpersteine im Bereich Sammlung und Lieferung von Logs&quot; \u2014 Entschl\u00fcsselung des Vortrags\" src=\"\/wp-content\/uploads\/2019\/04\/034f588e0834b1d4e4873d9c3dbd0873.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wir haben entschieden, dass wir die Protokolle \u00fcber einen Unix-Socket schreiben werden. Und zwar nicht in \/dev\/log, weil dort ein Durcheinander aus Systemprotokollen herrscht, durch journald in diesem Pipeline. Daher werden wir in einen benutzerdefinierten Socket schreiben. Wir werden ihn an ein separates Regelset anh\u00e4ngen. So st\u00f6ren wir uns nicht gegenseitig. Alles wird transparent und nachvollziehbar sein. Genau so haben wir es gemacht. Das Verzeichnis mit diesen Sockets ist standardisiert und wird in alle Container weitergeleitet. Die Container k\u00f6nnen den ben\u00f6tigten Socket sehen, \u00f6ffnen und in ihn schreiben. <\/p>\n<p><\/p>\n<p>Warum nicht in eine Datei? Weil alle gelesen haben <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/badoo\/blog\/280606\/\">den Artikel \u00fcber Badushka<\/a><\/noindex>, der zu versuchen schrieb, eine Datei in Docker zu leiten, und dabei festgestellt wurde, dass sich nach einem Neustart von rsyslog der Dateideskriptor \u00e4ndert und Docker diese Datei verliert. Es h\u00e4lt etwas anderes offen, aber nicht mehr den Socket, in den geschrieben wird. Wir haben entschieden, dieses Problem zu umgehen und gleichzeitig das Problem der Sperrung zu umgehen.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Juri Buschmelev &quot;Karte der Stolpersteine im Bereich Sammlung und Lieferung von Logs&quot; \u2014 Entschl\u00fcsselung des Vortrags\" src=\"\/wp-content\/uploads\/2019\/04\/78db15581a68ce16d11f5ebe7e6fe04e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Rsyslog f\u00fchrt die im Slide angegebenen Aktionen durch und sendet die Protokolle entweder an Relay oder an Kafka. Kafka entspricht der alten Methode. Relay \u2014 ich habe versucht, reines rsyslog f\u00fcr die Protokoll\u00fcbertragung zu verwenden. Ohne Message Queue, mit den Standardmitteln von rsyslog. Im Prinzip funktioniert das.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Juri Buschmelev &quot;Karte der Stolpersteine im Bereich Sammlung und Lieferung von Logs&quot; \u2014 Entschl\u00fcsselung des Vortrags\" src=\"\/wp-content\/uploads\/2019\/04\/e61a25005ecbdc86d9de3215ee6fb97e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Es gibt jedoch Feinheiten, wie man diese dann in diesen Teil (Logstash\/Graylog\/ES) integriert. Dieser Teil (rsyslog-rsyslog) wird zwischen den Rechenzentren verwendet. Hier wird eine komprimierte TCP-Verbindung eingesetzt, die hilft, Bandbreite zu sparen und somit die Wahrscheinlichkeit erh\u00f6ht, dass wir Protokolle aus einem anderen Rechenzentrum erhalten, wenn die Verbindung \u00fcberlastet ist. Denn in Indonesien gibt es ernsthafte Probleme. Dort ist dies ein st\u00e4ndiges Thema.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Juri Buschmelev &quot;Karte der Stolpersteine im Bereich Sammlung und Lieferung von Logs&quot; \u2014 Entschl\u00fcsselung des Vortrags\" src=\"\/wp-content\/uploads\/2019\/04\/7509ba360be2db4dec0c8679225d285f.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wir haben dar\u00fcber nachgedacht, wie wir eigentlich \u00fcberwachen k\u00f6nnen, wie wahrscheinlich es ist, dass die Protokolle, die wir aus der Anwendung aufgezeichnet haben, den anderen Endpunkt erreichen. Daher haben wir uns entschieden, Metriken zu erstellen. rsyslog hat ein eigenes Statistik-Modul, das verschiedene Z\u00e4hler enth\u00e4lt. Zum Beispiel kann es Ihnen die Gr\u00f6\u00dfe der Warteschlange anzeigen oder wie viele Nachrichten in einem bestimmten Aktionsbereich eingegangen sind. Daraus lassen sich bereits Erkenntnisse gewinnen. Au\u00dferdem gibt es benutzerdefinierte Z\u00e4hler, die Sie anpassen k\u00f6nnen, um beispielsweise die Anzahl der Nachrichten anzuzeigen, die von einer bestimmten API aufgezeichnet wurden. Dar\u00fcber hinaus habe ich den rsyslog_exporter in Python geschrieben und wir haben alles an Prometheus gesendet und Grafiken erstellt. Die Metriken von Graylog waren sehr gew\u00fcnscht, aber wir hatten bisher nicht die Gelegenheit, sie einzurichten.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Juri Buschmelev &quot;Karte der Stolpersteine im Bereich Sammlung und Lieferung von Logs&quot; \u2014 Entschl\u00fcsselung des Vortrags\" src=\"\/wp-content\/uploads\/2019\/04\/ef9bd61fc43e056b4a56240c85e7fd20.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Was war das Problem? Wir haben festgestellt, dass unsere Live-APIs unerwartet 50.000 Nachrichten pro Sekunde senden. Das betrifft nur die Live-APIs, nicht die Staging-Umgebung. Graylog zeigt uns jedoch nur 12.000 Nachrichten pro Sekunde an. Daher stellte sich die berechtigte Frage, wo die restlichen Nachrichten geblieben sind. Daraus folgerten wir, dass Graylog einfach \u00fcberlastet ist. Nach Pr\u00fcfung best\u00e4tigte sich, dass Graylog mit Elasticsearch diese Datenmenge nicht bew\u00e4ltigen kann.<\/p>\n<p><\/p>\n<p>Dar\u00fcber hinaus gab es weitere Entdeckungen, die wir im Verlauf gemacht haben.<\/p>\n<p><\/p>\n<p>Die Aufzeichnung in den Socket wurde blockiert. Wie kam es dazu? Als ich rsyslog zur Zustellung verwendet habe, brach pl\u00f6tzlich die Verbindung zwischen den Rechenzentren zusammen. Die Lieferung stoppte an einem Ort und auch an einem anderen. Dies f\u00fchrte zu einer \u00dcberlastung bei der Maschine mit der API, die in den rsyslog-Socket schreibt. Dort f\u00fcllte sich die Warteschlange. Anschlie\u00dfend f\u00fcllte sich die Warteschlange f\u00fcr das Schreiben in den Unix-Socket, die standardm\u00e4\u00dfig auf 128 Pakete begrenzt ist. Der n\u00e4chste write() im Anwendungscode wurde blockiert. Als wir uns die Bibliothek ansehen, die wir in unseren Go-Anwendungen verwenden, stand dort, dass das Schreiben in den Socket im nicht blockierenden Modus erfolgt. Wir waren \u00fcberzeugt, dass nichts blockiert. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/badoo\/blog\/280606\/\">den Artikel \u00fcber Badushka<\/a><\/noindex>, die dar\u00fcber geschrieben hat. Es gibt jedoch einen Punkt. Rund um diesen Aufruf gab es eine endlose Schleife, in der st\u00e4ndig versucht wurde, eine Nachricht in den Socket zu stecken. Das haben wir \u00fcbersehen. Die Bibliothek musste neu geschrieben werden. Seitdem hat sie sich mehrmals ge\u00e4ndert, aber jetzt haben wir alle Blockierungen in den Untereinheiten beseitigt. Daher k\u00f6nnen wir rsyslog stoppen, ohne dass etwas ausf\u00e4llt.<\/p>\n<p><\/p>\n<p>Wir m\u00fcssen die Gr\u00f6\u00dfe der Warteschlangen \u00fcberwachen, um nicht auf dieselben Probleme zu sto\u00dfen. Erstens k\u00f6nnen wir \u00fcberwachen, wann wir anfangen, Nachrichten zu verlieren. Zweitens k\u00f6nnen wir erkennen, dass wir grunds\u00e4tzlich Probleme mit der Zustellung haben.<\/p>\n<p><\/p>\n<p>Und noch ein unangenehmer Punkt \u2013 die Amplikation um das Zehnfache in einer Microservices-Architektur ist sehr einfach. Wir haben nicht so viele eingehende Anfragen, aber aufgrund des Graphen, in dem diese Nachrichten laufen, und der Access-Logs erh\u00f6hen wir tats\u00e4chlich die Last der Logs ungef\u00e4hr um das Zehnfache. Leider hatte ich nicht die Zeit, die genauen Zahlen zu berechnen, aber Microservices sind eben so. Das sollte man im Hinterkopf behalten. Im Moment ist das Logsammelsystem die am st\u00e4rksten belastete Komponente bei Lazada. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Juri Buschmelev &quot;Karte der Stolpersteine im Bereich Sammlung und Lieferung von Logs&quot; \u2014 Entschl\u00fcsselung des Vortrags\" src=\"\/wp-content\/uploads\/2019\/04\/d76c6d91613ff77c41b8985cee83218f.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wie l\u00f6st man das Problem mit Elasticsearch? Wenn Sie schnell alle Protokolle an einem Ort abrufen m\u00f6chten, um nicht auf allen Maschinen suchen zu m\u00fcssen, verwenden Sie ein Dateispeicher. Das funktioniert garantiert. Es kann auf jedem Server eingerichtet werden. Man muss nur ein paar Festplatten anschlie\u00dfen und syslog installieren. Danach sind alle Protokolle garantiert an einem Ort vorhanden. Dann k\u00f6nnen Sie in Ruhe Elasticsearch, Graylog oder etwas anderes konfigurieren. Aber Sie haben bereits alle Protokolle und k\u00f6nnen sie so lange speichern, wie der Speicherplatz reicht.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Juri Buschmelev &quot;Karte der Stolpersteine im Bereich Sammlung und Lieferung von Logs&quot; \u2014 Entschl\u00fcsselung des Vortrags\" src=\"\/wp-content\/uploads\/2019\/04\/571297f25de76958769f3a4b9bfbf5b9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Zum Zeitpunkt meines Vortrags sah das Schema so aus. Wir haben nahezu aufgeh\u00f6rt, in die Datei zu schreiben. H\u00f6chstwahrscheinlich schalten wir die Reste jetzt ab. Auf den lokalen Maschinen, auf denen die API l\u00e4uft, werden wir auch nicht mehr in Dateien schreiben. Erstens gibt es ein Dateispeicher, das sehr gut funktioniert. Zweitens ist der Platz auf diesen Maschinen st\u00e4ndig knapp, und man muss ihn fortlaufend \u00fcberwachen.<\/p>\n<p><\/p>\n<p>Dieser Teil mit Logstash und Graylog ist wirklich problematisch. Deshalb m\u00fcssen wir uns davon trennen. Wir m\u00fcssen uns f\u00fcr etwas entscheiden.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Juri Buschmelev &quot;Karte der Stolpersteine im Bereich Sammlung und Lieferung von Logs&quot; \u2014 Entschl\u00fcsselung des Vortrags\" src=\"\/wp-content\/uploads\/2019\/04\/4a285577708aa1c55c16a72364fa8072.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wir haben uns entschieden, Logstash und Kibana abzulehnen. Der Grund ist, dass wir eine Sicherheitsabteilung haben. Was hat das miteinander zu tun? Nun, Kibana erlaubt ohne X-Pack und ohne Shield keine differenzierten Zugriffsrechte auf die Logs. Daher haben wir Graylog verwendet. Es ist nicht mein Favorit, aber es funktioniert. Wir haben neue Hardware gekauft, haben frisches Graylog installiert und alle Logs mit strikten Formaten in eine separate Graylog-Instanz verschoben. Dadurch haben wir das Problem mit den verschiedenen Typen identischer Felder organisatorisch gel\u00f6st.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Juri Buschmelev &quot;Karte der Stolpersteine im Bereich Sammlung und Lieferung von Logs&quot; \u2014 Entschl\u00fcsselung des Vortrags\" src=\"\/wp-content\/uploads\/2019\/04\/91b9fdada2648ae1caec05169b11926a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Was genau ist in das neue Graylog integriert? Wir haben einfach alles in Docker aufgenommen. Wir haben einige Server genommen, drei Instanzen von Kafka ausgerollt und 7 Server mit Graylog in Version 2.3 (weil wir Elasticsearch in Version 5 wollten) aufgebaut. Das Ganze haben wir auf RAID-Systemen mit HDDs laufen lassen. Wir haben eine Indexierungsrate von bis zu 100.000 Nachrichten pro Sekunde erreicht und gesehen, dass wir 140 Terabyte Daten pro Woche verarbeiten. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Juri Buschmelev &quot;Karte der Stolpersteine im Bereich Sammlung und Lieferung von Logs&quot; \u2014 Entschl\u00fcsselung des Vortrags\" src=\"\/wp-content\/uploads\/2019\/04\/05f9b3c06739548f092bbe271bf8fc54.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Und wieder die gleichen Probleme! Uns stehen zwei Verkaufsaktionen bevor. Wir haben \u00fcber 6 Millionen Nachrichten umgezogen. Graylog schafft es nicht, damit hinterherzukommen. Wir m\u00fcssen uns irgendwie wieder durchschlagen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Juri Buschmelev &quot;Karte der Stolpersteine im Bereich Sammlung und Lieferung von Logs&quot; \u2014 Entschl\u00fcsselung des Vortrags\" src=\"\/wp-content\/uploads\/2019\/04\/424aa2febc2fd903aabee4aeabb64010.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>So haben wir \u00fcberlebt. Wir haben noch ein paar Server und SSDs hinzugef\u00fcgt. Momentan leben wir auf diese Weise. Jetzt verarbeiten wir bereits 160.000 Nachrichten pro Sekunde. Wir haben noch nicht die Grenze erreicht, daher ist es bisher unklar, wie viel wir tats\u00e4chlich aus diesem System herausholen k\u00f6nnen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Juri Buschmelev &quot;Karte der Stolpersteine im Bereich Sammlung und Lieferung von Logs&quot; \u2014 Entschl\u00fcsselung des Vortrags\" src=\"\/wp-content\/uploads\/2019\/04\/17d84fa7de5403551e55f42345e62a1a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Das sind unsere Pl\u00e4ne f\u00fcr die Zukunft. Davon ist wahrscheinlich High Availability am wichtigsten. Das haben wir momentan noch nicht. Einige Maschinen sind gleich konfiguriert, aber der gesamte Traffic l\u00e4uft bisher \u00fcber eine Maschine. Wir m\u00fcssen Zeit investieren, um das Failover zwischen ihnen einzurichten.<\/p>\n<p><\/p>\n<p>Metriken mit Graylog sammeln.<\/p>\n<p><\/p>\n<p>Ein Rate Limit einrichten, damit uns eine \u00fcberlastete API nicht den Bandbreite und alles andere kaputt macht.<\/p>\n<p><\/p>\n<p>Und schlie\u00dflich einen SLA mit den Entwicklern vereinbaren, dass wir bis zu einem bestimmten Umfang betreuen k\u00f6nnen. Wenn ihr mehr schreibt, tut mir leid.<\/p>\n<p><\/p>\n<p>Und die Dokumentation schreiben.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Juri Buschmelev &quot;Karte der Stolpersteine im Bereich Sammlung und Lieferung von Logs&quot; \u2014 Entschl\u00fcsselung des Vortrags\" src=\"\/wp-content\/uploads\/2019\/04\/4a78e2834d5877f8bf17d77a44000c22.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Kurz zusammengefasst, die Ergebnisse von allem, was wir durchgemacht haben. Erstens, Standards. Zweitens, Syslog \u2013 ein Kuchen. Drittens, Rsyslog funktioniert genau so, wie es auf der Folie steht. Und lasst uns zu den Fragen \u00fcbergehen.<\/p>\n<p><\/p>\n<p><strong>Fragen<\/strong>.<\/p>\n<p><\/p>\n<p><strong>Frage<\/strong>: Warum haben Sie sich entschlossen, nichts zu nehmen\u2026 (Filebeat?)<\/p>\n<p><\/p>\n<p><strong>Antwort<\/strong>: Wir m\u00fcssen in eine Datei schreiben. Das wollte ich wirklich nicht. Wenn dein API Tausende von Nachrichten pro Sekunde schreibt, ist es einfach nicht praktikabel, sogar einmal pro Stunde zu rotieren. Man k\u00f6nnte in eine Pipe schreiben. Daraufhin fragten die Entwickler: \u201eWas passiert, wenn der Prozess, in den wir schreiben, abst\u00fcrzt?\u201c Ich konnte nichts darauf antworten und sagte: \u201eNa gut, dann machen wir das nicht.\u201c<\/p>\n<p><\/p>\n<p><strong>Frage<\/strong>: Warum schreiben Sie die Logs nicht einfach in HDFS?<\/p>\n<p><\/p>\n<p><strong>Antwort<\/strong>: Das ist der n\u00e4chste Schritt. Wir haben am Anfang dar\u00fcber nachgedacht, aber da wir momentan keine Ressourcen daf\u00fcr haben, bleibt es eine langfristige L\u00f6sung.<\/p>\n<p><\/p>\n<p><strong>Frage<\/strong>: Ein Spaltenformat w\u00e4re passender.<\/p>\n<p><\/p>\n<p><strong>Antwort<\/strong>: Ich verstehe. Wir sind \u201edaf\u00fcr\u201c mit beiden H\u00e4nden. <\/p>\n<p><\/p>\n<p><strong>Frage<\/strong>: Sie schreiben in rsyslog. Dort kann man sowohl TCP als auch UDP verwenden. Aber wenn Sie UDP verwenden, wie gew\u00e4hrleisten Sie dann die Zustellung?<\/p>\n<p><\/p>\n<p><strong>Antwort<\/strong>: Es gibt zwei Punkte. Erstens sage ich sofort allen, dass wir die Lieferung von Logs nicht garantieren. Denn wenn Entwickler kommen und sagen: \u201eLass uns da Finanzdaten reinschreiben, und ihr legt die irgendwo ab, f\u00fcr den Fall, dass etwas passiert\u201c, antworten wir: \u201eSuper! Fangt an, euch beim Schreiben in den Socket zu blockieren und macht das in Transaktionen, damit ihr uns das garantiert in den Socket schreibt und sicherstellt, dass wir es auf der anderen Seite erhalten haben.\u201c In diesem Moment ist es allen sofort nicht mehr wichtig. Wenn es nicht wichtig ist, welche Fragen haben wir dann? Wenn ihr keine Garantie f\u00fcr das Schreiben in den Socket geben wollt, warum sollten wir dann die Lieferung garantieren? Wir geben unser Bestes. Wir bem\u00fchen uns wirklich, so viel wie m\u00f6glich und so gut wie m\u00f6glich zu liefern, aber wir geben keine 100% Garantie. Daher sollte man keine Finanzdaten dort schreiben. Daf\u00fcr sind Datenbanken mit Transaktionen da.<\/p>\n<p><\/p>\n<p><strong>Frage<\/strong>: Wenn die API eine Nachricht im Log generiert und die Kontrolle an Microservices \u00fcbergibt, habt ihr dann nicht das Problem, dass Nachrichten von verschiedenen Microservices in der falschen Reihenfolge ankommen? Dadurch entsteht Verwirrung.<\/p>\n<p><\/p>\n<p><strong>Antwort<\/strong>: Es ist normal, dass sie in unterschiedlicher Reihenfolge ankommen. Darauf sollte man vorbereitet sein. Denn bei jeder Netzwerk-Zustellung ist die Reihenfolge nicht garantiert, oder man muss speziell Ressourcen daf\u00fcr aufwenden. Wenn wir uns Dateispeicher betrachten, speichert jede API ihre Logs in ihren eigenen Dateien. Genauer gesagt, rsyslog ordnet diese in Verzeichnissen an. Jede API hat ihre eigenen Logs, in die man gehen und nachsehen kann, und dann k\u00f6nnen sie anhand des Zeitstempels in diesen Logs abgeglichen werden. Wenn sie in Graylog schauen, werden sie dort nach Zeitstempel sortiert. Dort ist alles in Ordnung.<\/p>\n<p><\/p>\n<p><strong>Frage<\/strong>: Der Zeitstempel kann sich um Millisekunden unterscheiden.<\/p>\n<p><\/p>\n<p><strong>Antwort<\/strong>: Der Zeitstempel wird von der API selbst generiert. Darin liegt eigentlich der ganze Trick. Wir haben NTP. Die API generiert den Zeitstempel bereits in der Nachricht selbst. Dieser wird nicht von rsyslog hinzugef\u00fcgt.<\/p>\n<p><\/p>\n<p><strong>Frage<\/strong>: Die Interaktion zwischen den Rechenzentren ist nicht ganz klar. Innerhalb eines Rechenzentrums ist es klar, wie die Logs gesammelt und verarbeitet werden. Wie erfolgt die Interaktion zwischen den Rechenzentren? Oder lebt jedes Rechenzentrum sein eigenes Leben?<\/p>\n<p><\/p>\n<p><strong>Antwort<\/strong>: Fast. In jedem Land befindet sich unsere Infrastruktur in einem bestimmten Rechenzentrum. Derzeit gibt es keine Verteilung, sodass ein Land in mehreren Rechenzentren gehostet wird. Daher ist eine Zusammenf\u00fchrung nicht notwendig. Innerhalb jedes Rechenzentrums gibt es einen Log Relay. Dies ist ein Rsyslog-Server. Tats\u00e4chlich betreiben wir zwei Management-Server, die identisch eingerichtet sind. Aktuell l\u00e4uft der gesamte Verkehr \u00fcber einen von ihnen, der alle Protokolle aggregiert. Dieser Server hat eine Festplattenwarteschlange f\u00fcr den Notfall. Er komprimiert die Logs und sendet sie an unser zentrales Rechenzentrum in Singapur, wo sie dann an Graylog weitergeleitet werden. Au\u00dferdem gibt es in jedem Rechenzentrum einen eigenen Dateispeicher. Sollte die Verbindung mal ausfallen, haben wir dort alle Logs. Sie werden dort verbleiben und bleiben erhalten.<\/p>\n<p><\/p>\n<p><strong>Frage<\/strong>: Erhalten Sie die Logs in Notfallsituationen von dort?<\/p>\n<p><\/p>\n<p><strong>Antwort<\/strong>: Kann man dorthin (zum Dateispeicher) gehen und nachsehen?<\/p>\n<p><\/p>\n<p><strong>Frage<\/strong>: Wie \u00fcberwachen Sie, dass keine Logs verloren gehen?<\/p>\n<p><\/p>\n<p><strong>Antwort<\/strong>: Wir verlieren sie tats\u00e4chlich, und wir \u00fcberwachen das. Die \u00dcberwachung wurde vor einem Monat gestartet. In der Bibliothek, die die Go API nutzt, gibt es Metriken. Sie kann z\u00e4hlen, wie oft sie nicht in den Socket schreiben konnte. Aktuell gibt es eine raffinierte Heuristik. Es gibt einen Puffer. Er versucht, Nachrichten aus diesem zu schreiben. Wenn der Puffer \u00fcberl\u00e4uft, beginnt er, diese zu verwerfen. Und z\u00e4hlt, wie viele er verworfen hat. Wenn die Z\u00e4hler beginnen, \u00fcberzulaufen, erfahren wir davon. Sie kommen jetzt auch nach Prometheus, und in Grafana kann man die Diagramme ansehen. Man kann Benachrichtigungen einrichten. Aber momentan ist unklar, an wen sie gesendet werden sollen.<\/p>\n<p><\/p>\n<p><strong>Frage<\/strong>: Speichern Sie Protokolle in Elasticsearch mit einer Sicherung. Wie viele Replikate haben Sie?<\/p>\n<p><\/p>\n<p><strong>Antwort<\/strong>: Eine Replikat.<\/p>\n<p><\/p>\n<p><strong>Frage<\/strong>: Ist das nur ein Replikat?<\/p>\n<p><\/p>\n<p><strong>Antwort<\/strong>: Das ist Master und Replikat. Die Daten werden in zwei Exemplaren gespeichert.<\/p>\n<p><\/p>\n<p><strong>Frage<\/strong>: Haben Sie die Gr\u00f6\u00dfe des rsyslog-Puffers irgendwie angepasst? <\/p>\n<p><\/p>\n<p><strong>Antwort<\/strong>: Wir schreiben Datagramme in einen benutzerdefinierten Unix-Socket. Das setzt uns sofort eine Grenze von 128 Kilobyte. Mehr k\u00f6nnen wir nicht darin speichern. Das haben wir in den Standard aufgenommen. Wer Zugriff auf die Speicherplatz haben m\u00f6chte, muss 128 Kilobyte beachten. Die Bibliotheken k\u00fcrzen die Nachrichten und setzen ein Flag, das angibt, dass die Nachricht gek\u00fcrzt wurde. In unserem Standard f\u00fcr die Nachricht gibt es ein spezielles Feld, das zeigt, ob sie beim Schreiben gek\u00fcrzt wurde oder nicht. So k\u00f6nnen wir diesen Aspekt ebenfalls nachvollziehen.<\/p>\n<p><\/p>\n<p><strong>Frage<\/strong>: Schreiben Sie kaputte JSON-Daten? <\/p>\n<p><\/p>\n<p><strong>Antwort<\/strong>: Kaputte JSON-Daten werden entweder w\u00e4hrend des Relays verworfen, weil das Paket zu gro\u00df ist, oder von Graylog zur\u00fcckgewiesen, weil es die JSON-Struktur nicht parsen kann. Aber es gibt einige Details, die behoben werden m\u00fcssen, und diese h\u00e4ngen gr\u00f6\u00dftenteils mit rsyslog zusammen. Ich habe bereits einige Issues dort eingetragen, an denen noch gearbeitet werden muss.<\/p>\n<p><\/p>\n<p><strong>Frage<\/strong>: Warum Kafka? Haben Sie es mit RabbitMQ versucht? Funktioniert Graylog bei solch hohen Lasten nicht?<\/p>\n<p><\/p>\n<p><strong>Antwort<\/strong>: Graylog stellt sich als nicht ideal f\u00fcr uns heraus. Tats\u00e4chlich sind wir mit Graylog nicht zufrieden. Es gibt viele Probleme damit. Es ist eine eigenwillige L\u00f6sung. Und ehrlich gesagt, brauchen wir es nicht. Ich w\u00fcrde es vorziehen, direkt von rsyslog in Elasticsearch zu schreiben und dann Kibana zu nutzen. Doch wir m\u00fcssen zuerst die Sicherheitsfragen kl\u00e4ren. Das k\u00f6nnte eine m\u00f6gliche Entwicklungsrichtung f\u00fcr uns sein, wenn wir Graylog abschaffen und Kibana verwenden. Logstash w\u00e4re nicht sinnvoll, denn alles, was ich brauche, kann ich auch mit rsyslog erledigen. Es hat sogar ein Modul zum Schreiben in Elasticsearch. Mit Graylog versuchen wir, irgendwie zurechtzukommen. Wir haben es sogar ein wenig optimiert. Aber es gibt noch Raum f\u00fcr Verbesserungen.<\/p>\n<p><\/p>\n<p>\u00dcber Kafka. Das hat sich historisch so ergeben. Als ich kam, war sie bereits vorhanden und es wurden schon Logs geschrieben. Wir haben einfach unseren Cluster hochgefahren und die Logs dorthin verschoben. Wir verwalten ihn und wissen, wie es ihm geht. Zur RabbitMQ... wir haben keine gute Erfahrung mit RabbitMQ. Aber unsere RabbitMQ-Instanz l\u00e4uft gut. Wir haben sie in der Produktion und hatten einige Probleme damit. Kurz vor der Verkaufsaktion wurde sie optimiert und funktioniert jetzt gut. Aber davor war ich nicht bereit, sie in die Produktion zu bringen. Es gibt noch einen weiteren Punkt. Graylog kann die Version AMQP 0.9 lesen, w\u00e4hrend rsyslog die Version AMQP 1.0 schreiben kann. Es gibt keine L\u00f6sung, die beides kann. Entweder das eine oder das andere. Daher nutzen wir momentan nur Kafka. Aber auch da gibt es eigene Nuancen. Denn omkafka der rsyslog-Version, die wir verwenden, kann den gesamten Nachrichtenpuffer verlieren, den sie von rsyslog abgezogen hat. Momentan nehmen wir das in Kauf. <\/p>\n<p><\/p>\n<p><strong>Frage<\/strong>: Nutzen Sie Kafka, weil es bereits vorhanden war? F\u00fcr keine anderen Zwecke wird es nicht verwendet?<\/p>\n<p><\/p>\n<p><strong>Antwort<\/strong>: Kafka, die verwendet wird, wird vom Data Science Team genutzt. Es ist ein ganz eigenes Projekt, \u00fcber das ich leider nichts sagen kann. Ich bin unwissend dar\u00fcber. Es war in der Verantwortung des Data Science Teams. Als die Logs eingerichtet wurden, haben wir beschlossen, sie zu verwenden, um nicht zus\u00e4tzlich unsere eigene einzurichten. Jetzt haben wir Graylog aktualisiert und dabei die Kompatibilit\u00e4t verloren, da dort eine \u00e4ltere Version von Kafka ist. Wir mussten unsere eigene einrichten. So haben wir auch diese vier Topics f\u00fcr jede API losgeworden. Wir haben ein breites Topic f\u00fcr alle Live-Umgebungen erstellt, ein breites Topic f\u00fcr alle Staging-Umgebungen und schieben einfach alles dort hinein. Graylog filtert das alles parallel heraus.<\/p>\n<p><\/p>\n<p><strong>Frage<\/strong>: Warum ist dieses Schamanenwerk mit den Sockets notwendig? Haben Sie versucht, den Log-Treiber Syslog f\u00fcr Container zu verwenden?<\/p>\n<p><\/p>\n<p><strong>Antwort<\/strong>: Zu der Zeit, als wir uns mit diesem Thema befassten, war unsere Beziehung zu Docker angespannt. Es war Docker 1.0 oder 0.9. Docker selbst war irgendwie seltsam. Zweitens, wenn man auch noch Logs hineinschieben will\u2026 Ich habe das unbegr\u00fcndete Gef\u00fchl, dass er alle Logs durch sich selbst, durch den Docker-Daemon, leitet. Wenn eine API verr\u00fcckt spielt, sto\u00dfen die anderen APIs auf das Problem, dass sie stdout und stderr nicht senden k\u00f6nnen. Ich wei\u00df nicht, wohin das f\u00fchrt. Ich habe das Gef\u00fchl, dass wir in diesem Fall den Syslog-Treiber von Docker nicht verwenden sollten. Unsere Abteilung f\u00fcr funktionale Tests hat ihren eigenen kleinen Graylog-Cluster f\u00fcr Logs. Sie nutzen die Log-Treiber von Docker und scheinbar l\u00e4uft alles gut. Aber sie schreiben GELF direkt in Graylog. Zu dem Zeitpunkt, als wir damit anfingen, mussten wir sicherstellen, dass es einfach funktioniert. Eventuell, wenn jemand kommt und sagt, dass es schon seit Jahren problemlos l\u00e4uft, werden wir es ausprobieren.<\/p>\n<p><\/p>\n<p><strong>Frage<\/strong>: Die Lieferung zwischen den Rechenzentren erfolgt \u00fcber rsyslog. Warum nicht \u00fcber Kafka?<\/p>\n<p><\/p>\n<p><strong>Antwort<\/strong>: Wir machen es tats\u00e4chlich auf beide Arten. Aus zwei Gr\u00fcnden. Wenn der Kanal v\u00f6llig \u00fcberlastet ist, passen unsere Protokolle selbst im komprimierten Format nicht mehr hindurch. Und Kafka erm\u00f6glicht es, sie w\u00e4hrend des Prozesses einfach zu verlieren. Auf diese Weise vermeiden wir das Festh\u00e4ngen dieser Protokolle. In diesem Fall nutzen wir Kafka direkt. Wenn wir jedoch einen guten Kanal haben und ihn entlasten m\u00f6chten, verwenden wir rsyslog. Tats\u00e4chlich kann man es so einstellen, dass es automatisch das herausfiltert, was nicht hindurch passt. Momentan verwenden wir an einigen Stellen die direkte Zustellung \u00fcber rsyslog und an anderen Stellen Kafka.<\/p>\n<p>Quelle: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/450098\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041b\u043e\u0433\u0438 \u2014 \u0432\u0430\u0436\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0430\u044f \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u043e\u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 (\u043b\u0438\u0431\u043e \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442), \u043a\u0430\u043a \u043e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f. \u0412 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043d\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u043b\u043e\u0433\u0430\u043c\u0438 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u043e\u0439 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u043e\u043b\u0438\u043c\u043f\u0438\u0430\u0434\u044b. \u041d\u0443\u0436\u043d\u043e \u0440\u0435\u0448\u0438\u0442\u044c \u0441\u0440\u0430\u0437\u0443 \u043a\u0443\u0447\u0443 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432: \u043a\u0430\u043a \u043f\u0438\u0441\u0430\u0442\u044c \u043b\u043e\u0433\u0438 \u0438\u0437 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f; \u043a\u0443\u0434\u0430 \u043f\u0438\u0441\u0430\u0442\u044c \u043b\u043e\u0433\u0438; \u043a\u0430\u043a \u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u043b\u043e\u0433\u0438 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438; \u043a\u0430\u043a \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0438 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043b\u043e\u0433\u0438. \u041f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u043d\u044b\u043d\u0435 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":24507,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-32723","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041b\u043e\u0433\u0438 \u2014 \u0432\u0430\u0436\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0430\u044f \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u043e\u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 (\u043b\u0438\u0431\u043e \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442), \u043a\u0430\u043a \u043e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f. \u0412 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043d\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u043b\u043e\u0433\u0430\u043c\u0438 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u043e\u0439 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u043e\u043b\u0438\u043c\u043f\u0438\u0430\u0434\u044b. \u041d\u0443\u0436\u043d\u043e \u0440\u0435\u0448\u0438\u0442\u044c \u0441\u0440\u0430\u0437\u0443 \u043a\u0443\u0447\u0443 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432: \u043a\u0430\u043a \u043f\u0438\u0441\u0430\u0442\u044c \u043b\u043e\u0433\u0438 \u0438\u0437 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f; \u043a\u0443\u0434\u0430 \u043f\u0438\u0441\u0430\u0442\u044c \u043b\u043e\u0433\u0438; \u043a\u0430\u043a \u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u043b\u043e\u0433\u0438 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438; \u043a\u0430\u043a \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0438 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043b\u043e\u0433\u0438. \u041f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u043d\u044b\u043d\u0435\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/yurij-bushmelev-karta-grablej-na-pole-sbora-i-dostavki-logov-rasshifrovka-doklada\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"de_DE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u042e\u0440\u0438\u0439 \u0411\u0443\u0448\u043c\u0435\u043b\u0435\u0432 \u00ab\u041a\u0430\u0440\u0442\u0430 \u0433\u0440\u0430\u0431\u043b\u0435\u0439 \u043d\u0430 \u043f\u043e\u043b\u0435 \u0441\u0431\u043e\u0440\u0430 \u0438 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u043b\u043e\u0433\u043e\u0432\u00bb \u2014 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0430 \u0434\u043e\u043a\u043b\u0430\u0434\u0430 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041b\u043e\u0433\u0438 \u2014 \u0432\u0430\u0436\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0430\u044f \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u043e\u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 (\u043b\u0438\u0431\u043e \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442), \u043a\u0430\u043a \u043e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f. \u0412 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043d\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u043b\u043e\u0433\u0430\u043c\u0438 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u043e\u0439 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u043e\u043b\u0438\u043c\u043f\u0438\u0430\u0434\u044b. \u041d\u0443\u0436\u043d\u043e \u0440\u0435\u0448\u0438\u0442\u044c \u0441\u0440\u0430\u0437\u0443 \u043a\u0443\u0447\u0443 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432: \u043a\u0430\u043a \u043f\u0438\u0441\u0430\u0442\u044c \u043b\u043e\u0433\u0438 \u0438\u0437 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f; \u043a\u0443\u0434\u0430 \u043f\u0438\u0441\u0430\u0442\u044c \u043b\u043e\u0433\u0438; \u043a\u0430\u043a \u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u043b\u043e\u0433\u0438 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438; \u043a\u0430\u043a \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0438 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043b\u043e\u0433\u0438. \u041f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u043d\u044b\u043d\u0435\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/yurij-bushmelev-karta-grablej-na-pole-sbora-i-dostavki-logov-rasshifrovka-doklada\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T18:48:35+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T18:48:35+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Juri Bushmelev \u201eKarte der H\u00fcrden im Bereich der Sammlung und Lieferung von Protokollen\u201c \u2013 Transkription des Vortrags | ProHoster","description":"Protokolle sind ein wichtiger Bestandteil des Systems, der es erm\u00f6glicht zu verstehen, ob es funktioniert (oder nicht), wie erwartet. In einer Microservices-Architektur wird die Arbeit mit Protokollen zu einer eigenen Disziplin. Es m\u00fcssen zahlreiche Fragen gel\u00f6st werden: wie man Protokolle aus der Anwendung schreibt; wohin man Protokolle schreibt; wie man Protokolle zur Speicherung und Verarbeitung liefert; wie man Protokolle verarbeitet und speichert. Die Anwendung beliebter","canonical_url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/yurij-bushmelev-karta-grablej-na-pole-sbora-i-dostavki-logov-rasshifrovka-doklada","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"de_DE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u042e\u0440\u0438\u0439 \u0411\u0443\u0448\u043c\u0435\u043b\u0435\u0432 \u00ab\u041a\u0430\u0440\u0442\u0430 \u0433\u0440\u0430\u0431\u043b\u0435\u0439 \u043d\u0430 \u043f\u043e\u043b\u0435 \u0441\u0431\u043e\u0440\u0430 \u0438 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u043b\u043e\u0433\u043e\u0432\u00bb \u2014 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0430 \u0434\u043e\u043a\u043b\u0430\u0434\u0430 | ProHoster","og:description":"\u041b\u043e\u0433\u0438 \u2014 \u0432\u0430\u0436\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0430\u044f \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u043e\u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 (\u043b\u0438\u0431\u043e \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442), \u043a\u0430\u043a \u043e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f. \u0412 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043d\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u043b\u043e\u0433\u0430\u043c\u0438 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u043e\u0439 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u043e\u043b\u0438\u043c\u043f\u0438\u0430\u0434\u044b. \u041d\u0443\u0436\u043d\u043e \u0440\u0435\u0448\u0438\u0442\u044c \u0441\u0440\u0430\u0437\u0443 \u043a\u0443\u0447\u0443 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432: \u043a\u0430\u043a \u043f\u0438\u0441\u0430\u0442\u044c \u043b\u043e\u0433\u0438 \u0438\u0437 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f; \u043a\u0443\u0434\u0430 \u043f\u0438\u0441\u0430\u0442\u044c \u043b\u043e\u0433\u0438; \u043a\u0430\u043a \u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u043b\u043e\u0433\u0438 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438; \u043a\u0430\u043a \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0438 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043b\u043e\u0433\u0438. \u041f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u043d\u044b\u043d\u0435","og:url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/yurij-bushmelev-karta-grablej-na-pole-sbora-i-dostavki-logov-rasshifrovka-doklada","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T18:48:35+00:00","article:modified_time":"2019-10-31T18:48:35+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"32723","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-21 12:16:55","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 02:53:25","updated":"2026-01-21 12:16:55"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/32723","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=32723"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/32723\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/24507"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=32723"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=32723"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=32723"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}