WAL-G: neue Funktionen und Community-Erweiterung. Georgy Rylov

Ich schlage vor, dass Sie das Transkript des Berichts von Georgy Rylov Anfang 2020 „WAL-G: neue Möglichkeiten und Erweiterung der Community“ lesen.

Open-Source-Betreuer stehen im Laufe ihres Wachstums vor vielen Herausforderungen. Wie schreibe ich immer mehr erforderliche Funktionen, behebe immer mehr Probleme und schaffe es, immer mehr Pull-Requests anzuzeigen? Am Beispiel von WAL-G (Backup-Tool für PostgreSQL) erzähle ich Ihnen, wie wir diese Probleme gelöst haben, indem wir an der Universität einen Kurs über Open-Source-Entwicklung eingeführt haben, was wir erreicht haben und wohin wir als nächstes gehen werden.

WAL-G: neue Funktionen und Community-Erweiterung. Georgy Rylov

Hallo nochmal alle zusammen! Ich bin ein Yandex-Entwickler aus Jekaterinburg. Und heute werde ich über WAL-G sprechen.

Im Titel des Berichts stand nicht, dass es sich um Backups handelte. Weiß jemand, was WAL-G ist? Oder weiß es jeder? Heben Sie Ihre Hand, wenn Sie es nicht wissen. Heilige Scheiße, du bist auf den Bericht gekommen und weißt nicht, worum es geht.

Lassen Sie mich Ihnen sagen, was heute passieren wird. Zufälligerweise führt unser Team schon seit geraumer Zeit Backups durch. Und dies ist ein weiterer Bericht in einer Reihe, in der wir darüber sprechen, wie wir Daten sicher, bequem und effizient speichern.

WAL-G: neue Funktionen und Community-Erweiterung. Georgy Rylov

In früheren Serien gab es viele Berichte von Andrei Borodin und Vladimir Leskov. Wir waren viele. Und wir reden schon seit vielen Jahren über WAL-G.

clck.ru/F8ioz — https://www.highload.ru/moscow/2018/abstracts/3964

clck.ru/Ln8Qw — https://www.highload.ru/moscow/2019/abstracts/5981

Dieser Bericht wird sich insofern ein wenig von den anderen unterscheiden, als es mehr um den technischen Teil ging, aber hier werde ich darüber sprechen, wie wir auf Probleme im Zusammenhang mit dem Wachstum der Community gestoßen sind. Und wie wir auf eine kleine Idee kamen, die uns dabei hilft, damit klarzukommen.

WAL-G: neue Funktionen und Community-Erweiterung. Georgy Rylov

Vor ein paar Jahren war WAL-G ein recht kleines Projekt, das wir von Citus Data bekamen. Und wir haben es einfach genommen. Und es wurde von einer Person entwickelt.

Und nur WAL-G hatte nicht:

  • Backup von einer Replik.
  • Es gab keine inkrementellen Backups.
  • Es gab keine WAL-Delta-Backups.
  • Und es fehlte noch eine ganze Menge.

In diesen wenigen Jahren ist WAL-G stark gewachsen.

WAL-G: neue Funktionen und Community-Erweiterung. Georgy Rylov

Und bis 2020 sind alle oben genannten Dinge bereits erschienen. Und dazu kam noch das, was wir jetzt haben:

  • Mehr als 1 Sterne auf GitHub.
  • 150 Gabeln.
  • Ungefähr 15 offene PRs.
  • Und viele weitere Mitwirkende.
  • Und ständig offene Fragen. Und das, obwohl wir buchstäblich jeden Tag dorthin gehen und etwas dagegen unternehmen.

WAL-G: neue Funktionen und Community-Erweiterung. Georgy Rylov

Und wir kamen zu dem Schluss, dass dieses Projekt mehr Aufmerksamkeit erfordert, auch wenn wir selbst nichts für unseren Managed Databases-Dienst in Yandex implementieren müssen.

Und irgendwann im Herbst 2018 kam uns eine Idee. Normalerweise hat das Team mehrere Möglichkeiten, einige Funktionen zu entwickeln oder Fehler zu beheben, wenn Sie nicht genügend Hände haben. Sie können beispielsweise einen anderen Entwickler einstellen und ihm Geld zahlen. Oder Sie übernehmen einen Praktikanten für eine Weile und zahlen ihm auch etwas Gehalt. Aber es gibt immer noch eine ziemlich große Gruppe von Leuten, von denen einige bereits wirklich wissen, wie man Code schreibt. Man weiß einfach nicht immer, welche Qualität der Code hat.

Wir haben darüber nachgedacht und beschlossen, zu versuchen, Studenten anzulocken. Aber Studierende werden bei uns nicht alles mitmachen. Sie werden nur einen Teil der Arbeit erledigen. Und sie werden beispielsweise Tests schreiben, Fehler beheben und Funktionen implementieren, die die Hauptfunktionalität nicht beeinträchtigen. Die Hauptfunktionalität besteht darin, Backups zu erstellen und Backups wiederherzustellen. Wenn wir beim Erstellen eines Backups einen Fehler machen, kommt es zu Datenverlust. Und das will natürlich niemand. Jeder möchte, dass alles sehr sicher ist. Daher möchten wir natürlich nicht zulassen, dass Code, dem wir vertrauen, weniger vertrauen als unserem eigenen. Das heißt, wir möchten von unseren zusätzlichen Mitarbeitern jeden unkritischen Code erhalten.

Unter welchen Bedingungen wird studentische PR akzeptiert?

  • Sie sind verpflichtet, ihren Code mit Tests abzudecken. Alles sollte in CI stattfinden.
  • Und wir gehen auch 2 Bewertungen durch. Einer von Andrey Borodin und einer von mir.
  • Und um zu überprüfen, dass dadurch nichts in unserem Dienst beschädigt wird, lade ich die Assembly mit diesem Commit separat hoch. Und wir prüfen in End-to-End-Tests, dass nichts fehlschlägt.

Spezialkurs zu Open Source

WAL-G: neue Funktionen und Community-Erweiterung. Georgy Rylov

Ein wenig darüber, warum dies notwendig ist und warum dies meiner Meinung nach eine coole Idee ist.

Für uns liegt der Gewinn klar auf der Hand:

  • Wir bekommen zusätzliche Hände.
  • Und wir suchen Kandidaten für das Team unter klugen Studenten, die intelligenten Code schreiben.

Welchen Nutzen haben Studierende?

Sie sind möglicherweise weniger offensichtlich, da Studenten zumindest kein Geld für den Code erhalten, den sie schreiben, sondern nur Noten für ihre Studienunterlagen.

Ich habe sie danach gefragt. Und in ihren Worten:

  • Erfahrung als Mitwirkender im Bereich Open Source.
  • Holen Sie sich eine Zeile in Ihren Lebenslauf.
  • Beweisen Sie sich und bestehen Sie ein Vorstellungsgespräch bei Yandex.
  • Werden Sie GSoC-Mitglied.
  • +1 Spezialkurs für diejenigen, die Code schreiben möchten.

Ich werde nicht darüber sprechen, wie der Kurs aufgebaut war. Ich sage nur, dass WAL-G das Hauptprojekt war. Wir haben auch Projekte wie Odyssey, PostgreSQL und ClickHouse in diesen Kurs einbezogen.

Und sie gaben nicht nur in diesem Kurs Probleme, sondern verteilten auch Diplome und Studienleistungen.

Wie sieht es mit dem Nutzen für die Benutzer aus?

Kommen wir nun zu dem Teil, der Sie am meisten interessiert. Was nützt dir das? Der Punkt ist, dass die Schüler viele Fehler behoben haben. Und wir haben die von Ihnen gewünschten Funktionen umgesetzt.

Und lassen Sie mich Ihnen von den Dingen erzählen, die Sie sich schon lange gewünscht und verwirklicht haben.

WAL-G: neue Funktionen und Community-Erweiterung. Georgy Rylov

Unterstützung für Tablespaces. Tablespaces in WAL-G wurden wahrscheinlich seit der Veröffentlichung von WAL-G erwartet, da WAL-G der Nachfolger eines anderen Backup-Tools WAL-E ist, bei dem Datenbanksicherungen mit Tablespaces unterstützt wurden.

Lassen Sie mich kurz daran erinnern, was es ist und warum es alles notwendig ist. Normalerweise belegen alle Ihre Postgres-Daten ein Verzeichnis im Dateisystem, das als Basis bezeichnet wird. Und dieses Verzeichnis enthält bereits alle von Postgres benötigten Dateien und Unterverzeichnisse.

Tablespaces sind Verzeichnisse, die Postgres-Daten enthalten, sich jedoch nicht außerhalb des Basisverzeichnisses befinden. Die Folie zeigt, dass sich die Tablespaces außerhalb des Basisverzeichnisses befinden.

WAL-G: neue Funktionen und Community-Erweiterung. Georgy Rylov

Wie sieht das für Postgres selbst aus? Im Basisverzeichnis gibt es ein separates Unterverzeichnis pg_tblspc. Und es enthält symbolische Links zu Verzeichnissen, die tatsächlich Postgres-Daten außerhalb des Basisverzeichnisses enthalten.

WAL-G: neue Funktionen und Community-Erweiterung. Georgy Rylov

Wenn Sie all dies verwenden, sehen diese Befehle für Sie möglicherweise etwa so aus. Das heißt, Sie erstellen eine Tabelle in einem bestimmten Tabellenbereich und sehen, wo sie sich jetzt befindet. Dies sind die letzten beiden Zeilen, die letzten beiden aufgerufenen Befehle. Und da ist klar, dass es einen Weg gibt. Aber in Wirklichkeit ist dies nicht der wahre Weg. Dies ist der vorangestellte Pfad vom Basisverzeichnis zum Tablespace. Und von dort wird es mit einem Symlink verknüpft, der zu Ihren echten Daten führt.

Wir verwenden dies alles nicht in unserem Team, aber es wurde von vielen anderen WAL-E-Benutzern verwendet, die uns geschrieben haben, dass sie zu WAL-G wechseln wollten, aber das hielt sie davon ab. Dies wird jetzt unterstützt.

WAL-G: neue Funktionen und Community-Erweiterung. Georgy Rylov

Ein weiteres Feature, das uns unser Spezialkurs gebracht hat, ist das Aufholen. Leute, die wahrscheinlich mehr mit Oracle als mit Postgres gearbeitet haben, wissen, wie man aufholt.

Kurz darüber, was es ist. Die Cluster-Topologie in unserem Dienst sieht normalerweise etwa so aus. Wir haben einen Meister. Es gibt ein Replikat, das das Write-Ahead-Protokoll von dort streamt. Und das Replikat teilt dem Master mit, auf welchem ​​LSN es sich gerade befindet. Und irgendwo parallel dazu kann das Protokoll archiviert werden. Und zusätzlich zur Archivierung des Protokolls werden auch Backups in die Cloud gesendet. Und es werden Delta-Backups verschickt.

Was könnte das Problem sein? Wenn Sie über eine relativ große Datenbank verfügen, kann es sein, dass Ihr Replikat weit hinter dem Master zurückbleibt. Und sie hinkt so weit hinterher, dass sie ihn nie mehr einholen kann. Dieses Problem muss normalerweise irgendwie gelöst werden.

Und der einfachste Weg ist, das Replikat zu entfernen und erneut hochzuladen, da es nie aufholen wird und das Problem behoben werden muss. Das ist aber eine ziemlich lange Zeit, denn die Wiederherstellung einer kompletten 10-TB-Datenbanksicherung dauert sehr, sehr lange. Und das alles wollen wir schnellstmöglich erledigen, wenn solche Probleme auftreten. Und genau dafür ist Aufholjagd da.

Catchup ermöglicht die Nutzung von Delta-Backups, die auf diese Weise in der Cloud gespeichert werden. Sie sagen, auf welchem ​​LSN sich das verzögerte Replikat derzeit befindet, und geben es im Catchup-Befehl an, um ein Delta-Backup zwischen diesem LSN und dem LSN zu erstellen, auf dem sich Ihr Cluster derzeit befindet. Anschließend stellen Sie dieses Backup auf dem Replikat wieder her, das im Rückstand war.

Andere Basen

Die Studierenden haben uns auch viele Features auf einmal mitgebracht. Da wir bei Yandex nicht nur Postgres kochen, sondern auch MySQL, MongoDB, Redis und ClickHouse haben, mussten wir irgendwann in der Lage sein, Backups mit Point-in-Time-Wiederherstellung für MySQL zu erstellen und damit die Möglichkeit zum Hochladen zu haben sie in die Cloud.

Und wir wollten es auf ähnliche Weise machen wie WAL-G. Und wir beschlossen, zu experimentieren und zu sehen, wie das Ganze aussehen würde.

Und ohne diese Logik in irgendeiner Weise zu teilen, schrieben sie zunächst den Code in den Fork. Sie haben gesehen, dass wir eine Art funktionierendes Modell haben und es fliegen kann. Dann dachten wir, dass unsere Hauptgemeinschaft Postgresists sind, sie verwenden WAL-G. Und deshalb müssen wir diese Teile irgendwie trennen. Das heißt, wenn wir Code für Postgres bearbeiten, beschädigen wir MySQL nicht; wenn wir MySQL bearbeiten, beschädigen wir Postgres nicht.

WAL-G: neue Funktionen und Community-Erweiterung. Georgy Rylov

Die erste Idee, dies zu trennen, war die Idee, denselben Ansatz zu verwenden, der in PostgreSQL-Erweiterungen verwendet wird. Und tatsächlich musste man zum Erstellen eines MySQL-Backups eine Art dynamische Bibliothek installieren.

Aber hier wird die Asymmetrie dieses Ansatzes sofort sichtbar. Wenn Sie Postgres sichern, legen Sie ein normales Backup für Postgres darauf ab und alles ist in Ordnung. Und für MySQL stellt sich heraus, dass Sie ein Backup für Postgres installieren und dafür auch eine dynamische Bibliothek für MySQL installieren. Es klingt irgendwie seltsam. Das dachten wir auch und kamen zu dem Schluss, dass dies nicht die Lösung war, die wir brauchten.

Verschiedene Builds für Postgres, MySQL, MongoDB, Redis

Aber dies ermöglichte es uns, so scheint es uns, die richtige Entscheidung zu treffen – unterschiedliche Baugruppen für verschiedene Stützpunkte zuzuweisen. Dadurch war es möglich, die Logik zu isolieren, die mit Backups verschiedener Datenbanken verbunden ist, die auf die gemeinsame API zugreifen, die WAL-G implementiert.

WAL-G: neue Funktionen und Community-Erweiterung. Georgy Rylov

Dies ist der Teil, den wir selbst geschrieben haben – bevor wir den Schülern die Aufgaben gaben. Das heißt, das ist genau der Teil, wo sie etwas falsch machen könnten, also haben wir beschlossen, dass wir so etwas besser machen sollten und alles wird gut.

WAL-G: neue Funktionen und Community-Erweiterung. Georgy Rylov

Danach haben wir Probleme ausgegeben. Sie wurden sofort abgebaut. Die Schüler mussten drei Stützpunkte unterstützen.

Das ist MySQL, das wir seit mehr als einem Jahr auf diese Weise mit WAL-G sichern.

Und jetzt nähert sich MongoDB der Produktion, wo sie es mit einer Datei fertigstellen. Tatsächlich haben wir das Framework für all das geschrieben. Dann schrieben die Schüler einige umsetzbare Dinge. Und dann bringen wir sie in einen Zustand, den wir in der Produktion akzeptieren können.

Diese Probleme sahen nicht so aus, als müssten die Schüler für jede dieser Datenbanken vollständige Sicherungstools schreiben. So ein Problem hatten wir nicht. Unser Problem bestand darin, dass wir eine Point-in-Time-Wiederherstellung und ein Backup in die Cloud wollten. Und sie baten die Schüler, einen Code zu schreiben, der dieses Problem lösen würde. Die Studenten verwendeten bereits vorhandene Backup-Tools, die irgendwie Backups erstellen, und klebten dann alles mit WAL-G zusammen, das alles an die Cloud weiterleitete. Und sie haben auch eine Point-in-Time-Recovery hinzugefügt.

WAL-G: neue Funktionen und Community-Erweiterung. Georgy Rylov

Was haben die Schüler sonst noch mitgebracht? Sie brachten die Libsodium-Verschlüsselungsunterstützung für WAL-G.

Wir haben auch Backup-Speicherrichtlinien. Jetzt können Backups als dauerhaft markiert werden. Und irgendwie ist es für Ihren Dienst bequemer, den Prozess der Speicherung zu automatisieren.

WAL-G: neue Funktionen und Community-Erweiterung. Georgy Rylov

Was war das Ergebnis dieses Experiments?

Für den Kurs hatten sich zunächst mehr als 100 Personen angemeldet. Zuerst habe ich nicht gesagt, dass die Universität in Jekaterinburg die Uraler Föderale Universität ist. Dort haben wir alles angekündigt. 100 Personen haben sich angemeldet. In Wirklichkeit haben viel weniger Leute angefangen, etwas zu tun, nämlich etwa 30 Leute.

Noch weniger Leute haben den Kurs abgeschlossen, weil es notwendig war, Tests für die bereits vorhandenen Codes zu schreiben. Und beheben Sie auch einige Fehler oder erstellen Sie eine Funktion. Und einige Studenten haben den Kurs trotzdem geschlossen.

Derzeit haben die Studierenden während dieses Kurses etwa 14 Probleme behoben und 10 Features unterschiedlicher Größe erstellt. Und es scheint mir, dass dies ein vollwertiger Ersatz für ein oder zwei Entwickler ist.

Unter anderem haben wir Diplome und Studienleistungen ausgestellt. Und 12 erhielten Diplome. 6 von ihnen haben sich bereits bei „5“ gewehrt. Die Zurückgebliebenen hatten noch keinen Schutz, aber ich denke, dass auch für sie alles gut werden wird.

Pläne für die Zukunft

Welche Pläne haben wir für die Zukunft?

Zumindest jene Funktionswünsche, die wir bereits von Nutzern gehört haben und umsetzen wollen. Das:

  • Überwachen der Korrektheit der Zeitachsenverfolgung im HA-Cluster-Backup-Archiv. Sie können dies mit WAL-G tun. Und ich denke, wir werden Studierende haben, die sich mit diesem Thema befassen.
  • Wir haben bereits eine Person, die für die Übertragung von Backups und WAL zwischen Clouds verantwortlich ist.
  • Und wir haben kürzlich eine Idee veröffentlicht, dass wir WAL-G noch weiter beschleunigen können, indem wir inkrementelle Backups entpacken, ohne Seiten neu zu schreiben, und die Archive, die wir dorthin senden, optimieren.

Sie können sie hier teilen

Wozu diente dieser Bericht? Darüber hinaus haben wir jetzt zusätzlich zu den 4 Menschen, die dieses Projekt unterstützen, zusätzliche Hände, und zwar ziemlich viele. Vor allem, wenn Sie ihnen in einer persönlichen Nachricht schreiben. Und wenn Sie Ihre Daten sichern und dies mit WAL-G tun oder auf WAL-G umsteigen möchten, können wir Ihre Wünsche ganz einfach berücksichtigen.

WAL-G: neue Funktionen und Community-Erweiterung. Georgy Rylov

Dies ist ein QR-Code und ein Link. Sie können sie durchgehen und alle Ihre Wünsche aufschreiben. Beispielsweise beheben wir einige Fehler nicht. Oder Sie möchten unbedingt eine Funktion, die aber aus irgendeinem Grund noch in keinem Backup enthalten ist, auch nicht in unserem. Schreiben Sie unbedingt darüber.

WAL-G: neue Funktionen und Community-Erweiterung. Georgy Rylov

Fragen

Guten Tag! Danke für den Bericht! Frage zu WAL-G, aber nicht zu Postgres. WAL-G sichert MySQL und ruft ein zusätzliches Backup auf. Wenn wir moderne Installationen auf CentOS nehmen und MySQL installieren, wird MariDB installiert. Ab Version 10.3 wird kein zusätzliches Backup unterstützt, MariDB-Backup wird unterstützt. Wie geht es dir damit?

Im Moment haben wir nicht versucht, MariDB zu sichern. Wir haben Anfragen nach FoundationDB-Unterstützung erhalten, aber wenn es eine solche Anfrage gibt, können wir im Allgemeinen Leute finden, die dies tun. Es ist nicht so lang oder so schwierig, wie ich denke.

Guten Tag! Danke für den Bericht! Frage zu möglichen neuen Funktionen. Sind Sie bereit, WAL-G mit Bändern arbeiten zu lassen, sodass Sie Backups auf Bändern durchführen können?

Backup auf Bandspeicher heißt das offenbar?

Ja.

Es gibt Andrei Borodin, der diese Frage besser beantworten kann als ich.

(Andrey) Ja, danke für die Frage! Wir hatten die Anfrage, ein Backup vom Cloud-Speicher auf Band zu übertragen. Und dafür Sägen Transfer zwischen Wolken. Denn die Cloud-zu-Cloud-Übertragung ist eine verallgemeinerte Version der Bandübertragung. Darüber hinaus verfügen wir über eine erweiterbare Architektur in Bezug auf Speicher. Viele Storoges wurden übrigens von Studenten geschrieben. Und wenn Sie Storage für Band schreiben, wird es natürlich unterstützt. Wir sind bereit, Pull-Anfragen zu berücksichtigen. Dort müssen Sie eine Datei schreiben, eine Datei lesen. Wenn Sie diese Dinge in Go tun, erhalten Sie normalerweise 50 Codezeilen. Und dann wird Band in WAL-G unterstützt.

Danke für den Bericht! Interessanter Entwicklungsprozess. Backup ist eine wichtige Funktionalität, die durch Tests gut abgedeckt werden sollte. Haben die Studenten bei der Implementierung von Funktionen für neue Datenbanken auch die Tests geschrieben, oder haben Sie die Tests selbst geschrieben und die Implementierung dann den Studenten übergeben?

Die Studierenden schrieben auch Tests. Aber die Studenten schrieben mehr für Funktionen wie neue Datenbanken. Sie haben Integrationstests geschrieben. Und sie haben Unit-Tests geschrieben. Wenn die Integration erfolgreich ist, also im Moment, handelt es sich um ein Skript, das Sie manuell ausführen oder zum Beispiel über Cron ausführen lassen. Das heißt, das Skript dort ist sehr klar.

Die Studenten haben nicht viel Erfahrung. Nimmt die Überprüfung viel Zeit in Anspruch?

Ja, Rezensionen nehmen ziemlich viel Zeit in Anspruch. Das heißt, wenn mehrere Committer gleichzeitig kommen und sagen, dass ich dies und jenes getan habe, muss man normalerweise nachdenken und sich etwa einen halben Tag Zeit nehmen, um herauszufinden, was sie dort geschrieben haben. Denn der Code muss sorgfältig gelesen werden. Sie hatten kein Interview. Wir kennen sie nicht sehr gut, daher nimmt es viel Zeit in Anspruch.

Danke für den Bericht! Zuvor hatte Andrey Borodin erklärt, dass archive_command in WAL-G direkt aufgerufen werden sollte. Aber im Fall einer Art Cluster-Patrone benötigen wir zusätzliche Logik, um den Knoten zu bestimmen, von dem aus die Wellen gesendet werden sollen. Wie lösen Sie dieses Problem selbst?

Was ist hier Ihr Problem? Nehmen wir an, Sie haben ein synchrones Replikat, mit dem Sie ein Backup erstellen? Oder was?

(Andrey) Tatsache ist, dass WAL-G tatsächlich dazu gedacht ist, ohne Shell-Skripte verwendet zu werden. Wenn etwas fehlt, fügen wir die Logik hinzu, die in WAL-G enthalten sein sollte. Was die Herkunft der Archivierung angeht, glauben wir, dass die Archivierung vom aktuellen Master im Cluster erfolgen sollte. Die Archivierung von einer Replik ist eine schlechte Idee. Es gibt verschiedene mögliche Szenarien mit Problemen. Insbesondere Probleme bei der Archivierung von Zeitplänen und zusätzlichen Informationen. Danke für die Frage!

(Klarstellung: Wir haben Shell-Skripte abgeschafft in dieser Angelegenheit)

Guten Abend! Danke für den Bericht! Ich interessiere mich für die Catchup-Funktion, über die Sie gesprochen haben. Wir waren mit einer Situation konfrontiert, in der ein Replikat im Rückstand war und nicht aufholen konnte. Und ich habe in den WAL-G-Dokumenten keine Beschreibung dieser Funktion gefunden.

Catchup erschien buchstäblich am 20. Januar 2020. Die Dokumentation könnte etwas mehr Arbeit erfordern. Wir schreiben es selbst und wir schreiben es nicht besonders gut. Und vielleicht sollten wir anfangen, von den Schülern zu verlangen, dass sie es schreiben.

Ist es bereits veröffentlicht?

Der Pull-Request ist bereits tot, d. h. ich habe ihn überprüft. Ich habe dies auf einem Testcluster versucht. Bisher hatten wir keine Situation, in der wir dies in einem Kampfbeispiel testen konnten.

Wann ist damit zu rechnen?

Ich weiß nicht. Warten Sie einen Monat, wir werden das sicher überprüfen.

Source: habr.com

Kommentar hinzufügen