Kontext
Wir haben ActiveRecord::StatementInvalid
gestern innerhalb von 4 Stunden sporadische Fehler von MySQL-Servern gesehen. Die Fehler sind seitdem nicht mehr aufgetreten.
Seltsamerweise schienen SQL-Anweisungen beschädigt zu sein: ein zufälliges Zeichen oder mehr, das um 2 Bytes vorwärts oder rückwärts verschoben wurde. Zum Beispiel "Unknown table 'erades'"
für eine Abfrage für eine grades
Tabelle. Dies war nicht auf Tabellennamen beschränkt: Spaltennamen, SQL-Schlüsselwörter und Werte waren in diesen Abfragen betroffen.
Der Fehler
Ein Beispiel für Fehlermeldungen:
.
->,
: Tabelle '[Datenbankname] .id' existiert nicht: SELECT [..] FROM [..] INNER JOIN [..] ON [..] = `[Tabellenname]` .`id`. .
`
->b
: Falscher Tabellenname 'topic_setsb ON': SELECT [..] FROM [..] INNER JOIN `topic_sets` ON ...
s
->q
: Unbekannte Spalte 'aqsigned_ [redacted]' in 'Feldliste'
U
->W
: Sie haben einen Fehler in Ihrer SQL-Syntax. [..] in der Nähe von 'NWLL GROUP BY ...
8
->:
: Sie haben einen Fehler in Ihrer SQL-Syntax; [..] in der Nähe von ': 887)' in Zeile 1: SELECT [..] WHERE [..] IN (48846, 48901, 48887)
Da MySQL wahrscheinlich nur den ersten Fehler in der Anweisung meldet, konnte ich die genaue Anzahl der Beschädigungen pro Anweisung nicht ermitteln. Die in der Nachricht enthaltene vollständige SQL-Abfrage scheint eine Kopie der auf der Clientseite gespeicherten Anweisung zu sein , und in diesem Teil der Nachricht war keine Beschädigung aufgetreten.
In einigen Fällen konnte ich anhand der Fehlermeldung nicht erkennen, welches Zeichen möglicherweise beschädigt wurde, z. B. "Die richtige Syntax für die Verwendung in der Nähe von '' in Zeile 1", und möglicherweise handelte es sich bei allen Beschädigungen nicht um Byte-Verschiebungen. Dies kann von nicht druckbaren Zeichen stammen oder es wurden möglicherweise Zeichen eingefügt / gelöscht.
Es gab ein etwas festes Muster in der Art und Weise, wie Aussagen verfälscht wurden, aber es schien keine eindeutige Regel zu geben. Beispiel: Es würde 10 bis 20 wenige Muster geben, bei denen dieselbe Aussage auf dieselbe Weise verfälscht wurde, aber die Position der Verfälschungen variiert zwischen diesen Mustern.
Das Fehlerprotokoll, das ich von der RDS-Konsole erhalten kann, ist leer. Für den Zeitraum wurde keine Verschlechterung des AWS-Dienstes gemeldet.
Insgesamt wurden 143 Fehler an unser Ausnahmeverfolgungstool gemeldet. Sie stammten von 4 Passagierarbeitern, 2 in derselben EC2-Instanz und die beiden anderen in einer anderen EC2-Instanz. Verteilung der Fehlerzahlen auf diese Mitarbeiter: 1, 41, 42, 50. Dies entspricht etwa 0,001% der gesamten Anfragen, die in den 4 Stunden, in denen dies geschah, bearbeitet wurden.
Für jeden Arbeiter traten Fehler in Rinnsalen auf: Jeder meldete diese Fehler etwa 5 Minuten lang, wobei 1-2 Fehler alle paar Sekunden bis 2-3 Minuten auftraten - abgesehen von dem, der nur 1 Fehler aufwies.
Einige Abfragen betrafen die Master-Datenbank, andere die Replikat-Datenbank.
Umwelt und andere Fakten:
- AWS RDS MySQL 5.6.39
- AWS EC2-Instanzen c4.4xlarge. Zu diesem Zeitpunkt gab es mehr als 15 Instanzen, die dieselbe Website bedienten.
- Apache 2, MPM-Modul: Ereignis
- Passagier 5.3.3, Parallelitätsmodell: Prozess. In der Regel gibt es mehr als 30 Worker-Prozesse in einer einzelnen EC2-Instanz.
- Rails 4.2.10, Datenbankpoolgröße: 2.
- MySQL-Client-Bibliothek: mysql2 0.4.10
- Ruby 2.3.7
Zeitleiste
instance A launch 2018-11-13 12:00 UTC
instance A process P errors 2018-11-13 13:40-13:43 UTC
instance A process Q errors 2018-11-13 14:22-14:26 UTC
instance A shutdown 2018-11-13 20:00 UTC
instance B launch 2018-11-13 15:00 UTC
instance B process R errors 2018-11-13 15:39-15:40 UTC
instance B process S errors 2018-11-13 17:39-17:43 UTC
instance B shutdown 2018-11-13 23:00 UTC
Mögliche Ursache
Ein Bekannter gab zu, dass er am selben Tag dieselbe Art von Fehler in AWS gesehen hatte, und verwies auf diesen Vortrag [1] über Datenkorruption auf Netzwerkebene: Es geht darum, wie Netzwerk-Switches die Ethernet-CRC eines Pakets beim Umleiten und Beschädigen während neu berechnen Der Umleitungsprozess kann zu einer "gültigen" CRC führen, und wie die TCP-Prüfsumme auch eine Lücke aufweist. ( Textnotizen von kevinchen.co ).
[1] !! Con 2017: Korruption im Rechenzentrum! TCP kann Ihre Daten nicht sicher aufbewahren! von Evan Jones
Ihre Empfehlung war, TLS für die gesamte Kommunikation zu verwenden, da die TLS-Schicht die beschädigten Bytes nicht entschlüsseln kann.
Ich habe auch diese Seite gefunden , die die Einschränkung von CRC und Prüfsumme beschreibt. Es gibt einen ähnlich aussehenden Fehler in dieser Serverfehlerfrage und die Ursache war auch netzwerkbezogen.
Ich bin zunehmend davon überzeugt, dass die Fehler durch einen Fehler auf Netzwerkebene verursacht werden.
Frage
Stimmt die Ethernet / TCP-Theorie mit dem von mir beschriebenen fehlerhaften Verhalten überein? Ich bin nicht sicher, ob nur ein Prozess gleichzeitig diesen Fehler sehen kann, obwohl es vermutlich passieren kann, wenn ein Switch entscheidet, Pakete basierend auf den Quell-Ziel-Port-Paaren unterschiedlich zu behandeln, da jede Verbindung a verwendet anderer Port.
Ich würde die Frage gerne neu formulieren, wenn es sich tatsächlich um eine XY-Frage handelt.
Hinweis: Ich habe im AWS-Forum eine Anfrage zur Bestätigung / Untersuchung gesendet, dass dies etwas von der AWS-Infrastruktur ist. Hier, in Serverfault, bin ich daran interessiert, etwas über die Plausibilität der Hypothese zu erfahren und wie sie das Verhalten zeigen kann, das ich gesehen habe (oder nicht).
quelle
Antworten:
Es liegt im Bereich der Plausibilität, schwer zu schließen. Die von Ihnen aufgelisteten Bit-Flips sind bei einer 8-Bit-Ausrichtung konsistent. Obwohl es interessant wäre, die gesamte Nachricht zu sehen, da (wahrscheinlich) auch andere Flips in den Netzwerkrahmen vorhanden sein müssten, um CRCs / Prüfsummen zu vereiteln.
In Bezug auf "nur einige Mitarbeiter auf demselben Computer melden Fehler" könnte dies sein: Die Last zwischen den Arbeitern ist nicht gleich, es ist einfach ein Effekt der Anzahl der pro Prozess generierten Datenverkehrsbytes oder wenn die Mitarbeiter dauerhafte Verbindungen aufrechterhalten. Sie haben gerade das Glücksspiel bei der Pfadauswahl verloren. Das heißt, die Mitarbeiter, die Fehler melden, haben Verbindungen, die auf den fehlerhaften Link gehasht werden, wenn sich irgendwo auf dem Weg mehrere aktive Links befinden. (Siehe, es ist nicht ungewöhnlich, Hash (srcip, srcport, dstip, dstport) für die Linkauswahl zu verwenden, sowohl für L2 (lacp / bond) als auch für L3 (ECMP)). Dies ist auch bei kürzeren Verbindungen möglich, obwohl dies jetzt weniger wahrscheinlich ist. Es ist auch durchaus möglich, dass AWS auch eine esoterischere Pfadauswahl für sein Netzwerk hat, was dafür verantwortlich sein könnte.
Normalerweise bin ich ein bisschen knorrig und suche nach anderen bestätigenden Beweisen, wie Prüfsummenfehlerzählern von OS, Nic und Switches / Routern, obwohl ich gerne sagen würde, dass die Aufteilung, die Sie bei einigen Instanzen haben, keine Probleme hat, während andere habe Probleme als gute bestätigende Beweise.
Flipmuster:
quelle