WARN [sys-#78%IgniteInstance1%] (Log4J2Logger.java:523) Partition states validation has failed for group: Cache1, msg: Partitions update counters are inconsistent for Part 32...
Ich versuche, mehrere IgniteDataStreamer-Instanzen zu verwenden, um einen Cache nach dem Start meines Clusters vorab zu laden, wie hier beschrieben, und ich habe dieses minimierte Beispiel zusammengestellt, um zu reproduzieren, was ich sehe. Jeder IgniteRunnable/IgniteDataStreamer streamt einen eindeutigen Satz von Schlüsseln in den Cache.
Im Wesentlichen habe ich diese beiden Klassen:
IgniteServerMain.java
public class PreloadRunnable implements IgniteRunnable {
private static final long serialVersionUID = 1L;
private final int jobId;
private final Random random = new Random();
public PreloadRunnable(int jobId) {
this.jobId = jobId;
}
@Override
public void run() {
try (IgniteDataStreamer streamer = Ignition
.ignite(IgniteServerMain.IGNITE_INSTANCE_NAME)
.dataStreamer(IgniteServerMain.CACHE_NAME)) {
for (int v = 0; v < 10_000; v++) {
char randomLetter = (char) ('A' + random.nextInt(26));
String k = randomLetter + "-" + String.format("%06d", jobId) + "-" + String.format("%06d", v);
streamer.addData(k, v);
}
}
}
}
Einige Szenarien:
Ich beobachte die WARN-Protokollierung, wann immer ich Knoten 1 starte vor Knoten 2. In diesem Szenario beginnt Knoten 1 mit dem Streamen von Daten in den Cache, kurz nachdem er erkennt, dass Knoten 2 dem Cluster beigetreten ist, und das Datenstreaming verzahnt sich mit einem Partition Map Exchange.
Wenn ich die Pause am Ende von „waitForServerNodesToBeAvailable von 100 Millisekunden auf 10 Sekunden ändere, wird die WARN-Protokollierung nicht angezeigt. Dadurch erhält die anfängliche PME Zeit, vor dem LoadCache fertig zu werden.
Wenn ich die Pause auf 100 ms zurücksetze und Knoten 1 nach Knoten 2 starte, dann kehrt die Ignition.start-Methode von Knoten 1 erst zurück, nachdem die anfängliche PME abgeschlossen ist, und daher sehe ich auch nicht WARN-Protokollierung in diesem Szenario.
In meinem Beispielcode habe ich nach LoadCache eine Schleife hinzugefügt, die alle 10 Sekunden programmgesteuert die IdleVerify-JMX-Methode von Ignite aufruft. In Szenario 1 bestätigt der erste IdleVerify-Aufruf, dass die Aktualisierungszähler inkonsistent sind. Etwas später sehe ich normalerweise eine Protokollierung, die darauf hinweist, dass die PME abgeschlossen ist. Und wenn dann der zweite IdleVerify-Aufruf ausgeführt wird, wird gemeldet, dass keine Konflikte gefunden wurden. Es scheint also, dass diese Partitionsaktualisierungszähler irgendwann konsistent sind. Ich habe außerdem festgestellt, dass, wenn ich die Datenmenge erhöhe, die LoadCache in den Cache streamt, es länger dauert, bis die erste PME abgeschlossen ist. Daher kann es viele Iterationen meiner IdleVerify-Schleife dauern, bis gemeldet wird, dass keine Konflikte vorliegen.
Fragen:
Was ist hier los? Die IgniteDataStreamer-API gibt an, dass „der Datenstreamer die Datenkonsistenz nicht garantiert, bis er erfolgreich abgeschlossen wurde“, aber dies scheint im Widerspruch zu den inkonsistenten Update-Zählern zu stehen, die ich sehe.
Welche Bedeutung haben diese inkonsistenten Update-Zähler? Besteht in diesem Zustand die Möglichkeit eines Datenverlusts? Und ist es richtig, dass diese Aktualisierungszähler immer letztendlich konsistent sein werden?
Gibt es eine bessere Möglichkeit für Knoten 1, auf den Beitritt der anderen Knoten zu warten und sicherzustellen, dass die anfängliche PME abgeschlossen ist, bevor sie mit dem Streamen von Daten in den Cache beginnt? Unter der Annahme, dass die Topologie stabil ist (dies ist möglicherweise eine schlechte Annahme), scheint dies das gesamte Problem mit inkonsistenten Update-Zählern zu vermeiden.
Welche Bedeutung hat diese WARN-Protokollierung in Apache Ignite? [code]WARN [sys-#78%IgniteInstance1%] (Log4J2Logger.java:523) Partition states validation has failed for group: Cache1, msg: Partitions update counters are inconsistent for Part 32... [/code] Ich versuche, mehrere IgniteDataStreamer-Instanzen zu verwenden, um einen Cache nach dem Start meines Clusters vorab zu laden, wie hier beschrieben, und ich habe dieses minimierte Beispiel zusammengestellt, um zu reproduzieren, was ich sehe. Jeder IgniteRunnable/IgniteDataStreamer streamt einen eindeutigen Satz von Schlüsseln in den Cache. Im Wesentlichen habe ich diese beiden Klassen: IgniteServerMain.java [code]public class IgniteServerMain { private static final Logger log = LogManager.getLogger();
public static final String CACHE_NAME = "Cache1"; public static final String IGNITE_INSTANCE_NAME = "IgniteInstance1"; private static final String NODE_ID = System.getProperty("NODE_ID"); private static final int SERVER_NODES = 2;
public static void main(String[] args) { try { Ignition.start(getIgniteConfiguration());
if ("1".equals(NODE_ID)) { waitForServerNodesToBeAvailable(); loadCache(); idleVerifyLoop(); }
while (true) { sleep(10_000); } } catch (Exception e) { log.error("{}", e, e); System.exit(1); } }
while (!idleVerify()) { if (Duration.between(start, Instant.now()).getSeconds() > 120) { log.error("IdleVerifyLoop: exiting, there are still conflicts after 2 minutes of waiting"); return; } sleep(10_000); }
for (int v = 0; v < 10_000; v++) { char randomLetter = (char) ('A' + random.nextInt(26)); String k = randomLetter + "-" + String.format("%06d", jobId) + "-" + String.format("%06d", v); streamer.addData(k, v); } } } } [/code] Einige Szenarien: [list] [*]Ich beobachte die WARN-Protokollierung, wann immer ich Knoten 1 starte vor Knoten 2. In diesem Szenario beginnt Knoten 1 mit dem Streamen von Daten in den Cache, kurz nachdem er erkennt, dass Knoten 2 dem Cluster beigetreten ist, und das Datenstreaming verzahnt sich mit einem Partition Map Exchange. [*]Wenn ich die Pause am Ende von „waitForServerNodesToBeAvailable von 100 Millisekunden auf 10 Sekunden ändere, wird die WARN-Protokollierung nicht angezeigt. Dadurch erhält die anfängliche PME Zeit, vor dem LoadCache fertig zu werden. [*]Wenn ich die Pause auf 100 ms zurücksetze und Knoten 1 nach Knoten 2 starte, dann kehrt die Ignition.start-Methode von Knoten 1 erst zurück, nachdem die anfängliche PME abgeschlossen ist, und daher sehe ich auch nicht WARN-Protokollierung in diesem Szenario. [/list] In meinem Beispielcode habe ich nach LoadCache eine Schleife hinzugefügt, die alle 10 Sekunden programmgesteuert die IdleVerify-JMX-Methode von Ignite aufruft. In Szenario 1 bestätigt der erste IdleVerify-Aufruf, dass die Aktualisierungszähler inkonsistent sind. Etwas später sehe ich normalerweise eine Protokollierung, die darauf hinweist, dass die PME abgeschlossen ist. Und wenn dann der zweite IdleVerify-Aufruf ausgeführt wird, wird gemeldet, dass keine Konflikte gefunden wurden. Es scheint also, dass diese Partitionsaktualisierungszähler irgendwann konsistent sind. Ich habe außerdem festgestellt, dass, wenn ich die Datenmenge erhöhe, die LoadCache in den Cache streamt, es länger dauert, bis die erste PME abgeschlossen ist. Daher kann es viele Iterationen meiner IdleVerify-Schleife dauern, bis gemeldet wird, dass keine Konflikte vorliegen. Fragen: [list] [*]Was ist hier los? Die IgniteDataStreamer-API gibt an, dass „der Datenstreamer die Datenkonsistenz nicht garantiert, bis er erfolgreich abgeschlossen wurde“, aber dies scheint im Widerspruch zu den inkonsistenten Update-Zählern zu stehen, die ich sehe. [*]Welche Bedeutung haben diese inkonsistenten Update-Zähler? Besteht in diesem Zustand die Möglichkeit eines Datenverlusts? Und ist es richtig, dass diese Aktualisierungszähler immer letztendlich konsistent sein werden? [*]Gibt es eine bessere Möglichkeit für Knoten 1, auf den Beitritt der anderen Knoten zu warten und sicherzustellen, dass die anfängliche PME abgeschlossen ist, bevor sie mit dem Streamen von Daten in den Cache beginnt? Unter der Annahme, dass die Topologie stabil ist (dies ist möglicherweise eine schlechte Annahme), scheint dies das gesamte [url=viewtopic.php?t=26065]Problem[/url] mit inkonsistenten Update-Zählern zu vermeiden. [/list]
Die Adddata -Methode von
INCTITEDATASTREAMER gibt an, dass diese Methode parallel aus mehreren Threads aufgerufen werden kann, um das Streaming bei Bedarf zu beschleunigen. Ich würde gerne wissen,...
Ich baue eine App, mit der Benutzer Sprachnotizen aufzeichnen können. Die Funktionalität von allem funktioniert großartig; Ich versuche jetzt, Änderungen an der AudioSession umzusetzen, um mögliche...
In meiner Android-App, die ich bis zu Android 13 entwickle, ändere ich die Sprache des Geräts, auf dem die App ordnungsgemäß funktionierte. Wenn ich nun die App in den Hintergrund stelle, ändere ich...
Das Ziel
Ich umschließe eine Liste von Nachrichtenelementen mit einer Komponente „ListWrap“. Diese Komponente dient dazu, jedes Element in der Liste zu umschließen und Erkennt, wenn untergeordnete...
Ich erstelle eine Website, die eine hier gefundene Kartenumdrehungsanimation nutzt und über ein Navigationsmenü mit fester Position verfügt. Wenn die Karte in einem beliebigen Browser unter iOS...