Mysql-cluster und Splitbrains



  • Hallo,

    ich spiele gerade etwas mit redundanten Datenbanken rum und hab mal versucht, mit Mysql-Cluster ein vernünftiges System nachzubauen. Ich habe zwei Server (n1 und n2) mit nem Linux drauf, die beide hängen an einem Firmennetz dran.

    Auf beiden Rechnern laufen sowohl Datenbank- als aus Knotencluster (also mysqld und ndbd), als Managementserver hab ich in einer virtuellen Maschine auf n2 ein System eingerichtet, weil ich dachte, damit krieg ich das System noch vollständig redundant. (Vielleicht lag ich da falsch.)

    Meine Idee:
    Die beiden Server sind noch zusätzlich per Ethernet verbunden und werden aus dem Netzwerk über eine virtuelle IP-Adresse angesprochen (gemanaged von heartbeat/Linux-HA). Wenn n1 verfügbar ist, dann hat er die virtuelle IP.

    Jetzt habe ich folgendes Szenario getestet: Ich schreibe wie ein irrer Daten auf die DB hinter der virtuellen IP und nehme dann Server1=n1 vom Netz. Das merkt heartbeat, macht den IP-Failover, n2 bekommt die virtuelle IP, ich schreibe weiter Daten, n1 geht wieder ans Netz, die viruelle IP-Adresse wird an ihn zurückgegeben. Alles fein, die DB bleibt konsistent. Mysql-Cluster ist toll.

    Es ist auch alles gut, wenn ich nur den Management-Server vom Netz nehme oder ndbd bzw. mysqld auf dem zweiten Server n2 abschieße.

    Mein Problem kommt nun ins Spiel, wenn ich n2 komplett abschieße, so daß n1 auch die virtuelle Maschine mit dem Managemetserver nicht mehr am Netz sieht. Dann tickt n1 aus: Management und alle anderen Knoten weg und meine DB bekommt Fehler und die Schreibzugriffe brechen ab. Erst wenn der Managementserver wieder da ist und die ndb-Knoten neu gestartet werden, läuft das System (mit konsistenter DB, aber zu wenigen Schreibzugriffen) brav weiter.

    Meine Theorie dazu ist, das n1 einen Splitbrain vermutet und den Arbitrator (also den Management-Server) nicht finden kann, also sicherheitshalber die Arbeit einstellt.

    Ich habe also einen Single-Point-of-Failure, nämlich n2, was natürlich unerwünscht ist.

    Ich hab ein bißchen in der Doku gesucht, aber irgendwie scheint es nicht möglich zu sein, einen zweiten, niederprioritären Arbitrator auf n1 zu legen, der wirklich nur bei einem Ausfall von n2 und Management ins Spiel kommt. Zugegeben, das würde den Schutz vor Splitbrains untergraben, aber das kann man sowieso fast ausschließen: die Rechner sehen sich über's Netzwerk, über ein eigenes Ethernet-Kabel und eine Nullmodemverbindung. Oder kann man diese Splitbrain-Kontrolle komplett abschalten?

    Hat da jemand ne gute Idee, wie ich das Problem mit mysql-cluster lösen kann?

    Ich überlege aktuell, das ganze mit Mysql-Replica zu machen, das sollte mit zwei Rechnern echt redundant bekommen zu sein (Splitbrain macht halt Probleme), aber da muß man sich von Hand drum kümmern, das die Datenbanken synchron bleiben, was ich eigentlich nicht mag.

    Jemand schon mal sowas gemacht und hat dafür ne Anleitung für mich? Noch weitere Ideen?

    Viele Grüße
    Daniel


Log in to reply