Webserver-Cluster und Sessions

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Webserver-Cluster und Sessions

    Hi,

    ich zerbrech mir gerade seit mehreren Stunden das Hirn.

    Folgendes Situation:
    Wir haben eine Seite, sie läuft auf unserem Web-Server Cluster. Die Server werden (ich glaube) per round-robin angesprochen. Sprich, ich lande bei jedem Request auf einem anderen Server.
    Um Session-Persitenz zu erreichen, wird sharedance eingesetzt. Klappt im Normalfall auch ganz gut.
    Man loggt sich also auf der Seite ein - ob man eingeloggt ist, oder nicht wird in den Sessiondaten gespeichert. Mancher Content (in dem Fall Bilder) dürfen nur gezeigt werden, wenn man entsprechende Rechte hat.

    Im Beispiel habe ich zb die Startseite für angemeldete Benutzer, die die Leute anzeigt, die zuletzt meine "persönliche" Seite besucht haben. Dort werden (zB) 5 Thumbnails ausgegeben. Die Thumbnails werden über eine PHP Datei angezeigt, die je nach Status (eingeloggt oder nicht, Rechte oder nicht) entweder das User-Bild oder ein Platzhalter Bild anzeigt.
    Damit das ganze funktioniert, wird in der Bild.php natürlich auch ein session_start() gemacht.

    Nun zum Problem:
    Es kommt vor, das User rausgeschmissen werden. Leider ist das ganze nicht reproduzierbar - sie werden beim wechsel von einer Seite zur nächsten einfach rausgeschmissen. Teils kommt es vor, das ihr Session-Cookie vom Browser nicht mehr mitgesendet wird, oder der $_SESSION-Array ist leer. (also anscheinend neue "jungfräuliche" Session)

    Hier nun meine Theorie. Ich glaube, das das mehrmalige starten der Session (n mal bild.php und seite.php) zu Problemen führt. Soweit ich weiß, führt Sharedance kein Locking der Session Daten durch. Dadurch würde das session_start() in der bild.php die Session aus seite.php evtl überschreiben. Siehe (http://leo.freeflux.net/blog/archive...x-und-php.html).

    Ich hab auch schon nen Sessionhandler mit mcache genommen, habe da aber das selbe Problem.

    Wenn ich das ganze auf einem anderen Server Teste, der keine "spezielle" Sessionverwaltung hat, funktioniert alles tadellos. Auch ein Cluster mit vorgeschalteten Loadbalancer (der den User entsprechend auf einen der webserver "klebt") macht keine Probleme - einzig in der sharedance/mcache Umgebung.


    Ich würde gerne verstehen, warum mir die Session abhaut - habt ihr noch Tips für mich? Wie kann ich besser an das Problem ran gehen? Habt ihr auch schon mal Probleme mit Sessions in Web-Clusterumgebungen gehabt?

    Dank euch schonmal.


    EDIT:
    Das ganze ist leider nicht Browserspezifisch. Ich lass mir aktuell ne mail senden, wenn ein USer auf der Seite kein PHPSESSID Cookie hat - da sind leider mehrere Browser dabei (IE, FF, Opera). Hab auch schon mit den P3P Headern rumgespielt.
    Zuletzt geändert von prego; 11.04.2007, 15:08.

  • #2
    Ich registriere bei solchen Phänomenen zu allererst mal eigene Session Handler (sofern das nicht sowieso der Fall ist) und lasse mir darüber alle Session Aktionen inklusive mikrosekundengenauem Timestamp loggen. Damit lassen sich konkurrierende Zugriffe leicht erkennen (open einer Session vor close derselben).

    Sharedance habe ich allerdings noch nie benutzt. (Ich verlasse mich auf session.save_path via NFS.)

    Kommentar


    • #3
      Hey onemorenerd, danke für deine Antwort.

      Leider kann ich das Problem nicht reproduzieren. Ab und zu kommt es vor und ab und zu nicht.
      Nach welchen Kriterien loggst du? Ich kann ja schlecht von jedem Request auf der Seite ne Mail schicken lassen...

      Kommentar


      • #4
        Wäre es nicht insgesamt sinnvoller wenn du nicht sinnvoller wenn du die Sessions nicht verteilst sondern alle Server ein Verzeichnis für die Sessions benutzen (so wie onemorenerd schon gesagt hat)? Deine Datenbank wird ja auch nicht geshared oder? Evtl. solltest kannst du ja einen eigenen Sessionhandler schreiben der auch locks benutzt.
        EDIT:
        Für den Log solltest du eine Datei verwenden die du dir dann per Mail schicken lässt oder so - ansonsten wirst du wohl als Spamvertreiber aussortiert.
        Zuletzt geändert von tontechniker; 11.04.2007, 17:04.
        Die Regeln | rtfm | register_globals | strings | SQL-Injections | [COLOR=silver][[/COLOR][COLOR=royalblue]–[/COLOR][COLOR=silver]][/COLOR]

        Kommentar


        • #5
          Ähm ja, logging per Mail ... im Testbetrieb wartest du auf einzelne Mails und im Livebetrieb erreicht deine Inbox binnen Minuten ihr Quota-Limit.

          http://www.devshed.com/c/a/PHP/Logging-With-PHP/ ist eine ganz brauchbare Einführung.

          Da Session Aktionen im Livebetrieb massenweise auftreten, muß man schon genauer überlegen, wie man das sinnvoll loggen kann. Eine Datei kommt eigentlich nicht in Frage, eine DB sollte konkurrierende Schreiboperationen zulassen, syslog() wäre gut.
          Per Cron kannst du dir das von syslogd generierte Logfile ja alle x Minuten mailen lassen.

          Kommentar


          • #6
            @tontechniker: Ich hab natürlich von allen Webservern zugriff auf die selbe Datenbank. Das Problem ist auch nicht das sharen der Session, das erledigt ja sharedance oder mchace für mich - jeweils mit entsprechender implementation eines Sessionhandlers.
            Das Problem hat sich in 2 Wochen sowieso erledigt, weil dir dann haproxy als Loadbalancer installieren. Der klebt den User dann an einen Server und ich kann die normale PHP-Session Verwaltung benutzen.
            Mein Problem liegt ja leider darin, das irgendetwas an meinen mehrfachen Aufrufen die Session zerschiest. Wahrscheinlich auf der Clientseite - entweder wird das PHPSESSID-Cookie gelöscht oder es wird ein neues vergeben, womit meine Session wieder leer ist. Ich hab da halt das fehlende Locking bei sharedance/mcache in Vermutung - auch ein SQL-Sessionhandler wird daran nichts ändern.

            Natürlich kann es auch ganz woanders dran liegen - ich bin da für jeden Vorschlag offen.

            @onemorenerd:
            Momentan herscht auf der Seite noch kein "echter" Live Betrieb. Es ist noch eine überschaubare Zahl an nutzern - 100-200 Mails kann ich mir denk ich zusenden. Ich meinte eher WAS ich loggen soll? Wann eine Session gestartet wird?
            Oder was wäre ein sinnvoller Log-punkt?


            Vielen Dank euch schonmal.

            Kommentar


            • #7
              Da sich die Seite noch im Testbetrieb befindet und bereits alle Webserver auf die selbe DB zugreifen, bietet sich ein DB-basierter Session Handler an. http://www.zend.com/zend/spotlight/c...lery-wade8.php ist ganz brauchbar und läßt sich in einer Minute so erweitern, dass alle Aufrufe der _*-Methoden zusätzlich einen Eintrag in eine Loggin-Tabelle schreiben, der die Session-ID, einen exakten Timestamp, den eigenen Methodennamen und ggf. weitere Zutaten enthält.

              Dadurch könntest du anhand der Log-Tabelle jegliche sessionbezogene Aktion von PHP nachvollziehen. Die Timestamps verraten Race Conditions und wenn du mehr brauchst, logst du halt mehr.

              Kommentar

              Lädt...
              X