Verbindungsverlust zwischen Knoten im privaten Netzwerk

Ich habe 3 Knoten, die in einem privaten Netzwerk ausgeführt werden.

Nachdem ich diese Frage gestellt habe, habe ich manuell node1als Peer zu node2und hinzugefügt node3, sodass mein Netzwerk so aussieht:

                 _______                    
     ---------> | node2 |
    /           |_______|
   v
 _______
| node1 |
|_______|
   ^
    \            _______
     ---------> | node3 |
                |_______|

Ich habe die Knoten letzte Nacht laufen lassen, aber gegen 22 Uhr (BRST), node2und node3aufgehört zu hören node1( admin.peerswar leer), während node1sie noch mit beiden verbunden war ( admin.peersenthielt 2 Elemente), aber keine Interaktion erhalten.

Ist es möglich, dass dies ein Problem mit dem Ethereum-Protokoll ist oder wäre es etwas anderes?


Bearbeiten:

Ich betreibe die Knoten auf derselben physischen Maschine, aber in verschiedenen VMs. Diese VMs wurden Ubuntu 12.04installiert.

Die VMs laufen über ein CentOS mit VMWare vCenter.

Sind die Uhren auf Ihren verschiedenen Knoten alle mit der Netzwerkzeit synchronisiert?
Ja, sind Sie. Tatsächlich befinden sie sich auf derselben physischen Maschine, obwohl sie sich in verschiedenen VMs befinden.
Welches VM-System verwenden Sie und was ist das Host-Betriebssystem?
@JackWinters Ich habe die Frage bearbeitet ...

Antworten (1)

Zusammenfassung

Ich hätte erwartet, dass die Bootnodes-Parameter es Knoten 2 und Knoten 3 ermöglichen würden, Knoten 1, Knoten 2 und Knoten 3 zu finden und dann für alle Knoten, ihre Peer-Verbindungen beizubehalten.

Aus Henrique Barcelosdem Problem von geht hervor, dass diese Konfiguration in einem privaten Netzwerk, in dem die Knoten in einer VM ausgeführt werden, nicht stabil ist.

Die Alternative zur Verwendung static-nodes.jsonscheint keine stabile Verbindung zu bieten.

Die nächste zu versuchende Konfiguration ist die Verwendung trusted-nodes.jsonund Angabe des --maxpeersParameters

Nachfolgend sind die Schritte aufgeführt, die wir unternehmen, um das Problem zu lösen.



Ein interessantes Problem.

  1. Wahrscheinlichkeitstechnisch würde ich sagen, dass es höchst unwahrscheinlich ist, dass dies ein Problem mit dem Ethereum-Protokoll ist, da es robust genug für das Internet ist.

  2. Sie haben angegeben, dass Ihre Zeit mit der Netzwerkzeit synchronisiert ist. Dies scheint ein häufig auftretendes Problem zu sein, und deshalb habe ich die obige Frage gestellt.

  3. Schauen wir uns Ihre Konfiguration an.

  4. Frage. Betreiben Sie andere Ethereum-Mainnet-Knoten in Ihrem privaten Netzwerk? Der Grund, warum ich dies frage, ist, dass es möglicherweise zu einem Konflikt mit dem Netzwerkport 30303 kommt, der sich auf den ersten Link in Ihrer Frage bezieht.

  5. Vom ersten Link in Ihrer Frage starten Sie Ihre Geth-Instanzen auf den verschiedenen Knoten mit dem folgenden Befehl:

    geth --verbosity 4 --autodag --nat any --genesis /opt/blockchain/genesis.json
     --datadir /opt/blockchain/data --networkid 4828 --port 30303 --rpc
     --rpcaddr 10.48.247.25 --rpcport 8545 --rpcapi db,eth,net,web3,admin
     --rpccorsdomain '*' --fast --mine --ipcdisable
    

    Knoten 1 wurde als Ihr Bootknoten festgelegt. Knoten 2 und 3 haben die Datei /opt/blockchain/data/static-nodes.json mit den folgenden Informationen:

    ["enode://{node1publickey}@{node1ip}:30303"]
    
  6. Die Informationen in /opt/blockchain/data/static-nodes.json in 5. oben stimmen mit den Startinformationen in der Geth-Instanz node1 überein, die mit dem Befehl admin.nodeInfo in der Geth-Instanz node1 angezeigt werden.

    ...
    enode: "enode://{node1publickey}@{node1ip}:30303",
    ...
    

    Ist das richtig?

  7. Wenn Sie sich jetzt Ihre geth-Startparameter ansehen:
    a. Sie könnten versuchen, den --nat anyParameter
    b zu entfernen. Ihr --networkidist einzigartig aus dem Mainnet "1"
    c. Dies sollte kein Problem sein, es sei denn, Sie betreiben andere Mainnet-Ethereum-Knoten in Ihrem --port 30303Netzwerk, und selbst dies sollte kein Problem sein, da es sich um eine andere IP- Adresse handelt
    . Ihre --rpcaddrsollte die IP-Adresse jeder Maschine sein. Knoten 1 sollte die IP-Adresse von Knoten 1 haben. Knoten 2 sollte die IP-Adresse von Knoten 2 haben und Knoten 3 sollte die IP-Adresse von Knoten 3 haben.
    e. Ihre --rpcport, --rpcapiund --rpccorsdomainsollte Ihre Netzwerkkonnektivität nicht beeinträchtigen.
    f. Sie sollten die nicht benötigen--fastParameter, da Ihre Blockchain sowieso klein sein sollte, da es sich um eine interne Testnet-Blockchain handelt.
    g. Ihre --mineund --ipcdisable-Parameter sollten Ihre Konnektivität nicht beeinträchtigen.
  8. Als nächstes würde ich versuchen, den --bootnodeParameter zu entfernen und die /opt/blockchain/data/static-nodes.jsonMethode in 5. oben auf den Knoten 2 und 3 auszuprobieren. Führen Sie dies eine Weile aus und hoffen wir, dass Sie keine Verbindungsabbrüche haben. Wir können dies von der Liste streichen, wenn Sie immer noch Verbindungsabbrüche haben.

Unten hinzugefügt am 04.12.2016:

  1. Henrique Barceloshat die static-nodes.jsonMethode verwendet, damit sich die Peers finden, aber die Peer-Verbindungen sind abgebrochen. Ich schlage vor, es zu versuchen, trusted-nodes.jsonda diese vertrauenswürdige Peer-Knoten angeben, mit denen eine Verbindung hergestellt werden soll, und die nicht durch die --maxpeersVerbindungsbeschränkungen blockiert würden.
  2. Was ich bei meinen Tests festgestellt habe, ist, dass die static-nodes.jsonOption keine Verbindung herstellen würde, es sei denn, ich füge einen Parameter ungleich Null hinzu --maxpeers, obwohl --maxpeersder Standardwert 25 sein soll.
Etwa 4. Nein, ich betreibe die Knoten nur im privaten Netzwerk.
Ungefähr 5. node1ist der Bootnode, ich übergebe seinen Enode über --bootnodesan node2und node3, aber es gibt keinenstatic-nodes.json
Etwa 7.a. --natist laut Dokumentation standardmäßig auf "beliebig" eingestellt
Ich habe eine static-nodes.jsonDatei in node2und hinzugefügt node3, mit einem Array, das den Enode von enthält node1. Ich lasse die Knoten die ganze Nacht laufen und kommentiere morgen die Ergebnisse hier (ich bin um GMT-0300)
Ich freue mich darauf, von Ihren Ergebnissen zu hören.
Anscheinend wurde das Verbindungsproblem gelöst. Ich weiß nicht genau, was ich aber gelöst hat.
Wahrscheinlich hat das static-nodes.jsongeholfen, aber ich kann es nicht genau wissen.
Führen Sie es noch einige Tage aus und prüfen Sie, ob die Verbindungen robust sind. Sie können dann zur alten Methode der Verwendung der Bootnodes zurückkehren und bei Verbindungsabbrüchen bestätigen, dass die Bootnodes-Methode nicht für Ihre Umgebung geeignet ist.
Ja, ich hatte vor, so etwas zu machen. Vielen Dank für Ihre Hilfe bei diesem Problem @BokkyPooBah
Ach nein! Die Knoten gingen am Wochenende wieder auseinander :/
Wenn Ihre Knoten divergieren, vereinen sie sich nie wieder? Ich habe einige weitere Tests durchgeführt und festgestellt, dass ich den Parameter --maxpeers festlegen musste, damit die Verbindung zwischen Peers funktioniert. Ich werde mir das ein bisschen genauer ansehen und mich bei Ihnen melden. Ich habe auch die --Verbosity etwas höher als die Standardeinstellung 3 eingestellt, um mein Problem mit der Peer-Verbindung zu verfolgen.
Ich glaube nicht, dass sie sich irgendwann wieder anschließen würden, weil sie 1000 Blocks voneinander entfernt waren. Ich arbeite derzeit mit verbosity=4, ich habe einige Meldungen wie "Peer ist ungesund geworden" gesehen, aber ich weiß nicht genau, was das bedeutet.
Ich gehe die Protokolle durch, der letzte Blockimport wurde am 09. April um 10:37:19 Uhr GMT-0300 (letzten Samstag) durchgeführt, was bedeutet, dass die Knoten seit fast 2 Tagen nicht mehr miteinander kommuniziert haben.
Und ich habe auch versucht, die Datei trusted-nodes.json zu testen, da sie das maxpeers-Limit ignoriert. Siehe ethereum.stackexchange.com/questions/2478/… . Vielleicht möchten Sie diese Konfiguration als nächstes testen.
Das ist seltsam --maxpeers, weil der Standardwert 25 ist und ich nur 3 laufende Knoten habe :/
Ich habe festgestellt, dass ich bei der Verwendung von --dev --networkid xxxx --nodiscover mit static-nodes.json die Peers nicht dazu bringen konnte, sich mit einer Knotenablehnungsnachricht zu verbinden (angezeigt, wenn die Ausführlichkeit auf 4 oder 5 eingestellt ist), bis Ich setze --maxpeers manuell auf eine Zahl ungleich Null.
Ich benutze nicht --dev, sollte ich sein?
Ihre --networkid und --genesis machen Ihre Netzwerkinstanz einzigartig. --help zeigt, dass --dev die Developer mode: pre-configured private network with several debugging flags.
Ich habe ausführlichere Protokolle im --devModus bemerkt. Die Knoten haben sich die ganze Nacht über gut verhalten, bisher gab es keine Abweichungen.
Ich habe gerade meine Testergebnisse auf ethereum.stackexchange.com/questions/2851/… aufgeschrieben . Es gibt einige Bits in der Einstellung admin.verbosity(6), um die P2P-Verbindungsversuche zu verfolgen.
@HenriqueBarcelos Hast du das jemals gelöst? Ich habe das gleiche Problem und diese Schritte haben es nicht gelöst.
Wo platzierst du trusted-nodes.json? Müssen Sie geth neu starten, damit es die Liste der Enodes verwendet?